Skip to content

Commit 4e552d7

Browse files
committed
jaxrs-2.0-cxf
1 parent 0ff7fbb commit 4e552d7

File tree

2 files changed

+46
-24
lines changed

2 files changed

+46
-24
lines changed

instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-cxf-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/CxfInstrumentationModule.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
import com.google.auto.service.AutoService;
1111
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1212
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
13+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
1314
import java.util.List;
1415

1516
@AutoService(InstrumentationModule.class)
16-
public class CxfInstrumentationModule extends InstrumentationModule {
17+
public class CxfInstrumentationModule extends InstrumentationModule
18+
implements ExperimentalInstrumentationModule {
1719
public CxfInstrumentationModule() {
1820
super("jaxrs", "jaxrs-2.0", "cxf", "cxf-3.2");
1921
}
@@ -26,4 +28,9 @@ public List<TypeInstrumentation> typeInstrumentations() {
2628
new CxfRsHttpListenerInstrumentation(),
2729
new CxfJaxRsInvokerInstrumentation());
2830
}
31+
32+
@Override
33+
public boolean isIndyReady() {
34+
return true;
35+
}
2936
}

instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-cxf-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/CxfRequestContextInstrumentation.java

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1818
import io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsConstants;
1919
import java.lang.reflect.Method;
20+
import javax.annotation.Nullable;
2021
import javax.ws.rs.container.ContainerRequestContext;
2122
import net.bytebuddy.asm.Advice;
22-
import net.bytebuddy.asm.Advice.Local;
2323
import net.bytebuddy.description.type.TypeDescription;
2424
import net.bytebuddy.matcher.ElementMatcher;
2525
import org.apache.cxf.jaxrs.impl.AbstractRequestContextImpl;
@@ -57,50 +57,65 @@ public void transform(TypeTransformer transformer) {
5757
@SuppressWarnings("unused")
5858
public static class ContainerRequestContextAdvice {
5959

60+
public static class AdviceScope {
61+
private Jaxrs2HandlerData handlerData;
62+
private Context context;
63+
private Scope scope;
64+
65+
public AdviceScope enter(
66+
Class<?> resourceClass, Method method, AbstractRequestContextImpl requestContext) {
67+
handlerData = new Jaxrs2HandlerData(resourceClass, method);
68+
context =
69+
Jaxrs2RequestContextHelper.createOrUpdateAbortSpan(
70+
instrumenter(), (ContainerRequestContext) requestContext, handlerData);
71+
if (context != null) {
72+
scope = context.makeCurrent();
73+
}
74+
75+
return this;
76+
}
77+
78+
public void exit(@Nullable Throwable throwable) {
79+
if (scope == null) {
80+
return;
81+
}
82+
scope.close();
83+
instrumenter().end(context, handlerData, null, throwable);
84+
}
85+
}
86+
87+
@Nullable
6088
@Advice.OnMethodEnter(suppress = Throwable.class)
61-
public static void decorateAbortSpan(
62-
@Advice.This AbstractRequestContextImpl requestContext,
63-
@Local("otelHandlerData") Jaxrs2HandlerData handlerData,
64-
@Local("otelContext") Context context,
65-
@Local("otelScope") Scope scope) {
89+
public static AdviceScope decorateAbortSpan(
90+
@Advice.This AbstractRequestContextImpl requestContext) {
6691

6792
if (requestContext.getProperty(JaxrsConstants.ABORT_HANDLED) != null
6893
|| !(requestContext instanceof ContainerRequestContext)) {
69-
return;
94+
return null;
7095
}
7196

7297
Message message = requestContext.getMessage();
7398
OperationResourceInfoStack resourceInfoStack =
7499
(OperationResourceInfoStack)
75100
message.get("org.apache.cxf.jaxrs.model.OperationResourceInfoStack");
76101
if (resourceInfoStack == null || resourceInfoStack.isEmpty()) {
77-
return;
102+
return null;
78103
}
79104

80105
MethodInvocationInfo invocationInfo = resourceInfoStack.peek();
81106
Method method = invocationInfo.getMethodInfo().getMethodToInvoke();
82107
Class<?> resourceClass = invocationInfo.getRealClass();
83108

84-
handlerData = new Jaxrs2HandlerData(resourceClass, method);
85-
context =
86-
Jaxrs2RequestContextHelper.createOrUpdateAbortSpan(
87-
instrumenter(), (ContainerRequestContext) requestContext, handlerData);
88-
if (context != null) {
89-
scope = context.makeCurrent();
90-
}
109+
AdviceScope adviceScope = new AdviceScope();
110+
return adviceScope.enter(resourceClass, method, requestContext);
91111
}
92112

93113
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
94114
public static void stopSpan(
95-
@Local("otelHandlerData") Jaxrs2HandlerData handlerData,
96-
@Local("otelContext") Context context,
97-
@Local("otelScope") Scope scope,
98-
@Advice.Thrown Throwable throwable) {
99-
if (scope == null) {
100-
return;
115+
@Advice.Thrown Throwable throwable, @Advice.Enter @Nullable AdviceScope adviceScope) {
116+
if (adviceScope != null) {
117+
adviceScope.exit(throwable);
101118
}
102-
scope.close();
103-
instrumenter().end(context, handlerData, null, throwable);
104119
}
105120
}
106121
}

0 commit comments

Comments
 (0)