diff --git a/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/TracingEndInInterceptor.java b/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/TracingEndInInterceptor.java index d6ed962b52..19e810cf9f 100644 --- a/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/TracingEndInInterceptor.java +++ b/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/TracingEndInInterceptor.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.cxf; +import org.apache.cxf.interceptor.OutgoingChainInterceptor; import org.apache.cxf.message.Message; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; @@ -12,6 +13,8 @@ import org.apache.cxf.phase.Phase; public class TracingEndInInterceptor extends AbstractPhaseInterceptor { public TracingEndInInterceptor() { super(Phase.POST_INVOKE); + // end the span before the OutInterceptors (callbacks) are executed + addBefore(OutgoingChainInterceptor.class.getName()); } @Override diff --git a/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/test/groovy/TestWsServlet.groovy b/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/test/groovy/TestWsServlet.groovy index d8cd8064fc..6e40c049ec 100644 --- a/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/test/groovy/TestWsServlet.groovy +++ b/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/test/groovy/TestWsServlet.groovy @@ -4,7 +4,13 @@ */ import hello.HelloServiceImpl +import io.opentelemetry.api.trace.Span +import io.opentelemetry.context.Context +import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan import org.apache.cxf.jaxws.EndpointImpl +import org.apache.cxf.message.Message +import org.apache.cxf.phase.AbstractPhaseInterceptor +import org.apache.cxf.phase.Phase import org.apache.cxf.transport.servlet.CXFNonSpringServlet import javax.servlet.ServletConfig @@ -18,5 +24,14 @@ class TestWsServlet extends CXFNonSpringServlet { Object implementor = new HelloServiceImpl() EndpointImpl endpoint = new EndpointImpl(bus, implementor) endpoint.publish("/HelloService") + endpoint.getOutInterceptors().add(new AbstractPhaseInterceptor(Phase.SETUP) { + @Override + void handleMessage(Message message) { + Context context = Context.current() + if (LocalRootSpan.fromContext(context) != Span.fromContext(context)) { + throw new IllegalStateException("handler span should be ended before outgoing interceptors") + } + } + }) } }