From 426988eb953bda13859174bfcbc770a3e1eed90c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=A7=E6=80=9D?= Date: Mon, 4 Mar 2024 19:48:16 +0800 Subject: [PATCH 1/9] feat: add library instrumentation in reactor-netty --- .../javaagent/build.gradle.kts | 1 + .../reactornetty/v1_0/DecoratorFunctions.java | 1 + .../HttpResponseReceiverInstrumenter.java | 4 +- .../v1_0/ReactorNettySingletons.java | 2 + .../library/build.gradle.kts | 7 + .../v1_0/HttpClientRequestHeadersSetter.java | 7 +- .../v1_0/InstrumentationContexts.java | 39 +++-- ...eactorNettyHttpClientAttributesGetter.java | 6 +- .../v1_0/ReactorNettyTelemetry.java | 29 ++++ .../v1_0/ReactorNettyTelemetryBuilder.java | 157 ++++++++++++++++++ .../reactornetty/v1_0/UrlParser.java | 2 +- .../build.gradle.kts | 1 + .../HttpClientBeanPostProcessor.java | 29 ++++ settings.gradle.kts | 1 + 14 files changed, 262 insertions(+), 24 deletions(-) create mode 100644 instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/build.gradle.kts rename instrumentation/reactor/reactor-netty/reactor-netty-1.0/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java (71%) rename instrumentation/reactor/reactor-netty/reactor-netty-1.0/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/reactornetty/v1_0/InstrumentationContexts.java (70%) rename instrumentation/reactor/reactor-netty/reactor-netty-1.0/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java (93%) create mode 100644 instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java create mode 100644 instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java rename instrumentation/reactor/reactor-netty/reactor-netty-1.0/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/reactornetty/v1_0/UrlParser.java (97%) create mode 100644 instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/build.gradle.kts b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/build.gradle.kts index d2c002fdac9c..2d3b3fa18daa 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/build.gradle.kts +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { implementation(project(":instrumentation:netty:netty-4-common:library")) implementation(project(":instrumentation:netty:netty-common:library")) implementation(project(":instrumentation:reactor:reactor-3.1:library")) + implementation(project(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:library")) library("io.projectreactor.netty:reactor-netty-http:1.0.0") diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java index d806c76e796b..d23a93696ed5 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java @@ -9,6 +9,7 @@ import io.opentelemetry.context.Scope; import java.util.function.BiConsumer; import javax.annotation.Nullable; +import io.opentelemetry.instrumentation.reactornetty.v1_0.InstrumentationContexts; import reactor.netty.Connection; import reactor.netty.http.client.HttpClientInfos; import reactor.util.context.ContextView; diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java index 0804f184632f..6717c5cbb58e 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.ReactorContextKeys.CONTEXTS_HOLDER_KEY; +import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.ReactorNettySingletons.instrumenter; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount; @@ -13,6 +14,7 @@ import java.util.function.BiConsumer; import java.util.function.Function; import javax.annotation.Nullable; +import io.opentelemetry.instrumentation.reactornetty.v1_0.InstrumentationContexts; import reactor.core.publisher.Mono; import reactor.netty.Connection; import reactor.netty.http.client.HttpClient; @@ -34,7 +36,7 @@ public static HttpClient.ResponseReceiver instrument(HttpClient.ResponseRecei HttpClient client = (HttpClient) receiver; HttpClientConfig config = client.configuration(); - InstrumentationContexts instrumentationContexts = new InstrumentationContexts(); + InstrumentationContexts instrumentationContexts = new InstrumentationContexts(instrumenter()); HttpClient modified = client diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java index 5087235c26dd..5b2df22522c4 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java @@ -18,6 +18,8 @@ import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyClientInstrumenterFactory; import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyConnectionInstrumentationFlag; import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyConnectionInstrumenter; +import io.opentelemetry.instrumentation.reactornetty.v1_0.HttpClientRequestHeadersSetter; +import io.opentelemetry.instrumentation.reactornetty.v1_0.ReactorNettyHttpClientAttributesGetter; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import reactor.netty.http.client.HttpClientRequest; diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/build.gradle.kts b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/build.gradle.kts new file mode 100644 index 000000000000..6de540a5f8ff --- /dev/null +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("otel.library-instrumentation") +} + +dependencies { + implementation("io.projectreactor.netty:reactor-netty-http:1.1.0") +} diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java similarity index 71% rename from instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java rename to instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java index b7fecafa80d8..0b65876e6e37 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java @@ -3,13 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; +package io.opentelemetry.instrumentation.reactornetty.v1_0; -import io.opentelemetry.context.propagation.TextMapSetter; import javax.annotation.Nullable; + +import io.opentelemetry.context.propagation.TextMapSetter; import reactor.netty.http.client.HttpClientRequest; -enum HttpClientRequestHeadersSetter implements TextMapSetter { +public enum HttpClientRequestHeadersSetter implements TextMapSetter { INSTANCE; @Override diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/InstrumentationContexts.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/InstrumentationContexts.java similarity index 70% rename from instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/InstrumentationContexts.java rename to instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/InstrumentationContexts.java index e81a2d6eef7a..d32e2364b4f6 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/InstrumentationContexts.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/InstrumentationContexts.java @@ -3,11 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; - -import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.ReactorNettySingletons.instrumenter; +package io.opentelemetry.instrumentation.reactornetty.v1_0; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil; import io.opentelemetry.instrumentation.api.internal.Timer; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount; @@ -19,14 +18,14 @@ import reactor.netty.http.client.HttpClientRequest; import reactor.netty.http.client.HttpClientResponse; -final class InstrumentationContexts { +public final class InstrumentationContexts { private static final VirtualField requestContextVirtualField = VirtualField.find(HttpClientRequest.class, Context.class); private static final AtomicReferenceFieldUpdater parentContextUpdater = - AtomicReferenceFieldUpdater.newUpdater( - InstrumentationContexts.class, Context.class, "parentContext"); + AtomicReferenceFieldUpdater.newUpdater( + InstrumentationContexts.class, Context.class, "parentContext"); private volatile Context parentContext; private volatile Timer timer; @@ -35,7 +34,13 @@ final class InstrumentationContexts { // coexisting HTTP client spans private final Queue clientContexts = new LinkedBlockingQueue<>(); - void initialize(Context parentContext) { + private final Instrumenter instrumenter; + + public InstrumentationContexts(Instrumenter instrumenter) { + this.instrumenter = instrumenter; + } + + public void initialize(Context parentContext) { Context parentContextWithResends = HttpClientRequestResendCount.initialize(parentContext); // make sure initialization happens only once if (parentContextUpdater.compareAndSet(this, null, parentContextWithResends)) { @@ -43,29 +48,29 @@ void initialize(Context parentContext) { } } - Context getParentContext() { + public Context getParentContext() { return parentContext; } @Nullable - Context getClientContext() { + public Context getClientContext() { RequestAndContext requestAndContext = clientContexts.peek(); return requestAndContext == null ? null : requestAndContext.context; } @Nullable - Context startClientSpan(HttpClientRequest request) { + public Context startClientSpan(HttpClientRequest request) { Context parentContext = this.parentContext; Context context = null; - if (instrumenter().shouldStart(parentContext, request)) { - context = instrumenter().start(parentContext, request); + if (instrumenter.shouldStart(parentContext, request)) { + context = instrumenter.start(parentContext, request); requestContextVirtualField.set(request, context); clientContexts.offer(new RequestAndContext(request, context)); } return context; } - void endClientSpan(@Nullable HttpClientResponse response, @Nullable Throwable error) { + public void endClientSpan(@Nullable HttpClientResponse response, @Nullable Throwable error) { HttpClientRequest request = null; Context context = null; RequestAndContext requestAndContext = clientContexts.poll(); @@ -79,16 +84,16 @@ void endClientSpan(@Nullable HttpClientResponse response, @Nullable Throwable er } if (request != null && context != null) { - instrumenter().end(context, request, response, error); + instrumenter.end(context, request, response, error); } } - void startAndEndConnectionErrorSpan(HttpClientRequest request, Throwable error) { + public void startAndEndConnectionErrorSpan(HttpClientRequest request, Throwable error) { Context parentContext = this.parentContext; - if (instrumenter().shouldStart(parentContext, request)) { + if (instrumenter.shouldStart(parentContext, request)) { Timer timer = this.timer; InstrumenterUtil.startAndEnd( - instrumenter(), parentContext, request, null, error, timer.startTime(), timer.now()); + instrumenter, parentContext, request, null, error, timer.startTime(), timer.now()); } } diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java similarity index 93% rename from instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java rename to instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java index 2aa7a163d351..4bfdb9aa3507 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; +package io.opentelemetry.instrumentation.reactornetty.v1_0; import io.netty.handler.codec.http.HttpVersion; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter; @@ -15,9 +15,11 @@ import reactor.netty.http.client.HttpClientRequest; import reactor.netty.http.client.HttpClientResponse; -final class ReactorNettyHttpClientAttributesGetter +public final class ReactorNettyHttpClientAttributesGetter implements HttpClientAttributesGetter { + public static final ReactorNettyHttpClientAttributesGetter INSTANCE = new ReactorNettyHttpClientAttributesGetter(); + @Override public String getUrlFull(HttpClientRequest request) { return request.resourceUrl(); diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java new file mode 100644 index 000000000000..a9184bceb124 --- /dev/null +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java @@ -0,0 +1,29 @@ +package io.opentelemetry.instrumentation.reactornetty.v1_0; + +import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.ContextPropagators; +import java.util.concurrent.atomic.AtomicReference; +import reactor.netty.http.client.HttpClient; + +public class ReactorNettyTelemetry { + + private final InstrumentationContexts contexts; + + private final ContextPropagators propagators; + + ReactorNettyTelemetry(InstrumentationContexts contexts, ContextPropagators propagators) { + this.contexts = contexts; + this.propagators = propagators; + } + + public HttpClient tracingHttpClient(HttpClient httpClient) { + AtomicReference clientContext = new AtomicReference<>(); + return httpClient.doOnRequest((request, connection) -> { + // create span + contexts.startClientSpan(request); + propagators.getTextMapPropagator().inject(clientContext.get(), request, HttpClientRequestHeadersSetter.INSTANCE); + }).doOnResponse((response, connection) -> { + contexts.endClientSpan(response, null); + }).doOnResponseError(contexts::endClientSpan); + } +} diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java new file mode 100644 index 000000000000..cda59835eab2 --- /dev/null +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java @@ -0,0 +1,157 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.reactornetty.v1_0; + +import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient; + +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; +import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics; +import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; +import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder; +import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; +import reactor.netty.http.client.HttpClientRequest; +import reactor.netty.http.client.HttpClientResponse; + +/** A builder of {@link ReactorNettyTelemetry}. */ +public final class ReactorNettyTelemetryBuilder { + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.reactor-netty-1.0"; + + private final List> + clientAdditionalExtractors = new ArrayList<>(); + + private final OpenTelemetry openTelemetry; + + private boolean emitExperimentalHttpClientTelemetry = false; + + private Consumer> + clientExtractorConfigurer = builder -> {}; + private Consumer> clientSpanNameExtractorConfigurer = + builder -> {}; + + private final HttpClientAttributesExtractorBuilder + httpClientAttributesExtractorBuilder = HttpClientAttributesExtractor.builder(ReactorNettyHttpClientAttributesGetter.INSTANCE); + + public ReactorNettyTelemetryBuilder(OpenTelemetry openTelemetry) { + this.openTelemetry = openTelemetry; + } + + /** + * Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented + * items for HttpClient. + */ + @CanIgnoreReturnValue + public ReactorNettyTelemetryBuilder addClientAttributesExtractor( + AttributesExtractor attributesExtractor) { + clientAdditionalExtractors.add(attributesExtractor); + return this; + } + + /** + * Configures the HTTP HttpClient request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + @CanIgnoreReturnValue + public ReactorNettyTelemetryBuilder setCapturedClientRequestHeaders( + List requestHeaders) { + clientExtractorConfigurer = + clientExtractorConfigurer.andThen( + builder -> builder.setCapturedRequestHeaders(requestHeaders)); + return this; + } + + /** + * Configures the HTTP HttpClient response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + @CanIgnoreReturnValue + public ReactorNettyTelemetryBuilder setCapturedClientResponseHeaders( + List responseHeaders) { + clientExtractorConfigurer = + clientExtractorConfigurer.andThen( + builder -> builder.setCapturedResponseHeaders(responseHeaders)); + return this; + } + + + /** + * Configures the instrumentation to recognize an alternative set of HTTP request methods. + * + *

By default, this instrumentation defines "known" methods as the ones listed in RFC9110 and the PATCH + * method defined in RFC5789. + * + *

Note: calling this method overrides the default known method sets completely; it does + * not supplement it. + * + * @param knownMethods A set of recognized HTTP request methods. + * @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set) + */ + @CanIgnoreReturnValue + public ReactorNettyTelemetryBuilder setKnownMethods(Set knownMethods) { + clientExtractorConfigurer = + clientExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); + clientSpanNameExtractorConfigurer = + clientSpanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); + return this; + } + + /** + * Configures the instrumentation to emit experimental HTTP client metrics. + * + * @param emitExperimentalHttpClientTelemetry {@code true} if the experimental HTTP client metrics + * are to be emitted. + */ + @CanIgnoreReturnValue + public ReactorNettyTelemetryBuilder setEmitExperimentalHttpClientTelemetry( + boolean emitExperimentalHttpClientTelemetry) { + this.emitExperimentalHttpClientTelemetry = emitExperimentalHttpClientTelemetry; + return this; + } + + /** + * Returns a new {@link ReactorNettyTelemetry} with the settings of this {@link + * ReactorNettyTelemetryBuilder}. + */ + public ReactorNettyTelemetry build() { + ReactorNettyHttpClientAttributesGetter httpAttributesGetter = ReactorNettyHttpClientAttributesGetter.INSTANCE; + + HttpClientAttributesExtractorBuilder extractorBuilder = + HttpClientAttributesExtractor.builder(httpAttributesGetter); + + HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = + HttpSpanNameExtractor.builder(httpAttributesGetter); + + InstrumenterBuilder clientBuilder = + Instrumenter.builder( + openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build()) + .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) + .addAttributesExtractor(extractorBuilder.build()) + .addOperationMetrics(HttpClientMetrics.get()); + + if (emitExperimentalHttpClientTelemetry) { + clientBuilder + .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) + .addOperationMetrics(HttpClientExperimentalMetrics.get()); + } + + // headers are injected elsewhere; ClientRequest is immutable + return new ReactorNettyTelemetry(new InstrumentationContexts(clientBuilder.buildInstrumenter(alwaysClient())), openTelemetry.getPropagators()); + } +} diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/UrlParser.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/UrlParser.java similarity index 97% rename from instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/UrlParser.java rename to instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/UrlParser.java index bbd0003c04d9..bff6fedb4a4a 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/UrlParser.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/UrlParser.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; +package io.opentelemetry.instrumentation.reactornetty.v1_0; import javax.annotation.Nullable; diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index 255f750d6d84..bd2830742efd 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { implementation(project(":instrumentation:spring:spring-web:spring-web-3.1:library")) implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-5.3:library")) implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library")) + implementation(project(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:library")) compileOnly("javax.servlet:javax.servlet-api:3.1.0") compileOnly("jakarta.servlet:jakarta.servlet-api:5.0.0") implementation(project(":instrumentation:spring:spring-webflux:spring-webflux-5.3:library")) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java new file mode 100644 index 000000000000..33dba1ccf326 --- /dev/null +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java @@ -0,0 +1,29 @@ +package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.reactornetty; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.reactornetty.v1_0.ReactorNettyTelemetryBuilder; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.config.BeanPostProcessor; +import reactor.netty.http.client.HttpClient; + +public class HttpClientBeanPostProcessor implements BeanPostProcessor { + private final ObjectProvider openTelemetryProvider; + + HttpClientBeanPostProcessor(ObjectProvider openTelemetryProvider) { + this.openTelemetryProvider = openTelemetryProvider; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) { + OpenTelemetry openTelemetry = openTelemetryProvider.getIfAvailable(); + if (openTelemetry == null) { + return bean; + } + if (bean instanceof HttpClient) { + HttpClient httpClient = (HttpClient) bean; + ReactorNettyTelemetryBuilder builder = new ReactorNettyTelemetryBuilder(openTelemetry); + bean = builder.build().tracingHttpClient(httpClient); + } + return bean; + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 00a34d0c372e..2bdc55d8f617 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -453,6 +453,7 @@ include(":instrumentation:reactor:reactor-kafka-1.0:testing") include(":instrumentation:reactor:reactor-netty:reactor-netty-0.9:javaagent") include(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:javaagent") include(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:javaagent-unit-tests") +include(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:library") include(":instrumentation:rediscala-1.8:javaagent") include(":instrumentation:redisson:redisson-3.0:javaagent") include(":instrumentation:redisson:redisson-3.17:javaagent") From 2fbfc8c55b221afe8d19f709b8013ddc3c6c4780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=A7=E6=80=9D?= Date: Fri, 29 Mar 2024 17:35:14 +0800 Subject: [PATCH 2/9] feat: support jedis 2.7.2 --- .../jedis-1.4/javaagent/build.gradle.kts | 10 ++ .../v1_4/JedisConnectionInstrumentation.java | 49 +++++++ .../JedisClientTest.java | 133 ++++++++++++++++++ 3 files changed, 192 insertions(+) create mode 100644 instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io.opentelemetry.javaagent.instrumentation.jedis.v2_7_2/JedisClientTest.java diff --git a/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts b/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts index 2e446ca8b53a..ec832eaddafe 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts +++ b/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts @@ -25,6 +25,16 @@ dependencies { latestDepTestLibrary("redis.clients:jedis:2.+") // see jedis-3.0 module } +testing { + suites { + dependencies { + val test_2_7_2 by registering(JvmTestSuite::class) { + implementation("redis.clients:jedis:2.7.2") + } + } + } +} + tasks { test { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java index c2386d5821e7..9a0ff6a11438 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java @@ -46,6 +46,13 @@ public void transform(TypeTransformer transformer) { .and(takesArgument(0, named("redis.clients.jedis.Protocol$Command"))) .and(takesArgument(1, is(byte[][].class))), this.getClass().getName() + "$SendCommandWithArgsAdvice"); + // For version 2.7.2 + transformer.applyAdviceToMethod(isMethod() + .and(named("sendCommand")) + .and(takesArguments(2)) + .and(takesArgument(0, named("redis.clients.jedis.ProtocolCommand"))) + .and(takesArgument(1, is(byte[][].class))), + this.getClass().getName() + "$SendCommandWithProtocolCommandArgsAdvice"); } @SuppressWarnings("unused") @@ -118,4 +125,46 @@ public static void stopSpan( JedisRequestContext.endIfNotAttached(instrumenter(), context, request, throwable); } } + + @SuppressWarnings("unused") + public static class SendCommandWithProtocolCommandArgsAdvice { + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.This Connection connection, + @Advice.Argument(0) Object command, + @Advice.Argument(1) byte[][] args, + @Advice.Local("otelJedisRequest") JedisRequest request, + @Advice.Local("otelContext") Context context, + @Advice.Local("otelScope") Scope scope) { + Context parentContext = currentContext(); + Protocol.Command cmd = null; + // It must be a Protocol.Command in redis 2.7.2 + if (command instanceof Protocol.Command) { + cmd = (Protocol.Command) command; + } + request = JedisRequest.create(connection, cmd, asList(args)); + if (!instrumenter().shouldStart(parentContext, request)) { + return; + } + + context = instrumenter().start(parentContext, request); + scope = context.makeCurrent(); + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void stopSpan( + @Advice.Thrown Throwable throwable, + @Advice.Local("otelJedisRequest") JedisRequest request, + @Advice.Local("otelContext") Context context, + @Advice.Local("otelScope") Scope scope) { + if (scope == null) { + return; + } + + scope.close(); + JedisRequestContext.endIfNotAttached(instrumenter(), context, request, throwable); + } + } + } diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io.opentelemetry.javaagent.instrumentation.jedis.v2_7_2/JedisClientTest.java b/instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io.opentelemetry.javaagent.instrumentation.jedis.v2_7_2/JedisClientTest.java new file mode 100644 index 000000000000..b9b316b73ca7 --- /dev/null +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io.opentelemetry.javaagent.instrumentation.jedis.v2_7_2/JedisClientTest.java @@ -0,0 +1,133 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jedis.v2_7_2; + +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.semconv.SemanticAttributes; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.testcontainers.containers.GenericContainer; +import redis.clients.jedis.Jedis; + +class JedisClientTest { + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + static GenericContainer redisServer = + new GenericContainer<>("redis:6.2.3-alpine").withExposedPorts(6379); + + static int port; + + static Jedis jedis; + + @BeforeAll + static void setup() { + redisServer.start(); + port = redisServer.getMappedPort(6379); + jedis = new Jedis("localhost", port); + } + + @AfterAll + static void cleanup() { + redisServer.stop(); + } + + @BeforeEach + void reset() { + jedis.flushAll(); + testing.clearData(); + } + + @Test + void setCommand() { + jedis.set("foo", "bar"); + + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("SET") + .hasKind(SpanKind.CLIENT) + .hasAttributesSatisfyingExactly( + equalTo(SemanticAttributes.DB_SYSTEM, "redis"), + equalTo(SemanticAttributes.DB_STATEMENT, "SET foo ?"), + equalTo(SemanticAttributes.DB_OPERATION, "SET"), + equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), + equalTo(SemanticAttributes.SERVER_PORT, port)))); + } + + @Test + void getCommand() { + jedis.set("foo", "bar"); + String value = jedis.get("foo"); + + assertThat(value).isEqualTo("bar"); + + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("SET") + .hasKind(SpanKind.CLIENT) + .hasAttributesSatisfyingExactly( + equalTo(SemanticAttributes.DB_SYSTEM, "redis"), + equalTo(SemanticAttributes.DB_STATEMENT, "SET foo ?"), + equalTo(SemanticAttributes.DB_OPERATION, "SET"), + equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), + equalTo(SemanticAttributes.SERVER_PORT, port))), + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("GET") + .hasKind(SpanKind.CLIENT) + .hasAttributesSatisfyingExactly( + equalTo(SemanticAttributes.DB_SYSTEM, "redis"), + equalTo(SemanticAttributes.DB_STATEMENT, "GET foo"), + equalTo(SemanticAttributes.DB_OPERATION, "GET"), + equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), + equalTo(SemanticAttributes.SERVER_PORT, port)))); + } + + @Test + void commandWithNoArguments() { + jedis.set("foo", "bar"); + String value = jedis.randomKey(); + + assertThat(value).isEqualTo("foo"); + + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("SET") + .hasKind(SpanKind.CLIENT) + .hasAttributesSatisfyingExactly( + equalTo(SemanticAttributes.DB_SYSTEM, "redis"), + equalTo(SemanticAttributes.DB_STATEMENT, "SET foo ?"), + equalTo(SemanticAttributes.DB_OPERATION, "SET"), + equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), + equalTo(SemanticAttributes.SERVER_PORT, port))), + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("RANDOMKEY") + .hasKind(SpanKind.CLIENT) + .hasAttributesSatisfyingExactly( + equalTo(SemanticAttributes.DB_SYSTEM, "redis"), + equalTo(SemanticAttributes.DB_STATEMENT, "RANDOMKEY"), + equalTo(SemanticAttributes.DB_OPERATION, "RANDOMKEY"), + equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), + equalTo(SemanticAttributes.SERVER_PORT, port)))); + } +} From 36f6d9669b5806faf81a631f846add6c28d1a57a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=A7=E6=80=9D?= Date: Fri, 29 Mar 2024 22:23:56 +0800 Subject: [PATCH 3/9] add ut for 2.7.2 --- .../jedis-1.4/javaagent/build.gradle.kts | 13 +- .../v1_4/JedisConnectionInstrumentation.java | 50 ++++++- .../jedis/v1_4/JedisClientTest.java | 127 +----------------- .../jedis/v1_4/JedisClientTest.java | 10 ++ .../jedis/jedis-1.4/testing/build.gradle.kts | 9 ++ .../jedis/AbstractJedisTest.java} | 4 +- .../reactornetty/v1_0/DecoratorFunctions.java | 2 +- .../HttpResponseReceiverInstrumenter.java | 2 +- .../v1_0/HttpClientRequestHeadersSetter.java | 3 +- .../v1_0/InstrumentationContexts.java | 4 +- ...eactorNettyHttpClientAttributesGetter.java | 3 +- .../v1_0/ReactorNettyTelemetry.java | 26 +++- .../v1_0/ReactorNettyTelemetryBuilder.java | 20 +-- .../HttpClientBeanPostProcessor.java | 5 + settings.gradle.kts | 1 + 15 files changed, 125 insertions(+), 154 deletions(-) create mode 100644 instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java create mode 100644 instrumentation/jedis/jedis-1.4/testing/build.gradle.kts rename instrumentation/jedis/jedis-1.4/{javaagent/src/test_2_7_2/java/io.opentelemetry.javaagent.instrumentation.jedis.v2_7_2/JedisClientTest.java => testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java} (98%) diff --git a/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts b/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts index ec832eaddafe..6b5d3657a8c5 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts +++ b/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { annotationProcessor("com.google.auto.value:auto-value") implementation(project(":instrumentation:jedis:jedis-common:javaagent")) + testImplementation(project(":instrumentation:jedis:jedis-1.4:testing")) testInstrumentation(project(":instrumentation:jedis:jedis-3.0:javaagent")) testInstrumentation(project(":instrumentation:jedis:jedis-4.0:javaagent")) @@ -27,9 +28,17 @@ dependencies { testing { suites { - dependencies { - val test_2_7_2 by registering(JvmTestSuite::class) { + val test_2_7_2 by registering(JvmTestSuite::class) { + dependencies { implementation("redis.clients:jedis:2.7.2") + implementation(project(":instrumentation:jedis:jedis-1.4:testing")) + targets { + all { + testTask.configure { + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + } + } + } } } } diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java index 9a0ff6a11438..73245fd147bd 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java @@ -47,7 +47,14 @@ public void transform(TypeTransformer transformer) { .and(takesArgument(1, is(byte[][].class))), this.getClass().getName() + "$SendCommandWithArgsAdvice"); // For version 2.7.2 - transformer.applyAdviceToMethod(isMethod() + transformer.applyAdviceToMethod( + isMethod() + .and(named("sendCommand")) + .and(takesArguments(1)) + .and(takesArgument(0, named("redis.clients.jedis.ProtocolCommand"))), + this.getClass().getName() + "$SendCommandWithProtocolNoArgsAdvice"); + transformer.applyAdviceToMethod( + isMethod() .and(named("sendCommand")) .and(takesArguments(2)) .and(takesArgument(0, named("redis.clients.jedis.ProtocolCommand"))) @@ -126,6 +133,46 @@ public static void stopSpan( } } + @SuppressWarnings("unused") + public static class SendCommandWithProtocolNoArgsAdvice { + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.This Connection connection, + @Advice.Argument(0) Object command, + @Advice.Local("otelJedisRequest") JedisRequest request, + @Advice.Local("otelContext") Context context, + @Advice.Local("otelScope") Scope scope) { + Context parentContext = currentContext(); + Protocol.Command cmd = null; + // It must be a Protocol.Command in redis 2.7.2 + if (command instanceof Protocol.Command) { + cmd = (Protocol.Command) command; + } + request = JedisRequest.create(connection, cmd); + if (!instrumenter().shouldStart(parentContext, request)) { + return; + } + + context = instrumenter().start(parentContext, request); + scope = context.makeCurrent(); + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void stopSpan( + @Advice.Thrown Throwable throwable, + @Advice.Local("otelJedisRequest") JedisRequest request, + @Advice.Local("otelContext") Context context, + @Advice.Local("otelScope") Scope scope) { + if (scope == null) { + return; + } + + scope.close(); + JedisRequestContext.endIfNotAttached(instrumenter(), context, request, throwable); + } + } + @SuppressWarnings("unused") public static class SendCommandWithProtocolCommandArgsAdvice { @@ -166,5 +213,4 @@ public static void stopSpan( JedisRequestContext.endIfNotAttached(instrumenter(), context, request, throwable); } } - } diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java b/instrumentation/jedis/jedis-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java index 1a4aafef54a1..99b5bfc6272d 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java @@ -5,129 +5,6 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v1_4; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; -import static org.assertj.core.api.Assertions.assertThat; +import io.opentelemetry.javaagent.instrumentation.jedis.AbstractJedisTest; -import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.SemanticAttributes; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.testcontainers.containers.GenericContainer; -import redis.clients.jedis.Jedis; - -class JedisClientTest { - @RegisterExtension - static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - - static GenericContainer redisServer = - new GenericContainer<>("redis:6.2.3-alpine").withExposedPorts(6379); - - static int port; - - static Jedis jedis; - - @BeforeAll - static void setup() { - redisServer.start(); - port = redisServer.getMappedPort(6379); - jedis = new Jedis("localhost", port); - } - - @AfterAll - static void cleanup() { - redisServer.stop(); - } - - @BeforeEach - void reset() { - jedis.flushAll(); - testing.clearData(); - } - - @Test - void setCommand() { - jedis.set("foo", "bar"); - - testing.waitAndAssertTraces( - trace -> - trace.hasSpansSatisfyingExactly( - span -> - span.hasName("SET") - .hasKind(SpanKind.CLIENT) - .hasAttributesSatisfyingExactly( - equalTo(SemanticAttributes.DB_SYSTEM, "redis"), - equalTo(SemanticAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(SemanticAttributes.DB_OPERATION, "SET"), - equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), - equalTo(SemanticAttributes.SERVER_PORT, port)))); - } - - @Test - void getCommand() { - jedis.set("foo", "bar"); - String value = jedis.get("foo"); - - assertThat(value).isEqualTo("bar"); - - testing.waitAndAssertTraces( - trace -> - trace.hasSpansSatisfyingExactly( - span -> - span.hasName("SET") - .hasKind(SpanKind.CLIENT) - .hasAttributesSatisfyingExactly( - equalTo(SemanticAttributes.DB_SYSTEM, "redis"), - equalTo(SemanticAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(SemanticAttributes.DB_OPERATION, "SET"), - equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), - equalTo(SemanticAttributes.SERVER_PORT, port))), - trace -> - trace.hasSpansSatisfyingExactly( - span -> - span.hasName("GET") - .hasKind(SpanKind.CLIENT) - .hasAttributesSatisfyingExactly( - equalTo(SemanticAttributes.DB_SYSTEM, "redis"), - equalTo(SemanticAttributes.DB_STATEMENT, "GET foo"), - equalTo(SemanticAttributes.DB_OPERATION, "GET"), - equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), - equalTo(SemanticAttributes.SERVER_PORT, port)))); - } - - @Test - void commandWithNoArguments() { - jedis.set("foo", "bar"); - String value = jedis.randomKey(); - - assertThat(value).isEqualTo("foo"); - - testing.waitAndAssertTraces( - trace -> - trace.hasSpansSatisfyingExactly( - span -> - span.hasName("SET") - .hasKind(SpanKind.CLIENT) - .hasAttributesSatisfyingExactly( - equalTo(SemanticAttributes.DB_SYSTEM, "redis"), - equalTo(SemanticAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(SemanticAttributes.DB_OPERATION, "SET"), - equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), - equalTo(SemanticAttributes.SERVER_PORT, port))), - trace -> - trace.hasSpansSatisfyingExactly( - span -> - span.hasName("RANDOMKEY") - .hasKind(SpanKind.CLIENT) - .hasAttributesSatisfyingExactly( - equalTo(SemanticAttributes.DB_SYSTEM, "redis"), - equalTo(SemanticAttributes.DB_STATEMENT, "RANDOMKEY"), - equalTo(SemanticAttributes.DB_OPERATION, "RANDOMKEY"), - equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), - equalTo(SemanticAttributes.SERVER_PORT, port)))); - } -} +class JedisClientTest extends AbstractJedisTest {} diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java b/instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java new file mode 100644 index 000000000000..99b5bfc6272d --- /dev/null +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jedis.v1_4; + +import io.opentelemetry.javaagent.instrumentation.jedis.AbstractJedisTest; + +class JedisClientTest extends AbstractJedisTest {} diff --git a/instrumentation/jedis/jedis-1.4/testing/build.gradle.kts b/instrumentation/jedis/jedis-1.4/testing/build.gradle.kts new file mode 100644 index 000000000000..38876e40dcf8 --- /dev/null +++ b/instrumentation/jedis/jedis-1.4/testing/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("otel.java-conventions") +} + +dependencies { + compileOnly("redis.clients:jedis:1.4.0") + api(project(":testing-common")) + implementation("org.testcontainers:testcontainers") +} diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io.opentelemetry.javaagent.instrumentation.jedis.v2_7_2/JedisClientTest.java b/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java similarity index 98% rename from instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io.opentelemetry.javaagent.instrumentation.jedis.v2_7_2/JedisClientTest.java rename to instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java index b9b316b73ca7..5427679fbf42 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io.opentelemetry.javaagent.instrumentation.jedis.v2_7_2/JedisClientTest.java +++ b/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.jedis.v2_7_2; +package io.opentelemetry.javaagent.instrumentation.jedis; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static org.assertj.core.api.Assertions.assertThat; @@ -20,7 +20,7 @@ import org.testcontainers.containers.GenericContainer; import redis.clients.jedis.Jedis; -class JedisClientTest { +public abstract class AbstractJedisTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java index d23a93696ed5..b3f370a10f92 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java @@ -7,9 +7,9 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.reactornetty.v1_0.InstrumentationContexts; import java.util.function.BiConsumer; import javax.annotation.Nullable; -import io.opentelemetry.instrumentation.reactornetty.v1_0.InstrumentationContexts; import reactor.netty.Connection; import reactor.netty.http.client.HttpClientInfos; import reactor.util.context.ContextView; diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java index 6717c5cbb58e..7b50a5ca125d 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java @@ -11,10 +11,10 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount; import io.opentelemetry.instrumentation.netty.v4_1.NettyClientTelemetry; +import io.opentelemetry.instrumentation.reactornetty.v1_0.InstrumentationContexts; import java.util.function.BiConsumer; import java.util.function.Function; import javax.annotation.Nullable; -import io.opentelemetry.instrumentation.reactornetty.v1_0.InstrumentationContexts; import reactor.core.publisher.Mono; import reactor.netty.Connection; import reactor.netty.http.client.HttpClient; diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java index 0b65876e6e37..0ad33d435fcb 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java @@ -5,9 +5,8 @@ package io.opentelemetry.instrumentation.reactornetty.v1_0; -import javax.annotation.Nullable; - import io.opentelemetry.context.propagation.TextMapSetter; +import javax.annotation.Nullable; import reactor.netty.http.client.HttpClientRequest; public enum HttpClientRequestHeadersSetter implements TextMapSetter { diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/InstrumentationContexts.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/InstrumentationContexts.java index d32e2364b4f6..03d3ba69c5dd 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/InstrumentationContexts.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/InstrumentationContexts.java @@ -24,8 +24,8 @@ public final class InstrumentationContexts { private static final AtomicReferenceFieldUpdater parentContextUpdater = - AtomicReferenceFieldUpdater.newUpdater( - InstrumentationContexts.class, Context.class, "parentContext"); + AtomicReferenceFieldUpdater.newUpdater( + InstrumentationContexts.class, Context.class, "parentContext"); private volatile Context parentContext; private volatile Timer timer; diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java index 4bfdb9aa3507..50bbd017f05e 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java @@ -18,7 +18,8 @@ public final class ReactorNettyHttpClientAttributesGetter implements HttpClientAttributesGetter { - public static final ReactorNettyHttpClientAttributesGetter INSTANCE = new ReactorNettyHttpClientAttributesGetter(); + public static final ReactorNettyHttpClientAttributesGetter INSTANCE = + new ReactorNettyHttpClientAttributesGetter(); @Override public String getUrlFull(HttpClientRequest request) { diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java index a9184bceb124..c94d220cf42e 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.reactornetty.v1_0; import io.opentelemetry.context.Context; @@ -18,12 +23,19 @@ public class ReactorNettyTelemetry { public HttpClient tracingHttpClient(HttpClient httpClient) { AtomicReference clientContext = new AtomicReference<>(); - return httpClient.doOnRequest((request, connection) -> { - // create span - contexts.startClientSpan(request); - propagators.getTextMapPropagator().inject(clientContext.get(), request, HttpClientRequestHeadersSetter.INSTANCE); - }).doOnResponse((response, connection) -> { - contexts.endClientSpan(response, null); - }).doOnResponseError(contexts::endClientSpan); + return httpClient + .doOnRequest( + (request, connection) -> { + // create span + contexts.startClientSpan(request); + propagators + .getTextMapPropagator() + .inject(clientContext.get(), request, HttpClientRequestHeadersSetter.INSTANCE); + }) + .doOnResponse( + (response, connection) -> { + contexts.endClientSpan(response, null); + }) + .doOnResponseError(contexts::endClientSpan); } } diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java index cda59835eab2..44aee6314336 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java @@ -40,11 +40,12 @@ public final class ReactorNettyTelemetryBuilder { private Consumer> clientExtractorConfigurer = builder -> {}; - private Consumer> clientSpanNameExtractorConfigurer = - builder -> {}; - + private Consumer> + clientSpanNameExtractorConfigurer = builder -> {}; + private final HttpClientAttributesExtractorBuilder - httpClientAttributesExtractorBuilder = HttpClientAttributesExtractor.builder(ReactorNettyHttpClientAttributesGetter.INSTANCE); + httpClientAttributesExtractorBuilder = + HttpClientAttributesExtractor.builder(ReactorNettyHttpClientAttributesGetter.INSTANCE); public ReactorNettyTelemetryBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -67,8 +68,7 @@ public ReactorNettyTelemetryBuilder addClientAttributesExtractor( * @param requestHeaders A list of HTTP header names. */ @CanIgnoreReturnValue - public ReactorNettyTelemetryBuilder setCapturedClientRequestHeaders( - List requestHeaders) { + public ReactorNettyTelemetryBuilder setCapturedClientRequestHeaders(List requestHeaders) { clientExtractorConfigurer = clientExtractorConfigurer.andThen( builder -> builder.setCapturedRequestHeaders(requestHeaders)); @@ -89,7 +89,6 @@ public ReactorNettyTelemetryBuilder setCapturedClientResponseHeaders( return this; } - /** * Configures the instrumentation to recognize an alternative set of HTTP request methods. * @@ -130,7 +129,8 @@ public ReactorNettyTelemetryBuilder setEmitExperimentalHttpClientTelemetry( * ReactorNettyTelemetryBuilder}. */ public ReactorNettyTelemetry build() { - ReactorNettyHttpClientAttributesGetter httpAttributesGetter = ReactorNettyHttpClientAttributesGetter.INSTANCE; + ReactorNettyHttpClientAttributesGetter httpAttributesGetter = + ReactorNettyHttpClientAttributesGetter.INSTANCE; HttpClientAttributesExtractorBuilder extractorBuilder = HttpClientAttributesExtractor.builder(httpAttributesGetter); @@ -152,6 +152,8 @@ public ReactorNettyTelemetry build() { } // headers are injected elsewhere; ClientRequest is immutable - return new ReactorNettyTelemetry(new InstrumentationContexts(clientBuilder.buildInstrumenter(alwaysClient())), openTelemetry.getPropagators()); + return new ReactorNettyTelemetry( + new InstrumentationContexts(clientBuilder.buildInstrumenter(alwaysClient())), + openTelemetry.getPropagators()); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java index 33dba1ccf326..522fd3b5b926 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.reactornetty; import io.opentelemetry.api.OpenTelemetry; diff --git a/settings.gradle.kts b/settings.gradle.kts index 2bdc55d8f617..8da080ff44b0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -309,6 +309,7 @@ include(":instrumentation:jdbc:javaagent") include(":instrumentation:jdbc:library") include(":instrumentation:jdbc:testing") include(":instrumentation:jedis:jedis-1.4:javaagent") +include(":instrumentation:jedis:jedis-1.4:testing") include(":instrumentation:jedis:jedis-3.0:javaagent") include(":instrumentation:jedis:jedis-4.0:javaagent") include(":instrumentation:jedis:jedis-common:javaagent") From 75c4056cab9dda3b84b58eb3f4e3e70f0f5f67c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=A7=E6=80=9D?= Date: Fri, 29 Mar 2024 22:55:19 +0800 Subject: [PATCH 4/9] revert commit --- .../javaagent/build.gradle.kts | 1 - .../v1_0/HttpClientRequestHeadersSetter.java | 4 +- .../HttpResponseReceiverInstrumenter.java | 3 +- .../v1_0/InstrumentationContexts.java | 35 ++-- ...eactorNettyHttpClientAttributesGetter.java | 7 +- .../v1_0/ReactorNettySingletons.java | 2 - .../reactornetty/v1_0/UrlParser.java | 2 +- .../library/build.gradle.kts | 7 - .../v1_0/ReactorNettyTelemetry.java | 41 ----- .../v1_0/ReactorNettyTelemetryBuilder.java | 159 ------------------ .../build.gradle.kts | 1 - .../HttpClientBeanPostProcessor.java | 34 ---- settings.gradle.kts | 1 - 13 files changed, 21 insertions(+), 276 deletions(-) rename instrumentation/reactor/reactor-netty/reactor-netty-1.0/{library/src/main/java/io/opentelemetry => javaagent/src/main/java/io/opentelemetry/javaagent}/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java (71%) rename instrumentation/reactor/reactor-netty/reactor-netty-1.0/{library/src/main/java/io/opentelemetry => javaagent/src/main/java/io/opentelemetry/javaagent}/instrumentation/reactornetty/v1_0/InstrumentationContexts.java (73%) rename instrumentation/reactor/reactor-netty/reactor-netty-1.0/{library/src/main/java/io/opentelemetry => javaagent/src/main/java/io/opentelemetry/javaagent}/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java (93%) rename instrumentation/reactor/reactor-netty/reactor-netty-1.0/{library/src/main/java/io/opentelemetry => javaagent/src/main/java/io/opentelemetry/javaagent}/instrumentation/reactornetty/v1_0/UrlParser.java (97%) delete mode 100644 instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/build.gradle.kts delete mode 100644 instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java delete mode 100644 instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java delete mode 100644 instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/build.gradle.kts b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/build.gradle.kts index 2d3b3fa18daa..d2c002fdac9c 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/build.gradle.kts +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/build.gradle.kts @@ -28,7 +28,6 @@ dependencies { implementation(project(":instrumentation:netty:netty-4-common:library")) implementation(project(":instrumentation:netty:netty-common:library")) implementation(project(":instrumentation:reactor:reactor-3.1:library")) - implementation(project(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:library")) library("io.projectreactor.netty:reactor-netty-http:1.0.0") diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java similarity index 71% rename from instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java rename to instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java index 0ad33d435fcb..b7fecafa80d8 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpClientRequestHeadersSetter.java @@ -3,13 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.reactornetty.v1_0; +package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; import io.opentelemetry.context.propagation.TextMapSetter; import javax.annotation.Nullable; import reactor.netty.http.client.HttpClientRequest; -public enum HttpClientRequestHeadersSetter implements TextMapSetter { +enum HttpClientRequestHeadersSetter implements TextMapSetter { INSTANCE; @Override diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java index 7b50a5ca125d..931c3a4bd6ce 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java @@ -6,7 +6,6 @@ package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.ReactorContextKeys.CONTEXTS_HOLDER_KEY; -import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.ReactorNettySingletons.instrumenter; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount; @@ -36,7 +35,7 @@ public static HttpClient.ResponseReceiver instrument(HttpClient.ResponseRecei HttpClient client = (HttpClient) receiver; HttpClientConfig config = client.configuration(); - InstrumentationContexts instrumentationContexts = new InstrumentationContexts(instrumenter()); + InstrumentationContexts instrumentationContexts = new InstrumentationContexts(); HttpClient modified = client diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/InstrumentationContexts.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/InstrumentationContexts.java similarity index 73% rename from instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/InstrumentationContexts.java rename to instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/InstrumentationContexts.java index 03d3ba69c5dd..e81a2d6eef7a 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/InstrumentationContexts.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/InstrumentationContexts.java @@ -3,10 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.reactornetty.v1_0; +package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; + +import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.ReactorNettySingletons.instrumenter; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil; import io.opentelemetry.instrumentation.api.internal.Timer; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount; @@ -18,7 +19,7 @@ import reactor.netty.http.client.HttpClientRequest; import reactor.netty.http.client.HttpClientResponse; -public final class InstrumentationContexts { +final class InstrumentationContexts { private static final VirtualField requestContextVirtualField = VirtualField.find(HttpClientRequest.class, Context.class); @@ -34,13 +35,7 @@ public final class InstrumentationContexts { // coexisting HTTP client spans private final Queue clientContexts = new LinkedBlockingQueue<>(); - private final Instrumenter instrumenter; - - public InstrumentationContexts(Instrumenter instrumenter) { - this.instrumenter = instrumenter; - } - - public void initialize(Context parentContext) { + void initialize(Context parentContext) { Context parentContextWithResends = HttpClientRequestResendCount.initialize(parentContext); // make sure initialization happens only once if (parentContextUpdater.compareAndSet(this, null, parentContextWithResends)) { @@ -48,29 +43,29 @@ public void initialize(Context parentContext) { } } - public Context getParentContext() { + Context getParentContext() { return parentContext; } @Nullable - public Context getClientContext() { + Context getClientContext() { RequestAndContext requestAndContext = clientContexts.peek(); return requestAndContext == null ? null : requestAndContext.context; } @Nullable - public Context startClientSpan(HttpClientRequest request) { + Context startClientSpan(HttpClientRequest request) { Context parentContext = this.parentContext; Context context = null; - if (instrumenter.shouldStart(parentContext, request)) { - context = instrumenter.start(parentContext, request); + if (instrumenter().shouldStart(parentContext, request)) { + context = instrumenter().start(parentContext, request); requestContextVirtualField.set(request, context); clientContexts.offer(new RequestAndContext(request, context)); } return context; } - public void endClientSpan(@Nullable HttpClientResponse response, @Nullable Throwable error) { + void endClientSpan(@Nullable HttpClientResponse response, @Nullable Throwable error) { HttpClientRequest request = null; Context context = null; RequestAndContext requestAndContext = clientContexts.poll(); @@ -84,16 +79,16 @@ public void endClientSpan(@Nullable HttpClientResponse response, @Nullable Throw } if (request != null && context != null) { - instrumenter.end(context, request, response, error); + instrumenter().end(context, request, response, error); } } - public void startAndEndConnectionErrorSpan(HttpClientRequest request, Throwable error) { + void startAndEndConnectionErrorSpan(HttpClientRequest request, Throwable error) { Context parentContext = this.parentContext; - if (instrumenter.shouldStart(parentContext, request)) { + if (instrumenter().shouldStart(parentContext, request)) { Timer timer = this.timer; InstrumenterUtil.startAndEnd( - instrumenter, parentContext, request, null, error, timer.startTime(), timer.now()); + instrumenter(), parentContext, request, null, error, timer.startTime(), timer.now()); } } diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java similarity index 93% rename from instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java rename to instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java index 50bbd017f05e..2aa7a163d351 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.reactornetty.v1_0; +package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; import io.netty.handler.codec.http.HttpVersion; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter; @@ -15,12 +15,9 @@ import reactor.netty.http.client.HttpClientRequest; import reactor.netty.http.client.HttpClientResponse; -public final class ReactorNettyHttpClientAttributesGetter +final class ReactorNettyHttpClientAttributesGetter implements HttpClientAttributesGetter { - public static final ReactorNettyHttpClientAttributesGetter INSTANCE = - new ReactorNettyHttpClientAttributesGetter(); - @Override public String getUrlFull(HttpClientRequest request) { return request.resourceUrl(); diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java index 5b2df22522c4..5087235c26dd 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettySingletons.java @@ -18,8 +18,6 @@ import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyClientInstrumenterFactory; import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyConnectionInstrumentationFlag; import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyConnectionInstrumenter; -import io.opentelemetry.instrumentation.reactornetty.v1_0.HttpClientRequestHeadersSetter; -import io.opentelemetry.instrumentation.reactornetty.v1_0.ReactorNettyHttpClientAttributesGetter; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import reactor.netty.http.client.HttpClientRequest; diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/UrlParser.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/UrlParser.java similarity index 97% rename from instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/UrlParser.java rename to instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/UrlParser.java index bff6fedb4a4a..bbd0003c04d9 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/UrlParser.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/UrlParser.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.reactornetty.v1_0; +package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; import javax.annotation.Nullable; diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/build.gradle.kts b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/build.gradle.kts deleted file mode 100644 index 6de540a5f8ff..000000000000 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - id("otel.library-instrumentation") -} - -dependencies { - implementation("io.projectreactor.netty:reactor-netty-http:1.1.0") -} diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java deleted file mode 100644 index c94d220cf42e..000000000000 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetry.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.reactornetty.v1_0; - -import io.opentelemetry.context.Context; -import io.opentelemetry.context.propagation.ContextPropagators; -import java.util.concurrent.atomic.AtomicReference; -import reactor.netty.http.client.HttpClient; - -public class ReactorNettyTelemetry { - - private final InstrumentationContexts contexts; - - private final ContextPropagators propagators; - - ReactorNettyTelemetry(InstrumentationContexts contexts, ContextPropagators propagators) { - this.contexts = contexts; - this.propagators = propagators; - } - - public HttpClient tracingHttpClient(HttpClient httpClient) { - AtomicReference clientContext = new AtomicReference<>(); - return httpClient - .doOnRequest( - (request, connection) -> { - // create span - contexts.startClientSpan(request); - propagators - .getTextMapPropagator() - .inject(clientContext.get(), request, HttpClientRequestHeadersSetter.INSTANCE); - }) - .doOnResponse( - (response, connection) -> { - contexts.endClientSpan(response, null); - }) - .doOnResponseError(contexts::endClientSpan); - } -} diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java deleted file mode 100644 index 44aee6314336..000000000000 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/library/src/main/java/io/opentelemetry/instrumentation/reactornetty/v1_0/ReactorNettyTelemetryBuilder.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.reactornetty.v1_0; - -import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; -import reactor.netty.http.client.HttpClientRequest; -import reactor.netty.http.client.HttpClientResponse; - -/** A builder of {@link ReactorNettyTelemetry}. */ -public final class ReactorNettyTelemetryBuilder { - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.reactor-netty-1.0"; - - private final List> - clientAdditionalExtractors = new ArrayList<>(); - - private final OpenTelemetry openTelemetry; - - private boolean emitExperimentalHttpClientTelemetry = false; - - private Consumer> - clientExtractorConfigurer = builder -> {}; - private Consumer> - clientSpanNameExtractorConfigurer = builder -> {}; - - private final HttpClientAttributesExtractorBuilder - httpClientAttributesExtractorBuilder = - HttpClientAttributesExtractor.builder(ReactorNettyHttpClientAttributesGetter.INSTANCE); - - public ReactorNettyTelemetryBuilder(OpenTelemetry openTelemetry) { - this.openTelemetry = openTelemetry; - } - - /** - * Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented - * items for HttpClient. - */ - @CanIgnoreReturnValue - public ReactorNettyTelemetryBuilder addClientAttributesExtractor( - AttributesExtractor attributesExtractor) { - clientAdditionalExtractors.add(attributesExtractor); - return this; - } - - /** - * Configures the HTTP HttpClient request headers that will be captured as span attributes. - * - * @param requestHeaders A list of HTTP header names. - */ - @CanIgnoreReturnValue - public ReactorNettyTelemetryBuilder setCapturedClientRequestHeaders(List requestHeaders) { - clientExtractorConfigurer = - clientExtractorConfigurer.andThen( - builder -> builder.setCapturedRequestHeaders(requestHeaders)); - return this; - } - - /** - * Configures the HTTP HttpClient response headers that will be captured as span attributes. - * - * @param responseHeaders A list of HTTP header names. - */ - @CanIgnoreReturnValue - public ReactorNettyTelemetryBuilder setCapturedClientResponseHeaders( - List responseHeaders) { - clientExtractorConfigurer = - clientExtractorConfigurer.andThen( - builder -> builder.setCapturedResponseHeaders(responseHeaders)); - return this; - } - - /** - * Configures the instrumentation to recognize an alternative set of HTTP request methods. - * - *

