From 9c3a4d0a9788d6800dd6a3ddb61a616263fc58d5 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sun, 8 Dec 2024 13:06:37 -0800 Subject: [PATCH 1/6] Rename ApacheHttpClient5Telemetry --- .../apache-httpclient-5.2/library/README.md | 12 +- ...ApacheHttpClient5HttpAttributesGetter.java | 1 + .../v5_2/ApacheHttpClient5Request.java | 4 + .../v5_2/ApacheHttpClient5Telemetry.java | 9 +- .../ApacheHttpClient5TelemetryBuilder.java | 12 +- .../ApacheHttpClientHttpAttributesGetter.java | 114 ++++++++++++++++++ .../v5_2/ApacheHttpClientRequest.java | 75 ++++++++++++ .../v5_2/ApacheHttpClientTelemetry.java | 58 +++++++++ .../ApacheHttpClientTelemetryBuilder.java | 113 +++++++++++++++++ .../v5_2/OtelExecChainHandler.java | 12 +- .../v5_2/OtelExecChainHandlerOld.java | 100 +++++++++++++++ .../v5_2/internal/Experimental.java | 53 ++++++++ ...java => AbstractApacheHttpClientTest.java} | 2 +- ...nt5Test.java => ApacheHttpClientTest.java} | 4 +- 14 files changed, 551 insertions(+), 18 deletions(-) create mode 100644 instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientHttpAttributesGetter.java create mode 100644 instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientRequest.java create mode 100644 instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetry.java create mode 100644 instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java create mode 100644 instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/OtelExecChainHandlerOld.java create mode 100644 instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java rename instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/{AbstractApacheHttpClient5Test.java => AbstractApacheHttpClientTest.java} (99%) rename instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/{ApacheHttpClient5Test.java => ApacheHttpClientTest.java} (94%) diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/README.md b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/README.md index 22694b3076cd..c1053547fc56 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/README.md +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/README.md @@ -29,32 +29,32 @@ implementation("io.opentelemetry.instrumentation:opentelemetry-apache-httpclient ### Usage -The instrumentation library provides the class `ApacheHttpClient5Telemetry` that has a builder +The instrumentation library provides the class `ApacheHttpClientTelemetry` that has a builder method and allows the creation of an instance of the `HttpClientBuilder` to provide OpenTelemetry-based spans and context propagation: ```java import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.apachehttpclient.v5_2.ApacheHttpClient5Telemetry; +import io.opentelemetry.instrumentation.apachehttpclient.v5_2.ApacheHttpClientTelemetry; import org.apache.hc.client5.http.classic.HttpClient; import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; -public class ApacheHttpClient5Configuration { +public class ApacheHttpClientConfiguration { private OpenTelemetry openTelemetry; - public ApacheHttpClient5Configuration(OpenTelemetry openTelemetry) { + public ApacheHttpClientConfiguration(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; } // creates a new http client builder for constructing http clients with open telemetry instrumentation public HttpClientBuilder createBuilder() { - return ApacheHttpClient5Telemetry.builder(openTelemetry).build().newHttpClientBuilder(); + return ApacheHttpClientTelemetry.builder(openTelemetry).build().newHttpClientBuilder(); } // creates a new http client with open telemetry instrumentation public HttpClient newHttpClient() { - return ApacheHttpClient5Telemetry.builder(openTelemetry).build().newHttpClient(); + return ApacheHttpClientTelemetry.builder(openTelemetry).build().newHttpClient(); } } ``` diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5HttpAttributesGetter.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5HttpAttributesGetter.java index 36d69791d57c..67c6b78087fe 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5HttpAttributesGetter.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5HttpAttributesGetter.java @@ -15,6 +15,7 @@ import org.apache.hc.core5.http.MessageHeaders; import org.apache.hc.core5.http.ProtocolVersion; +@Deprecated enum ApacheHttpClient5HttpAttributesGetter implements HttpClientAttributesGetter { INSTANCE; diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Request.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Request.java index d0c96600ecf5..5adca552c464 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Request.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Request.java @@ -14,6 +14,10 @@ import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.HttpRequest; +/** + * @deprecated Use {@link ApacheHttpClientRequest} instead. + */ +@Deprecated public final class ApacheHttpClient5Request { private static final Logger logger = Logger.getLogger(ApacheHttpClient5Request.class.getName()); diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Telemetry.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Telemetry.java index dca1909a1b44..3abcf6fef1c5 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Telemetry.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Telemetry.java @@ -13,7 +13,12 @@ import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.apache.hc.core5.http.HttpResponse; -/** Entrypoint for instrumenting Apache HTTP Client. */ +/** + * Entrypoint for instrumenting Apache HTTP Client. + * + * @deprecated Use {@link ApacheHttpClientTelemetry} instead. + */ +@Deprecated public final class ApacheHttpClient5Telemetry { /** @@ -53,6 +58,6 @@ public HttpClientBuilder newHttpClientBuilder() { .addExecInterceptorAfter( ChainElement.PROTOCOL.name(), "OtelExecChainHandler", - new OtelExecChainHandler(instrumenter, propagators)); + new OtelExecChainHandlerOld(instrumenter, propagators)); } } diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5TelemetryBuilder.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5TelemetryBuilder.java index 8d7b323462cf..22bfcf08e7b9 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5TelemetryBuilder.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5TelemetryBuilder.java @@ -7,6 +7,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.apachehttpclient.v5_2.internal.Experimental; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; @@ -16,7 +17,12 @@ import java.util.function.Function; import org.apache.hc.core5.http.HttpResponse; -/** A builder for {@link ApacheHttpClient5Telemetry}. */ +/** + * A builder for {@link ApacheHttpClient5Telemetry}. + * + * @deprecated Use {@link ApacheHttpClientTelemetryBuilder} instead. + */ +@Deprecated public final class ApacheHttpClient5TelemetryBuilder { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-httpclient-5.2"; @@ -90,7 +96,11 @@ public ApacheHttpClient5TelemetryBuilder setKnownMethods(Set knownMethod * * @param emitExperimentalHttpClientMetrics {@code true} if the experimental HTTP client metrics * are to be emitted. + * @deprecated Use {@link + * Experimental#setEmitExperimentalTelemetry(ApacheHttpClientTelemetryBuilder, boolean)} + * instead. */ + @Deprecated @CanIgnoreReturnValue public ApacheHttpClient5TelemetryBuilder setEmitExperimentalHttpClientMetrics( boolean emitExperimentalHttpClientMetrics) { diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientHttpAttributesGetter.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientHttpAttributesGetter.java new file mode 100644 index 000000000000..813d584ff9e9 --- /dev/null +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientHttpAttributesGetter.java @@ -0,0 +1,114 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.apachehttpclient.v5_2; + +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import javax.annotation.Nullable; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.MessageHeaders; +import org.apache.hc.core5.http.ProtocolVersion; + +enum ApacheHttpClientHttpAttributesGetter + implements HttpClientAttributesGetter { + INSTANCE; + + @Override + public String getHttpRequestMethod(ApacheHttpClientRequest request) { + return request.getMethod(); + } + + @Override + @Nullable + public String getUrlFull(ApacheHttpClientRequest request) { + return request.getUrl(); + } + + @Override + public List getHttpRequestHeader(ApacheHttpClientRequest request, String name) { + return getHeader(request, name); + } + + @Override + public Integer getHttpResponseStatusCode( + ApacheHttpClientRequest request, HttpResponse response, @Nullable Throwable error) { + return response.getCode(); + } + + @Override + public List getHttpResponseHeader( + ApacheHttpClientRequest request, HttpResponse response, String name) { + return getHeader(response, name); + } + + private static List getHeader(MessageHeaders messageHeaders, String name) { + return headersToList(messageHeaders.getHeaders(name)); + } + + private static List getHeader(ApacheHttpClientRequest messageHeaders, String name) { + return headersToList(messageHeaders.getDelegate().getHeaders(name)); + } + + // minimize memory overhead by not using streams + private static List headersToList(Header[] headers) { + if (headers.length == 0) { + return Collections.emptyList(); + } + List headersList = new ArrayList<>(headers.length); + for (Header header : headers) { + headersList.add(header.getValue()); + } + return headersList; + } + + @Nullable + @Override + public String getNetworkProtocolName( + ApacheHttpClientRequest request, @Nullable HttpResponse response) { + ProtocolVersion protocolVersion = getVersion(request, response); + if (protocolVersion == null) { + return null; + } + return protocolVersion.getProtocol(); + } + + @Nullable + @Override + public String getNetworkProtocolVersion( + ApacheHttpClientRequest request, @Nullable HttpResponse response) { + ProtocolVersion protocolVersion = getVersion(request, response); + if (protocolVersion == null) { + return null; + } + if (protocolVersion.getMinor() == 0) { + return Integer.toString(protocolVersion.getMajor()); + } + return protocolVersion.getMajor() + "." + protocolVersion.getMinor(); + } + + @Override + @Nullable + public String getServerAddress(ApacheHttpClientRequest request) { + return request.getDelegate().getAuthority().getHostName(); + } + + @Override + public Integer getServerPort(ApacheHttpClientRequest request) { + return request.getDelegate().getAuthority().getPort(); + } + + private static ProtocolVersion getVersion( + ApacheHttpClientRequest request, @Nullable HttpResponse response) { + ProtocolVersion protocolVersion = request.getDelegate().getVersion(); + if (protocolVersion == null && response != null) { + protocolVersion = response.getVersion(); + } + return protocolVersion; + } +} diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientRequest.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientRequest.java new file mode 100644 index 000000000000..4654b08ac056 --- /dev/null +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientRequest.java @@ -0,0 +1,75 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.apachehttpclient.v5_2; + +import static java.util.logging.Level.FINE; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.logging.Logger; +import javax.annotation.Nullable; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.HttpRequest; + +public final class ApacheHttpClientRequest { + + private static final Logger logger = Logger.getLogger(ApacheHttpClientRequest.class.getName()); + + @Nullable private final URI uri; + private final HttpRequest delegate; + + ApacheHttpClientRequest(@Nullable HttpHost httpHost, HttpRequest httpRequest) { + URI calculatedUri = getUri(httpRequest); + if (calculatedUri != null && httpHost != null) { + uri = getCalculatedUri(httpHost, calculatedUri); + } else { + uri = calculatedUri; + } + delegate = httpRequest; + } + + /** Returns the actual {@link HttpRequest} being executed by the client. */ + public HttpRequest getDelegate() { + return delegate; + } + + String getMethod() { + return delegate.getMethod(); + } + + @Nullable + String getUrl() { + return uri != null ? uri.toString() : null; + } + + @Nullable + private static URI getUri(HttpRequest httpRequest) { + try { + // this can be relative or absolute + return new URI(httpRequest.getUri().toString()); + } catch (URISyntaxException e) { + logger.log(FINE, e.getMessage(), e); + return null; + } + } + + @Nullable + private static URI getCalculatedUri(HttpHost httpHost, URI uri) { + try { + return new URI( + httpHost.getSchemeName(), + uri.getUserInfo(), + httpHost.getHostName(), + httpHost.getPort(), + uri.getPath(), + uri.getQuery(), + uri.getFragment()); + } catch (URISyntaxException e) { + logger.log(FINE, e.getMessage(), e); + return null; + } + } +} diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetry.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetry.java new file mode 100644 index 000000000000..0ef5497a3890 --- /dev/null +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetry.java @@ -0,0 +1,58 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.apachehttpclient.v5_2; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import org.apache.hc.client5.http.impl.ChainElement; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.core5.http.HttpResponse; + +/** Entrypoint for instrumenting Apache HTTP Client. */ +public final class ApacheHttpClientTelemetry { + + /** + * Returns a new {@link ApacheHttpClientTelemetry} configured with the given {@link + * OpenTelemetry}. + */ + public static ApacheHttpClientTelemetry create(OpenTelemetry openTelemetry) { + return builder(openTelemetry).build(); + } + + /** + * Returns a new {@link ApacheHttpClientTelemetryBuilder} configured with the given {@link + * OpenTelemetry}. + */ + public static ApacheHttpClientTelemetryBuilder builder(OpenTelemetry openTelemetry) { + return new ApacheHttpClientTelemetryBuilder(openTelemetry); + } + + private final Instrumenter instrumenter; + private final ContextPropagators propagators; + + ApacheHttpClientTelemetry( + Instrumenter instrumenter, + ContextPropagators propagators) { + this.instrumenter = instrumenter; + this.propagators = propagators; + } + + /** Returns a new {@link CloseableHttpClient} with tracing configured. */ + public CloseableHttpClient newHttpClient() { + return newHttpClientBuilder().build(); + } + + /** Returns a new {@link HttpClientBuilder} to create a client with tracing configured. */ + public HttpClientBuilder newHttpClientBuilder() { + return HttpClientBuilder.create() + .addExecInterceptorAfter( + ChainElement.PROTOCOL.name(), + "OtelExecChainHandler", + new OtelExecChainHandler(instrumenter, propagators)); + } +} diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java new file mode 100644 index 000000000000..b2c5bb7131db --- /dev/null +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java @@ -0,0 +1,113 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.apachehttpclient.v5_2; + +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.apachehttpclient.v5_2.internal.Experimental; +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 java.util.List; +import java.util.Set; +import java.util.function.Function; +import org.apache.hc.core5.http.HttpResponse; + +/** A builder for {@link ApacheHttpClientTelemetry}. */ +public final class ApacheHttpClientTelemetryBuilder { + + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-httpclient-5.2"; + private final DefaultHttpClientInstrumenterBuilder builder; + private final OpenTelemetry openTelemetry; + + ApacheHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) { + builder = + DefaultHttpClientInstrumenterBuilder.create( + INSTRUMENTATION_NAME, openTelemetry, ApacheHttpClientHttpAttributesGetter.INSTANCE); + 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 ApacheHttpClientTelemetryBuilder addAttributeExtractor( + AttributesExtractor + attributesExtractor) { + builder.addAttributeExtractor(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 ApacheHttpClientTelemetryBuilder setCapturedRequestHeaders(List 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 ApacheHttpClientTelemetryBuilder setCapturedResponseHeaders(List 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(Set) + */ + @CanIgnoreReturnValue + public ApacheHttpClientTelemetryBuilder setKnownMethods(Set knownMethods) { + builder.setKnownMethods(knownMethods); + return this; + } + + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public ApacheHttpClientTelemetryBuilder setSpanNameExtractor( + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + builder.setSpanNameExtractor(spanNameExtractorTransformer); + return this; + } + + /** + * Can be used via the unstable method {@link + * Experimental#setEmitExperimentalTelemetry(ApacheHttpClientTelemetryBuilder, boolean)}. + */ + void setEmitExperimentalHttpClientMetrics(boolean emitExperimentalHttpClientMetrics) { + builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); + } + + /** + * Returns a new {@link ApacheHttpClientTelemetry} configured with this {@link + * ApacheHttpClientTelemetryBuilder}. + */ + public ApacheHttpClientTelemetry build() { + return new ApacheHttpClientTelemetry(builder.build(), openTelemetry.getPropagators()); + } +} diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/OtelExecChainHandler.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/OtelExecChainHandler.java index bf361ea646d1..94dce0b4d67d 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/OtelExecChainHandler.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/OtelExecChainHandler.java @@ -24,11 +24,11 @@ class OtelExecChainHandler implements ExecChainHandler { private static final String REQUEST_PARENT_CONTEXT_ATTRIBUTE_ID = OtelExecChainHandler.class.getName() + ".context"; - private final Instrumenter instrumenter; + private final Instrumenter instrumenter; private final ContextPropagators propagators; public OtelExecChainHandler( - Instrumenter instrumenter, + Instrumenter instrumenter, ContextPropagators propagators) { this.instrumenter = instrumenter; this.propagators = propagators; @@ -45,7 +45,7 @@ public ClassicHttpResponse execute(ClassicHttpRequest request, Scope scope, Exec scope.clientContext.setAttribute(REQUEST_PARENT_CONTEXT_ATTRIBUTE_ID, parentContext); } - ApacheHttpClient5Request instrumenterRequest = getApacheHttpClient5Request(request, scope); + ApacheHttpClientRequest instrumenterRequest = getApacheHttpClientRequest(request, scope); if (!instrumenter.shouldStart(parentContext, instrumenterRequest)) { return chain.proceed(request, scope); @@ -59,7 +59,7 @@ public ClassicHttpResponse execute(ClassicHttpRequest request, Scope scope, Exec private ClassicHttpResponse execute( ClassicHttpRequest request, - ApacheHttpClient5Request instrumenterRequest, + ApacheHttpClientRequest instrumenterRequest, ExecChain chain, Scope scope, Context context) @@ -77,7 +77,7 @@ private ClassicHttpResponse execute( } } - private static ApacheHttpClient5Request getApacheHttpClient5Request( + private static ApacheHttpClientRequest getApacheHttpClientRequest( ClassicHttpRequest request, Scope scope) { HttpHost host = null; if (scope.route.getTargetHost() != null) { @@ -94,6 +94,6 @@ private static ApacheHttpClient5Request getApacheHttpClient5Request( host = new HttpHost(host.getSchemeName(), host.getHostName(), -1); } - return new ApacheHttpClient5Request(host, request); + return new ApacheHttpClientRequest(host, request); } } diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/OtelExecChainHandlerOld.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/OtelExecChainHandlerOld.java new file mode 100644 index 000000000000..a19a8b756773 --- /dev/null +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/OtelExecChainHandlerOld.java @@ -0,0 +1,100 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.apachehttpclient.v5_2; + +import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount; +import java.io.IOException; +import org.apache.hc.client5.http.classic.ExecChain; +import org.apache.hc.client5.http.classic.ExecChain.Scope; +import org.apache.hc.client5.http.classic.ExecChainHandler; +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.apache.hc.core5.http.ClassicHttpResponse; +import org.apache.hc.core5.http.HttpException; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.HttpResponse; + +@Deprecated +class OtelExecChainHandlerOld implements ExecChainHandler { + + private static final String REQUEST_PARENT_CONTEXT_ATTRIBUTE_ID = + OtelExecChainHandlerOld.class.getName() + ".context"; + + private final Instrumenter instrumenter; + private final ContextPropagators propagators; + + public OtelExecChainHandlerOld( + Instrumenter instrumenter, + ContextPropagators propagators) { + this.instrumenter = instrumenter; + this.propagators = propagators; + } + + @Override + public ClassicHttpResponse execute(ClassicHttpRequest request, Scope scope, ExecChain chain) + throws IOException, HttpException { + Context parentContext = + scope.clientContext.getAttribute(REQUEST_PARENT_CONTEXT_ATTRIBUTE_ID, Context.class); + request.setVersion(scope.clientContext.getProtocolVersion()); + if (parentContext == null) { + parentContext = HttpClientRequestResendCount.initialize(Context.current()); + scope.clientContext.setAttribute(REQUEST_PARENT_CONTEXT_ATTRIBUTE_ID, parentContext); + } + + ApacheHttpClient5Request instrumenterRequest = getApacheHttpClient5Request(request, scope); + + if (!instrumenter.shouldStart(parentContext, instrumenterRequest)) { + return chain.proceed(request, scope); + } + + Context context = instrumenter.start(parentContext, instrumenterRequest); + propagators.getTextMapPropagator().inject(context, request, HttpHeaderSetter.INSTANCE); + + return execute(request, instrumenterRequest, chain, scope, context); + } + + private ClassicHttpResponse execute( + ClassicHttpRequest request, + ApacheHttpClient5Request instrumenterRequest, + ExecChain chain, + Scope scope, + Context context) + throws IOException, HttpException { + ClassicHttpResponse response = null; + Throwable error = null; + try (io.opentelemetry.context.Scope ignored = context.makeCurrent()) { + response = chain.proceed(request, scope); + return response; + } catch (Exception e) { + error = e; + throw e; + } finally { + instrumenter.end(context, instrumenterRequest, response, error); + } + } + + private static ApacheHttpClient5Request getApacheHttpClient5Request( + ClassicHttpRequest request, Scope scope) { + HttpHost host = null; + if (scope.route.getTargetHost() != null) { + host = scope.route.getTargetHost(); + } else if (scope.clientContext.getHttpRoute().getTargetHost() != null) { + host = scope.clientContext.getHttpRoute().getTargetHost(); + } + if (host != null + && ((host.getSchemeName().equals("https") && host.getPort() == 443) + || (host.getSchemeName().equals("http") && host.getPort() == 80))) { + // port seems to be added to the host by route planning for standard ports even if not + // specified in the URL. There doesn't seem to be a way to differentiate between explicit + // and implicit port, but ignore in both cases to match the more common case. + host = new HttpHost(host.getSchemeName(), host.getHostName(), -1); + } + + return new ApacheHttpClient5Request(host, request); + } +} diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java new file mode 100644 index 000000000000..ae954e6e7f07 --- /dev/null +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java @@ -0,0 +1,53 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.apachehttpclient.v5_2.internal; + +import static java.util.logging.Level.FINE; + +import io.opentelemetry.instrumentation.apachehttpclient.v5_2.ApacheHttpClientTelemetryBuilder; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.logging.Logger; +import javax.annotation.Nullable; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +// TODO (trask) update the above javadoc similar to +// https://github.com/open-telemetry/opentelemetry-java/pull/6886 +public class Experimental { + + private static final Logger logger = Logger.getLogger(Experimental.class.getName()); + + @Nullable private static final Method emitExperimentalTelemetry = getEmitExperimentalTelemetry(); + + public void setEmitExperimentalTelemetry( + ApacheHttpClientTelemetryBuilder builder, boolean emitExperimentalTelemetry) { + + if (Experimental.emitExperimentalTelemetry != null) { + try { + Experimental.emitExperimentalTelemetry.invoke(builder, emitExperimentalTelemetry); + } catch (IllegalAccessException | InvocationTargetException e) { + logger.log(FINE, e.getMessage(), e); + } + } + } + + @Nullable + private static Method getEmitExperimentalTelemetry() { + try { + Method method = + ApacheHttpClientTelemetryBuilder.class.getDeclaredMethod( + "setEmitExperimentalHttpClientMetrics", boolean.class); + method.setAccessible(true); + return method; + } catch (NoSuchMethodException e) { + logger.log(FINE, e.getMessage(), e); + return null; + } + } +} diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/AbstractApacheHttpClient5Test.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/AbstractApacheHttpClientTest.java similarity index 99% rename from instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/AbstractApacheHttpClient5Test.java rename to instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/AbstractApacheHttpClientTest.java index b23b5f32d247..47684a841037 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/AbstractApacheHttpClient5Test.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/AbstractApacheHttpClientTest.java @@ -27,7 +27,7 @@ import org.junit.jupiter.api.TestInstance; @TestInstance(TestInstance.Lifecycle.PER_CLASS) -abstract class AbstractApacheHttpClient5Test { +abstract class AbstractApacheHttpClientTest { protected abstract InstrumentationExtension testing(); diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Test.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTest.java similarity index 94% rename from instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Test.java rename to instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTest.java index 8d8f5a4c289f..744063576a31 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Test.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/test/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTest.java @@ -18,7 +18,7 @@ import org.apache.hc.core5.util.Timeout; import org.junit.jupiter.api.extension.RegisterExtension; -class ApacheHttpClient5Test extends AbstractApacheHttpClient5Test { +class ApacheHttpClientTest extends AbstractApacheHttpClientTest { @RegisterExtension static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forLibrary(); @@ -31,7 +31,7 @@ protected InstrumentationExtension testing() { @Override protected CloseableHttpClient createClient(boolean readTimeout) { HttpClientBuilder builder = - ApacheHttpClient5Telemetry.builder(testing.getOpenTelemetry()) + ApacheHttpClientTelemetry.builder(testing.getOpenTelemetry()) .setCapturedRequestHeaders( Collections.singletonList(AbstractHttpClientTest.TEST_REQUEST_HEADER)) .setCapturedResponseHeaders( From ad12db24fde96404c202a5a105c58359271d986f Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 9 Dec 2024 14:17:54 -0800 Subject: [PATCH 2/6] Fix javadoc todo --- .../apachehttpclient/v5_2/internal/Experimental.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java index ae954e6e7f07..eaadacaf369a 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java @@ -14,11 +14,10 @@ import javax.annotation.Nullable; /** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. + * 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. */ -// TODO (trask) update the above javadoc similar to -// https://github.com/open-telemetry/opentelemetry-java/pull/6886 public class Experimental { private static final Logger logger = Logger.getLogger(Experimental.class.getName()); From 29c62ae0d3a5bda982ae1a213be6b936cebd7fa5 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 10 Dec 2024 07:24:01 -0800 Subject: [PATCH 3/6] remove reflection --- .../ApacheHttpClientTelemetryBuilder.java | 13 +++---- .../v5_2/internal/Experimental.java | 35 +++++-------------- 2 files changed, 13 insertions(+), 35 deletions(-) diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java index b2c5bb7131db..eae9a6a10557 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java @@ -24,6 +24,11 @@ public final class ApacheHttpClientTelemetryBuilder { private final DefaultHttpClientInstrumenterBuilder builder; private final OpenTelemetry openTelemetry; + static { + Experimental.setSetEmitExperimentalTelemetry( + (builder, emit) -> builder.builder.setEmitExperimentalHttpClientMetrics(emit)); + } + ApacheHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) { builder = DefaultHttpClientInstrumenterBuilder.create( @@ -95,14 +100,6 @@ public ApacheHttpClientTelemetryBuilder setSpanNameExtractor( return this; } - /** - * Can be used via the unstable method {@link - * Experimental#setEmitExperimentalTelemetry(ApacheHttpClientTelemetryBuilder, boolean)}. - */ - void setEmitExperimentalHttpClientMetrics(boolean emitExperimentalHttpClientMetrics) { - builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); - } - /** * Returns a new {@link ApacheHttpClientTelemetry} configured with this {@link * ApacheHttpClientTelemetryBuilder}. diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java index eaadacaf369a..8b601a58e36f 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java @@ -5,12 +5,8 @@ package io.opentelemetry.instrumentation.apachehttpclient.v5_2.internal; -import static java.util.logging.Level.FINE; - import io.opentelemetry.instrumentation.apachehttpclient.v5_2.ApacheHttpClientTelemetryBuilder; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.logging.Logger; +import java.util.function.BiConsumer; import javax.annotation.Nullable; /** @@ -20,33 +16,18 @@ */ public class Experimental { - private static final Logger logger = Logger.getLogger(Experimental.class.getName()); - - @Nullable private static final Method emitExperimentalTelemetry = getEmitExperimentalTelemetry(); + @Nullable + private static BiConsumer setEmitExperimentalTelemetry; public void setEmitExperimentalTelemetry( ApacheHttpClientTelemetryBuilder builder, boolean emitExperimentalTelemetry) { - - if (Experimental.emitExperimentalTelemetry != null) { - try { - Experimental.emitExperimentalTelemetry.invoke(builder, emitExperimentalTelemetry); - } catch (IllegalAccessException | InvocationTargetException e) { - logger.log(FINE, e.getMessage(), e); - } + if (setEmitExperimentalTelemetry != null) { + setEmitExperimentalTelemetry.accept(builder, emitExperimentalTelemetry); } } - @Nullable - private static Method getEmitExperimentalTelemetry() { - try { - Method method = - ApacheHttpClientTelemetryBuilder.class.getDeclaredMethod( - "setEmitExperimentalHttpClientMetrics", boolean.class); - method.setAccessible(true); - return method; - } catch (NoSuchMethodException e) { - logger.log(FINE, e.getMessage(), e); - return null; - } + public static void setSetEmitExperimentalTelemetry( + BiConsumer setEmitExperimentalTelemetry) { + Experimental.setEmitExperimentalTelemetry = setEmitExperimentalTelemetry; } } From 07834d79743a79c5efa2fa7542d664968ef92e8c Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 10 Dec 2024 19:37:43 -0800 Subject: [PATCH 4/6] fix --- .../v5_2/ApacheHttpClientTelemetryBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java index eae9a6a10557..d0911db28cdd 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java @@ -41,10 +41,10 @@ public final class ApacheHttpClientTelemetryBuilder { * items. The {@link AttributesExtractor} will be executed after all default extractors. */ @CanIgnoreReturnValue - public ApacheHttpClientTelemetryBuilder addAttributeExtractor( + public ApacheHttpClientTelemetryBuilder addAttributesExtractor( AttributesExtractor attributesExtractor) { - builder.addAttributeExtractor(attributesExtractor); + builder.addAttributesExtractor(attributesExtractor); return this; } From cb7f2b161817b1b2deca609fec0bc98473fdd8dc Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 10 Dec 2024 19:50:01 -0800 Subject: [PATCH 5/6] volatile --- .../apachehttpclient/v5_2/internal/Experimental.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java index 8b601a58e36f..1a44d93d08ad 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java @@ -17,7 +17,8 @@ public class Experimental { @Nullable - private static BiConsumer setEmitExperimentalTelemetry; + private static volatile BiConsumer + setEmitExperimentalTelemetry; public void setEmitExperimentalTelemetry( ApacheHttpClientTelemetryBuilder builder, boolean emitExperimentalTelemetry) { From 93f741596e93f63de02b3f3c5d392bfe6e6bb897 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 10 Dec 2024 20:29:35 -0800 Subject: [PATCH 6/6] static --- .../apachehttpclient/v5_2/internal/Experimental.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java index 1a44d93d08ad..e219b4186b46 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/internal/Experimental.java @@ -14,13 +14,13 @@ * APIs (or a version of them) may be promoted to the public stable API in the future, but no * guarantees are made. */ -public class Experimental { +public final class Experimental { @Nullable private static volatile BiConsumer setEmitExperimentalTelemetry; - public void setEmitExperimentalTelemetry( + public static void setEmitExperimentalTelemetry( ApacheHttpClientTelemetryBuilder builder, boolean emitExperimentalTelemetry) { if (setEmitExperimentalTelemetry != null) { setEmitExperimentalTelemetry.accept(builder, emitExperimentalTelemetry); @@ -31,4 +31,6 @@ public static void setSetEmitExperimentalTelemetry( BiConsumer setEmitExperimentalTelemetry) { Experimental.setEmitExperimentalTelemetry = setEmitExperimentalTelemetry; } + + private Experimental() {} }