From 0fbdcad1dd40358c2cf02428dee51bbf926cdb88 Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Fri, 12 Feb 2021 12:12:40 +0100 Subject: [PATCH] Make BaseTracer#startSpan() return Context (#2232) * Make BaseTracer#startSpan() return Context * Update instrumentation/apache-camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/CamelEventNotifier.java Co-authored-by: Trask Stalnaker * spotless * Add Javadocs to BaseTracer Co-authored-by: Trask Stalnaker --- .../api/tracer/BaseTracer.java | 64 +++++++++++++++++-- .../api/tracer/utils/NetPeerUtils.java | 8 ++- .../apachecamel/CamelEventNotifier.java | 5 +- .../dropwizardviews/DropwizardTracer.java | 6 -- .../DropwizardViewsInstrumentationModule.java | 14 ++-- .../extannotations/TraceAdvice.java | 14 ++-- .../finatra/FinatraInstrumentationModule.java | 23 +++---- .../grpc/v1_5/client/GrpcClientTracer.java | 19 +++--- .../v1_5/client/TracingClientInterceptor.java | 36 ++++++----- .../JdbcDataSourceInstrumentationModule.java | 14 ++-- .../jsp/HttpJspPageInstrumentation.java | 16 ++--- .../JspCompilationContextInstrumentation.java | 16 ++--- .../instrumentation/jsp/JspTracer.java | 8 ++- .../kafkaclients/KafkaProducerTracer.java | 9 +-- .../instrumentation/methods/MethodAdvice.java | 14 ++-- .../ChannelFutureListenerInstrumentation.java | 7 +- .../ChannelFutureListenerInstrumentation.java | 7 +- .../ChannelFutureListenerInstrumentation.java | 7 +- .../otelannotations/WithSpanTracer.java | 3 +- .../instrumentation/play/v2_3/PlayAdvice.java | 14 ++-- .../play/v2_3/RequestCompleteCallback.java | 12 ++-- .../instrumentation/play/v2_4/PlayAdvice.java | 17 ++--- .../play/v2_4/RequestCompleteCallback.java | 12 ++-- .../instrumentation/play/v2_6/PlayAdvice.java | 17 ++--- .../play/v2_6/RequestCompleteCallback.java | 12 ++-- .../rabbitmq/RabbitTracer.java | 25 ++++---- .../ratpack/ErrorHandlerAdvice.java | 11 ++-- .../ratpack/RatpackTracer.java | 6 +- .../ratpack/TracingHandler.java | 14 ++-- .../RmiClientInstrumentationModule.java | 14 ++-- .../rmi/client/RmiClientTracer.java | 17 ++--- .../rxjava/TracedOnSubscribe.java | 11 ++-- ...equestDispatcherInstrumentationModule.java | 15 ++--- ...pServletResponseInstrumentationModule.java | 16 ++--- .../spring/batch/item/ItemTracer.java | 9 +-- .../spring/batch/job/JobExecutionTracer.java | 4 +- .../batch/step/StepExecutionTracer.java | 4 +- .../data/SpringDataInstrumentationModule.java | 16 ++--- .../SpringSchedulingRunnableWrapper.java | 11 ++-- .../scheduling/SpringSchedulingTracer.java | 8 ++- .../server/DispatcherHandlerAdvice.java | 6 +- .../ws/AnnotatedMethodInstrumentation.java | 14 ++-- .../spring/ws/SpringWsTracer.java | 16 +++-- 43 files changed, 321 insertions(+), 270 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/BaseTracer.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/BaseTracer.java index 366e83a87b..2a9a7d927b 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/BaseTracer.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/BaseTracer.java @@ -8,6 +8,7 @@ package io.opentelemetry.instrumentation.api.tracer; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.Tracer; @@ -21,6 +22,20 @@ import java.lang.reflect.Method; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +/** + * Base class for all instrumentation specific tracer implementations. + * + *

Tracers should not use {@link Span} directly in their public APIs: ideally all lifecycle + * methods (ex. start/end methods) should return/accept {@link Context}. + * + *

The {@link BaseTracer} offers several {@code startSpan()} utility methods for creating bare + * spans without any attributes. If you want to provide some additional attributes on span start + * please consider writing your own specific {@code startSpan()} method in the your tracer. + * + *

