From 22dd39ff902a3fbbaada1b5faa5ccdeb708328a6 Mon Sep 17 00:00:00 2001
From: Pavol Loffay
Date: Mon, 11 Jan 2021 19:53:49 +0100
Subject: [PATCH] Capture buffers in netty 4.0, small cleanup
Signed-off-by: Pavol Loffay
---
.../netty/v4_0/server/DataCaptureUtils.java | 32 +++++++++++++------
.../HttpServerRequestTracingHandler.java | 3 +-
.../HttpServerResponseTracingHandler.java | 3 +-
.../netty/v4_1/server/DataCaptureUtils.java | 5 +--
4 files changed, 27 insertions(+), 16 deletions(-)
diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/DataCaptureUtils.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/DataCaptureUtils.java
index 107265b1c..38102a0bd 100644
--- a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/DataCaptureUtils.java
+++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/DataCaptureUtils.java
@@ -16,6 +16,7 @@
package io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_0.server;
+import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.handler.codec.http.HttpContent;
import io.netty.handler.codec.http.HttpMessage;
@@ -35,7 +36,7 @@ public static void captureBody(
Span span,
Channel channel,
AttributeKey attributeKey,
- HttpContent httpContent) {
+ Object httpContentOrBuffer) {
Attribute bufferAttr = channel.attr(attributeKey);
BoundedByteArrayOutputStream buffer = bufferAttr.get();
@@ -44,16 +45,17 @@ public static void captureBody(
return;
}
- final ByteArrayOutputStream finalBuffer = buffer;
- httpContent
- .content()
- .forEachByte(
- value -> {
- finalBuffer.write(value);
- return true;
- });
+ ByteBuf content = castToBuf(httpContentOrBuffer);
+ if (content != null && content.isReadable()) {
+ final ByteArrayOutputStream finalBuffer = buffer;
+ content.forEachByte(
+ value -> {
+ finalBuffer.write(value);
+ return true;
+ });
+ }
- if (httpContent instanceof LastHttpContent) {
+ if (httpContentOrBuffer instanceof LastHttpContent) {
bufferAttr.remove();
try {
span.setAttribute(attributeKey.name(), buffer.toStringWithSuppliedCharset());
@@ -63,6 +65,16 @@ public static void captureBody(
}
}
+ private static ByteBuf castToBuf(Object msg) {
+ if (msg instanceof ByteBuf) {
+ return (ByteBuf) msg;
+ } else if (msg instanceof HttpContent) {
+ HttpContent httpContent = (HttpContent) msg;
+ return httpContent.content();
+ }
+ return null;
+ }
+
// see io.netty.handler.codec.http.HttpUtil
public static CharSequence getContentType(HttpMessage message) {
return message.headers().get("content-type");
diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerRequestTracingHandler.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerRequestTracingHandler.java
index 7c022a90b..9d02757a6 100644
--- a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerRequestTracingHandler.java
+++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerRequestTracingHandler.java
@@ -85,8 +85,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof HttpContent
&& agentConfig.getDataCapture().getHttpBody().getRequest().getValue()) {
- DataCaptureUtils.captureBody(
- span, channel, AttributeKeys.REQUEST_BODY_BUFFER, (HttpContent) msg);
+ DataCaptureUtils.captureBody(span, channel, AttributeKeys.REQUEST_BODY_BUFFER, msg);
}
ctx.fireChannelRead(msg);
diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerResponseTracingHandler.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerResponseTracingHandler.java
index 7abb229c6..18946643a 100644
--- a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerResponseTracingHandler.java
+++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerResponseTracingHandler.java
@@ -85,8 +85,7 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) {
if (msg instanceof HttpContent
&& agentConfig.getDataCapture().getHttpBody().getResponse().getValue()) {
- DataCaptureUtils.captureBody(
- span, ctx.channel(), AttributeKeys.RESPONSE_BODY_BUFFER, (HttpContent) msg);
+ DataCaptureUtils.captureBody(span, ctx.channel(), AttributeKeys.RESPONSE_BODY_BUFFER, msg);
}
try (Scope ignored = context.makeCurrent()) {
diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/DataCaptureUtils.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/DataCaptureUtils.java
index b412d29b6..f4fb9363d 100644
--- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/DataCaptureUtils.java
+++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/DataCaptureUtils.java
@@ -19,6 +19,7 @@
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.handler.codec.http.HttpContent;
+import io.netty.handler.codec.http.HttpHeaderNames;
import io.netty.handler.codec.http.HttpMessage;
import io.netty.handler.codec.http.LastHttpContent;
import io.netty.util.Attribute;
@@ -77,10 +78,10 @@ private static ByteBuf castToBuf(Object msg) {
// see io.netty.handler.codec.http.HttpUtil
public static CharSequence getContentType(HttpMessage message) {
- return message.headers().get("content-type");
+ return message.headers().get(HttpHeaderNames.CONTENT_TYPE);
}
public static CharSequence getContentLength(HttpMessage message) {
- return message.headers().get("content-length");
+ return message.headers().get(HttpHeaderNames.CONTENT_LENGTH);
}
}