diff --git a/instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyHttpResponseMutator.java b/instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyHttpResponseMutator.java new file mode 100644 index 000000000000..4e808c5de94a --- /dev/null +++ b/instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyHttpResponseMutator.java @@ -0,0 +1,29 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.grizzly; + +import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseMutator; +import org.glassfish.grizzly.http.HttpResponsePacket; +import org.glassfish.grizzly.http.util.DataChunk; +import org.glassfish.grizzly.http.util.MimeHeaders; + +public enum GrizzlyHttpResponseMutator implements HttpServerResponseMutator { + INSTANCE; + + @Override + public void appendHeader(HttpResponsePacket response, String name, String value) { + MimeHeaders headers = response.getHeaders(); + DataChunk data = headers.getValue(name); + if (data == null) { + data = headers.addValue(name); + } + if (data.getLength() > 0) { + data.setString(data.toString() + "," + value); + } else { + data.setString(value); + } + } +} diff --git a/instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/HttpServerFilterInstrumentation.java b/instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/HttpServerFilterInstrumentation.java index fcc5d0c9e1da..7b515a73ecca 100644 --- a/instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/HttpServerFilterInstrumentation.java +++ b/instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/HttpServerFilterInstrumentation.java @@ -11,6 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import io.opentelemetry.context.Context; +import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder; import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -43,6 +44,15 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class PrepareResponseAdvice { + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.Argument(0) FilterChainContext ctx, + @Advice.Argument(2) HttpResponsePacket response) { + Context context = GrizzlyStateStorage.getContext(ctx); + HttpServerResponseCustomizerHolder.getCustomizer() + .customize(context, response, GrizzlyHttpResponseMutator.INSTANCE); + } + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void onExit( @Advice.Argument(0) FilterChainContext ctx, diff --git a/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyTest.groovy b/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyTest.groovy index e638be4e0de4..6b9d885f1cb7 100644 --- a/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyTest.groovy +++ b/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyTest.groovy @@ -58,6 +58,11 @@ class GrizzlyTest extends HttpServerTest implements AgentTestTrait { server.stop() } + @Override + boolean hasResponseCustomizer(ServerEndpoint endpoint) { + true + } + @Override boolean testCapturedHttpHeaders() { false