Optimizations for Http2FrameLogger
Motivation: The logger was always performing a hex dump of the ByteBufs regarless whether or not the log would take place. Modifications: Fixed the logger to avoid serializing the ByteBufs and calling the varargs method if logging is not enabled. Result: The loggers should run MUCH faster when disabled.
This commit is contained in:
parent
3df7b4dac7
commit
44615f6cb2
@ -33,6 +33,7 @@ public class Http2FrameLogger extends ChannelHandlerAdapter {
|
|||||||
OUTBOUND
|
OUTBOUND
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final int BUFFER_LENGTH_THRESHOLD = 64;
|
||||||
private final InternalLogger logger;
|
private final InternalLogger logger;
|
||||||
private final InternalLogLevel level;
|
private final InternalLogLevel level;
|
||||||
|
|
||||||
@ -47,74 +48,114 @@ public class Http2FrameLogger extends ChannelHandlerAdapter {
|
|||||||
|
|
||||||
public void logData(Direction direction, int streamId, ByteBuf data, int padding,
|
public void logData(Direction direction, int streamId, ByteBuf data, int padding,
|
||||||
boolean endStream) {
|
boolean endStream) {
|
||||||
|
if (enabled()) {
|
||||||
log(direction,
|
log(direction,
|
||||||
"DATA: streamId=%d, padding=%d, endStream=%b, length=%d, bytes=%s",
|
"DATA: streamId=%d, padding=%d, endStream=%b, length=%d, bytes=%s",
|
||||||
streamId, padding, endStream, data.readableBytes(), ByteBufUtil.hexDump(data));
|
streamId, padding, endStream, data.readableBytes(), toString(data));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void logHeaders(Direction direction, int streamId, Http2Headers headers, int padding,
|
public void logHeaders(Direction direction, int streamId, Http2Headers headers, int padding,
|
||||||
boolean endStream) {
|
boolean endStream) {
|
||||||
|
if (enabled()) {
|
||||||
log(direction, "HEADERS: streamId:%d, headers=%s, padding=%d, endStream=%b",
|
log(direction, "HEADERS: streamId:%d, headers=%s, padding=%d, endStream=%b",
|
||||||
streamId, headers, padding, endStream);
|
streamId, headers, padding, endStream);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void logHeaders(Direction direction, int streamId, Http2Headers headers,
|
public void logHeaders(Direction direction, int streamId, Http2Headers headers,
|
||||||
int streamDependency, short weight, boolean exclusive, int padding, boolean endStream) {
|
int streamDependency, short weight, boolean exclusive, int padding, boolean endStream) {
|
||||||
|
if (enabled()) {
|
||||||
log(direction,
|
log(direction,
|
||||||
"HEADERS: streamId:%d, headers=%s, streamDependency=%d, weight=%d, exclusive=%b, "
|
"HEADERS: streamId:%d, headers=%s, streamDependency=%d, weight=%d, exclusive=%b, "
|
||||||
+ "padding=%d, endStream=%b", streamId, headers,
|
+ "padding=%d, endStream=%b", streamId, headers,
|
||||||
streamDependency, weight, exclusive, padding, endStream);
|
streamDependency, weight, exclusive, padding, endStream);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void logPriority(Direction direction, int streamId, int streamDependency, short weight,
|
public void logPriority(Direction direction, int streamId, int streamDependency, short weight,
|
||||||
boolean exclusive) {
|
boolean exclusive) {
|
||||||
|
if (enabled()) {
|
||||||
log(direction, "PRIORITY: streamId=%d, streamDependency=%d, weight=%d, exclusive=%b",
|
log(direction, "PRIORITY: streamId=%d, streamDependency=%d, weight=%d, exclusive=%b",
|
||||||
streamId, streamDependency, weight, exclusive);
|
streamId, streamDependency, weight, exclusive);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void logRstStream(Direction direction, int streamId, long errorCode) {
|
public void logRstStream(Direction direction, int streamId, long errorCode) {
|
||||||
|
if (enabled()) {
|
||||||
log(direction, "RST_STREAM: streamId=%d, errorCode=%d", streamId, errorCode);
|
log(direction, "RST_STREAM: streamId=%d, errorCode=%d", streamId, errorCode);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void logSettingsAck(Direction direction) {
|
public void logSettingsAck(Direction direction) {
|
||||||
|
if (enabled()) {
|
||||||
log(direction, "SETTINGS ack=true");
|
log(direction, "SETTINGS ack=true");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void logSettings(Direction direction, Http2Settings settings) {
|
public void logSettings(Direction direction, Http2Settings settings) {
|
||||||
|
if (enabled()) {
|
||||||
log(direction, "SETTINGS: ack=false, settings=%s", settings);
|
log(direction, "SETTINGS: ack=false, settings=%s", settings);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void logPing(Direction direction, ByteBuf data) {
|
public void logPing(Direction direction, ByteBuf data) {
|
||||||
log(direction, "PING: ack=false, length=%d, bytes=%s", data.readableBytes(), ByteBufUtil.hexDump(data));
|
if (enabled()) {
|
||||||
|
log(direction, "PING: ack=false, length=%d, bytes=%s", data.readableBytes(), toString(data));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void logPingAck(Direction direction, ByteBuf data) {
|
public void logPingAck(Direction direction, ByteBuf data) {
|
||||||
log(direction, "PING: ack=true, length=%d, bytes=%s", data.readableBytes(), ByteBufUtil.hexDump(data));
|
if (enabled()) {
|
||||||
|
log(direction, "PING: ack=true, length=%d, bytes=%s", data.readableBytes(), toString(data));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void logPushPromise(Direction direction, int streamId, int promisedStreamId,
|
public void logPushPromise(Direction direction, int streamId, int promisedStreamId,
|
||||||
Http2Headers headers, int padding) {
|
Http2Headers headers, int padding) {
|
||||||
|
if (enabled()) {
|
||||||
log(direction, "PUSH_PROMISE: streamId=%d, promisedStreamId=%d, headers=%s, padding=%d",
|
log(direction, "PUSH_PROMISE: streamId=%d, promisedStreamId=%d, headers=%s, padding=%d",
|
||||||
streamId, promisedStreamId, headers, padding);
|
streamId, promisedStreamId, headers, padding);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void logGoAway(Direction direction, int lastStreamId, long errorCode, ByteBuf debugData) {
|
public void logGoAway(Direction direction, int lastStreamId, long errorCode, ByteBuf debugData) {
|
||||||
|
if (enabled()) {
|
||||||
log(direction, "GO_AWAY: lastStreamId=%d, errorCode=%d, length=%d, bytes=%s", lastStreamId,
|
log(direction, "GO_AWAY: lastStreamId=%d, errorCode=%d, length=%d, bytes=%s", lastStreamId,
|
||||||
errorCode, debugData.readableBytes(), ByteBufUtil.hexDump(debugData));
|
errorCode, debugData.readableBytes(), toString(debugData));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void logWindowsUpdate(Direction direction, int streamId, int windowSizeIncrement) {
|
public void logWindowsUpdate(Direction direction, int streamId, int windowSizeIncrement) {
|
||||||
|
if (enabled()) {
|
||||||
log(direction, "WINDOW_UPDATE: streamId=%d, windowSizeIncrement=%d", streamId,
|
log(direction, "WINDOW_UPDATE: streamId=%d, windowSizeIncrement=%d", streamId,
|
||||||
windowSizeIncrement);
|
windowSizeIncrement);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void logUnknownFrame(Direction direction, byte frameType, int streamId, Http2Flags flags, ByteBuf data) {
|
public void logUnknownFrame(Direction direction, byte frameType, int streamId, Http2Flags flags, ByteBuf data) {
|
||||||
|
if (enabled()) {
|
||||||
log(direction, "UNKNOWN: frameType=%d, streamId=%d, flags=%d, length=%d, bytes=%s",
|
log(direction, "UNKNOWN: frameType=%d, streamId=%d, flags=%d, length=%d, bytes=%s",
|
||||||
frameType & 0xFF, streamId, flags.value(), data.readableBytes(), ByteBufUtil.hexDump(data));
|
frameType & 0xFF, streamId, flags.value(), data.readableBytes(), toString(data));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean enabled() {
|
||||||
|
return logger.isEnabled(level);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String toString(ByteBuf buf) {
|
||||||
|
if (level == InternalLogLevel.TRACE || buf.readableBytes() <= BUFFER_LENGTH_THRESHOLD) {
|
||||||
|
// Log the entire buffer.
|
||||||
|
return ByteBufUtil.hexDump(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise just log the first 64 bytes.
|
||||||
|
int length = Math.min(buf.readableBytes(), BUFFER_LENGTH_THRESHOLD);
|
||||||
|
return ByteBufUtil.hexDump(buf, buf.readerIndex(), length) + "...";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void log(Direction direction, String format, Object... args) {
|
private void log(Direction direction, String format, Object... args) {
|
||||||
if (logger.isEnabled(level)) {
|
|
||||||
StringBuilder b = new StringBuilder(200);
|
StringBuilder b = new StringBuilder(200);
|
||||||
b.append("\n----------------")
|
b.append("\n----------------")
|
||||||
.append(direction.name())
|
.append(direction.name())
|
||||||
@ -124,4 +165,3 @@ public class Http2FrameLogger extends ChannelHandlerAdapter {
|
|||||||
logger.log(level, b.toString());
|
logger.log(level, b.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user