By default, this instrumentation defines "known" methods as the ones listed in RFC9110 and the PATCH - * method defined in RFC5789. - * - *

Note: calling this method overrides the default known method sets completely; it does - * not supplement it. - * - * @param knownMethods A set of recognized HTTP request methods. - * @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set) - */ - @CanIgnoreReturnValue - public ReactorNettyTelemetryBuilder setKnownMethods(Set knownMethods) { - clientExtractorConfigurer = - clientExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); - clientSpanNameExtractorConfigurer = - clientSpanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); - return this; - } - - /** - * Configures the instrumentation to emit experimental HTTP client metrics. - * - * @param emitExperimentalHttpClientTelemetry {@code true} if the experimental HTTP client metrics - * are to be emitted. - */ - @CanIgnoreReturnValue - public ReactorNettyTelemetryBuilder setEmitExperimentalHttpClientTelemetry( - boolean emitExperimentalHttpClientTelemetry) { - this.emitExperimentalHttpClientTelemetry = emitExperimentalHttpClientTelemetry; - return this; - } - - /** - * Returns a new {@link ReactorNettyTelemetry} with the settings of this {@link - * ReactorNettyTelemetryBuilder}. - */ - public ReactorNettyTelemetry build() { - ReactorNettyHttpClientAttributesGetter httpAttributesGetter = - ReactorNettyHttpClientAttributesGetter.INSTANCE; - - HttpClientAttributesExtractorBuilder extractorBuilder = - HttpClientAttributesExtractor.builder(httpAttributesGetter); - - HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = - HttpSpanNameExtractor.builder(httpAttributesGetter); - - InstrumenterBuilder clientBuilder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor(extractorBuilder.build()) - .addOperationMetrics(HttpClientMetrics.get()); - - if (emitExperimentalHttpClientTelemetry) { - clientBuilder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - - // headers are injected elsewhere; ClientRequest is immutable - return new ReactorNettyTelemetry( - new InstrumentationContexts(clientBuilder.buildInstrumenter(alwaysClient())), - openTelemetry.getPropagators()); - } -} diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index bd2830742efd..255f750d6d84 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -21,7 +21,6 @@ dependencies { implementation(project(":instrumentation:spring:spring-web:spring-web-3.1:library")) implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-5.3:library")) implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library")) - implementation(project(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:library")) compileOnly("javax.servlet:javax.servlet-api:3.1.0") compileOnly("jakarta.servlet:jakarta.servlet-api:5.0.0") implementation(project(":instrumentation:spring:spring-webflux:spring-webflux-5.3:library")) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java deleted file mode 100644 index 522fd3b5b926..000000000000 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/reactornetty/HttpClientBeanPostProcessor.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.reactornetty; - -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.reactornetty.v1_0.ReactorNettyTelemetryBuilder; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.beans.factory.config.BeanPostProcessor; -import reactor.netty.http.client.HttpClient; - -public class HttpClientBeanPostProcessor implements BeanPostProcessor { - private final ObjectProvider openTelemetryProvider; - - HttpClientBeanPostProcessor(ObjectProvider openTelemetryProvider) { - this.openTelemetryProvider = openTelemetryProvider; - } - - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) { - OpenTelemetry openTelemetry = openTelemetryProvider.getIfAvailable(); - if (openTelemetry == null) { - return bean; - } - if (bean instanceof HttpClient) { - HttpClient httpClient = (HttpClient) bean; - ReactorNettyTelemetryBuilder builder = new ReactorNettyTelemetryBuilder(openTelemetry); - bean = builder.build().tracingHttpClient(httpClient); - } - return bean; - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index 8da080ff44b0..3a5bf1b4298a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -454,7 +454,6 @@ include(":instrumentation:reactor:reactor-kafka-1.0:testing") include(":instrumentation:reactor:reactor-netty:reactor-netty-0.9:javaagent") include(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:javaagent") include(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:javaagent-unit-tests") -include(":instrumentation:reactor:reactor-netty:reactor-netty-1.0:library") include(":instrumentation:rediscala-1.8:javaagent") include(":instrumentation:redisson:redisson-3.0:javaagent") include(":instrumentation:redisson:redisson-3.17:javaagent") From d013f44311cf6072da5a53a40aa46be204243002 Mon Sep 17 00:00:00 2001 From: Liu Ziming <448918299@qq.com> Date: Fri, 29 Mar 2024 23:05:43 +0800 Subject: [PATCH 5/9] Update DecoratorFunctions.java --- .../instrumentation/reactornetty/v1_0/DecoratorFunctions.java | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java index b3f370a10f92..d806c76e796b 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/DecoratorFunctions.java @@ -7,7 +7,6 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.reactornetty.v1_0.InstrumentationContexts; import java.util.function.BiConsumer; import javax.annotation.Nullable; import reactor.netty.Connection; From 1af9eb8c6310d3a592cf8f0d82555eaa45670f77 Mon Sep 17 00:00:00 2001 From: Liu Ziming <448918299@qq.com> Date: Fri, 29 Mar 2024 23:06:05 +0800 Subject: [PATCH 6/9] Update HttpResponseReceiverInstrumenter.java --- .../reactornetty/v1_0/HttpResponseReceiverInstrumenter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java index 931c3a4bd6ce..0804f184632f 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/HttpResponseReceiverInstrumenter.java @@ -10,7 +10,6 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount; import io.opentelemetry.instrumentation.netty.v4_1.NettyClientTelemetry; -import io.opentelemetry.instrumentation.reactornetty.v1_0.InstrumentationContexts; import java.util.function.BiConsumer; import java.util.function.Function; import javax.annotation.Nullable; From d3600331ec2e3c93ab45e869e77509faa8505e36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=A7=E6=80=9D?= Date: Mon, 1 Apr 2024 13:23:11 +0800 Subject: [PATCH 7/9] remove redundant import --- .../jedis/jedis-1.4/javaagent/build.gradle.kts | 7 ------- .../instrumentation/jedis/AbstractJedisTest.java | 14 +++++++------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts b/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts index 6b5d3657a8c5..8c939e9e3f1f 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts +++ b/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts @@ -32,13 +32,6 @@ testing { dependencies { implementation("redis.clients:jedis:2.7.2") implementation(project(":instrumentation:jedis:jedis-1.4:testing")) - targets { - all { - testTask.configure { - usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) - } - } - } } } } diff --git a/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java b/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java index 5427679fbf42..3f3cd5c498ba 100644 --- a/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java +++ b/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java @@ -22,25 +22,25 @@ public abstract class AbstractJedisTest { @RegisterExtension - static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + protected static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - static GenericContainer redisServer = + private static final GenericContainer REDIS_SERVER = new GenericContainer<>("redis:6.2.3-alpine").withExposedPorts(6379); - static int port; + private static int port; - static Jedis jedis; + private static Jedis jedis; @BeforeAll static void setup() { - redisServer.start(); - port = redisServer.getMappedPort(6379); + REDIS_SERVER.start(); + port = REDIS_SERVER.getMappedPort(6379); jedis = new Jedis("localhost", port); } @AfterAll static void cleanup() { - redisServer.stop(); + REDIS_SERVER.stop(); } @BeforeEach From 2f618fe5ac70e39e9eb3853cc82476398baf7b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=A7=E6=80=9D?= Date: Mon, 1 Apr 2024 23:03:28 +0800 Subject: [PATCH 8/9] fix --- .../jedis-1.4/javaagent/build.gradle.kts | 3 +- .../v1_4/JedisConnectionInstrumentation.java | 89 ++----------------- .../jedis/v1_4/JedisClientTest.java | 0 .../jedis/AbstractJedisTest.java | 2 +- 4 files changed, 10 insertions(+), 84 deletions(-) rename instrumentation/jedis/jedis-1.4/javaagent/src/{test_2_7_2 => version272}/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java (100%) diff --git a/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts b/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts index 8c939e9e3f1f..a8351d07e963 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts +++ b/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { annotationProcessor("com.google.auto.value:auto-value") implementation(project(":instrumentation:jedis:jedis-common:javaagent")) + testImplementation(project(":instrumentation:jedis:jedis-1.4:testing")) testInstrumentation(project(":instrumentation:jedis:jedis-3.0:javaagent")) @@ -28,7 +29,7 @@ dependencies { testing { suites { - val test_2_7_2 by registering(JvmTestSuite::class) { + val version272 by registering(JvmTestSuite::class) { dependencies { implementation("redis.clients:jedis:2.7.2") implementation(project(":instrumentation:jedis:jedis-1.4:testing")) diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java index 73245fd147bd..b8e670d857d1 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java @@ -52,90 +52,19 @@ public void transform(TypeTransformer transformer) { .and(named("sendCommand")) .and(takesArguments(1)) .and(takesArgument(0, named("redis.clients.jedis.ProtocolCommand"))), - this.getClass().getName() + "$SendCommandWithProtocolNoArgsAdvice"); + this.getClass().getName() + "$SendCommandNoArgsAdvice"); transformer.applyAdviceToMethod( isMethod() .and(named("sendCommand")) .and(takesArguments(2)) .and(takesArgument(0, named("redis.clients.jedis.ProtocolCommand"))) .and(takesArgument(1, is(byte[][].class))), - this.getClass().getName() + "$SendCommandWithProtocolCommandArgsAdvice"); + this.getClass().getName() + "$SendCommandWithArgsAdvice"); } @SuppressWarnings("unused") public static class SendCommandNoArgsAdvice { - @Advice.OnMethodEnter(suppress = Throwable.class) - public static void onEnter( - @Advice.This Connection connection, - @Advice.Argument(0) Protocol.Command command, - @Advice.Local("otelJedisRequest") JedisRequest request, - @Advice.Local("otelContext") Context context, - @Advice.Local("otelScope") Scope scope) { - Context parentContext = currentContext(); - request = JedisRequest.create(connection, command); - if (!instrumenter().shouldStart(parentContext, request)) { - return; - } - - context = instrumenter().start(parentContext, request); - scope = context.makeCurrent(); - } - - @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void stopSpan( - @Advice.Thrown Throwable throwable, - @Advice.Local("otelJedisRequest") JedisRequest request, - @Advice.Local("otelContext") Context context, - @Advice.Local("otelScope") Scope scope) { - if (scope == null) { - return; - } - - scope.close(); - JedisRequestContext.endIfNotAttached(instrumenter(), context, request, throwable); - } - } - - @SuppressWarnings("unused") - public static class SendCommandWithArgsAdvice { - - @Advice.OnMethodEnter(suppress = Throwable.class) - public static void onEnter( - @Advice.This Connection connection, - @Advice.Argument(0) Protocol.Command command, - @Advice.Argument(1) byte[][] args, - @Advice.Local("otelJedisRequest") JedisRequest request, - @Advice.Local("otelContext") Context context, - @Advice.Local("otelScope") Scope scope) { - Context parentContext = currentContext(); - request = JedisRequest.create(connection, command, asList(args)); - if (!instrumenter().shouldStart(parentContext, request)) { - return; - } - - context = instrumenter().start(parentContext, request); - scope = context.makeCurrent(); - } - - @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void stopSpan( - @Advice.Thrown Throwable throwable, - @Advice.Local("otelJedisRequest") JedisRequest request, - @Advice.Local("otelContext") Context context, - @Advice.Local("otelScope") Scope scope) { - if (scope == null) { - return; - } - - scope.close(); - JedisRequestContext.endIfNotAttached(instrumenter(), context, request, throwable); - } - } - - @SuppressWarnings("unused") - public static class SendCommandWithProtocolNoArgsAdvice { - @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.This Connection connection, @@ -144,12 +73,10 @@ public static void onEnter( @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { Context parentContext = currentContext(); - Protocol.Command cmd = null; - // It must be a Protocol.Command in redis 2.7.2 + // Must be a Protocol.Command if (command instanceof Protocol.Command) { - cmd = (Protocol.Command) command; + request = JedisRequest.create(connection, (Protocol.Command) command); } - request = JedisRequest.create(connection, cmd); if (!instrumenter().shouldStart(parentContext, request)) { return; } @@ -174,7 +101,7 @@ public static void stopSpan( } @SuppressWarnings("unused") - public static class SendCommandWithProtocolCommandArgsAdvice { + public static class SendCommandWithArgsAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @@ -185,12 +112,10 @@ public static void onEnter( @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { Context parentContext = currentContext(); - Protocol.Command cmd = null; - // It must be a Protocol.Command in redis 2.7.2 + // Must be a Protocol.Command if (command instanceof Protocol.Command) { - cmd = (Protocol.Command) command; + request = JedisRequest.create(connection, (Protocol.Command) command, asList(args)); } - request = JedisRequest.create(connection, cmd, asList(args)); if (!instrumenter().shouldStart(parentContext, request)) { return; } diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java b/instrumentation/jedis/jedis-1.4/javaagent/src/version272/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java similarity index 100% rename from instrumentation/jedis/jedis-1.4/javaagent/src/test_2_7_2/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java rename to instrumentation/jedis/jedis-1.4/javaagent/src/version272/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java diff --git a/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java b/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java index 3f3cd5c498ba..8e22b8d638a5 100644 --- a/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java +++ b/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java @@ -22,7 +22,7 @@ public abstract class AbstractJedisTest { @RegisterExtension - protected static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + private static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); private static final GenericContainer REDIS_SERVER = new GenericContainer<>("redis:6.2.3-alpine").withExposedPorts(6379); From 6f4889fb867f5780fa61ab0f5416a1ca52a06f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=A7=E6=80=9D?= Date: Fri, 29 Mar 2024 22:23:56 +0800 Subject: [PATCH 9/9] polish code --- .../v1_4/JedisConnectionInstrumentation.java | 44 ++++++++----------- .../{v1_4 => v2_7_2}/JedisClientTest.java | 2 +- 2 files changed, 19 insertions(+), 27 deletions(-) rename instrumentation/jedis/jedis-1.4/javaagent/src/version272/java/io/opentelemetry/javaagent/instrumentation/jedis/{v1_4 => v2_7_2}/JedisClientTest.java (76%) diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java index b8e670d857d1..fcd6822e99bb 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisConnectionInstrumentation.java @@ -11,6 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.is; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -21,6 +22,7 @@ import io.opentelemetry.javaagent.instrumentation.jedis.JedisRequestContext; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.implementation.bytecode.assign.Assigner; import net.bytebuddy.matcher.ElementMatcher; import redis.clients.jedis.Connection; import redis.clients.jedis.Protocol; @@ -37,27 +39,23 @@ public void transform(TypeTransformer transformer) { isMethod() .and(named("sendCommand")) .and(takesArguments(1)) - .and(takesArgument(0, named("redis.clients.jedis.Protocol$Command"))), + .and( + takesArgument( + 0, + namedOneOf( + "redis.clients.jedis.Protocol$Command", + "redis.clients.jedis.ProtocolCommand"))), this.getClass().getName() + "$SendCommandNoArgsAdvice"); transformer.applyAdviceToMethod( isMethod() .and(named("sendCommand")) .and(takesArguments(2)) - .and(takesArgument(0, named("redis.clients.jedis.Protocol$Command"))) - .and(takesArgument(1, is(byte[][].class))), - this.getClass().getName() + "$SendCommandWithArgsAdvice"); - // For version 2.7.2 - transformer.applyAdviceToMethod( - isMethod() - .and(named("sendCommand")) - .and(takesArguments(1)) - .and(takesArgument(0, named("redis.clients.jedis.ProtocolCommand"))), - this.getClass().getName() + "$SendCommandNoArgsAdvice"); - transformer.applyAdviceToMethod( - isMethod() - .and(named("sendCommand")) - .and(takesArguments(2)) - .and(takesArgument(0, named("redis.clients.jedis.ProtocolCommand"))) + .and( + takesArgument( + 0, + namedOneOf( + "redis.clients.jedis.Protocol$Command", + "redis.clients.jedis.ProtocolCommand"))) .and(takesArgument(1, is(byte[][].class))), this.getClass().getName() + "$SendCommandWithArgsAdvice"); } @@ -68,15 +66,12 @@ public static class SendCommandNoArgsAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.This Connection connection, - @Advice.Argument(0) Object command, + @Advice.Argument(value = 0, typing = Assigner.Typing.DYNAMIC) Protocol.Command command, @Advice.Local("otelJedisRequest") JedisRequest request, @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { Context parentContext = currentContext(); - // Must be a Protocol.Command - if (command instanceof Protocol.Command) { - request = JedisRequest.create(connection, (Protocol.Command) command); - } + request = JedisRequest.create(connection, command); if (!instrumenter().shouldStart(parentContext, request)) { return; } @@ -106,16 +101,13 @@ public static class SendCommandWithArgsAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.This Connection connection, - @Advice.Argument(0) Object command, + @Advice.Argument(value = 0, typing = Assigner.Typing.DYNAMIC) Protocol.Command command, @Advice.Argument(1) byte[][] args, @Advice.Local("otelJedisRequest") JedisRequest request, @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { Context parentContext = currentContext(); - // Must be a Protocol.Command - if (command instanceof Protocol.Command) { - request = JedisRequest.create(connection, (Protocol.Command) command, asList(args)); - } + request = JedisRequest.create(connection, command, asList(args)); if (!instrumenter().shouldStart(parentContext, request)) { return; } diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/version272/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java b/instrumentation/jedis/jedis-1.4/javaagent/src/version272/java/io/opentelemetry/javaagent/instrumentation/jedis/v2_7_2/JedisClientTest.java similarity index 76% rename from instrumentation/jedis/jedis-1.4/javaagent/src/version272/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java rename to instrumentation/jedis/jedis-1.4/javaagent/src/version272/java/io/opentelemetry/javaagent/instrumentation/jedis/v2_7_2/JedisClientTest.java index 99b5bfc6272d..15d1e5d01084 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/version272/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisClientTest.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/version272/java/io/opentelemetry/javaagent/instrumentation/jedis/v2_7_2/JedisClientTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.jedis.v1_4; +package io.opentelemetry.javaagent.instrumentation.jedis.v2_7_2; import io.opentelemetry.javaagent.instrumentation.jedis.AbstractJedisTest;