diff --git a/instrumentation/servlet/servlet-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/Servlet3Advice.java b/instrumentation/servlet/servlet-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/Servlet3Advice.java index eb60c83ce6..ad8bb8293d 100644 --- a/instrumentation/servlet/servlet-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/Servlet3Advice.java +++ b/instrumentation/servlet/servlet-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/Servlet3Advice.java @@ -53,39 +53,29 @@ public class Servlet3Advice { } Context attachedContext = tracer().getServerContext(httpServletRequest); - if (attachedContext != null) { + if (attachedContext != null && tracer().needsRescoping(attachedContext)) { + attachedContext = + tracer().updateContext(attachedContext, httpServletRequest, mappingResolver, servlet); + scope = attachedContext.makeCurrent(); // We are inside nested servlet/filter/app-server span, don't create new span - if (tracer().needsRescoping(attachedContext)) { - attachedContext = - tracer().updateContext(attachedContext, httpServletRequest, mappingResolver, servlet); - scope = attachedContext.makeCurrent(); - return; - } - - // We already have attached context to request but this could have been done by app server - // instrumentation, if needed update span with info from current request. - Context currentContext = Java8BytecodeBridge.currentContext(); - Context updatedContext = - tracer().updateContext(currentContext, httpServletRequest, mappingResolver, servlet); - if (updatedContext != currentContext) { - // runOnceUnderAppServer updated context, need to re-scope - scope = updatedContext.makeCurrent(); - } return; } Context currentContext = Java8BytecodeBridge.currentContext(); - if (currentContext != null - && Java8BytecodeBridge.spanFromContext(currentContext).isRecording()) { - // We already have a span but it was not created by servlet instrumentation. - // In case it was created by app server integration we need to update it with info from - // current request. + if (attachedContext != null + || Java8BytecodeBridge.spanFromContext(currentContext).isRecording()) { + // Update context with info from current request to ensure that server span gets the best + // possible name. + // In case server span was created by app server instrumentations calling updateContext + // returns a new context that contains servlet context path that is used in other + // instrumentations for naming server span. Context updatedContext = tracer().updateContext(currentContext, httpServletRequest, mappingResolver, servlet); if (currentContext != updatedContext) { // updateContext updated context, need to re-scope scope = updatedContext.makeCurrent(); } + // We are inside nested servlet/filter/app-server span, don't create new span return; } diff --git a/instrumentation/servlet/servlet-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v5_0/service/JakartaServletServiceAdvice.java b/instrumentation/servlet/servlet-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v5_0/service/JakartaServletServiceAdvice.java index 9f05f7901e..33e6d0cf73 100644 --- a/instrumentation/servlet/servlet-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v5_0/service/JakartaServletServiceAdvice.java +++ b/instrumentation/servlet/servlet-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v5_0/service/JakartaServletServiceAdvice.java @@ -54,39 +54,29 @@ public class JakartaServletServiceAdvice { } Context attachedContext = tracer().getServerContext(httpServletRequest); - if (attachedContext != null) { + if (attachedContext != null && tracer().needsRescoping(attachedContext)) { + attachedContext = + tracer().updateContext(attachedContext, httpServletRequest, mappingResolver, servlet); + scope = attachedContext.makeCurrent(); // We are inside nested servlet/filter/app-server span, don't create new span - if (tracer().needsRescoping(attachedContext)) { - attachedContext = - tracer().updateContext(attachedContext, httpServletRequest, mappingResolver, servlet); - scope = attachedContext.makeCurrent(); - return; - } - - // We already have attached context to request but this could have been done by app server - // instrumentation, if needed update span with info from current request. - Context currentContext = Java8BytecodeBridge.currentContext(); - Context updatedContext = - tracer().updateContext(currentContext, httpServletRequest, mappingResolver, servlet); - if (updatedContext != currentContext) { - // runOnceUnderAppServer updated context, need to re-scope - scope = updatedContext.makeCurrent(); - } return; } Context currentContext = Java8BytecodeBridge.currentContext(); - if (currentContext != null - && Java8BytecodeBridge.spanFromContext(currentContext).isRecording()) { - // We already have a span but it was not created by servlet instrumentation. - // In case it was created by app server integration we need to update it with info from - // current request. + if (attachedContext != null + || Java8BytecodeBridge.spanFromContext(currentContext).isRecording()) { + // Update context with info from current request to ensure that server span gets the best + // possible name. + // In case server span was created by app server instrumentations calling updateContext + // returns a new context that contains servlet context path that is used in other + // instrumentations for naming server span. Context updatedContext = tracer().updateContext(currentContext, httpServletRequest, mappingResolver, servlet); if (currentContext != updatedContext) { // updateContext updated context, need to re-scope scope = updatedContext.makeCurrent(); } + // We are inside nested servlet/filter/app-server span, don't create new span return; }