Enable http pipelining test on Grizzly (#8411)

This commit is contained in:
Lauri Tulmin 2023-05-05 12:44:55 +03:00 committed by GitHub
parent 413890d246
commit 60aa4215f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 79 additions and 16 deletions

View File

@ -0,0 +1,77 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.grizzly;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
import io.opentelemetry.context.Scope;
import io.opentelemetry.javaagent.bootstrap.CallDepth;
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
import org.glassfish.grizzly.filterchain.FilterChainContext;
public class FilterChainContextInstrumentation implements TypeInstrumentation {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return named("org.glassfish.grizzly.filterchain.FilterChainContext");
}
@Override
public void transform(TypeTransformer transformer) {
transformer.applyAdviceToMethod(
named("resume").and(takesArguments(0)),
FilterChainContextInstrumentation.class.getName() + "$ResumeAdvice");
transformer.applyAdviceToMethod(
named("write"), FilterChainContextInstrumentation.class.getName() + "$WriteAdvice");
}
@SuppressWarnings("unused")
public static class ResumeAdvice {
@Advice.OnMethodEnter(suppress = Throwable.class)
public static Scope onEnter() {
return Java8BytecodeBridge.rootContext().makeCurrent();
}
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
public static void onExit(@Advice.Enter Scope scope) {
if (scope != null) {
scope.close();
}
}
}
@SuppressWarnings("unused")
public static class WriteAdvice {
@Advice.OnMethodEnter(suppress = Throwable.class)
public static void onEnter(@Advice.Local("otelCallDepth") CallDepth callDepth) {
callDepth = CallDepth.forClass(FilterChainContext.class);
callDepth.getAndIncrement();
}
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
public static void onExit(
@Advice.This FilterChainContext filterChainContext,
@Advice.Local("otelCallDepth") CallDepth callDepth) {
// When exiting the outermost call to write clear context & request from filter chain context.
// Write makes a copy of the current filter chain context and passes it on. In older versions
// new and old filter chain context share the attributes, but in newer versions the attributes
// are also copied. We need to remove the attributes here to ensure that the next request
// starts with clean state, failing to do so causes http pipelining test to fail with the
// latest deps.
if (callDepth.decrementAndGet() == 0) {
GrizzlyStateStorage.removeContext(filterChainContext);
GrizzlyStateStorage.removeRequest(filterChainContext);
}
}
}
}

View File

@ -25,6 +25,7 @@ public class GrizzlyInstrumentationModule extends InstrumentationModule {
new FilterInstrumentation(), new FilterInstrumentation(),
new HttpCodecFilterInstrumentation(), new HttpCodecFilterInstrumentation(),
new HttpServerFilterInstrumentation(), new HttpServerFilterInstrumentation(),
new HttpHandlerInstrumentation()); new HttpHandlerInstrumentation(),
new FilterChainContextInstrumentation());
} }
} }

View File

@ -39,11 +39,6 @@ class GrizzlyAsyncTest extends GrizzlyTest {
false false
} }
@Override
boolean testHttpPipelining() {
false
}
@Override @Override
boolean verifyServerSpanEndTime() { boolean verifyServerSpanEndTime() {
// server spans are ended inside of the JAX-RS controller spans // server spans are ended inside of the JAX-RS controller spans

View File

@ -84,11 +84,6 @@ class GrizzlyFilterchainServerTest extends HttpServerTest<HttpServer> implements
false false
} }
@Override
boolean testHttpPipelining() {
false
}
@Override @Override
boolean verifyServerSpanEndTime() { boolean verifyServerSpanEndTime() {
// server spans are ended inside of the controller spans // server spans are ended inside of the controller spans

View File

@ -68,11 +68,6 @@ class GrizzlyTest extends HttpServerTest<HttpServer> implements AgentTestTrait {
false false
} }
@Override
boolean testHttpPipelining() {
false
}
static class SimpleExceptionMapper implements ExceptionMapper<Throwable> { static class SimpleExceptionMapper implements ExceptionMapper<Throwable> {
@Override @Override