When constructing {@link Span}s tracers should set all attributes available during + * construction on a {@link SpanBuilder} instead of a {@link Span}. This way {@code SpanProcessor}s + * are able to see those attributes in the {@code onStart()} method and can freely read/modify them. + */ public abstract class BaseTracer { // Keeps track of the server span for the current trace. // TODO(anuraaga): Should probably be renamed to local root key since it could be a consumer span @@ -61,18 +76,29 @@ public abstract class BaseTracer { return propagators; } - public Span startSpan(Class clazz) { - String spanName = spanNameForClass(clazz); + public Context startSpan(Class clazz) { + return startSpan(spanNameForClass(clazz)); + } + + public Context startSpan(Method method) { + return startSpan(spanNameForMethod(method)); + } + + public Context startSpan(String spanName) { return startSpan(spanName, SpanKind.INTERNAL); } - public Span startSpan(Method method) { - String spanName = spanNameForMethod(method); - return startSpan(spanName, SpanKind.INTERNAL); + public Context startSpan(String spanName, SpanKind kind) { + return startSpan(Context.current(), spanName, kind); } - public Span startSpan(String spanName, SpanKind kind) { - return tracer.spanBuilder(spanName).setSpanKind(kind).startSpan(); + public Context startSpan(Context parentContext, String spanName, SpanKind kind) { + Span span = spanBuilder(spanName, kind).setParent(parentContext).startSpan(); + return parentContext.with(span); + } + + protected SpanBuilder spanBuilder(String spanName, SpanKind kind) { + return tracer.spanBuilder(spanName).setSpanKind(kind); } protected final Context withClientSpan(Context parentContext, Span span) { @@ -157,10 +183,22 @@ public abstract class BaseTracer { end(Span.fromContext(context), endTimeNanos); } + /** + * End span. + * + * @deprecated Use {@link #end(Context)} instead. + */ + @Deprecated public void end(Span span) { end(span, -1); } + /** + * End span. + * + * @deprecated Use {@link #end(Context, long)} instead. + */ + @Deprecated public void end(Span span, long endTimeNanos) { if (endTimeNanos > 0) { span.end(endTimeNanos, TimeUnit.NANOSECONDS); @@ -177,10 +215,22 @@ public abstract class BaseTracer { endExceptionally(Span.fromContext(context), throwable, endTimeNanos); } + /** + * End span. + * + * @deprecated Use {@link #endExceptionally(Context, Throwable)} instead. + */ + @Deprecated public void endExceptionally(Span span, Throwable throwable) { endExceptionally(span, throwable, -1); } + /** + * End span. + * + * @deprecated Use {@link #endExceptionally(Context, Throwable, long)} instead. + */ + @Deprecated public void endExceptionally(Span span, Throwable throwable, long endTimeNanos) { span.setStatus(StatusCode.ERROR); onError(span, unwrapThrowable(throwable)); diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/utils/NetPeerUtils.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/utils/NetPeerUtils.java index 1860b899be..ad628346b7 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/utils/NetPeerUtils.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/utils/NetPeerUtils.java @@ -32,7 +32,11 @@ public final class NetPeerUtils { if (remoteConnection != null) { InetAddress remoteAddress = remoteConnection.getAddress(); if (remoteAddress != null) { - setNetPeer(span, remoteAddress, remoteConnection.getPort()); + setNetPeer( + span::setAttribute, + remoteAddress.getHostName(), + remoteAddress.getHostAddress(), + remoteConnection.getPort()); } else { // Failed DNS lookup, the host string is the name. setNetPeer( @@ -41,7 +45,7 @@ public final class NetPeerUtils { } } - public void setNetPeer(Span span, InetAddress remoteAddress, int port) { + public void setNetPeer(SpanBuilder span, InetAddress remoteAddress, int port) { setNetPeer( span::setAttribute, remoteAddress.getHostName(), remoteAddress.getHostAddress(), port); } diff --git a/instrumentation/apache-camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/CamelEventNotifier.java b/instrumentation/apache-camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/CamelEventNotifier.java index 7413db5b09..68604d99b2 100644 --- a/instrumentation/apache-camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/CamelEventNotifier.java +++ b/instrumentation/apache-camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/CamelEventNotifier.java @@ -59,10 +59,11 @@ final class CamelEventNotifier extends EventNotifierSupport { String name = sd.getOperationName(ese.getExchange(), ese.getEndpoint(), CamelDirection.OUTBOUND); - Span span = CamelTracer.TRACER.startSpan(name, sd.getInitiatorSpanKind()); + Context context = CamelTracer.TRACER.startSpan(name, sd.getInitiatorSpanKind()); + Span span = Span.fromContext(context); sd.pre(span, ese.getExchange(), ese.getEndpoint(), CamelDirection.OUTBOUND); ActiveSpanManager.activate(ese.getExchange(), span, sd.getInitiatorSpanKind()); - CamelPropagationUtil.injectParent(Context.current(), ese.getExchange().getIn().getHeaders()); + CamelPropagationUtil.injectParent(context, ese.getExchange().getIn().getHeaders()); LOG.debug("[Exchange sending] Initiator span started: {}", span); } diff --git a/instrumentation/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardTracer.java b/instrumentation/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardTracer.java index cf757d6706..73808343cc 100644 --- a/instrumentation/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardTracer.java +++ b/instrumentation/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardTracer.java @@ -5,8 +5,6 @@ package io.opentelemetry.javaagent.instrumentation.dropwizardviews; -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; public class DropwizardTracer extends BaseTracer { @@ -16,10 +14,6 @@ public class DropwizardTracer extends BaseTracer { return TRACER; } - public Span startSpan(String spanName) { - return super.startSpan(spanName, SpanKind.INTERNAL); - } - @Override protected String getInstrumentationName() { return "io.opentelemetry.javaagent.dropwizard-views"; diff --git a/instrumentation/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardViewsInstrumentationModule.java b/instrumentation/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardViewsInstrumentationModule.java index 7c37f7ed8a..a3ccf970d0 100644 --- a/instrumentation/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardViewsInstrumentationModule.java +++ b/instrumentation/dropwizard-views-0.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardviews/DropwizardViewsInstrumentationModule.java @@ -17,7 +17,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; import io.dropwizard.views.View; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; import io.opentelemetry.javaagent.tooling.InstrumentationModule; @@ -67,27 +67,27 @@ public class DropwizardViewsInstrumentationModule extends InstrumentationModule @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(0) View view, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { if (Java8BytecodeBridge.currentSpan().getSpanContext().isValid()) { - span = tracer().startSpan("Render " + view.getTemplateName()); - scope = span.makeCurrent(); + context = tracer().startSpan("Render " + view.getTemplateName()); + scope = context.makeCurrent(); } } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( @Advice.Thrown Throwable throwable, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { if (scope == null) { return; } scope.close(); if (throwable == null) { - tracer().end(span); + tracer().end(context); } else { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } } } diff --git a/instrumentation/external-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extannotations/TraceAdvice.java b/instrumentation/external-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extannotations/TraceAdvice.java index 4ae3942772..2a64fed7ff 100644 --- a/instrumentation/external-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extannotations/TraceAdvice.java +++ b/instrumentation/external-annotations/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/extannotations/TraceAdvice.java @@ -7,7 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.extannotations; import static io.opentelemetry.javaagent.instrumentation.extannotations.TraceAnnotationTracer.tracer; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import java.lang.reflect.Method; import net.bytebuddy.asm.Advice; @@ -17,22 +17,22 @@ public class TraceAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Origin Method method, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan(method); - scope = span.makeCurrent(); + context = tracer().startSpan(method); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope, @Advice.Thrown Throwable throwable) { scope.close(); if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - tracer().end(span); + tracer().end(context); } } } diff --git a/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraInstrumentationModule.java b/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraInstrumentationModule.java index 6eb38ab271..58d4a853a6 100644 --- a/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraInstrumentationModule.java +++ b/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraInstrumentationModule.java @@ -22,6 +22,7 @@ import com.twitter.finatra.http.contexts.RouteInfo; import com.twitter.util.Future; import com.twitter.util.FutureEventListener; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; import io.opentelemetry.javaagent.tooling.InstrumentationModule; @@ -74,7 +75,7 @@ public class FinatraInstrumentationModule extends InstrumentationModule { public static void nameSpan( @Advice.FieldValue("routeInfo") RouteInfo routeInfo, @Advice.FieldValue("clazz") Class clazz, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { Span serverSpan = BaseTracer.getCurrentServerSpan(); @@ -82,15 +83,15 @@ public class FinatraInstrumentationModule extends InstrumentationModule { serverSpan.updateName(routeInfo.path()); } - span = tracer().startSpan(clazz); - scope = span.makeCurrent(); + context = tracer().startSpan(clazz); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void setupCallback( @Advice.Thrown Throwable throwable, @Advice.Return Some> responseOption, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { if (scope == null) { @@ -99,33 +100,33 @@ public class FinatraInstrumentationModule extends InstrumentationModule { if (throwable != null) { scope.close(); - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); return; } - responseOption.get().addEventListener(new Listener(span, scope)); + responseOption.get().addEventListener(new Listener(context, scope)); } } public static class Listener implements FutureEventListener { - private final Span span; + private final Context context; private final Scope scope; - public Listener(Span span, Scope scope) { - this.span = span; + public Listener(Context context, Scope scope) { + this.context = context; this.scope = scope; } @Override public void onSuccess(Response response) { scope.close(); - tracer().end(span); + tracer().end(context); } @Override public void onFailure(Throwable cause) { scope.close(); - tracer().endExceptionally(span, cause); + tracer().endExceptionally(context, cause); } } } diff --git a/instrumentation/grpc-1.5/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_5/client/GrpcClientTracer.java b/instrumentation/grpc-1.5/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_5/client/GrpcClientTracer.java index 95e80f5174..457f3d57be 100644 --- a/instrumentation/grpc-1.5/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_5/client/GrpcClientTracer.java +++ b/instrumentation/grpc-1.5/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_5/client/GrpcClientTracer.java @@ -9,8 +9,8 @@ import static io.opentelemetry.api.trace.SpanKind.CLIENT; import io.grpc.Status; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.RpcClientTracer; import io.opentelemetry.instrumentation.grpc.v1_5.common.GrpcHelper; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; @@ -28,15 +28,18 @@ public class GrpcClientTracer extends RpcClientTracer { return "grpc"; } - public Span startSpan(String name) { - SpanBuilder spanBuilder = tracer.spanBuilder(name).setSpanKind(CLIENT); - spanBuilder.setAttribute(SemanticAttributes.RPC_SYSTEM, getRpcSystem()); - return spanBuilder.startSpan(); + public Context startSpan(String name) { + Span span = + spanBuilder(name, CLIENT) + .setAttribute(SemanticAttributes.RPC_SYSTEM, getRpcSystem()) + .startSpan(); + return Context.current().with(span); } - public void endSpan(Span span, Status status) { - span.setStatus(GrpcHelper.statusFromGrpcStatus(status), status.getDescription()); - end(span); + public void end(Context context, Status status) { + Span.fromContext(context) + .setStatus(GrpcHelper.statusFromGrpcStatus(status), status.getDescription()); + end(context); } @Override diff --git a/instrumentation/grpc-1.5/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_5/client/TracingClientInterceptor.java b/instrumentation/grpc-1.5/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_5/client/TracingClientInterceptor.java index e2d9ac8dc8..f3956442b4 100644 --- a/instrumentation/grpc-1.5/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_5/client/TracingClientInterceptor.java +++ b/instrumentation/grpc-1.5/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_5/client/TracingClientInterceptor.java @@ -54,16 +54,16 @@ public class TracingClientInterceptor implements ClientInterceptor { public ClientCall interceptCall( MethodDescriptor method, CallOptions callOptions, Channel next) { String methodName = method.getFullMethodName(); - Span span = tracer.startSpan(methodName); + Context context = tracer.startSpan(methodName); + Span span = Span.fromContext(context); GrpcHelper.prepareSpan(span, methodName); - Context context = Context.current().with(span); final ClientCall result; try (Scope ignored = context.makeCurrent()) { try { // call other interceptors result = next.newCall(method, callOptions); } catch (Throwable e) { - tracer.endExceptionally(span, e); + tracer.endExceptionally(context, e); throw e; } } @@ -98,20 +98,20 @@ public class TracingClientInterceptor implements ClientInterceptor { @Override public void start(Listener responseListener, Metadata headers) { GlobalOpenTelemetry.getPropagators().getTextMapPropagator().inject(context, headers, SETTER); - try (Scope ignored = span.makeCurrent()) { - super.start(new TracingClientCallListener<>(responseListener, span, tracer), headers); + try (Scope ignored = context.makeCurrent()) { + super.start(new TracingClientCallListener<>(responseListener, context, tracer), headers); } catch (Throwable e) { - tracer.endExceptionally(span, e); + tracer.endExceptionally(context, e); throw e; } } @Override public void sendMessage(REQUEST message) { - try (Scope ignored = span.makeCurrent()) { + try (Scope ignored = context.makeCurrent()) { super.sendMessage(message); } catch (Throwable e) { - tracer.endExceptionally(span, e); + tracer.endExceptionally(context, e); throw e; } } @@ -119,24 +119,26 @@ public class TracingClientInterceptor implements ClientInterceptor { static final class TracingClientCallListener extends ForwardingClientCallListener.SimpleForwardingClientCallListener { - private final Span span; + private final Context context; private final GrpcClientTracer tracer; private final AtomicLong messageId = new AtomicLong(); - TracingClientCallListener(Listener delegate, Span span, GrpcClientTracer tracer) { + TracingClientCallListener( + Listener delegate, Context context, GrpcClientTracer tracer) { super(delegate); - this.span = span; + this.context = context; this.tracer = tracer; } @Override public void onMessage(RESPONSE message) { + Span span = Span.fromContext(context); Attributes attributes = Attributes.of( GrpcHelper.MESSAGE_TYPE, "SENT", GrpcHelper.MESSAGE_ID, messageId.incrementAndGet()); span.addEvent("message", attributes); - try (Scope ignored = span.makeCurrent()) { + try (Scope ignored = context.makeCurrent()) { delegate().onMessage(message); } catch (Throwable e) { tracer.addThrowable(span, e); @@ -145,21 +147,21 @@ public class TracingClientInterceptor implements ClientInterceptor { @Override public void onClose(Status status, Metadata trailers) { - try (Scope ignored = span.makeCurrent()) { + try (Scope ignored = context.makeCurrent()) { delegate().onClose(status, trailers); } catch (Throwable e) { - tracer.endExceptionally(span, e); + tracer.endExceptionally(context, e); throw e; } - tracer.endSpan(span, status); + tracer.end(context, status); } @Override public void onReady() { - try (Scope ignored = span.makeCurrent()) { + try (Scope ignored = context.makeCurrent()) { delegate().onReady(); } catch (Throwable e) { - tracer.endExceptionally(span, e); + tracer.endExceptionally(context, e); throw e; } } diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcDataSourceInstrumentationModule.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcDataSourceInstrumentationModule.java index 4c9bf68a31..b57d3ec624 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcDataSourceInstrumentationModule.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcDataSourceInstrumentationModule.java @@ -13,7 +13,7 @@ import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; import io.opentelemetry.javaagent.tooling.InstrumentationModule; @@ -59,7 +59,7 @@ public class JdbcDataSourceInstrumentationModule extends InstrumentationModule { @Advice.OnMethodEnter(suppress = Throwable.class) public static void start( @Advice.This DataSource ds, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { // TODO this is very strange condition if (!Java8BytecodeBridge.currentSpan().getSpanContext().isValid()) { @@ -67,13 +67,13 @@ public class JdbcDataSourceInstrumentationModule extends InstrumentationModule { return; } - span = tracer().startSpan(ds.getClass().getSimpleName() + ".getConnection", CLIENT); - scope = span.makeCurrent(); + context = tracer().startSpan(ds.getClass().getSimpleName() + ".getConnection", CLIENT); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope, @Advice.Thrown Throwable throwable) { if (scope == null) { @@ -82,9 +82,9 @@ public class JdbcDataSourceInstrumentationModule extends InstrumentationModule { scope.close(); if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - tracer().end(span); + tracer().end(context); } } } diff --git a/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/HttpJspPageInstrumentation.java b/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/HttpJspPageInstrumentation.java index 1f62048b59..74946e50c6 100644 --- a/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/HttpJspPageInstrumentation.java +++ b/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/HttpJspPageInstrumentation.java @@ -13,8 +13,8 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; @@ -51,24 +51,24 @@ public class HttpJspPageInstrumentation implements TypeInstrumentation { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(0) HttpServletRequest req, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan(tracer().spanNameOnRender(req), SpanKind.INTERNAL); - tracer().onRender(span, req); - scope = span.makeCurrent(); + context = tracer().startSpan(tracer().spanNameOnRender(req), SpanKind.INTERNAL); + tracer().onRender(context, req); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( @Advice.Thrown Throwable throwable, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { scope.close(); if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - tracer().end(span); + tracer().end(context); } } } diff --git a/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspCompilationContextInstrumentation.java b/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspCompilationContextInstrumentation.java index c9d02f2360..e0ceac9dca 100644 --- a/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspCompilationContextInstrumentation.java +++ b/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspCompilationContextInstrumentation.java @@ -11,8 +11,8 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; @@ -41,28 +41,28 @@ public class JspCompilationContextInstrumentation implements TypeInstrumentation @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.This JspCompilationContext jspCompilationContext, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = + context = tracer().startSpan(tracer().spanNameOnCompile(jspCompilationContext), SpanKind.INTERNAL); - scope = span.makeCurrent(); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( @Advice.This JspCompilationContext jspCompilationContext, @Advice.Thrown Throwable throwable, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { scope.close(); // Decorate on return because additional properties are available - tracer().onCompile(span, jspCompilationContext); + tracer().onCompile(context, jspCompilationContext); if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - tracer().end(span); + tracer().end(context); } } } diff --git a/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspTracer.java b/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspTracer.java index cd6f2de88e..6ad98a1340 100644 --- a/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspTracer.java +++ b/instrumentation/jsp-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspTracer.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.jsp; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; import java.net.URI; import java.net.URISyntaxException; @@ -29,8 +30,9 @@ public class JspTracer extends BaseTracer { : "Compile " + jspCompilationContext.getJspFile(); } - public void onCompile(Span span, JspCompilationContext jspCompilationContext) { + public void onCompile(Context context, JspCompilationContext jspCompilationContext) { if (jspCompilationContext != null) { + Span span = Span.fromContext(context); Compiler compiler = jspCompilationContext.getCompiler(); if (compiler != null) { span.setAttribute("jsp.compiler", compiler.getClass().getName()); @@ -49,7 +51,9 @@ public class JspTracer extends BaseTracer { return "Render " + spanName; } - public void onRender(Span span, HttpServletRequest req) { + public void onRender(Context context, HttpServletRequest req) { + Span span = Span.fromContext(context); + Object forwardOrigin = req.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH); if (forwardOrigin instanceof String) { span.setAttribute("jsp.forwardOrigin", forwardOrigin.toString()); diff --git a/instrumentation/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/KafkaProducerTracer.java b/instrumentation/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/KafkaProducerTracer.java index 907749553b..975a06c6b2 100644 --- a/instrumentation/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/KafkaProducerTracer.java +++ b/instrumentation/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/KafkaProducerTracer.java @@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.kafkaclients; import static io.opentelemetry.api.trace.SpanKind.PRODUCER; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import org.apache.kafka.clients.ApiVersions; @@ -22,9 +23,9 @@ public class KafkaProducerTracer extends BaseTracer { } public Span startProducerSpan(ProducerRecord record) { - Span span = startSpan(spanNameOnProduce(record), PRODUCER); + SpanBuilder span = spanBuilder(spanNameOnProduce(record), PRODUCER); onProduce(span, record); - return span; + return span.startSpan(); } // Do not inject headers for batch versions below 2 @@ -43,14 +44,14 @@ public class KafkaProducerTracer extends BaseTracer { return record.topic() + " send"; } - public void onProduce(Span span, ProducerRecord record) { + public void onProduce(SpanBuilder span, ProducerRecord record) { span.setAttribute(SemanticAttributes.MESSAGING_SYSTEM, "kafka"); span.setAttribute(SemanticAttributes.MESSAGING_DESTINATION_KIND, "topic"); span.setAttribute(SemanticAttributes.MESSAGING_DESTINATION, record.topic()); Integer partition = record.partition(); if (partition != null) { - span.setAttribute(SemanticAttributes.MESSAGING_KAFKA_PARTITION, partition); + span.setAttribute(SemanticAttributes.MESSAGING_KAFKA_PARTITION, partition.longValue()); } if (record.value() == null) { span.setAttribute(SemanticAttributes.MESSAGING_KAFKA_TOMBSTONE, true); diff --git a/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodAdvice.java b/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodAdvice.java index cefaaf5553..e85c20a057 100644 --- a/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodAdvice.java +++ b/instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodAdvice.java @@ -7,7 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.methods; import static io.opentelemetry.javaagent.instrumentation.methods.MethodTracer.tracer; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import java.lang.reflect.Method; import net.bytebuddy.asm.Advice; @@ -17,22 +17,22 @@ public class MethodAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Origin Method method, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan(method); - scope = span.makeCurrent(); + context = tracer().startSpan(method); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope, @Advice.Thrown Throwable throwable) { scope.close(); if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - tracer().end(span); + tracer().end(context); } } } diff --git a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java index 9cb71280fb..68c6ad8691 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java +++ b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.netty.v3_8; +import static io.opentelemetry.javaagent.instrumentation.netty.v3_8.client.NettyHttpClientTracer.tracer; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed; import static java.util.Collections.singletonMap; @@ -12,13 +13,11 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; -import io.opentelemetry.javaagent.instrumentation.netty.v3_8.client.NettyHttpClientTracer; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -75,8 +74,8 @@ public class ChannelFutureListenerInstrumentation implements TypeInstrumentation } // TODO pass Context into Tracer.startSpan() and then don't need this scoping Scope parentScope = parentContext.makeCurrent(); - Span errorSpan = NettyHttpClientTracer.tracer().startSpan("CONNECT", SpanKind.CLIENT); - NettyHttpClientTracer.tracer().endExceptionally(errorSpan, cause); + Context errorContext = tracer().startSpan("CONNECT", SpanKind.CLIENT); + tracer().endExceptionally(errorContext, cause); return parentScope; } diff --git a/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/ChannelFutureListenerInstrumentation.java b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/ChannelFutureListenerInstrumentation.java index 202174ecbc..60ffbbbd69 100644 --- a/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/ChannelFutureListenerInstrumentation.java +++ b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/ChannelFutureListenerInstrumentation.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.netty.v4_0; +import static io.opentelemetry.javaagent.instrumentation.netty.v4_0.client.NettyHttpClientTracer.tracer; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed; import static java.util.Collections.singletonMap; @@ -13,11 +14,9 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import io.netty.channel.ChannelFuture; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.instrumentation.netty.v4_0.client.NettyHttpClientTracer; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -63,8 +62,8 @@ public class ChannelFutureListenerInstrumentation implements TypeInstrumentation return null; } Scope parentScope = parentContext.makeCurrent(); - Span span = NettyHttpClientTracer.tracer().startSpan("CONNECT", SpanKind.CLIENT); - NettyHttpClientTracer.tracer().endExceptionally(span, cause); + Context errorContext = tracer().startSpan("CONNECT", SpanKind.CLIENT); + tracer().endExceptionally(errorContext, cause); return parentScope; } diff --git a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/ChannelFutureListenerInstrumentation.java b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/ChannelFutureListenerInstrumentation.java index e7d064f872..db178f25b8 100644 --- a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/ChannelFutureListenerInstrumentation.java +++ b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/ChannelFutureListenerInstrumentation.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.netty.v4_1; +import static io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.NettyHttpClientTracer.tracer; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed; import static java.util.Collections.singletonMap; @@ -13,12 +14,10 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import io.netty.channel.ChannelFuture; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.netty.v4_1.AttributeKeys; -import io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.NettyHttpClientTracer; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -64,8 +63,8 @@ public class ChannelFutureListenerInstrumentation implements TypeInstrumentation return null; } Scope parentScope = parentContext.makeCurrent(); - Span errorSpan = NettyHttpClientTracer.tracer().startSpan("CONNECT", SpanKind.CLIENT); - NettyHttpClientTracer.tracer().endExceptionally(errorSpan, cause); + Context errorContext = tracer().startSpan("CONNECT", SpanKind.CLIENT); + tracer().endExceptionally(errorContext, cause); return parentScope; } diff --git a/instrumentation/opentelemetry-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/otelannotations/WithSpanTracer.java b/instrumentation/opentelemetry-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/otelannotations/WithSpanTracer.java index 1e15ed26c6..d5535d35f1 100644 --- a/instrumentation/opentelemetry-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/otelannotations/WithSpanTracer.java +++ b/instrumentation/opentelemetry-annotations-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/otelannotations/WithSpanTracer.java @@ -35,7 +35,8 @@ public class WithSpanTracer extends BaseTracer { Method method, io.opentelemetry.api.trace.SpanKind kind) { io.opentelemetry.api.trace.Span span = - startSpan(spanNameForMethodWithAnnotation(applicationAnnotation, method), kind); + spanBuilder(spanNameForMethodWithAnnotation(applicationAnnotation, method), kind) + .startSpan(); if (kind == io.opentelemetry.api.trace.SpanKind.SERVER) { return withServerSpan(context, span); } diff --git a/instrumentation/play/play-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/PlayAdvice.java b/instrumentation/play/play-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/PlayAdvice.java index 7fc7c409f7..b6f0c365ed 100644 --- a/instrumentation/play/play-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/PlayAdvice.java +++ b/instrumentation/play/play-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/PlayAdvice.java @@ -7,8 +7,8 @@ package io.opentelemetry.javaagent.instrumentation.play.v2_3; import static io.opentelemetry.javaagent.instrumentation.play.v2_3.PlayTracer.tracer; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; import net.bytebuddy.asm.Advice; @@ -22,10 +22,10 @@ public class PlayAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(0) final Request req, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan("play.request", SpanKind.INTERNAL); - scope = span.makeCurrent(); + context = tracer().startSpan("play.request", SpanKind.INTERNAL); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) @@ -34,16 +34,16 @@ public class PlayAdvice { @Advice.Thrown Throwable throwable, @Advice.Argument(0) Request req, @Advice.Return(readOnly = false) Future responseFuture, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { scope.close(); // span finished in RequestCompleteCallback if (throwable == null) { responseFuture.onComplete( - new RequestCompleteCallback(span), ((Action) thisAction).executionContext()); + new RequestCompleteCallback(context), ((Action) thisAction).executionContext()); } else { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } // set the span name on the upstream akka/netty span diff --git a/instrumentation/play/play-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/RequestCompleteCallback.java b/instrumentation/play/play-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/RequestCompleteCallback.java index c56e65522d..eaeece1511 100644 --- a/instrumentation/play/play-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/RequestCompleteCallback.java +++ b/instrumentation/play/play-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/RequestCompleteCallback.java @@ -7,7 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.play.v2_3; import static io.opentelemetry.javaagent.instrumentation.play.v2_3.PlayTracer.tracer; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import play.api.mvc.Result; @@ -17,19 +17,19 @@ public class RequestCompleteCallback extends scala.runtime.AbstractFunction1 result) { try { if (result.isFailure()) { - tracer().endExceptionally(span, result.failed().get()); + tracer().endExceptionally(context, result.failed().get()); } else { - tracer().end(span); + tracer().end(context); } } catch (Throwable t) { log.debug("error in play instrumentation", t); diff --git a/instrumentation/play/play-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/PlayAdvice.java b/instrumentation/play/play-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/PlayAdvice.java index f83da968fa..d339a5d04a 100644 --- a/instrumentation/play/play-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/PlayAdvice.java +++ b/instrumentation/play/play-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/PlayAdvice.java @@ -7,10 +7,11 @@ package io.opentelemetry.javaagent.instrumentation.play.v2_4; import static io.opentelemetry.javaagent.instrumentation.play.v2_4.PlayTracer.tracer; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; +import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; import net.bytebuddy.asm.Advice; import play.api.mvc.Action; import play.api.mvc.Headers; @@ -22,10 +23,10 @@ public class PlayAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(0) Request req, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan("play.request", SpanKind.INTERNAL); - scope = span.makeCurrent(); + context = tracer().startSpan("play.request", SpanKind.INTERNAL); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) @@ -34,18 +35,18 @@ public class PlayAdvice { @Advice.Thrown Throwable throwable, @Advice.Argument(0) Request req, @Advice.Return(readOnly = false) Future responseFuture, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { // Call onRequest on return after tags are populated. - tracer().updateSpanName(span, req); + tracer().updateSpanName(Java8BytecodeBridge.spanFromContext(context), req); scope.close(); // span finished in RequestCompleteCallback if (throwable == null) { responseFuture.onComplete( - new RequestCompleteCallback(span), ((Action) thisAction).executionContext()); + new RequestCompleteCallback(context), ((Action) thisAction).executionContext()); } else { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } // set the span name on the upstream akka/netty span diff --git a/instrumentation/play/play-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/RequestCompleteCallback.java b/instrumentation/play/play-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/RequestCompleteCallback.java index abcd254b9f..64aeebe6e3 100644 --- a/instrumentation/play/play-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/RequestCompleteCallback.java +++ b/instrumentation/play/play-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/RequestCompleteCallback.java @@ -7,7 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.play.v2_4; import static io.opentelemetry.javaagent.instrumentation.play.v2_4.PlayTracer.tracer; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import play.api.mvc.Result; @@ -17,19 +17,19 @@ public class RequestCompleteCallback extends scala.runtime.AbstractFunction1 result) { try { if (result.isFailure()) { - tracer().endExceptionally(span, result.failed().get()); + tracer().endExceptionally(context, result.failed().get()); } else { - tracer().end(span); + tracer().end(context); } } catch (Throwable t) { log.debug("error in play instrumentation", t); diff --git a/instrumentation/play/play-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAdvice.java b/instrumentation/play/play-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAdvice.java index 046bded08a..d5f87d69d6 100644 --- a/instrumentation/play/play-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAdvice.java +++ b/instrumentation/play/play-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayAdvice.java @@ -7,10 +7,11 @@ package io.opentelemetry.javaagent.instrumentation.play.v2_6; import static io.opentelemetry.javaagent.instrumentation.play.v2_6.PlayTracer.tracer; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; +import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; import net.bytebuddy.asm.Advice; import play.api.mvc.Action; import play.api.mvc.Request; @@ -21,10 +22,10 @@ public class PlayAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(0) Request req, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan("play.request", SpanKind.INTERNAL); - scope = span.makeCurrent(); + context = tracer().startSpan("play.request", SpanKind.INTERNAL); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) @@ -33,18 +34,18 @@ public class PlayAdvice { @Advice.Thrown Throwable throwable, @Advice.Argument(0) Request req, @Advice.Return(readOnly = false) Future responseFuture, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { // Call onRequest on return after tags are populated. - tracer().updateSpanName(span, req); + tracer().updateSpanName(Java8BytecodeBridge.spanFromContext(context), req); scope.close(); // span finished in RequestCompleteCallback if (throwable == null) { responseFuture.onComplete( - new RequestCompleteCallback(span), ((Action) thisAction).executionContext()); + new RequestCompleteCallback(context), ((Action) thisAction).executionContext()); } else { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } // set the span name on the upstream akka/netty span diff --git a/instrumentation/play/play-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/RequestCompleteCallback.java b/instrumentation/play/play-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/RequestCompleteCallback.java index cba0231a46..0a0adda37a 100644 --- a/instrumentation/play/play-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/RequestCompleteCallback.java +++ b/instrumentation/play/play-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/RequestCompleteCallback.java @@ -7,7 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.play.v2_6; import static io.opentelemetry.javaagent.instrumentation.play.v2_6.PlayTracer.tracer; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import play.api.mvc.Result; @@ -17,19 +17,19 @@ public class RequestCompleteCallback extends scala.runtime.AbstractFunction1 result) { try { if (result.isFailure()) { - tracer().endExceptionally(span, result.failed().get()); + tracer().endExceptionally(context, result.failed().get()); } else { - tracer().end(span); + tracer().end(context); } } catch (Throwable t) { log.debug("error in play instrumentation", t); diff --git a/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitTracer.java b/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitTracer.java index 3bf27692f1..03b5fbe1bc 100644 --- a/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitTracer.java +++ b/instrumentation/rabbitmq-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitTracer.java @@ -35,13 +35,14 @@ public class RabbitTracer extends BaseTracer { public Span startSpan(String method, Connection connection) { SpanKind kind = method.equals("Channel.basicPublish") ? PRODUCER : CLIENT; - Span span = startSpan(method, kind); - span.setAttribute(SemanticAttributes.MESSAGING_SYSTEM, "rabbitmq"); - span.setAttribute(SemanticAttributes.MESSAGING_DESTINATION_KIND, "queue"); + SpanBuilder span = + spanBuilder(method, kind) + .setAttribute(SemanticAttributes.MESSAGING_SYSTEM, "rabbitmq") + .setAttribute(SemanticAttributes.MESSAGING_DESTINATION_KIND, "queue"); NetPeerUtils.INSTANCE.setNetPeer(span, connection.getAddress(), connection.getPort()); - return span; + return span.startSpan(); } public Span startGetSpan( @@ -55,20 +56,20 @@ public class RabbitTracer extends BaseTracer { .setAttribute(SemanticAttributes.MESSAGING_OPERATION, "receive") .setStartTimestamp(startTime, TimeUnit.MILLISECONDS); - Span span = spanBuilder.startSpan(); if (response != null) { - span.setAttribute( + spanBuilder.setAttribute( SemanticAttributes.MESSAGING_DESTINATION, normalizeExchangeName(response.getEnvelope().getExchange())); - span.setAttribute("messaging.rabbitmq.routing_key", response.getEnvelope().getRoutingKey()); - span.setAttribute( + spanBuilder.setAttribute( + "messaging.rabbitmq.routing_key", response.getEnvelope().getRoutingKey()); + spanBuilder.setAttribute( SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES, (long) response.getBody().length); } - NetPeerUtils.INSTANCE.setNetPeer(span, connection.getAddress(), connection.getPort()); - onGet(span, queue); + NetPeerUtils.INSTANCE.setNetPeer(spanBuilder, connection.getAddress(), connection.getPort()); + onGet(spanBuilder, queue); - return span; + return spanBuilder.startSpan(); } public Span startDeliverySpan( @@ -120,7 +121,7 @@ public class RabbitTracer extends BaseTracer { return (queue.startsWith("amq.gen-") ? "" : queue) + " receive"; } - public void onGet(Span span, String queue) { + public void onGet(SpanBuilder span, String queue) { span.setAttribute("rabbitmq.command", "basic.get"); span.setAttribute("rabbitmq.queue", queue); } diff --git a/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/ErrorHandlerAdvice.java b/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/ErrorHandlerAdvice.java index e44bd9a6ea..6991c01c34 100644 --- a/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/ErrorHandlerAdvice.java +++ b/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/ErrorHandlerAdvice.java @@ -9,6 +9,7 @@ import static io.opentelemetry.javaagent.instrumentation.ratpack.RatpackTracer.t import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; import java.util.Optional; import net.bytebuddy.asm.Advice; import ratpack.handling.Context; @@ -17,11 +18,13 @@ public class ErrorHandlerAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void captureThrowable( @Advice.Argument(0) Context ctx, @Advice.Argument(1) Throwable throwable) { - Optional span = ctx.maybeGet(Span.class); - if (span.isPresent()) { + Optional otelContext = + ctx.maybeGet(io.opentelemetry.context.Context.class); + if (otelContext.isPresent()) { // TODO this emulates old behaviour of BaseDecorator. Has to review - span.get().setStatus(StatusCode.ERROR); - tracer().addThrowable(span.get(), throwable); + Span span = Java8BytecodeBridge.spanFromContext(otelContext.get()); + span.setStatus(StatusCode.ERROR); + tracer().addThrowable(span, throwable); } } } diff --git a/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackTracer.java b/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackTracer.java index e986e79b28..ac39574db3 100644 --- a/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackTracer.java +++ b/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackTracer.java @@ -16,7 +16,7 @@ public class RatpackTracer extends BaseTracer { return TRACER; } - public Span onContext(Span span, Context ctx) { + public void onContext(io.opentelemetry.context.Context otelContext, Context ctx) { String description = ctx.getPathBinding().getDescription(); if (description == null || description.isEmpty()) { description = "/"; @@ -24,9 +24,7 @@ public class RatpackTracer extends BaseTracer { description = "/" + description; } - span.updateName(description); - - return span; + Span.fromContext(otelContext).updateName(description); } @Override diff --git a/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/TracingHandler.java b/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/TracingHandler.java index 8b329bfffe..384151b5ec 100644 --- a/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/TracingHandler.java +++ b/instrumentation/ratpack-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ratpack/TracingHandler.java @@ -8,7 +8,6 @@ package io.opentelemetry.javaagent.instrumentation.ratpack; import static io.opentelemetry.javaagent.instrumentation.ratpack.RatpackTracer.tracer; import io.netty.util.Attribute; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.netty.v4_1.AttributeKeys; @@ -25,21 +24,22 @@ public final class TracingHandler implements Handler { io.opentelemetry.context.Context serverSpanContext = spanAttribute.get(); // Relying on executor instrumentation to assume the netty span is in context as the parent. - Span ratpackSpan = tracer().startSpan("ratpack.handler", SpanKind.INTERNAL); - ctx.getExecution().add(ratpackSpan); + io.opentelemetry.context.Context ratpackContext = + tracer().startSpan("ratpack.handler", SpanKind.INTERNAL); + ctx.getExecution().add(ratpackContext); ctx.getResponse() .beforeSend( response -> { if (serverSpanContext != null) { // Rename the netty span name with the ratpack route. - tracer().onContext(Span.fromContext(serverSpanContext), ctx); + tracer().onContext(serverSpanContext, ctx); } - tracer().onContext(ratpackSpan, ctx); - tracer().end(ratpackSpan); + tracer().onContext(ratpackContext, ctx); + tracer().end(ratpackContext); }); - try (Scope ignored = ratpackSpan.makeCurrent()) { + try (Scope ignored = ratpackContext.makeCurrent()) { ctx.next(); // exceptions are captured by ServerErrorHandlerInstrumentation } diff --git a/instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientInstrumentationModule.java b/instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientInstrumentationModule.java index 7a277820b1..aafa55ffdf 100644 --- a/instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientInstrumentationModule.java +++ b/instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientInstrumentationModule.java @@ -14,7 +14,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; import io.opentelemetry.javaagent.tooling.InstrumentationModule; @@ -60,30 +60,30 @@ public class RmiClientInstrumentationModule extends InstrumentationModule { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(value = 1) Method method, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { // TODO replace with client span check if (!Java8BytecodeBridge.currentSpan().getSpanContext().isValid()) { return; } - span = tracer().startSpan(method); - scope = span.makeCurrent(); + context = tracer().startSpan(method); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( @Advice.Thrown Throwable throwable, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { if (scope == null) { return; } scope.close(); if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - tracer().end(span); + tracer().end(context); } } } diff --git a/instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientTracer.java b/instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientTracer.java index aa20f5160d..c093ed0eb5 100644 --- a/instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientTracer.java +++ b/instrumentation/rmi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rmi/client/RmiClientTracer.java @@ -8,7 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.rmi.client; import static io.opentelemetry.api.trace.SpanKind.CLIENT; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.api.trace.SpanBuilder; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.RpcClientTracer; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.lang.reflect.Method; @@ -21,17 +21,18 @@ public class RmiClientTracer extends RpcClientTracer { } @Override - public Span startSpan(Method method) { + public Context startSpan(Method method) { String serviceName = method.getDeclaringClass().getName(); String methodName = method.getName(); - SpanBuilder spanBuilder = - tracer.spanBuilder(serviceName + "/" + methodName).setSpanKind(CLIENT); - spanBuilder.setAttribute(SemanticAttributes.RPC_SYSTEM, getRpcSystem()); - spanBuilder.setAttribute(SemanticAttributes.RPC_SERVICE, serviceName); - spanBuilder.setAttribute(SemanticAttributes.RPC_METHOD, methodName); + Span span = + spanBuilder(serviceName + "/" + methodName, CLIENT) + .setAttribute(SemanticAttributes.RPC_SYSTEM, getRpcSystem()) + .setAttribute(SemanticAttributes.RPC_SERVICE, serviceName) + .setAttribute(SemanticAttributes.RPC_METHOD, methodName) + .startSpan(); - return spanBuilder.startSpan(); + return Context.current().with(span); } @Override diff --git a/instrumentation/rxjava-1.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/TracedOnSubscribe.java b/instrumentation/rxjava-1.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/TracedOnSubscribe.java index c7ddf22763..4d2ea20008 100644 --- a/instrumentation/rxjava-1.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/TracedOnSubscribe.java +++ b/instrumentation/rxjava-1.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/TracedOnSubscribe.java @@ -36,13 +36,10 @@ public class TracedOnSubscribe implements Observable.OnSubscribe { @Override public void call(Subscriber subscriber) { - // TODO pass Context into Tracer.startSpan() and then don't need this outer scoping - try (Scope ignored = parentContext.makeCurrent()) { - Span span = tracer.startSpan(operationName, spanKind); - decorateSpan(span); - try (Scope ignored1 = span.makeCurrent()) { - delegate.call(new TracedSubscriber<>(Context.current(), subscriber, tracer)); - } + Context context = tracer.startSpan(parentContext, operationName, spanKind); + decorateSpan(Span.fromContext(context)); + try (Scope ignored = context.makeCurrent()) { + delegate.call(new TracedSubscriber<>(context, subscriber, tracer)); } } diff --git a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentationModule.java b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentationModule.java index 6e0f79b997..752405ad17 100644 --- a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentationModule.java +++ b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentationModule.java @@ -81,7 +81,7 @@ public class RequestDispatcherInstrumentationModule extends InstrumentationModul @Advice.Origin Method method, @Advice.This RequestDispatcher dispatcher, @Advice.Local("_originalContext") Object originalContext, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope, @Advice.Argument(0) ServletRequest request) { @@ -116,7 +116,7 @@ public class RequestDispatcherInstrumentationModule extends InstrumentationModul } try (Scope ignored = parent.makeCurrent()) { - span = tracer().startSpan(method); + context = tracer().startSpan(method); // save the original servlet span before overwriting the request attribute, so that it can // be @@ -124,17 +124,16 @@ public class RequestDispatcherInstrumentationModule extends InstrumentationModul originalContext = request.getAttribute(CONTEXT_ATTRIBUTE); // this tells the dispatched servlet to use the current span as the parent for its work - Context newContext = Java8BytecodeBridge.currentContext().with(span); - request.setAttribute(CONTEXT_ATTRIBUTE, newContext); + request.setAttribute(CONTEXT_ATTRIBUTE, context); } - scope = span.makeCurrent(); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stop( @Advice.Local("_originalContext") Object originalContext, @Advice.Argument(0) ServletRequest request, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope, @Advice.Thrown Throwable throwable) { if (scope == null) { @@ -151,9 +150,9 @@ public class RequestDispatcherInstrumentationModule extends InstrumentationModul request.setAttribute(CONTEXT_ATTRIBUTE, originalContext); if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - tracer().end(span); + tracer().end(context); } } } diff --git a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/http/HttpServletResponseInstrumentationModule.java b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/http/HttpServletResponseInstrumentationModule.java index 6632453ff6..3df1833c09 100644 --- a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/http/HttpServletResponseInstrumentationModule.java +++ b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/http/HttpServletResponseInstrumentationModule.java @@ -14,7 +14,7 @@ import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.CallDepth; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap; @@ -63,33 +63,33 @@ public class HttpServletResponseInstrumentationModule extends InstrumentationMod @Advice.OnMethodEnter(suppress = Throwable.class) public static void start( @Advice.Origin Method method, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope, @Advice.Local("otelCallDepth") CallDepth callDepth) { callDepth = CallDepthThreadLocalMap.getCallDepth(HttpServletResponse.class); // Don't want to generate a new top-level span if (callDepth.getAndIncrement() == 0 && Java8BytecodeBridge.currentSpan().getSpanContext().isValid()) { - span = tracer().startSpan(method); - scope = span.makeCurrent(); + context = tracer().startSpan(method); + scope = context.makeCurrent(); } } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( @Advice.Thrown Throwable throwable, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope, @Advice.Local("otelCallDepth") CallDepth callDepth) { - if (callDepth.decrementAndGet() == 0 && span != null) { + if (callDepth.decrementAndGet() == 0 && context != null) { CallDepthThreadLocalMap.reset(HttpServletResponse.class); scope.close(); if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - tracer().end(span); + tracer().end(context); } } } diff --git a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/item/ItemTracer.java b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/item/ItemTracer.java index 1c75fb28e6..e9d9116bdb 100644 --- a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/item/ItemTracer.java +++ b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/item/ItemTracer.java @@ -7,7 +7,6 @@ package io.opentelemetry.javaagent.instrumentation.spring.batch.item; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import io.opentelemetry.context.ContextKey; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; @@ -59,13 +58,9 @@ public class ItemTracer extends BaseTracer { String jobName = chunkContext.getStepContext().getJobName(); String stepName = chunkContext.getStepContext().getStepName(); - Span span = - tracer - .spanBuilder("BatchJob " + jobName + "." + stepName + "." + itemOperationName) - .setSpanKind(INTERNAL) - .startSpan(); - return currentContext.with(span); + return startSpan( + currentContext, "BatchJob " + jobName + "." + stepName + "." + itemOperationName, INTERNAL); } @Override diff --git a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/job/JobExecutionTracer.java b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/job/JobExecutionTracer.java index a4890c691a..a2f9488108 100644 --- a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/job/JobExecutionTracer.java +++ b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/job/JobExecutionTracer.java @@ -7,7 +7,6 @@ package io.opentelemetry.javaagent.instrumentation.spring.batch.job; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; import org.springframework.batch.core.JobExecution; @@ -21,8 +20,7 @@ public class JobExecutionTracer extends BaseTracer { public Context startSpan(JobExecution jobExecution) { String jobName = jobExecution.getJobInstance().getJobName(); - Span span = startSpan("BatchJob " + jobName, INTERNAL); - return Context.current().with(span); + return startSpan("BatchJob " + jobName, INTERNAL); } @Override diff --git a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/step/StepExecutionTracer.java b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/step/StepExecutionTracer.java index 0916c3f63d..59f851d38b 100644 --- a/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/step/StepExecutionTracer.java +++ b/instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/step/StepExecutionTracer.java @@ -7,7 +7,6 @@ package io.opentelemetry.javaagent.instrumentation.spring.batch.step; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; import org.springframework.batch.core.StepExecution; @@ -22,8 +21,7 @@ public class StepExecutionTracer extends BaseTracer { public Context startSpan(StepExecution stepExecution) { String jobName = stepExecution.getJobExecution().getJobInstance().getJobName(); String stepName = stepExecution.getStepName(); - Span span = startSpan("BatchJob " + jobName + "." + stepName, INTERNAL); - return Context.current().with(span); + return startSpan("BatchJob " + jobName + "." + stepName, INTERNAL); } @Override diff --git a/instrumentation/spring/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/SpringDataInstrumentationModule.java b/instrumentation/spring/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/SpringDataInstrumentationModule.java index 9318ef3efb..a6d7d30240 100644 --- a/instrumentation/spring/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/SpringDataInstrumentationModule.java +++ b/instrumentation/spring/spring-data-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/SpringDataInstrumentationModule.java @@ -12,7 +12,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.tooling.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; @@ -102,17 +102,15 @@ public class SpringDataInstrumentationModule extends InstrumentationModule { return methodInvocation.proceed(); } - Span span = tracer().startSpan(invokedMethod); - - Object result; - try (Scope ignored = span.makeCurrent()) { - result = methodInvocation.proceed(); - tracer().end(span); + Context context = tracer().startSpan(invokedMethod); + try (Scope ignored = context.makeCurrent()) { + Object result = methodInvocation.proceed(); + tracer().end(context); + return result; } catch (Throwable t) { - tracer().endExceptionally(span, t); + tracer().endExceptionally(context, t); throw t; } - return result; } } } diff --git a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/SpringSchedulingRunnableWrapper.java b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/SpringSchedulingRunnableWrapper.java index 5c8ea7ca6d..8958fbd722 100644 --- a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/SpringSchedulingRunnableWrapper.java +++ b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/SpringSchedulingRunnableWrapper.java @@ -7,8 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.spring.scheduling; import static io.opentelemetry.javaagent.instrumentation.spring.scheduling.SpringSchedulingTracer.tracer; -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; public class SpringSchedulingRunnableWrapper implements Runnable { @@ -23,13 +22,13 @@ public class SpringSchedulingRunnableWrapper implements Runnable { if (runnable == null) { return; } - Span span = tracer().startSpan(tracer().spanNameOnRun(runnable), SpanKind.INTERNAL); - try (Scope ignored = span.makeCurrent()) { + Context context = tracer().startSpan(runnable); + try (Scope ignored = context.makeCurrent()) { runnable.run(); - tracer().end(span); + tracer().end(context); } catch (Throwable throwable) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); throw throwable; } } diff --git a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/SpringSchedulingTracer.java b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/SpringSchedulingTracer.java index ead4787087..6a0a1a4f36 100644 --- a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/SpringSchedulingTracer.java +++ b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/SpringSchedulingTracer.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.spring.scheduling; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; import org.springframework.scheduling.support.ScheduledMethodRunnable; @@ -20,7 +22,11 @@ public class SpringSchedulingTracer extends BaseTracer { return "io.opentelemetry.javaagent.spring-scheduling"; } - public String spanNameOnRun(Runnable runnable) { + public Context startSpan(Runnable runnable) { + return startSpan(spanNameOnRun(runnable), SpanKind.INTERNAL); + } + + private String spanNameOnRun(Runnable runnable) { if (runnable instanceof ScheduledMethodRunnable) { ScheduledMethodRunnable scheduledMethodRunnable = (ScheduledMethodRunnable) runnable; return spanNameForMethod(scheduledMethodRunnable.getMethod()); diff --git a/instrumentation/spring/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/server/DispatcherHandlerAdvice.java b/instrumentation/spring/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/server/DispatcherHandlerAdvice.java index 6a6f83b0d5..b6b5effc23 100644 --- a/instrumentation/spring/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/server/DispatcherHandlerAdvice.java +++ b/instrumentation/spring/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/server/DispatcherHandlerAdvice.java @@ -7,11 +7,9 @@ package io.opentelemetry.javaagent.instrumentation.spring.webflux.server; import static io.opentelemetry.javaagent.instrumentation.spring.webflux.server.SpringWebfluxHttpServerTracer.tracer; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; import net.bytebuddy.asm.Advice; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @@ -28,9 +26,7 @@ public class DispatcherHandlerAdvice { @Advice.Local("otelScope") Scope otelScope, @Advice.Local("otelContext") Context otelContext) { - Span span = tracer().startSpan("DispatcherHandler.handle", SpanKind.INTERNAL); - - otelContext = Java8BytecodeBridge.currentContext().with(span); + otelContext = tracer().startSpan("DispatcherHandler.handle", SpanKind.INTERNAL); // Unfortunately Netty EventLoop is not instrumented well enough to attribute all work to the // right things so we have to store the context in request itself. exchange.getAttributes().put(AdviceUtils.CONTEXT_ATTRIBUTE, otelContext); diff --git a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/AnnotatedMethodInstrumentation.java b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/AnnotatedMethodInstrumentation.java index bdf3ccfb8c..dfc92bda26 100644 --- a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/AnnotatedMethodInstrumentation.java +++ b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/AnnotatedMethodInstrumentation.java @@ -13,7 +13,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; @@ -55,19 +55,19 @@ public class AnnotatedMethodInstrumentation implements TypeInstrumentation { @Advice.OnMethodEnter(suppress = Throwable.class) public static void startSpan( @Advice.Origin Method method, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { if (CallDepthThreadLocalMap.incrementCallDepth(PayloadRoot.class) > 0) { return; } - span = tracer().startSpan(method); - scope = span.makeCurrent(); + context = tracer().startSpan(method); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( @Advice.Thrown Throwable throwable, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { if (scope == null) { return; @@ -76,9 +76,9 @@ public class AnnotatedMethodInstrumentation implements TypeInstrumentation { scope.close(); if (throwable == null) { - tracer().end(span); + tracer().end(context); } else { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } } } diff --git a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/SpringWsTracer.java b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/SpringWsTracer.java index 48e6d34a3b..69c73603e0 100644 --- a/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/SpringWsTracer.java +++ b/instrumentation/spring/spring-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/ws/SpringWsTracer.java @@ -6,6 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.spring.ws; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.lang.reflect.Method; @@ -18,13 +20,13 @@ public class SpringWsTracer extends BaseTracer { return TRACER; } - public Span startSpan(Method method) { - Span springWsSpan = super.startSpan(method); - springWsSpan.setAttribute( - SemanticAttributes.CODE_NAMESPACE, method.getDeclaringClass().getName()); - springWsSpan.setAttribute(SemanticAttributes.CODE_FUNCTION, method.getName()); - - return springWsSpan; + public Context startSpan(Method method) { + Span span = + spanBuilder(spanNameForMethod(method), SpanKind.INTERNAL) + .setAttribute(SemanticAttributes.CODE_NAMESPACE, method.getDeclaringClass().getName()) + .setAttribute(SemanticAttributes.CODE_FUNCTION, method.getName()) + .startSpan(); + return Context.current().with(span); } @Override