From 44c6b644b029eece70f1a8565c46ece0d2e7f784 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Thu, 13 Feb 2025 17:39:59 -0800 Subject: [PATCH 1/4] Better qualify Java HttpClient package --- .../HttpClientInstrumentation.java | 8 +- .../HttpClientInstrumentationModule.java | 2 +- .../HttpHeadersInstrumentation.java | 4 +- .../JavaHttpClientSingletons.java | 6 +- .../JavaHttpClientTest.java | 4 +- .../httpclient/JavaHttpClientTelemetry.java | 12 +- .../JavaHttpClientTelemetryBuilder.java | 9 +- .../httpclient/internal/Experimental.java | 1 + .../JavaHttpClientTelemetry.java | 49 ++++++++ .../JavaHttpClientTelemetryBuilder.java | 106 ++++++++++++++++++ .../internal/CompletableFutureWrapper.java | 2 +- .../javahttpclient/internal/Experimental.java | 36 ++++++ .../internal/HttpHeadersSetter.java | 2 +- .../internal/HttpRequestWrapper.java | 2 +- .../JavaHttpClientAttributesGetter.java | 2 +- ...aHttpClientInstrumenterBuilderFactory.java | 2 +- .../internal/OpenTelemetryHttpClient.java | 2 +- .../internal/ResponseConsumer.java | 2 +- .../httpclient/JavaHttpClientTest.java | 2 + .../javahttpclient/JavaHttpClientTest.java | 65 +++++++++++ .../AbstractJavaHttpClientTest.java | 2 +- 21 files changed, 295 insertions(+), 25 deletions(-) rename instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{httpclient => javahttpclient}/HttpClientInstrumentation.java (93%) rename instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{httpclient => javahttpclient}/HttpClientInstrumentationModule.java (91%) rename instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{httpclient => javahttpclient}/HttpHeadersInstrumentation.java (90%) rename instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{httpclient => javahttpclient}/JavaHttpClientSingletons.java (79%) rename instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/{httpclient => javahttpclient}/JavaHttpClientTest.java (91%) create mode 100644 instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetry.java create mode 100644 instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetryBuilder.java rename instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/{httpclient => javahttpclient}/internal/CompletableFutureWrapper.java (93%) create mode 100644 instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java rename instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/{httpclient => javahttpclient}/internal/HttpHeadersSetter.java (94%) rename instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/{httpclient => javahttpclient}/internal/HttpRequestWrapper.java (94%) rename instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/{httpclient => javahttpclient}/internal/JavaHttpClientAttributesGetter.java (96%) rename instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/{httpclient => javahttpclient}/internal/JavaHttpClientInstrumenterBuilderFactory.java (93%) rename instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/{httpclient => javahttpclient}/internal/OpenTelemetryHttpClient.java (98%) rename instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/{httpclient => javahttpclient}/internal/ResponseConsumer.java (94%) create mode 100644 instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java rename instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/{httpclient => javahttpclient}/AbstractJavaHttpClientTest.java (98%) diff --git a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentation.java b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpClientInstrumentation.java similarity index 93% rename from instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentation.java rename to instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpClientInstrumentation.java index 60c6572d1390..1131decf09c8 100644 --- a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentation.java +++ b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpClientInstrumentation.java @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.httpclient; +package io.opentelemetry.javaagent.instrumentation.javahttpclient; import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; -import static io.opentelemetry.javaagent.instrumentation.httpclient.JavaHttpClientSingletons.instrumenter; +import static io.opentelemetry.javaagent.instrumentation.javahttpclient.JavaHttpClientSingletons.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; @@ -19,8 +19,8 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.httpclient.internal.CompletableFutureWrapper; -import io.opentelemetry.instrumentation.httpclient.internal.ResponseConsumer; +import io.opentelemetry.instrumentation.javahttpclient.internal.CompletableFutureWrapper; +import io.opentelemetry.instrumentation.javahttpclient.internal.ResponseConsumer; import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; diff --git a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentationModule.java b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpClientInstrumentationModule.java similarity index 91% rename from instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentationModule.java rename to instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpClientInstrumentationModule.java index 222cdc89e6c9..0735a73f5569 100644 --- a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentationModule.java +++ b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpClientInstrumentationModule.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.httpclient; +package io.opentelemetry.javaagent.instrumentation.javahttpclient; import static java.util.Arrays.asList; diff --git a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpHeadersInstrumentation.java b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpHeadersInstrumentation.java similarity index 90% rename from instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpHeadersInstrumentation.java rename to instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpHeadersInstrumentation.java index 3bc3eb292c2a..3f72cdf76b85 100644 --- a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpHeadersInstrumentation.java +++ b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpHeadersInstrumentation.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.httpclient; +package io.opentelemetry.javaagent.instrumentation.javahttpclient; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass; -import static io.opentelemetry.javaagent.instrumentation.httpclient.JavaHttpClientSingletons.setter; +import static io.opentelemetry.javaagent.instrumentation.javahttpclient.JavaHttpClientSingletons.setter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; diff --git a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/JavaHttpClientSingletons.java b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientSingletons.java similarity index 79% rename from instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/JavaHttpClientSingletons.java rename to instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientSingletons.java index 9adaf4847367..80b1d3a64ecd 100644 --- a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/JavaHttpClientSingletons.java +++ b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientSingletons.java @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.httpclient; +package io.opentelemetry.javaagent.instrumentation.javahttpclient; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter; -import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientInstrumenterBuilderFactory; +import io.opentelemetry.instrumentation.javahttpclient.internal.HttpHeadersSetter; +import io.opentelemetry.instrumentation.javahttpclient.internal.JavaHttpClientInstrumenterBuilderFactory; import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import java.net.http.HttpRequest; import java.net.http.HttpResponse; diff --git a/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpclient/JavaHttpClientTest.java b/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientTest.java similarity index 91% rename from instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpclient/JavaHttpClientTest.java rename to instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientTest.java index b3e0e74c6397..97e3b9917b1d 100644 --- a/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpclient/JavaHttpClientTest.java +++ b/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientTest.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.httpclient; +package io.opentelemetry.javaagent.instrumentation.javahttpclient; -import io.opentelemetry.instrumentation.httpclient.AbstractJavaHttpClientTest; +import io.opentelemetry.instrumentation.javahttpclient.AbstractJavaHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetry.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetry.java index c65117ae0021..4e9ef90b1e33 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetry.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetry.java @@ -7,13 +7,19 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter; -import io.opentelemetry.instrumentation.httpclient.internal.OpenTelemetryHttpClient; +import io.opentelemetry.instrumentation.javahttpclient.internal.HttpHeadersSetter; +import io.opentelemetry.instrumentation.javahttpclient.internal.OpenTelemetryHttpClient; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -/** Entrypoint for instrumenting Java HTTP Client. */ +/** + * Entrypoint for instrumenting Java HTTP Client. + * + * @deprecated Use {@link + * io.opentelemetry.instrumentation.javahttpclient.JavaHttpClientTelemetry} instead. + */ +@Deprecated public final class JavaHttpClientTelemetry { /** diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java index 2113ba276eb6..11054cc2bd1e 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java @@ -12,13 +12,18 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.httpclient.internal.Experimental; -import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter; -import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientInstrumenterBuilderFactory; +import io.opentelemetry.instrumentation.javahttpclient.internal.HttpHeadersSetter; +import io.opentelemetry.instrumentation.javahttpclient.internal.JavaHttpClientInstrumenterBuilderFactory; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.Collection; import java.util.function.Function; +/** + * @deprecated Use {@link io.opentelemetry.instrumentation.javahttpclient.JavaHttpClientTelemetryBuilder} + * instead. + */ +@Deprecated public final class JavaHttpClientTelemetryBuilder { private final DefaultHttpClientInstrumenterBuilder> builder; diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/Experimental.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/Experimental.java index fc045ac50516..2da4b1a1e1e1 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/Experimental.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/Experimental.java @@ -14,6 +14,7 @@ * APIs (or a version of them) may be promoted to the public stable API in the future, but no * guarantees are made. */ +@Deprecated public final class Experimental { @Nullable diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetry.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetry.java new file mode 100644 index 000000000000..928ae20e0b60 --- /dev/null +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetry.java @@ -0,0 +1,49 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.javahttpclient; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.javahttpclient.internal.HttpHeadersSetter; +import io.opentelemetry.instrumentation.javahttpclient.internal.OpenTelemetryHttpClient; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +/** Entrypoint for instrumenting Java HTTP Client. */ +public final class JavaHttpClientTelemetry { + + /** + * Returns a new {@link JavaHttpClientTelemetry} configured with the given {@link OpenTelemetry}. + */ + public static JavaHttpClientTelemetry create(OpenTelemetry openTelemetry) { + return builder(openTelemetry).build(); + } + + public static JavaHttpClientTelemetryBuilder builder(OpenTelemetry openTelemetry) { + return new JavaHttpClientTelemetryBuilder(openTelemetry); + } + + private final Instrumenter> instrumenter; + private final HttpHeadersSetter headersSetter; + + JavaHttpClientTelemetry( + Instrumenter> instrumenter, HttpHeadersSetter headersSetter) { + this.instrumenter = instrumenter; + this.headersSetter = headersSetter; + } + + /** + * Construct a new OpenTelemetry tracing-enabled {@link HttpClient} using the provided {@link + * HttpClient} instance. + * + * @param client An instance of HttpClient configured as desired. + * @return a tracing-enabled {@link HttpClient}. + */ + public HttpClient newHttpClient(HttpClient client) { + return new OpenTelemetryHttpClient(client, instrumenter, headersSetter); + } +} diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetryBuilder.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetryBuilder.java new file mode 100644 index 000000000000..8dcbc48531de --- /dev/null +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetryBuilder.java @@ -0,0 +1,106 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.javahttpclient; + +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; +import io.opentelemetry.instrumentation.javahttpclient.internal.Experimental; +import io.opentelemetry.instrumentation.javahttpclient.internal.HttpHeadersSetter; +import io.opentelemetry.instrumentation.javahttpclient.internal.JavaHttpClientInstrumenterBuilderFactory; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.Collection; +import java.util.function.Function; + +public final class JavaHttpClientTelemetryBuilder { + + private final DefaultHttpClientInstrumenterBuilder> builder; + private final OpenTelemetry openTelemetry; + + static { + Experimental.internalSetEmitExperimentalTelemetry( + (builder, emit) -> builder.builder.setEmitExperimentalHttpClientMetrics(emit)); + } + + JavaHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) { + builder = JavaHttpClientInstrumenterBuilderFactory.create(openTelemetry); + this.openTelemetry = openTelemetry; + } + + /** + * Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented + * items. The {@link AttributesExtractor} will be executed after all default extractors. + */ + @CanIgnoreReturnValue + public JavaHttpClientTelemetryBuilder addAttributesExtractor( + AttributesExtractor> attributesExtractor) { + builder.addAttributesExtractor(attributesExtractor); + return this; + } + + /** + * Configures the HTTP request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + @CanIgnoreReturnValue + public JavaHttpClientTelemetryBuilder setCapturedRequestHeaders( + Collection requestHeaders) { + builder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + @CanIgnoreReturnValue + public JavaHttpClientTelemetryBuilder setCapturedResponseHeaders( + Collection responseHeaders) { + 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(Collection) + */ + @CanIgnoreReturnValue + public JavaHttpClientTelemetryBuilder setKnownMethods(Collection knownMethods) { + builder.setKnownMethods(knownMethods); + return this; + } + + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public JavaHttpClientTelemetryBuilder setSpanNameExtractor( + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + builder.setSpanNameExtractor(spanNameExtractorTransformer); + return this; + } + + public JavaHttpClientTelemetry build() { + return new JavaHttpClientTelemetry( + builder.build(), new HttpHeadersSetter(openTelemetry.getPropagators())); + } +} diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/CompletableFutureWrapper.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/CompletableFutureWrapper.java similarity index 93% rename from instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/CompletableFutureWrapper.java rename to instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/CompletableFutureWrapper.java index 924db6db24a3..b2bb09af6e49 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/CompletableFutureWrapper.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/CompletableFutureWrapper.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpclient.internal; +package io.opentelemetry.instrumentation.javahttpclient.internal; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java new file mode 100644 index 000000000000..fa8c5095957f --- /dev/null +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java @@ -0,0 +1,36 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.javahttpclient.internal; + +import io.opentelemetry.instrumentation.javahttpclient.JavaHttpClientTelemetryBuilder; +import java.util.function.BiConsumer; +import javax.annotation.Nullable; + +/** + * This class is internal and experimental. Its APIs are unstable and can change at any time. Its + * APIs (or a version of them) may be promoted to the public stable API in the future, but no + * guarantees are made. + */ +public final class Experimental { + + @Nullable + private static volatile BiConsumer + setEmitExperimentalTelemetry; + + public static void setEmitExperimentalTelemetry( + JavaHttpClientTelemetryBuilder builder, boolean emitExperimentalTelemetry) { + if (setEmitExperimentalTelemetry != null) { + setEmitExperimentalTelemetry.accept(builder, emitExperimentalTelemetry); + } + } + + public static void internalSetEmitExperimentalTelemetry( + BiConsumer setEmitExperimentalTelemetry) { + Experimental.setEmitExperimentalTelemetry = setEmitExperimentalTelemetry; + } + + private Experimental() {} +} diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/HttpHeadersSetter.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/HttpHeadersSetter.java similarity index 94% rename from instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/HttpHeadersSetter.java rename to instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/HttpHeadersSetter.java index 257d1b0fb1be..9f8555f7fc8b 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/HttpHeadersSetter.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/HttpHeadersSetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpclient.internal; +package io.opentelemetry.instrumentation.javahttpclient.internal; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.ContextPropagators; diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/HttpRequestWrapper.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/HttpRequestWrapper.java similarity index 94% rename from instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/HttpRequestWrapper.java rename to instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/HttpRequestWrapper.java index 3e843405ef9d..332d3e01aab6 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/HttpRequestWrapper.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/HttpRequestWrapper.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpclient.internal; +package io.opentelemetry.instrumentation.javahttpclient.internal; import java.net.URI; import java.net.http.HttpClient; diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientAttributesGetter.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/JavaHttpClientAttributesGetter.java similarity index 96% rename from instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientAttributesGetter.java rename to instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/JavaHttpClientAttributesGetter.java index e60a23b8c704..e8795f88f002 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientAttributesGetter.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/JavaHttpClientAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpclient.internal; +package io.opentelemetry.instrumentation.javahttpclient.internal; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter; import java.net.http.HttpClient; diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java similarity index 93% rename from instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java rename to instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java index bb8b2e48ba07..dc70b5edddf2 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpclient.internal; +package io.opentelemetry.instrumentation.javahttpclient.internal; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/OpenTelemetryHttpClient.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/OpenTelemetryHttpClient.java similarity index 98% rename from instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/OpenTelemetryHttpClient.java rename to instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/OpenTelemetryHttpClient.java index 775dbd2b5619..70a322359c75 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/OpenTelemetryHttpClient.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/OpenTelemetryHttpClient.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpclient.internal; +package io.opentelemetry.instrumentation.javahttpclient.internal; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/ResponseConsumer.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/ResponseConsumer.java similarity index 94% rename from instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/ResponseConsumer.java rename to instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/ResponseConsumer.java index b379754635da..6b14ba269837 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/ResponseConsumer.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/ResponseConsumer.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpclient.internal; +package io.opentelemetry.instrumentation.javahttpclient.internal; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; diff --git a/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTest.java b/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTest.java index 900d916aeb24..5ff5d455c1b0 100644 --- a/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTest.java +++ b/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTest.java @@ -5,6 +5,7 @@ package io.opentelemetry.instrumentation.httpclient; +import io.opentelemetry.instrumentation.javahttpclient.AbstractJavaHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; @@ -14,6 +15,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.extension.RegisterExtension; +@SuppressWarnings("deprecation") // testing deprecated classes public abstract class JavaHttpClientTest extends AbstractJavaHttpClientTest { @RegisterExtension diff --git a/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java b/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java new file mode 100644 index 000000000000..e490d7134523 --- /dev/null +++ b/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java @@ -0,0 +1,65 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.javahttpclient; + +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; +import java.net.http.HttpClient; +import java.util.Collections; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.extension.RegisterExtension; + +public abstract class JavaHttpClientTest extends AbstractJavaHttpClientTest { + + @RegisterExtension + static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forLibrary(); + + @Override + protected HttpClient configureHttpClient(HttpClient httpClient) { + return JavaHttpClientTelemetry.builder(testing.getOpenTelemetry()) + .setCapturedRequestHeaders( + Collections.singletonList(AbstractHttpClientTest.TEST_REQUEST_HEADER)) + .setCapturedResponseHeaders( + Collections.singletonList(AbstractHttpClientTest.TEST_RESPONSE_HEADER)) + .build() + .newHttpClient(httpClient); + } + + @Nested + static class Http1ClientTest extends JavaHttpClientTest { + + @Override + protected void configureHttpClientBuilder(HttpClient.Builder httpClientBuilder) { + httpClientBuilder.version(HttpClient.Version.HTTP_1_1); + } + } + + @Nested + static class Http2ClientTest extends JavaHttpClientTest { + + @Override + protected void configureHttpClientBuilder(HttpClient.Builder httpClientBuilder) { + httpClientBuilder.version(HttpClient.Version.HTTP_2); + } + + @Override + protected void configure(HttpClientTestOptions.Builder optionsBuilder) { + super.configure(optionsBuilder); + + optionsBuilder.setHttpProtocolVersion( + uri -> { + String uriString = uri.toString(); + if (uriString.equals("http://localhost:61/") + || uriString.equals("https://192.0.2.1/")) { + return "1.1"; + } + return "2"; + }); + } + } +} diff --git a/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/httpclient/AbstractJavaHttpClientTest.java b/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/javahttpclient/AbstractJavaHttpClientTest.java similarity index 98% rename from instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/httpclient/AbstractJavaHttpClientTest.java rename to instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/javahttpclient/AbstractJavaHttpClientTest.java index bf747d53f252..9c0c10b3c0c7 100644 --- a/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/httpclient/AbstractJavaHttpClientTest.java +++ b/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/javahttpclient/AbstractJavaHttpClientTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpclient; +package io.opentelemetry.instrumentation.javahttpclient; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; From 2e29209f4c2a3126ae62056d1f18bd5f417cff08 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 14 Feb 2025 08:19:56 -0800 Subject: [PATCH 2/4] spotless --- .../instrumentation/httpclient/JavaHttpClientTelemetry.java | 4 ++-- .../httpclient/JavaHttpClientTelemetryBuilder.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetry.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetry.java index 4e9ef90b1e33..d53727a38c10 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetry.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetry.java @@ -16,8 +16,8 @@ /** * Entrypoint for instrumenting Java HTTP Client. * - * @deprecated Use {@link - * io.opentelemetry.instrumentation.javahttpclient.JavaHttpClientTelemetry} instead. + * @deprecated Use {@link io.opentelemetry.instrumentation.javahttpclient.JavaHttpClientTelemetry} + * instead. */ @Deprecated public final class JavaHttpClientTelemetry { diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java index 11054cc2bd1e..f941dfb461ba 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java @@ -20,8 +20,8 @@ import java.util.function.Function; /** - * @deprecated Use {@link io.opentelemetry.instrumentation.javahttpclient.JavaHttpClientTelemetryBuilder} - * instead. + * @deprecated Use {@link + * io.opentelemetry.instrumentation.javahttpclient.JavaHttpClientTelemetryBuilder} instead. */ @Deprecated public final class JavaHttpClientTelemetryBuilder { From 3e09baab73804d68133237a0d92f2bbe71533b39 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 14 Feb 2025 08:55:39 -0800 Subject: [PATCH 3/4] Add javadoc --- .../instrumentation/httpclient/internal/Experimental.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/Experimental.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/Experimental.java index 2da4b1a1e1e1..5849d0c72060 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/Experimental.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/Experimental.java @@ -13,6 +13,9 @@ * This class is internal and experimental. Its APIs are unstable and can change at any time. Its * APIs (or a version of them) may be promoted to the public stable API in the future, but no * guarantees are made. + * + * @deprecated Use {@link io.opentelemetry.instrumentation.javahttpclient.internal.Experimental} + * instead. */ @Deprecated public final class Experimental { From d449cd3f3c73d6eb108caa60c4364a9d993787fa Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 14 Feb 2025 09:10:36 -0800 Subject: [PATCH 4/4] add migration note --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f27982b7c26..09a9460b0c07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ replaced by the stable `io.opentelemetry.instrumentation.api.semconv.util.SpanNames` - In preparation for stabilizing HTTP library instrumentation, the classes and methods that were deprecated in the prior two releases have now been removed +- The `java.net.http.HttpClient` instrumentation package + `io.opentelemetry.instrumentation.httpclient` was deprecated in favor of the new package name + `io.opentelemetry.instrumentation.javahttpclient` ## Version 2.12.0 (2025-01-17)