From 4cbfb361e144589773f8c59e3389c4bda1ef5e76 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sun, 6 Dec 2020 23:15:15 -0800 Subject: [PATCH] Use Context more in DatabaseClientTracer (#1836) --- .../api/tracer/DatabaseClientTracer.java | 32 ++++------ .../v3_0/CassandraDatabaseClientTracer.java | 6 +- .../cassandra/v3_0/TracingSession.java | 64 +++++++++---------- .../v4_0/CassandraDatabaseClientTracer.java | 4 +- .../cassandra/v4_0/TracingCqlSession.java | 42 ++++++------ ...earch5RestClientInstrumentationModule.java | 15 +++-- .../rest/v5_0/RestResponseListener.java | 14 ++-- ...earch6RestClientInstrumentationModule.java | 17 +++-- .../rest/v6_4/RestResponseListener.java | 14 ++-- .../rest/ElasticsearchRestClientTracer.java | 5 +- ...5TransportClientInstrumentationModule.java | 17 ++--- .../v5_0/TransportActionListener.java | 13 ++-- ...3TransportClientInstrumentationModule.java | 17 ++--- .../v5_3/TransportActionListener.java | 13 ++-- ...6TransportClientInstrumentationModule.java | 17 ++--- .../v6_0/TransportActionListener.java | 14 ++-- .../ElasticsearchTransportClientTracer.java | 5 +- .../instrumentation/jdbc/JdbcTracer.java | 15 +++-- .../PreparedStatementInstrumentation.java | 43 ++++++------- .../jdbc/StatementInstrumentation.java | 43 ++++++------- .../v1_4/JedisInstrumentationModule.java | 40 ++++++------ .../v3_0/JedisInstrumentationModule.java | 16 +++-- .../lettuce/v4_0/InstrumentationPoints.java | 14 ++-- .../v4_0/LettuceAsyncCommandsAdvice.java | 13 ++-- .../lettuce/v4_0/RedisConnectionAdvice.java | 15 +++-- .../lettuce/v5_0/ConnectionFutureAdvice.java | 15 +++-- .../lettuce/v5_0/LettuceAsyncBiFunction.java | 12 ++-- .../v5_0/LettuceAsyncCommandsAdvice.java | 17 ++--- .../v5_0/rx/LettuceFluxCreationAdvice.java | 6 +- .../rx/LettuceFluxTerminationRunnable.java | 24 +++---- .../v5_0/rx/LettuceMonoDualConsumer.java | 14 ++-- .../mongo/TracingCommandListener.java | 20 +++--- .../RediscalaInstrumentationModule.java | 25 ++++---- .../redisson/RedissonInstrumentation.java | 15 +++-- .../BulkGetCompletionListener.java | 6 +- .../spymemcached/CompletionListener.java | 11 ++-- .../spymemcached/GetCompletionListener.java | 6 +- .../OperationCompletionListener.java | 6 +- .../SpymemcachedInstrumentationModule.java | 61 ++++++++++-------- .../spymemcached/SyncCompletionListener.java | 6 +- 40 files changed, 398 insertions(+), 354 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/DatabaseClientTracer.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/DatabaseClientTracer.java index 26bd79f879..ef79b2de0a 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/DatabaseClientTracer.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/tracer/DatabaseClientTracer.java @@ -13,7 +13,6 @@ import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.attributes.SemanticAttributes; import io.opentelemetry.context.Context; -import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.tracer.utils.NetPeerUtils; import java.net.InetSocketAddress; import java.util.concurrent.ExecutionException; @@ -28,12 +27,17 @@ public abstract class DatabaseClientTracer extends BaseTracer tracer = OpenTelemetry.getGlobalTracer(getInstrumentationName(), getVersion()); } - public Span startSpan(CONNECTION connection, QUERY query) { + public boolean shouldStartSpan(Context parentContext) { + return parentContext.get(CONTEXT_CLIENT_SPAN_KEY) == null; + } + + public Context startSpan(Context parentContext, CONNECTION connection, QUERY query) { String normalizedQuery = normalizeQuery(query); Span span = tracer .spanBuilder(spanName(connection, query, normalizedQuery)) + .setParent(parentContext) .setSpanKind(CLIENT) .setAttribute(SemanticAttributes.DB_SYSTEM, dbSystem(connection)) .startSpan(); @@ -44,20 +48,7 @@ public abstract class DatabaseClientTracer extends BaseTracer } onStatement(span, normalizedQuery); - return span; - } - - /** - * Creates new scoped context with the given span. - * - *

Attaches new context to the request to avoid creating duplicate client spans. - */ - @Override - public Scope startScope(Span span) { - // TODO we could do this in one go, but TracingContextUtils.CONTEXT_SPAN_KEY is private - Context clientSpanContext = Context.current().with(CONTEXT_CLIENT_SPAN_KEY, span); - Context newContext = clientSpanContext.with(span); - return newContext.makeCurrent(); + return parentContext.with(span).with(CONTEXT_CLIENT_SPAN_KEY, span); } @Override @@ -70,13 +61,12 @@ public abstract class DatabaseClientTracer extends BaseTracer return context.get(CONTEXT_CLIENT_SPAN_KEY); } - @Override - public void end(Span span) { - span.end(); + public void end(Context context) { + Span.fromContext(context).end(); } - @Override - public void endExceptionally(Span span, Throwable throwable) { + public void endExceptionally(Context context, Throwable throwable) { + Span span = Span.fromContext(context); onError(span, throwable); end(span); } diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraDatabaseClientTracer.java b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraDatabaseClientTracer.java index 0e7584e4b5..896d8019ff 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraDatabaseClientTracer.java +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraDatabaseClientTracer.java @@ -10,6 +10,7 @@ import com.datastax.driver.core.Host; import com.datastax.driver.core.Session; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.attributes.SemanticAttributes; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.DatabaseClientTracer; import io.opentelemetry.instrumentation.api.tracer.utils.NetPeerUtils; import io.opentelemetry.javaagent.instrumentation.api.db.DbSystem; @@ -53,9 +54,10 @@ public class CassandraDatabaseClientTracer extends DatabaseClientTracer values) { - Span span = tracer().startSpan(session, query); + Context context = tracer().startSpan(Context.current(), session, query); ResultSet resultSet; - try (Scope ignored = tracer().startScope(span)) { + try (Scope ignored = context.makeCurrent()) { resultSet = session.execute(query, values); } catch (Throwable t) { - tracer().endExceptionally(span, t); + tracer().endExceptionally(context, t); throw t; } - tracer().end(span, resultSet.getExecutionInfo()); + tracer().end(context, resultSet.getExecutionInfo()); return resultSet; } @Override public ResultSet execute(Statement statement) { - Span span = tracer().startSpan(session, getQuery(statement)); + Context context = tracer().startSpan(Context.current(), session, getQuery(statement)); ResultSet resultSet; - try (Scope ignored = tracer().startScope(span)) { + try (Scope ignored = context.makeCurrent()) { resultSet = session.execute(statement); } catch (Throwable t) { - tracer().endExceptionally(span, t); + tracer().endExceptionally(context, t); throw t; } - tracer().end(span, resultSet.getExecutionInfo()); + tracer().end(context, resultSet.getExecutionInfo()); return resultSet; } @Override public ResultSetFuture executeAsync(String query) { - Span span = tracer().startSpan(session, query); - try (Scope ignored = tracer().startScope(span)) { + Context context = tracer().startSpan(Context.current(), session, query); + try (Scope ignored = context.makeCurrent()) { ResultSetFuture future = session.executeAsync(query); - addCallbackToEndSpan(future, span); + addCallbackToEndSpan(future, context); return future; } } @Override public ResultSetFuture executeAsync(String query, Object... values) { - Span span = tracer().startSpan(session, query); - try (Scope ignored = tracer().startScope(span)) { + Context context = tracer().startSpan(Context.current(), session, query); + try (Scope ignored = context.makeCurrent()) { ResultSetFuture future = session.executeAsync(query, values); - addCallbackToEndSpan(future, span); + addCallbackToEndSpan(future, context); return future; } } @Override public ResultSetFuture executeAsync(String query, Map values) { - Span span = tracer().startSpan(session, query); - try (Scope ignored = tracer().startScope(span)) { + Context context = tracer().startSpan(Context.current(), session, query); + try (Scope ignored = context.makeCurrent()) { ResultSetFuture future = session.executeAsync(query, values); - addCallbackToEndSpan(future, span); + addCallbackToEndSpan(future, context); return future; } } @@ -145,10 +145,10 @@ public class TracingSession implements Session { @Override public ResultSetFuture executeAsync(Statement statement) { String query = getQuery(statement); - Span span = tracer().startSpan(session, query); - try (Scope ignored = tracer().startScope(span)) { + Context context = tracer().startSpan(Context.current(), session, query); + try (Scope ignored = context.makeCurrent()) { ResultSetFuture future = session.executeAsync(statement); - addCallbackToEndSpan(future, span); + addCallbackToEndSpan(future, context); return future; } } @@ -209,18 +209,18 @@ public class TracingSession implements Session { return query == null ? "" : query; } - private void addCallbackToEndSpan(ResultSetFuture future, final Span span) { + private void addCallbackToEndSpan(ResultSetFuture future, Context context) { Futures.addCallback( future, new FutureCallback() { @Override public void onSuccess(ResultSet result) { - tracer().end(span, result.getExecutionInfo()); + tracer().end(context, result.getExecutionInfo()); } @Override public void onFailure(Throwable t) { - tracer().endExceptionally(span, t); + tracer().endExceptionally(context, t); } }, directExecutor()); diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraDatabaseClientTracer.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraDatabaseClientTracer.java index 9d1fedca08..ad8ff16bf2 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraDatabaseClientTracer.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraDatabaseClientTracer.java @@ -10,6 +10,7 @@ import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import com.datastax.oss.driver.api.core.metadata.Node; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.DatabaseClientTracer; import io.opentelemetry.instrumentation.api.tracer.utils.NetPeerUtils; import io.opentelemetry.javaagent.instrumentation.api.db.DbSystem; @@ -48,11 +49,12 @@ public class CassandraDatabaseClientTracer extends DatabaseClientTracer statement) { String query = getQuery(statement); - Span span = tracer().startSpan(session, query); - try (Scope ignored = tracer().startScope(span)) { + Context context = tracer().startSpan(Context.current(), session, query); + try (Scope ignored = context.makeCurrent()) { try { ResultSet resultSet = session.execute(statement); - tracer().onResponse(span, resultSet.getExecutionInfo()); + tracer().onResponse(context, resultSet.getExecutionInfo()); return resultSet; } catch (RuntimeException e) { - tracer().endExceptionally(span, e); + tracer().endExceptionally(context, e); throw e; } finally { - tracer().end(span); + tracer().end(context); } } } @@ -214,16 +214,16 @@ public class TracingCqlSession implements CqlSession { public CompletionStage executeAsync(@NonNull Statement statement) { String query = getQuery(statement); - Span span = tracer().startSpan(session, query); - try (Scope ignored = tracer().startScope(span)) { + Context context = tracer().startSpan(Context.current(), session, query); + try (Scope ignored = context.makeCurrent()) { CompletionStage stage = session.executeAsync(statement); return stage.whenComplete( (asyncResultSet, throwable) -> { if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - tracer().onResponse(span, asyncResultSet.getExecutionInfo()); - tracer().end(span); + tracer().onResponse(context, asyncResultSet.getExecutionInfo()); + tracer().end(context); } }); } @@ -232,16 +232,16 @@ public class TracingCqlSession implements CqlSession { @Override @NonNull public CompletionStage executeAsync(@NonNull String query) { - Span span = tracer().startSpan(session, query); - try (Scope ignored = tracer().startScope(span)) { + Context context = tracer().startSpan(Context.current(), session, query); + try (Scope ignored = context.makeCurrent()) { CompletionStage stage = session.executeAsync(query); return stage.whenComplete( (asyncResultSet, throwable) -> { if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - tracer().onResponse(span, asyncResultSet.getExecutionInfo()); - tracer().end(span); + tracer().onResponse(context, asyncResultSet.getExecutionInfo()); + tracer().end(context); } }); } diff --git a/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/Elasticsearch5RestClientInstrumentationModule.java b/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/Elasticsearch5RestClientInstrumentationModule.java index 1358f1d5d4..566fa13110 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/Elasticsearch5RestClientInstrumentationModule.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/Elasticsearch5RestClientInstrumentationModule.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.rest.v5_0; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.elasticsearch.rest.ElasticsearchRestClientTracer.tracer; import static io.opentelemetry.javaagent.tooling.matcher.NameMatchers.namedOneOf; import static java.util.Collections.singletonList; @@ -15,7 +16,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; 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; @@ -64,24 +65,24 @@ public class Elasticsearch5RestClientInstrumentationModule extends Instrumentati public static void onEnter( @Advice.Argument(0) String method, @Advice.Argument(1) String endpoint, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope, @Advice.Argument(value = 5, readOnly = false) ResponseListener responseListener) { - span = tracer().startSpan(null, method + " " + endpoint); - scope = tracer().startScope(span); + context = tracer().startSpan(currentContext(), null, method + " " + endpoint); + scope = context.makeCurrent(); - responseListener = new RestResponseListener(responseListener, span); + responseListener = new RestResponseListener(responseListener, context); } @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); } } } diff --git a/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/RestResponseListener.java b/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/RestResponseListener.java index aaf8156534..74d9cecf1f 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/RestResponseListener.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/RestResponseListener.java @@ -7,33 +7,33 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.rest.v5_0; import static io.opentelemetry.javaagent.instrumentation.elasticsearch.rest.ElasticsearchRestClientTracer.tracer; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import org.elasticsearch.client.Response; import org.elasticsearch.client.ResponseListener; public class RestResponseListener implements ResponseListener { private final ResponseListener listener; - private final Span span; + private final Context context; - public RestResponseListener(ResponseListener listener, Span span) { + public RestResponseListener(ResponseListener listener, Context context) { this.listener = listener; - this.span = span; + this.context = context; } @Override public void onSuccess(Response response) { if (response.getHost() != null) { - tracer().onResponse(span, response); + tracer().onResponse(context, response); } - tracer().end(span); + tracer().end(context); listener.onSuccess(response); } @Override public void onFailure(Exception e) { - tracer().endExceptionally(span, e); + tracer().endExceptionally(context, e); listener.onFailure(e); } } diff --git a/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/Elasticsearch6RestClientInstrumentationModule.java b/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/Elasticsearch6RestClientInstrumentationModule.java index 59c18ae072..5e0e6d6f4b 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/Elasticsearch6RestClientInstrumentationModule.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/Elasticsearch6RestClientInstrumentationModule.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.rest.v6_4; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.elasticsearch.rest.ElasticsearchRestClientTracer.tracer; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; @@ -14,7 +15,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; 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; @@ -63,23 +64,25 @@ public class Elasticsearch6RestClientInstrumentationModule extends Instrumentati public static void onEnter( @Advice.Argument(0) Request request, @Advice.Argument(value = 1, readOnly = false) ResponseListener responseListener, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan(null, request.getMethod() + " " + request.getEndpoint()); - scope = tracer().startScope(span); + context = + tracer() + .startSpan(currentContext(), null, request.getMethod() + " " + request.getEndpoint()); + scope = context.makeCurrent(); - responseListener = new RestResponseListener(responseListener, span); + responseListener = new RestResponseListener(responseListener, context); } @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); } } } diff --git a/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/RestResponseListener.java b/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/RestResponseListener.java index 1610bbcc68..dca4e9660d 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/RestResponseListener.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/RestResponseListener.java @@ -7,33 +7,33 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.rest.v6_4; import static io.opentelemetry.javaagent.instrumentation.elasticsearch.rest.ElasticsearchRestClientTracer.tracer; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import org.elasticsearch.client.Response; import org.elasticsearch.client.ResponseListener; public class RestResponseListener implements ResponseListener { private final ResponseListener listener; - private final Span span; + private final Context context; - public RestResponseListener(ResponseListener listener, Span span) { + public RestResponseListener(ResponseListener listener, Context context) { this.listener = listener; - this.span = span; + this.context = context; } @Override public void onSuccess(Response response) { if (response.getHost() != null) { - tracer().onResponse(span, response); + tracer().onResponse(context, response); } - tracer().end(span); + tracer().end(context); listener.onSuccess(response); } @Override public void onFailure(Exception e) { - tracer().endExceptionally(span, e); + tracer().endExceptionally(context, e); listener.onFailure(e); } } diff --git a/instrumentation/elasticsearch/elasticsearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestClientTracer.java b/instrumentation/elasticsearch/elasticsearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestClientTracer.java index 1b62457f2e..c267124dff 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestClientTracer.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestClientTracer.java @@ -7,6 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.rest; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.attributes.SemanticAttributes; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.DatabaseClientTracer; import io.opentelemetry.instrumentation.api.tracer.utils.NetPeerUtils; import java.net.InetSocketAddress; @@ -19,12 +20,12 @@ public class ElasticsearchRestClientTracer extends DatabaseClientTracer actionListener) { - span = tracer().startSpan(null, action); - scope = tracer().startScope(span); + context = tracer().startSpan(currentContext(), null, action); + scope = context.makeCurrent(); - tracer().onRequest(span, action.getClass(), actionRequest.getClass()); - actionListener = new TransportActionListener<>(actionRequest, actionListener, span); + tracer().onRequest(context, action.getClass(), actionRequest.getClass()); + actionListener = new TransportActionListener<>(actionRequest, actionListener, context); } @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); } } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_0/TransportActionListener.java b/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_0/TransportActionListener.java index c51abd22fe..a1897f6cd5 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_0/TransportActionListener.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_0/TransportActionListener.java @@ -9,6 +9,7 @@ import static io.opentelemetry.javaagent.instrumentation.elasticsearch.transport import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.attributes.SemanticAttributes; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.utils.NetPeerUtils; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionRequest; @@ -26,16 +27,18 @@ import org.elasticsearch.action.support.replication.ReplicationResponse; public class TransportActionListener implements ActionListener { private final ActionListener listener; - private final Span span; + private final Context context; public TransportActionListener( - ActionRequest actionRequest, ActionListener listener, Span span) { + ActionRequest actionRequest, ActionListener listener, Context context) { this.listener = listener; - this.span = span; + this.context = context; onRequest(actionRequest); } private void onRequest(ActionRequest request) { + Span span = Span.fromContext(context); + if (request instanceof IndicesRequest) { IndicesRequest req = (IndicesRequest) request; String[] indices = req.indices(); @@ -59,6 +62,8 @@ public class TransportActionListener implements Action @Override public void onResponse(T response) { + Span span = Span.fromContext(context); + if (response.remoteAddress() != null) { NetPeerUtils.INSTANCE.setNetPeer( span, response.remoteAddress().getHost(), response.remoteAddress().getAddress()); @@ -113,7 +118,7 @@ public class TransportActionListener implements Action @Override public void onFailure(Exception e) { - tracer().endExceptionally(span, e); + tracer().endExceptionally(context, e); listener.onFailure(e); } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/Elasticsearch53TransportClientInstrumentationModule.java b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/Elasticsearch53TransportClientInstrumentationModule.java index 00428d81ba..3a858be9ac 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/Elasticsearch53TransportClientInstrumentationModule.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/Elasticsearch53TransportClientInstrumentationModule.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.v5_3; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.ElasticsearchTransportClientTracer.tracer; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; @@ -13,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.tooling.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; @@ -67,27 +68,27 @@ public class Elasticsearch53TransportClientInstrumentationModule extends Instrum public static void onEnter( @Advice.Argument(0) Action action, @Advice.Argument(1) ActionRequest actionRequest, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope, @Advice.Argument(value = 2, readOnly = false) ActionListener actionListener) { - span = tracer().startSpan(null, action); - scope = tracer().startScope(span); + context = tracer().startSpan(currentContext(), null, action); + scope = context.makeCurrent(); - tracer().onRequest(span, action.getClass(), actionRequest.getClass()); - actionListener = new TransportActionListener<>(actionRequest, actionListener, span); + tracer().onRequest(context, action.getClass(), actionRequest.getClass()); + actionListener = new TransportActionListener<>(actionRequest, actionListener, context); } @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); } } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/TransportActionListener.java b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/TransportActionListener.java index dade3e2e49..2cdddcad59 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/TransportActionListener.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/TransportActionListener.java @@ -9,6 +9,7 @@ import static io.opentelemetry.javaagent.instrumentation.elasticsearch.transport import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.attributes.SemanticAttributes; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.utils.NetPeerUtils; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionRequest; @@ -26,16 +27,18 @@ import org.elasticsearch.action.support.replication.ReplicationResponse; public class TransportActionListener implements ActionListener { private final ActionListener listener; - private final Span span; + private final Context context; public TransportActionListener( - ActionRequest actionRequest, ActionListener listener, Span span) { + ActionRequest actionRequest, ActionListener listener, Context context) { this.listener = listener; - this.span = span; + this.context = context; onRequest(actionRequest); } private void onRequest(ActionRequest request) { + Span span = Span.fromContext(context); + if (request instanceof IndicesRequest) { IndicesRequest req = (IndicesRequest) request; String[] indices = req.indices(); @@ -60,6 +63,8 @@ public class TransportActionListener implements Action @Override public void onResponse(T response) { + Span span = Span.fromContext(context); + if (response.remoteAddress() != null) { NetPeerUtils.INSTANCE.setNetPeer( span, response.remoteAddress().getHost(), response.remoteAddress().getAddress()); @@ -114,7 +119,7 @@ public class TransportActionListener implements Action @Override public void onFailure(Exception e) { - tracer().endExceptionally(span, e); + tracer().endExceptionally(context, e); listener.onFailure(e); } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v6_0/Elasticsearch6TransportClientInstrumentationModule.java b/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v6_0/Elasticsearch6TransportClientInstrumentationModule.java index 7018dd0f23..8e31f837d2 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v6_0/Elasticsearch6TransportClientInstrumentationModule.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v6_0/Elasticsearch6TransportClientInstrumentationModule.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.v6_0; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.ElasticsearchTransportClientTracer.tracer; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; @@ -13,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.tooling.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; @@ -70,26 +71,26 @@ public class Elasticsearch6TransportClientInstrumentationModule extends Instrume public static void onEnter( @Advice.Argument(0) Action action, @Advice.Argument(1) ActionRequest actionRequest, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope, @Advice.Argument(value = 2, readOnly = false) ActionListener actionListener) { - span = tracer().startSpan(null, action); - scope = tracer().startScope(span); - tracer().onRequest(span, action.getClass(), actionRequest.getClass()); - actionListener = new TransportActionListener<>(actionRequest, actionListener, span); + context = tracer().startSpan(currentContext(), null, action); + scope = context.makeCurrent(); + tracer().onRequest(context, action.getClass(), actionRequest.getClass()); + actionListener = new TransportActionListener<>(actionRequest, actionListener, context); } @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); } } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v6_0/TransportActionListener.java b/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v6_0/TransportActionListener.java index c0efce0c2f..b97bdc8226 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v6_0/TransportActionListener.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v6_0/TransportActionListener.java @@ -9,6 +9,7 @@ import static io.opentelemetry.javaagent.instrumentation.elasticsearch.transport import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.attributes.SemanticAttributes; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.utils.NetPeerUtils; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionRequest; @@ -30,16 +31,17 @@ import org.elasticsearch.action.support.replication.ReplicationResponse; public class TransportActionListener implements ActionListener { private final ActionListener listener; - private final Span span; + private final Context context; public TransportActionListener( - ActionRequest actionRequest, ActionListener listener, Span span) { + ActionRequest actionRequest, ActionListener listener, Context context) { this.listener = listener; - this.span = span; + this.context = context; onRequest(actionRequest); } private void onRequest(ActionRequest request) { + Span span = Span.fromContext(context); if (request instanceof IndicesRequest) { IndicesRequest req = (IndicesRequest) request; String[] indices = req.indices(); @@ -64,6 +66,8 @@ public class TransportActionListener implements Action @Override public void onResponse(T response) { + Span span = Span.fromContext(context); + if (response.remoteAddress() != null) { NetPeerUtils.INSTANCE.setNetPeer( span, @@ -114,13 +118,13 @@ public class TransportActionListener implements Action span.setAttribute("elasticsearch.node.cluster.name", resp.getClusterName().value()); } - tracer().end(span); + tracer().end(context); listener.onResponse(response); } @Override public void onFailure(Exception e) { - tracer().endExceptionally(span, e); + tracer().endExceptionally(context, e); listener.onFailure(e); } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportClientTracer.java b/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportClientTracer.java index 7aac655d17..33879e1ae5 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportClientTracer.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportClientTracer.java @@ -7,6 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.transport; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.attributes.SemanticAttributes; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.DatabaseClientTracer; import java.net.InetSocketAddress; import org.elasticsearch.action.Action; @@ -20,10 +21,10 @@ public class ElasticsearchTransportClientTracer return TRACER; } - public Span onRequest(Span span, Class action, Class request) { + public void onRequest(Context context, Class action, Class request) { + Span span = Span.fromContext(context); span.setAttribute("elasticsearch.action", action.getSimpleName()); span.setAttribute("elasticsearch.request", request.getSimpleName()); - return span; } @Override diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcTracer.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcTracer.java index cddc44883d..76f1fbb3c5 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcTracer.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcTracer.java @@ -8,7 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.jdbc; import static io.opentelemetry.javaagent.instrumentation.jdbc.JdbcUtils.connectionFromStatement; import static io.opentelemetry.javaagent.instrumentation.jdbc.JdbcUtils.normalizeAndExtractInfo; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.DatabaseClientTracer; import io.opentelemetry.javaagent.instrumentation.api.CallDepth; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap; @@ -66,15 +66,16 @@ public class JdbcTracer extends DatabaseClientTracer { return CallDepthThreadLocalMap.getCallDepth(Statement.class); } - public Span startSpan(PreparedStatement statement) { - return startSpan(statement, JdbcMaps.preparedStatements.get(statement)); + public Context startSpan(Context parentContext, PreparedStatement statement) { + return startSpan(parentContext, statement, JdbcMaps.preparedStatements.get(statement)); } - public Span startSpan(Statement statement, String query) { - return startSpan(statement, normalizeAndExtractInfo(query)); + public Context startSpan(Context parentContext, Statement statement, String query) { + return startSpan(parentContext, statement, normalizeAndExtractInfo(query)); } - public Span startSpan(Statement statement, SqlStatementInfo queryInfo) { + private Context startSpan( + Context parentContext, Statement statement, SqlStatementInfo queryInfo) { Connection connection = connectionFromStatement(statement); if (connection == null) { return null; @@ -82,7 +83,7 @@ public class JdbcTracer extends DatabaseClientTracer { DbInfo dbInfo = extractDbInfo(connection); - return startSpan(dbInfo, queryInfo); + return startSpan(parentContext, dbInfo, queryInfo); } @Override diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/PreparedStatementInstrumentation.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/PreparedStatementInstrumentation.java index b303833edc..3279b1fd03 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/PreparedStatementInstrumentation.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/PreparedStatementInstrumentation.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.jdbc; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.jdbc.JdbcTracer.tracer; import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; @@ -14,9 +15,8 @@ import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -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.tooling.TypeInstrumentation; import java.sql.PreparedStatement; import java.util.Map; @@ -49,32 +49,31 @@ public class PreparedStatementInstrumentation implements TypeInstrumentation { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.This PreparedStatement statement, - @Advice.Local("otelSpan") Span span, - @Advice.Local("otelScope") Scope scope, - @Advice.Local("otelCallDepth") CallDepth callDepth) { - - callDepth = tracer().getCallDepth(); - if (callDepth.getAndIncrement() == 0) { - span = tracer().startSpan(statement); - if (span != null) { - scope = tracer().startScope(span); - } + @Advice.Local("otelContext") Context context, + @Advice.Local("otelScope") Scope scope) { + Context parentContext = currentContext(); + if (!tracer().shouldStartSpan(parentContext)) { + return; } + + context = tracer().startSpan(parentContext, statement); + 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("otelScope") Scope scope, - @Advice.Local("otelCallDepth") CallDepth callDepth) { - if (callDepth.decrementAndGet() == 0 && scope != null) { - scope.close(); - if (throwable == null) { - tracer().end(span); - } else { - tracer().endExceptionally(span, throwable); - } + @Advice.Local("otelContext") Context context, + @Advice.Local("otelScope") Scope scope) { + if (scope == null) { + return; + } + + scope.close(); + if (throwable == null) { + tracer().end(context); + } else { + tracer().endExceptionally(context, throwable); } } } diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/StatementInstrumentation.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/StatementInstrumentation.java index 3644abe6ea..beda5055d9 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/StatementInstrumentation.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/StatementInstrumentation.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.jdbc; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.jdbc.JdbcTracer.tracer; import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; @@ -14,9 +15,8 @@ import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -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.tooling.TypeInstrumentation; import java.sql.Statement; import java.util.Map; @@ -50,32 +50,31 @@ public class StatementInstrumentation implements TypeInstrumentation { public static void onEnter( @Advice.Argument(0) String sql, @Advice.This Statement statement, - @Advice.Local("otelSpan") Span span, - @Advice.Local("otelScope") Scope scope, - @Advice.Local("otelCallDepth") CallDepth callDepth) { - - callDepth = tracer().getCallDepth(); - if (callDepth.getAndIncrement() == 0) { - span = tracer().startSpan(statement, sql); - if (span != null) { - scope = tracer().startScope(span); - } + @Advice.Local("otelContext") Context context, + @Advice.Local("otelScope") Scope scope) { + Context parentContext = currentContext(); + if (!tracer().shouldStartSpan(parentContext)) { + return; } + + context = tracer().startSpan(parentContext, statement, sql); + 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("otelScope") Scope scope, - @Advice.Local("otelCallDepth") CallDepth callDepth) { - if (callDepth.decrementAndGet() == 0 && scope != null) { - scope.close(); - if (throwable == null) { - tracer().end(span); - } else { - tracer().endExceptionally(span, throwable); - } + @Advice.Local("otelContext") Context context, + @Advice.Local("otelScope") Scope scope) { + if (scope == null) { + return; + } + + scope.close(); + if (throwable == null) { + tracer().end(context); + } else { + tracer().endExceptionally(context, throwable); } } } diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumentationModule.java b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumentationModule.java index e7c24a634f..75e86efa4e 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumentationModule.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumentationModule.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v1_4; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.jedis.v1_4.JedisClientTracer.tracer; import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; import static java.util.Collections.singletonList; @@ -16,9 +17,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; 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.CallDepthThreadLocalMap; import io.opentelemetry.javaagent.instrumentation.jedis.v1_4.JedisClientTracer.CommandWithArgs; import io.opentelemetry.javaagent.tooling.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; @@ -84,32 +84,31 @@ public class JedisInstrumentationModule extends InstrumentationModule { public static void onEnter( @Advice.This Connection connection, @Advice.Argument(0) Command command, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - int callDepth = CallDepthThreadLocalMap.incrementCallDepth(Connection.class); - if (callDepth > 0) { + Context parentContext = currentContext(); + if (!tracer().shouldStartSpan(parentContext)) { return; } - span = tracer().startSpan(connection, new CommandWithArgs(command)); - scope = tracer().startScope(span); + context = tracer().startSpan(parentContext, connection, new CommandWithArgs(command)); + 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(); - CallDepthThreadLocalMap.reset(Connection.class); if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - tracer().end(span); + tracer().end(context); } } } @@ -121,32 +120,31 @@ public class JedisInstrumentationModule extends InstrumentationModule { @Advice.This Connection connection, @Advice.Argument(0) Command command, @Advice.Argument(1) byte[][] args, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - int callDepth = CallDepthThreadLocalMap.incrementCallDepth(Connection.class); - if (callDepth > 0) { + Context parentContext = currentContext(); + if (!tracer().shouldStartSpan(parentContext)) { return; } - span = tracer().startSpan(connection, new CommandWithArgs(command, args)); - scope = tracer().startScope(span); + context = tracer().startSpan(parentContext, connection, new CommandWithArgs(command, args)); + 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(); - CallDepthThreadLocalMap.reset(Connection.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/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisInstrumentationModule.java b/instrumentation/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisInstrumentationModule.java index 8dc4f84789..278fc0091a 100644 --- a/instrumentation/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisInstrumentationModule.java +++ b/instrumentation/jedis/jedis-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisInstrumentationModule.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v3_0; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.jedis.v3_0.JedisClientTracer.tracer; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; @@ -15,7 +16,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; 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.jedis.v3_0.JedisClientTracer.CommandWithArgs; import io.opentelemetry.javaagent.tooling.InstrumentationModule; @@ -68,16 +69,17 @@ public class JedisInstrumentationModule extends InstrumentationModule { @Advice.This Connection connection, @Advice.Argument(0) ProtocolCommand command, @Advice.Argument(1) byte[][] args, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan(connection, new CommandWithArgs(command, args)); - scope = tracer().startScope(span); + context = + tracer().startSpan(currentContext(), connection, new CommandWithArgs(command, args)); + 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; @@ -85,9 +87,9 @@ public class JedisInstrumentationModule 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/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/InstrumentationPoints.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/InstrumentationPoints.java index 781cfa7dae..ad270b4289 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/InstrumentationPoints.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/InstrumentationPoints.java @@ -15,6 +15,7 @@ import com.lambdaworks.redis.protocol.CommandType; import com.lambdaworks.redis.protocol.ProtocolKeyword; import com.lambdaworks.redis.protocol.RedisCommand; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import java.util.EnumSet; import java.util.Set; import java.util.concurrent.CancellationException; @@ -25,27 +26,28 @@ public final class InstrumentationPoints { public static void afterCommand( RedisCommand command, - Span span, + Context context, Throwable throwable, AsyncCommand asyncCommand) { if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else if (expectsResponse(command)) { asyncCommand.handleAsync( (value, ex) -> { if (ex == null) { - tracer().end(span); + tracer().end(context); } else if (ex instanceof CancellationException) { + Span span = Span.fromContext(context); span.setAttribute("lettuce.command.cancelled", true); - tracer().end(span); + tracer().end(context); } else { - tracer().endExceptionally(span, ex); + tracer().endExceptionally(context, ex); } return null; }); } else { // No response is expected, so we must finish the span now. - tracer().end(span); + tracer().end(context); } } diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncCommandsAdvice.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncCommandsAdvice.java index 82bf66f070..a6afcd60e1 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncCommandsAdvice.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncCommandsAdvice.java @@ -5,11 +5,12 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v4_0; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.lettuce.v4_0.LettuceDatabaseClientTracer.tracer; import com.lambdaworks.redis.protocol.AsyncCommand; import com.lambdaworks.redis.protocol.RedisCommand; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import net.bytebuddy.asm.Advice; @@ -18,10 +19,10 @@ public class LettuceAsyncCommandsAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(0) RedisCommand command, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan(null, command); - scope = tracer().startScope(span); + context = tracer().startSpan(currentContext(), null, command); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) @@ -29,9 +30,9 @@ public class LettuceAsyncCommandsAdvice { @Advice.Argument(0) RedisCommand command, @Advice.Thrown Throwable throwable, @Advice.Return AsyncCommand asyncCommand, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { scope.close(); - InstrumentationPoints.afterCommand(command, span, throwable, asyncCommand); + InstrumentationPoints.afterCommand(command, context, throwable, asyncCommand); } } diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/RedisConnectionAdvice.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/RedisConnectionAdvice.java index 1c2c3136ee..6a8c3b0a69 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/RedisConnectionAdvice.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/RedisConnectionAdvice.java @@ -5,10 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v4_0; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.lettuce.v4_0.LettuceConnectionDatabaseClientTracer.tracer; import com.lambdaworks.redis.RedisURI; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import net.bytebuddy.asm.Advice; @@ -17,22 +18,22 @@ public class RedisConnectionAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(1) RedisURI redisUri, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan(redisUri, "CONNECT"); - scope = tracer().startScope(span); + context = tracer().startSpan(currentContext(), redisUri, "CONNECT"); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void onExit( @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/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/ConnectionFutureAdvice.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/ConnectionFutureAdvice.java index 140d7964b9..04827df79a 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/ConnectionFutureAdvice.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/ConnectionFutureAdvice.java @@ -5,11 +5,12 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceConnectionDatabaseClientTracer.tracer; import io.lettuce.core.ConnectionFuture; import io.lettuce.core.RedisURI; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import net.bytebuddy.asm.Advice; @@ -18,24 +19,24 @@ public class ConnectionFutureAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(1) RedisURI redisUri, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan(redisUri, "CONNECT"); - scope = tracer().startScope(span); + context = tracer().startSpan(currentContext(), redisUri, "CONNECT"); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( @Advice.Thrown Throwable throwable, @Advice.Return ConnectionFuture connectionFuture, - @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); return; } - connectionFuture.handleAsync(new LettuceAsyncBiFunction<>(span)); + connectionFuture.handleAsync(new LettuceAsyncBiFunction<>(context)); } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncBiFunction.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncBiFunction.java index 8b346afd33..67562c0bef 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncBiFunction.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncBiFunction.java @@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceDatabaseClientTracer.tracer; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import java.util.concurrent.CancellationException; import java.util.function.BiFunction; @@ -23,19 +24,20 @@ import java.util.function.BiFunction; public class LettuceAsyncBiFunction implements BiFunction { - private final Span span; + private final Context context; - public LettuceAsyncBiFunction(Span span) { - this.span = span; + public LettuceAsyncBiFunction(Context context) { + this.context = context; } @Override public R apply(T t, Throwable throwable) { if (throwable instanceof CancellationException) { + Span span = Span.fromContext(context); span.setAttribute("lettuce.command.cancelled", true); - tracer().end(span); + tracer().end(context); } else { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } return null; } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncCommandsAdvice.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncCommandsAdvice.java index 6b5b329b2b..ca22435bf1 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncCommandsAdvice.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncCommandsAdvice.java @@ -5,12 +5,13 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceDatabaseClientTracer.tracer; import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceInstrumentationUtil.expectsResponse; import io.lettuce.core.protocol.AsyncCommand; import io.lettuce.core.protocol.RedisCommand; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import net.bytebuddy.asm.Advice; @@ -19,11 +20,11 @@ public class LettuceAsyncCommandsAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(0) RedisCommand command, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan(null, command); - scope = tracer().startScope(span); + context = tracer().startSpan(currentContext(), null, command); + scope = context.makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) @@ -31,20 +32,20 @@ public class LettuceAsyncCommandsAdvice { @Advice.Argument(0) RedisCommand command, @Advice.Thrown Throwable throwable, @Advice.Return AsyncCommand asyncCommand, - @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); return; } // close spans on error or normal completion if (expectsResponse(command)) { - asyncCommand.handleAsync(new LettuceAsyncBiFunction<>(span)); + asyncCommand.handleAsync(new LettuceAsyncBiFunction<>(context)); } else { - tracer().end(span); + tracer().end(context); } } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxCreationAdvice.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxCreationAdvice.java index 50b6920fce..70813eef3c 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxCreationAdvice.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxCreationAdvice.java @@ -25,14 +25,14 @@ public class LettuceFluxCreationAdvice { public static void monitorSpan( @Advice.Enter RedisCommand command, @Advice.Return(readOnly = false) Flux publisher) { - boolean finishSpanOnClose = !expectsResponse(command); + boolean expectsResponse = expectsResponse(command); LettuceFluxTerminationRunnable handler = - new LettuceFluxTerminationRunnable(command, finishSpanOnClose); + new LettuceFluxTerminationRunnable(command, expectsResponse); publisher = publisher.doOnSubscribe(handler.getOnSubscribeConsumer()); // don't register extra callbacks to finish the spans if the command being instrumented is one // of those that return // Mono (In here a flux is created first and then converted to Mono) - if (!finishSpanOnClose) { + if (expectsResponse) { publisher = publisher.doOnEach(handler); publisher = publisher.doOnCancel(handler); } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java index eaf56b4d0e..f978534098 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceFluxTerminationRunnable.java @@ -9,6 +9,7 @@ import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceDat import io.lettuce.core.protocol.RedisCommand; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import java.util.function.Consumer; import org.reactivestreams.Subscription; import org.slf4j.LoggerFactory; @@ -18,12 +19,12 @@ import reactor.core.publisher.SignalType; public class LettuceFluxTerminationRunnable implements Consumer>, Runnable { - private Span span = null; - private int numResults = 0; + private Context context; + private int numResults; private final FluxOnSubscribeConsumer onSubscribeConsumer; - public LettuceFluxTerminationRunnable(RedisCommand command, boolean finishSpanOnClose) { - onSubscribeConsumer = new FluxOnSubscribeConsumer(this, command, finishSpanOnClose); + public LettuceFluxTerminationRunnable(RedisCommand command, boolean expectsResponse) { + onSubscribeConsumer = new FluxOnSubscribeConsumer(this, command, expectsResponse); } public FluxOnSubscribeConsumer getOnSubscribeConsumer() { @@ -31,7 +32,8 @@ public class LettuceFluxTerminationRunnable implements Consumer>, Runn } private void finishSpan(boolean isCommandCancelled, Throwable throwable) { - if (span != null) { + if (context != null) { + Span span = Span.fromContext(context); span.setAttribute("lettuce.command.results.count", numResults); if (isCommandCancelled) { span.setAttribute("lettuce.command.cancelled", true); @@ -68,22 +70,22 @@ public class LettuceFluxTerminationRunnable implements Consumer>, Runn private final LettuceFluxTerminationRunnable owner; private final RedisCommand command; - private final boolean finishSpanOnClose; + private final boolean expectsResponse; public FluxOnSubscribeConsumer( LettuceFluxTerminationRunnable owner, RedisCommand command, - boolean finishSpanOnClose) { + boolean expectsResponse) { this.owner = owner; this.command = command; - this.finishSpanOnClose = finishSpanOnClose; + this.expectsResponse = expectsResponse; } @Override public void accept(Subscription subscription) { - owner.span = tracer().startSpan(null, command); - if (finishSpanOnClose) { - tracer().end(owner.span); + owner.context = tracer().startSpan(Context.current(), null, command); + if (!expectsResponse) { + tracer().end(owner.context); } } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceMonoDualConsumer.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceMonoDualConsumer.java index 136ecbb0e3..c030af68b0 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceMonoDualConsumer.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/rx/LettuceMonoDualConsumer.java @@ -8,7 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.rx; import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceDatabaseClientTracer.tracer; import io.lettuce.core.protocol.RedisCommand; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import java.util.function.BiConsumer; import java.util.function.Consumer; import org.slf4j.LoggerFactory; @@ -16,7 +16,7 @@ import reactor.core.publisher.Mono; public class LettuceMonoDualConsumer implements Consumer, BiConsumer { - private Span span = null; + private Context context; private final RedisCommand command; private final boolean finishSpanOnClose; @@ -27,19 +27,19 @@ public class LettuceMonoDualConsumer implements Consumer, BiConsumer spanMap = new ConcurrentHashMap<>(); + private final Map contextMap = new ConcurrentHashMap<>(); @Override public void commandStarted(CommandStartedEvent event) { - Span span = tracer().startSpan(event, event.getCommand()); - spanMap.put(event.getRequestId(), span); + Context context = tracer().startSpan(Context.current(), event, event.getCommand()); + contextMap.put(event.getRequestId(), context); } @Override public void commandSucceeded(CommandSucceededEvent event) { - Span span = spanMap.remove(event.getRequestId()); - if (span != null) { - tracer().end(span); + Context context = contextMap.remove(event.getRequestId()); + if (context != null) { + tracer().end(context); } } @Override public void commandFailed(CommandFailedEvent event) { - Span span = spanMap.remove(event.getRequestId()); - if (span != null) { - tracer().endExceptionally(span, event.getThrowable()); + Context context = contextMap.remove(event.getRequestId()); + if (context != null) { + tracer().endExceptionally(context, event.getThrowable()); } } } diff --git a/instrumentation/rediscala-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rediscala/RediscalaInstrumentationModule.java b/instrumentation/rediscala-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rediscala/RediscalaInstrumentationModule.java index 92d3aa7d52..21eb8b1eb2 100644 --- a/instrumentation/rediscala-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rediscala/RediscalaInstrumentationModule.java +++ b/instrumentation/rediscala-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rediscala/RediscalaInstrumentationModule.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.rediscala; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.rediscala.RediscalaClientTracer.tracer; import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.safeHasSuperType; @@ -18,7 +19,7 @@ import static net.bytebuddy.matcher.ElementMatchers.returns; 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.tooling.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; @@ -79,15 +80,15 @@ public class RediscalaInstrumentationModule extends InstrumentationModule { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(0) RedisCommand cmd, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan(cmd, cmd); - scope = tracer().startScope(span); + context = tracer().startSpan(currentContext(), cmd, cmd); + 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, @Advice.FieldValue("executionContext") ExecutionContext ctx, @@ -95,26 +96,26 @@ public class RediscalaInstrumentationModule extends InstrumentationModule { scope.close(); if (throwable != null) { - tracer().endExceptionally(span, throwable); + tracer().endExceptionally(context, throwable); } else { - responseFuture.onComplete(new OnCompleteHandler(span), ctx); + responseFuture.onComplete(new OnCompleteHandler(context), ctx); } } } public static class OnCompleteHandler extends AbstractFunction1, Void> { - private final Span span; + private final Context context; - public OnCompleteHandler(Span span) { - this.span = span; + public OnCompleteHandler(Context context) { + this.context = context; } @Override public Void apply(Try result) { if (result.isFailure()) { - tracer().endExceptionally(span, result.failed().get()); + tracer().endExceptionally(context, result.failed().get()); } else { - tracer().end(span); + tracer().end(context); } return null; } diff --git a/instrumentation/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonInstrumentation.java b/instrumentation/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonInstrumentation.java index f9cce747dd..08fd809977 100644 --- a/instrumentation/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonInstrumentation.java +++ b/instrumentation/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonInstrumentation.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.redisson; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.redisson.RedissonClientTracer.tracer; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; @@ -12,7 +13,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; 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; @@ -56,23 +57,23 @@ public class RedissonInstrumentation extends InstrumentationModule { public static void onEnter( @Advice.This RedisConnection connection, @Advice.Argument(0) Object arg, - @Advice.Local("otelSpan") Span span, + @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - span = tracer().startSpan(connection, arg); - scope = tracer().startScope(span); + context = tracer().startSpan(currentContext(), connection, arg); + 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/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/BulkGetCompletionListener.java b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/BulkGetCompletionListener.java index c6962764c2..768894d880 100644 --- a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/BulkGetCompletionListener.java +++ b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/BulkGetCompletionListener.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.spymemcached; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import java.util.concurrent.ExecutionException; import net.spy.memcached.MemcachedConnection; import net.spy.memcached.internal.BulkGetFuture; @@ -13,8 +14,9 @@ import net.spy.memcached.internal.BulkGetFuture; public class BulkGetCompletionListener extends CompletionListener> implements net.spy.memcached.internal.BulkGetCompletionListener { - public BulkGetCompletionListener(MemcachedConnection connection, String methodName) { - super(connection, methodName); + public BulkGetCompletionListener( + Context parentContext, MemcachedConnection connection, String methodName) { + super(parentContext, connection, methodName); } @Override diff --git a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/CompletionListener.java b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/CompletionListener.java index 7c62f80e21..f99ebdce39 100644 --- a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/CompletionListener.java +++ b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/CompletionListener.java @@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.spymemcached; import static io.opentelemetry.javaagent.instrumentation.spymemcached.MemcacheClientTracer.tracer; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import net.spy.memcached.MemcachedConnection; @@ -19,13 +20,15 @@ public abstract class CompletionListener { static final String HIT = "hit"; static final String MISS = "miss"; - private final Span span; + private final Context context; - public CompletionListener(MemcachedConnection connection, String methodName) { - span = tracer().startSpan(connection, methodName); + public CompletionListener( + Context parentContext, MemcachedConnection connection, String methodName) { + context = tracer().startSpan(parentContext, connection, methodName); } protected void closeAsyncSpan(T future) { + Span span = Span.fromContext(context); try { processResult(span, future); } catch (CancellationException e) { @@ -51,7 +54,7 @@ public abstract class CompletionListener { } protected void closeSyncSpan(Throwable thrown) { - tracer().endExceptionally(span, thrown); + tracer().endExceptionally(context, thrown); } protected abstract void processResult(Span span, T future) diff --git a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/GetCompletionListener.java b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/GetCompletionListener.java index be56baa336..f44c11694c 100644 --- a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/GetCompletionListener.java +++ b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/GetCompletionListener.java @@ -6,14 +6,16 @@ package io.opentelemetry.javaagent.instrumentation.spymemcached; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import java.util.concurrent.ExecutionException; import net.spy.memcached.MemcachedConnection; import net.spy.memcached.internal.GetFuture; public class GetCompletionListener extends CompletionListener> implements net.spy.memcached.internal.GetCompletionListener { - public GetCompletionListener(MemcachedConnection connection, String methodName) { - super(connection, methodName); + public GetCompletionListener( + Context parentContext, MemcachedConnection connection, String methodName) { + super(parentContext, connection, methodName); } @Override diff --git a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/OperationCompletionListener.java b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/OperationCompletionListener.java index 9e7cd5e8c3..d2cd4ccc2c 100644 --- a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/OperationCompletionListener.java +++ b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/OperationCompletionListener.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.spymemcached; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import java.util.concurrent.ExecutionException; import net.spy.memcached.MemcachedConnection; import net.spy.memcached.internal.OperationFuture; @@ -13,8 +14,9 @@ import net.spy.memcached.internal.OperationFuture; public class OperationCompletionListener extends CompletionListener> implements net.spy.memcached.internal.OperationCompletionListener { - public OperationCompletionListener(MemcachedConnection connection, String methodName) { - super(connection, methodName); + public OperationCompletionListener( + Context parentContext, MemcachedConnection connection, String methodName) { + super(parentContext, connection, methodName); } @Override diff --git a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedInstrumentationModule.java b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedInstrumentationModule.java index b413eb0bae..75b9aa29fa 100644 --- a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedInstrumentationModule.java +++ b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedInstrumentationModule.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.spymemcached; +import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.tooling.matcher.NameMatchers.namedOneOf; import static java.util.Collections.singletonList; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -14,6 +15,7 @@ import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.instrumentation.api.CallDepth; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap; import io.opentelemetry.javaagent.tooling.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; @@ -76,24 +78,24 @@ public class SpymemcachedInstrumentationModule extends InstrumentationModule { public static class AsyncOperationAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static int trackCallDepth() { - return CallDepthThreadLocalMap.incrementCallDepth(MemcachedClient.class); + public static void trackCallDepth(@Advice.Local("otelCallDepth") CallDepth callDepth) { + callDepth = CallDepthThreadLocalMap.getCallDepth(MemcachedClient.class); + callDepth.getAndIncrement(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void methodExit( - @Advice.Enter int callDepth, @Advice.This MemcachedClient client, @Advice.Origin("#m") String methodName, - @Advice.Return OperationFuture future) { - if (callDepth > 0) { + @Advice.Return OperationFuture future, + @Advice.Local("otelCallDepth") CallDepth callDepth) { + if (callDepth.decrementAndGet() > 0) { return; } - CallDepthThreadLocalMap.reset(MemcachedClient.class); if (future != null) { OperationCompletionListener listener = - new OperationCompletionListener(client.getConnection(), methodName); + new OperationCompletionListener(currentContext(), client.getConnection(), methodName); future.addListener(listener); } } @@ -102,24 +104,24 @@ public class SpymemcachedInstrumentationModule extends InstrumentationModule { public static class AsyncGetAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static int trackCallDepth() { - return CallDepthThreadLocalMap.incrementCallDepth(MemcachedClient.class); + public static void trackCallDepth(@Advice.Local("otelCallDepth") CallDepth callDepth) { + callDepth = CallDepthThreadLocalMap.getCallDepth(MemcachedClient.class); + callDepth.getAndIncrement(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void methodExit( - @Advice.Enter int callDepth, @Advice.This MemcachedClient client, @Advice.Origin("#m") String methodName, - @Advice.Return GetFuture future) { - if (callDepth > 0) { + @Advice.Return GetFuture future, + @Advice.Local("otelCallDepth") CallDepth callDepth) { + if (callDepth.decrementAndGet() > 0) { return; } - CallDepthThreadLocalMap.reset(MemcachedClient.class); if (future != null) { GetCompletionListener listener = - new GetCompletionListener(client.getConnection(), methodName); + new GetCompletionListener(currentContext(), client.getConnection(), methodName); future.addListener(listener); } } @@ -128,24 +130,24 @@ public class SpymemcachedInstrumentationModule extends InstrumentationModule { public static class AsyncBulkAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static int trackCallDepth() { - return CallDepthThreadLocalMap.incrementCallDepth(MemcachedClient.class); + public static void trackCallDepth(@Advice.Local("otelCallDepth") CallDepth callDepth) { + callDepth = CallDepthThreadLocalMap.getCallDepth(MemcachedClient.class); + callDepth.getAndIncrement(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void methodExit( - @Advice.Enter int callDepth, @Advice.This MemcachedClient client, @Advice.Origin("#m") String methodName, - @Advice.Return BulkFuture future) { - if (callDepth > 0) { + @Advice.Return BulkFuture future, + @Advice.Local("otelCallDepth") CallDepth callDepth) { + if (callDepth.decrementAndGet() > 0) { return; } - CallDepthThreadLocalMap.reset(MemcachedClient.class); if (future != null) { BulkGetCompletionListener listener = - new BulkGetCompletionListener(client.getConnection(), methodName); + new BulkGetCompletionListener(currentContext(), client.getConnection(), methodName); future.addListener(listener); } } @@ -155,22 +157,25 @@ public class SpymemcachedInstrumentationModule extends InstrumentationModule { @Advice.OnMethodEnter(suppress = Throwable.class) public static SyncCompletionListener methodEnter( - @Advice.This MemcachedClient client, @Advice.Origin("#m") String methodName) { - int callDepth = CallDepthThreadLocalMap.incrementCallDepth(MemcachedClient.class); - if (callDepth > 0) { + @Advice.This MemcachedClient client, + @Advice.Origin("#m") String methodName, + @Advice.Local("otelCallDepth") CallDepth callDepth) { + callDepth = CallDepthThreadLocalMap.getCallDepth(MemcachedClient.class); + if (callDepth.getAndIncrement() > 0) { return null; } - return new SyncCompletionListener(client.getConnection(), methodName); + return new SyncCompletionListener(currentContext(), client.getConnection(), methodName); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void methodExit( - @Advice.Enter SyncCompletionListener listener, @Advice.Thrown Throwable thrown) { - if (listener == null) { + @Advice.Enter SyncCompletionListener listener, + @Advice.Thrown Throwable thrown, + @Advice.Local("otelCallDepth") CallDepth callDepth) { + if (callDepth.decrementAndGet() > 0) { return; } - CallDepthThreadLocalMap.reset(MemcachedClient.class); listener.done(thrown); } diff --git a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SyncCompletionListener.java b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SyncCompletionListener.java index a547822ea2..4715af2e2d 100644 --- a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SyncCompletionListener.java +++ b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SyncCompletionListener.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.spymemcached; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; import net.spy.memcached.MemcachedConnection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,8 +15,9 @@ public class SyncCompletionListener extends CompletionListener { private static final Logger log = LoggerFactory.getLogger(SyncCompletionListener.class); - public SyncCompletionListener(MemcachedConnection connection, String methodName) { - super(connection, methodName); + public SyncCompletionListener( + Context parentContext, MemcachedConnection connection, String methodName) { + super(parentContext, connection, methodName); } @Override