diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java new file mode 100644 index 000000000000..1eb82d40caba --- /dev/null +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java @@ -0,0 +1,195 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.incubator.builder.internal; + +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.context.propagation.TextMapSetter; +import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; +import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; +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.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter; +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 java.util.function.Function; +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. + */ +public final class DefaultHttpClientInstrumenterBuilder { + + private final String instrumentationName; + private final OpenTelemetry openTelemetry; + + private final List> additionalExtractors = + new ArrayList<>(); + private final HttpClientAttributesExtractorBuilder + httpAttributesExtractorBuilder; + private final HttpClientAttributesGetter attributesGetter; + private final HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder; + + @Nullable private TextMapSetter headerSetter; + private Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer = Function.identity(); + private boolean emitExperimentalHttpClientMetrics = false; + private Consumer> builderCustomizer = b -> {}; + + public DefaultHttpClientInstrumenterBuilder( + String instrumentationName, + OpenTelemetry openTelemetry, + HttpClientAttributesGetter attributesGetter) { + this.instrumentationName = instrumentationName; + this.openTelemetry = openTelemetry; + httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(attributesGetter); + httpAttributesExtractorBuilder = HttpClientAttributesExtractor.builder(attributesGetter); + this.attributesGetter = attributesGetter; + } + + /** + * 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 DefaultHttpClientInstrumenterBuilder addAttributeExtractor( + AttributesExtractor attributesExtractor) { + additionalExtractors.add(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 DefaultHttpClientInstrumenterBuilder setCapturedRequestHeaders( + List requestHeaders) { + httpAttributesExtractorBuilder.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 DefaultHttpClientInstrumenterBuilder setCapturedResponseHeaders( + List responseHeaders) { + httpAttributesExtractorBuilder.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 DefaultHttpClientInstrumenterBuilder setKnownMethods( + Set knownMethods) { + httpAttributesExtractorBuilder.setKnownMethods(knownMethods); + httpSpanNameExtractorBuilder.setKnownMethods(knownMethods); + return this; + } + + @CanIgnoreReturnValue + public DefaultHttpClientInstrumenterBuilder setHeaderSetter( + @Nullable TextMapSetter headerSetter) { + this.headerSetter = headerSetter; + return this; + } + + /** + * Configures the instrumentation to emit experimental HTTP client metrics. + * + * @param emitExperimentalHttpClientMetrics {@code true} if the experimental HTTP client metrics + * are to be emitted. + */ + @CanIgnoreReturnValue + public DefaultHttpClientInstrumenterBuilder + setEmitExperimentalHttpClientMetrics(boolean emitExperimentalHttpClientMetrics) { + this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics; + return this; + } + + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public DefaultHttpClientInstrumenterBuilder setSpanNameExtractor( + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + + /** Sets custom {@link PeerServiceResolver}. */ + @CanIgnoreReturnValue + public DefaultHttpClientInstrumenterBuilder setPeerServiceResolver( + PeerServiceResolver peerServiceResolver) { + return addAttributeExtractor( + HttpClientPeerServiceAttributesExtractor.create(attributesGetter, peerServiceResolver)); + } + + @CanIgnoreReturnValue + public DefaultHttpClientInstrumenterBuilder setBuilderCustomizer( + Consumer> builderCustomizer) { + this.builderCustomizer = builderCustomizer; + return this; + } + + public Instrumenter build() { + + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); + + InstrumenterBuilder builder = + Instrumenter.builder( + openTelemetry, instrumentationName, spanNameExtractor) + .setSpanStatusExtractor(HttpSpanStatusExtractor.create(attributesGetter)) + .addAttributesExtractor(httpAttributesExtractorBuilder.build()) + .addAttributesExtractors(additionalExtractors) + .addOperationMetrics(HttpClientMetrics.get()); + if (emitExperimentalHttpClientMetrics) { + builder + .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(attributesGetter)) + .addOperationMetrics(HttpClientExperimentalMetrics.get()); + } + builderCustomizer.accept(builder); + + if (headerSetter != null) { + return builder.buildClientInstrumenter(headerSetter); + } + return builder.buildInstrumenter(SpanKindExtractor.alwaysClient()); + } + + public OpenTelemetry getOpenTelemetry() { + return openTelemetry; + } +} diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/client/AkkaHttpClientSingletons.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/client/AkkaHttpClientSingletons.java index feac2dac6281..aa20eeec9f93 100644 --- a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/client/AkkaHttpClientSingletons.java +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/client/AkkaHttpClientSingletons.java @@ -8,17 +8,8 @@ import akka.http.scaladsl.model.HttpRequest; import akka.http.scaladsl.model.HttpResponse; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import io.opentelemetry.javaagent.instrumentation.akkahttp.AkkaHttpUtil; public class AkkaHttpClientSingletons { @@ -28,31 +19,9 @@ public class AkkaHttpClientSingletons { static { SETTER = new HttpHeaderSetter(GlobalOpenTelemetry.getPropagators()); - AkkaHttpClientAttributesGetter httpAttributesGetter = new AkkaHttpClientAttributesGetter(); - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - AkkaHttpUtil.instrumentationName(), - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildInstrumenter(SpanKindExtractor.alwaysClient()); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + AkkaHttpUtil.instrumentationName(), new AkkaHttpClientAttributesGetter()); } public static Instrumenter instrumenter() { diff --git a/instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientSingletons.java b/instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientSingletons.java index cc0605af1092..6a2af90f730e 100644 --- a/instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientSingletons.java +++ b/instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientSingletons.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.apachehttpasyncclient; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import org.apache.http.HttpResponse; public final class ApacheHttpAsyncClientSingletons { @@ -24,33 +15,11 @@ public final class ApacheHttpAsyncClientSingletons { private static final Instrumenter INSTRUMENTER; static { - ApacheHttpAsyncClientHttpAttributesGetter httpAttributesGetter = - new ApacheHttpAsyncClientHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildClientInstrumenter(HttpHeaderSetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + INSTRUMENTATION_NAME, + new ApacheHttpAsyncClientHttpAttributesGetter(), + HttpHeaderSetter.INSTANCE); } public static Instrumenter instrumenter() { diff --git a/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientSingletons.java b/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientSingletons.java index d54ca9c2f35b..ef8e120c78c9 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientSingletons.java +++ b/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientSingletons.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.apachehttpclient.v2_0; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import org.apache.commons.httpclient.HttpMethod; public final class ApacheHttpClientSingletons { @@ -24,33 +15,11 @@ public final class ApacheHttpClientSingletons { private static final Instrumenter INSTRUMENTER; static { - ApacheHttpClientHttpAttributesGetter httpAttributesGetter = - new ApacheHttpClientHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildClientInstrumenter(HttpHeaderSetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + INSTRUMENTATION_NAME, + new ApacheHttpClientHttpAttributesGetter(), + HttpHeaderSetter.INSTANCE); } public static Instrumenter instrumenter() { diff --git a/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientSingletons.java b/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientSingletons.java index 146dd8f08727..a93209c3f42a 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientSingletons.java +++ b/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientSingletons.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.apachehttpclient.v4_0; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import org.apache.http.HttpResponse; public final class ApacheHttpClientSingletons { @@ -24,33 +15,11 @@ public final class ApacheHttpClientSingletons { private static final Instrumenter INSTRUMENTER; static { - ApacheHttpClientHttpAttributesGetter httpAttributesGetter = - new ApacheHttpClientHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildClientInstrumenter(HttpHeaderSetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + INSTRUMENTATION_NAME, + new ApacheHttpClientHttpAttributesGetter(), + HttpHeaderSetter.INSTANCE); } public static Instrumenter instrumenter() { diff --git a/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientTelemetryBuilder.java b/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientTelemetryBuilder.java index daf0d8c6889e..3526ca01436a 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientTelemetryBuilder.java +++ b/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientTelemetryBuilder.java @@ -7,20 +7,10 @@ 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.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; 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.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; -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.Function; @@ -30,24 +20,12 @@ public final class ApacheHttpClientTelemetryBuilder { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-httpclient-4.3"; - - private final OpenTelemetry openTelemetry; - - private final List> - additionalExtractors = new ArrayList<>(); - private final HttpClientAttributesExtractorBuilder - httpAttributesExtractorBuilder = - HttpClientAttributesExtractor.builder(ApacheHttpClientHttpAttributesGetter.INSTANCE); - private final HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = - HttpSpanNameExtractor.builder(ApacheHttpClientHttpAttributesGetter.INSTANCE); - private Function< - SpanNameExtractor, - ? extends SpanNameExtractor> - spanNameExtractorTransformer = Function.identity(); - private boolean emitExperimentalHttpClientMetrics = false; + private final DefaultHttpClientInstrumenterBuilder builder; ApacheHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) { - this.openTelemetry = openTelemetry; + builder = + new DefaultHttpClientInstrumenterBuilder<>( + INSTRUMENTATION_NAME, openTelemetry, ApacheHttpClientHttpAttributesGetter.INSTANCE); } /** @@ -58,7 +36,7 @@ public final class ApacheHttpClientTelemetryBuilder { public ApacheHttpClientTelemetryBuilder addAttributeExtractor( AttributesExtractor attributesExtractor) { - additionalExtractors.add(attributesExtractor); + builder.addAttributeExtractor(attributesExtractor); return this; } @@ -69,7 +47,7 @@ public ApacheHttpClientTelemetryBuilder addAttributeExtractor( */ @CanIgnoreReturnValue public ApacheHttpClientTelemetryBuilder setCapturedRequestHeaders(List requestHeaders) { - httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + builder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -80,7 +58,7 @@ public ApacheHttpClientTelemetryBuilder setCapturedRequestHeaders(List r */ @CanIgnoreReturnValue public ApacheHttpClientTelemetryBuilder setCapturedResponseHeaders(List responseHeaders) { - httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); + builder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -99,8 +77,7 @@ public ApacheHttpClientTelemetryBuilder setCapturedResponseHeaders(List */ @CanIgnoreReturnValue public ApacheHttpClientTelemetryBuilder setKnownMethods(Set knownMethods) { - httpAttributesExtractorBuilder.setKnownMethods(knownMethods); - httpSpanNameExtractorBuilder.setKnownMethods(knownMethods); + builder.setKnownMethods(knownMethods); return this; } @@ -113,7 +90,7 @@ public ApacheHttpClientTelemetryBuilder setKnownMethods(Set knownMethods @CanIgnoreReturnValue public ApacheHttpClientTelemetryBuilder setEmitExperimentalHttpClientMetrics( boolean emitExperimentalHttpClientMetrics) { - this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics; + builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); return this; } @@ -124,7 +101,7 @@ public ApacheHttpClientTelemetryBuilder setSpanNameExtractor( SpanNameExtractor, ? extends SpanNameExtractor> spanNameExtractorTransformer) { - this.spanNameExtractorTransformer = spanNameExtractorTransformer; + builder.setSpanNameExtractor(spanNameExtractorTransformer); return this; } @@ -133,29 +110,7 @@ public ApacheHttpClientTelemetryBuilder setSpanNameExtractor( * ApacheHttpClientTelemetryBuilder}. */ public ApacheHttpClientTelemetry build() { - ApacheHttpClientHttpAttributesGetter httpAttributesGetter = - ApacheHttpClientHttpAttributesGetter.INSTANCE; - SpanNameExtractor spanNameExtractor = - spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); - - InstrumenterBuilder builder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor(httpAttributesExtractorBuilder.build()) - .addAttributesExtractors(additionalExtractors) - .addOperationMetrics(HttpClientMetrics.get()); - if (emitExperimentalHttpClientMetrics) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - - Instrumenter instrumenter = - builder - // We manually inject because we need to inject internal requests for redirects. - .buildInstrumenter(SpanKindExtractor.alwaysClient()); - - return new ApacheHttpClientTelemetry(instrumenter, openTelemetry.getPropagators()); + return new ApacheHttpClientTelemetry( + builder.build(), builder.getOpenTelemetry().getPropagators()); } } diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientSingletons.java b/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientSingletons.java index 8f6ccbdd6a02..e1cc0a667cef 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientSingletons.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientSingletons.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.apachehttpclient.v5_0; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import org.apache.hc.core5.http.HttpRequest; import org.apache.hc.core5.http.HttpResponse; @@ -25,33 +16,11 @@ public final class ApacheHttpClientSingletons { private static final Instrumenter INSTRUMENTER; static { - ApacheHttpClientHttpAttributesGetter httpAttributesGetter = - new ApacheHttpClientHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildClientInstrumenter(HttpHeaderSetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + INSTRUMENTATION_NAME, + new ApacheHttpClientHttpAttributesGetter(), + HttpHeaderSetter.INSTANCE); } public static Instrumenter instrumenter() { 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 176555846849..e9a5eb273de0 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,20 +7,10 @@ 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.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; 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.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; -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.Function; @@ -30,26 +20,13 @@ public final class ApacheHttpClient5TelemetryBuilder { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-httpclient-5.2"; - - private final OpenTelemetry openTelemetry; - - private final List> - additionalExtractors = new ArrayList<>(); - private final HttpClientAttributesExtractorBuilder - httpAttributesExtractorBuilder = - HttpClientAttributesExtractor.builder(ApacheHttpClient5HttpAttributesGetter.INSTANCE); - - private final HttpSpanNameExtractorBuilder - httpSpanNameExtractorBuilder = - HttpSpanNameExtractor.builder(ApacheHttpClient5HttpAttributesGetter.INSTANCE); - private Function< - SpanNameExtractor, - ? extends SpanNameExtractor> - spanNameExtractorTransformer = Function.identity(); - private boolean emitExperimentalHttpClientMetrics = false; + private final DefaultHttpClientInstrumenterBuilder + builder; ApacheHttpClient5TelemetryBuilder(OpenTelemetry openTelemetry) { - this.openTelemetry = openTelemetry; + builder = + new DefaultHttpClientInstrumenterBuilder<>( + INSTRUMENTATION_NAME, openTelemetry, ApacheHttpClient5HttpAttributesGetter.INSTANCE); } /** @@ -60,7 +37,7 @@ public final class ApacheHttpClient5TelemetryBuilder { public ApacheHttpClient5TelemetryBuilder addAttributeExtractor( AttributesExtractor attributesExtractor) { - additionalExtractors.add(attributesExtractor); + builder.addAttributeExtractor(attributesExtractor); return this; } @@ -71,7 +48,7 @@ public ApacheHttpClient5TelemetryBuilder addAttributeExtractor( */ @CanIgnoreReturnValue public ApacheHttpClient5TelemetryBuilder setCapturedRequestHeaders(List requestHeaders) { - httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + builder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -83,7 +60,7 @@ public ApacheHttpClient5TelemetryBuilder setCapturedRequestHeaders(List @CanIgnoreReturnValue public ApacheHttpClient5TelemetryBuilder setCapturedResponseHeaders( List responseHeaders) { - httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); + builder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -102,8 +79,7 @@ public ApacheHttpClient5TelemetryBuilder setCapturedResponseHeaders( */ @CanIgnoreReturnValue public ApacheHttpClient5TelemetryBuilder setKnownMethods(Set knownMethods) { - httpAttributesExtractorBuilder.setKnownMethods(knownMethods); - httpSpanNameExtractorBuilder.setKnownMethods(knownMethods); + builder.setKnownMethods(knownMethods); return this; } @@ -116,7 +92,7 @@ public ApacheHttpClient5TelemetryBuilder setKnownMethods(Set knownMethod @CanIgnoreReturnValue public ApacheHttpClient5TelemetryBuilder setEmitExperimentalHttpClientMetrics( boolean emitExperimentalHttpClientMetrics) { - this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics; + builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); return this; } @@ -127,7 +103,7 @@ public ApacheHttpClient5TelemetryBuilder setSpanNameExtractor( SpanNameExtractor, ? extends SpanNameExtractor> spanNameExtractorTransformer) { - this.spanNameExtractorTransformer = spanNameExtractorTransformer; + builder.setSpanNameExtractor(spanNameExtractorTransformer); return this; } @@ -136,29 +112,7 @@ public ApacheHttpClient5TelemetryBuilder setSpanNameExtractor( * ApacheHttpClient5TelemetryBuilder}. */ public ApacheHttpClient5Telemetry build() { - ApacheHttpClient5HttpAttributesGetter httpAttributesGetter = - ApacheHttpClient5HttpAttributesGetter.INSTANCE; - SpanNameExtractor spanNameExtractor = - spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); - - InstrumenterBuilder builder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor(httpAttributesExtractorBuilder.build()) - .addAttributesExtractors(additionalExtractors) - .addOperationMetrics(HttpClientMetrics.get()); - if (emitExperimentalHttpClientMetrics) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - - Instrumenter instrumenter = - builder - // We manually inject because we need to inject internal requests for redirects. - .buildInstrumenter(SpanKindExtractor.alwaysClient()); - - return new ApacheHttpClient5Telemetry(instrumenter, openTelemetry.getPropagators()); + return new ApacheHttpClient5Telemetry( + builder.build(), builder.getOpenTelemetry().getPropagators()); } } diff --git a/instrumentation/async-http-client/async-http-client-1.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/AsyncHttpClientSingletons.java b/instrumentation/async-http-client/async-http-client-1.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/AsyncHttpClientSingletons.java index 7963e1d2b3d0..c886631a93cc 100644 --- a/instrumentation/async-http-client/async-http-client-1.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/AsyncHttpClientSingletons.java +++ b/instrumentation/async-http-client/async-http-client-1.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/AsyncHttpClientSingletons.java @@ -7,17 +7,8 @@ import com.ning.http.client.Request; import com.ning.http.client.Response; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; public final class AsyncHttpClientSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.async-http-client-1.9"; @@ -25,33 +16,11 @@ public final class AsyncHttpClientSingletons { private static final Instrumenter INSTRUMENTER; static { - AsyncHttpClientHttpAttributesGetter httpAttributesGetter = - new AsyncHttpClientHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildClientInstrumenter(HttpHeaderSetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + INSTRUMENTATION_NAME, + new AsyncHttpClientHttpAttributesGetter(), + HttpHeaderSetter.INSTANCE); } public static Instrumenter instrumenter() { diff --git a/instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/AsyncHttpClientSingletons.java b/instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/AsyncHttpClientSingletons.java index 56e8706a3317..2e140594f0bd 100644 --- a/instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/AsyncHttpClientSingletons.java +++ b/instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/AsyncHttpClientSingletons.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.asynchttpclient.v2_0; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import org.asynchttpclient.Response; public final class AsyncHttpClientSingletons { @@ -24,33 +15,11 @@ public final class AsyncHttpClientSingletons { private static final Instrumenter INSTRUMENTER; static { - AsyncHttpClientHttpAttributesGetter httpAttributesGetter = - new AsyncHttpClientHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildClientInstrumenter(HttpHeaderSetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + INSTRUMENTATION_NAME, + new AsyncHttpClientHttpAttributesGetter(), + HttpHeaderSetter.INSTANCE); } public static Instrumenter instrumenter() { diff --git a/instrumentation/google-http-client-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/googlehttpclient/GoogleHttpClientSingletons.java b/instrumentation/google-http-client-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/googlehttpclient/GoogleHttpClientSingletons.java index 17e717e79a65..68039f69b3ac 100644 --- a/instrumentation/google-http-client-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/googlehttpclient/GoogleHttpClientSingletons.java +++ b/instrumentation/google-http-client-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/googlehttpclient/GoogleHttpClientSingletons.java @@ -7,17 +7,8 @@ import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpResponse; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; public class GoogleHttpClientSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.google-http-client-1.19"; @@ -25,33 +16,11 @@ public class GoogleHttpClientSingletons { private static final Instrumenter INSTRUMENTER; static { - GoogleHttpClientHttpAttributesGetter httpAttributesGetter = - new GoogleHttpClientHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildClientInstrumenter(HttpHeaderSetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + INSTRUMENTATION_NAME, + new GoogleHttpClientHttpAttributesGetter(), + HttpHeaderSetter.INSTANCE); } public static Instrumenter instrumenter() { diff --git a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionSingletons.java b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionSingletons.java index f3eb0bd53bb8..62c67adb63b6 100644 --- a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionSingletons.java +++ b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionSingletons.java @@ -5,17 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.httpurlconnection; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import java.net.HttpURLConnection; public final class HttpUrlConnectionSingletons { @@ -23,38 +15,19 @@ public final class HttpUrlConnectionSingletons { private static final Instrumenter INSTRUMENTER; static { - HttpUrlHttpAttributesGetter httpAttributesGetter = new HttpUrlHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - "io.opentelemetry.http-url-connection", - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addAttributesExtractor( - HttpMethodAttributeExtractor.create( - CommonConfig.get().getKnownHttpRequestMethods())) - .addContextCustomizer( - (context, httpRequestPacket, startAttributes) -> - GetOutputStreamContext.init(context)) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildClientInstrumenter(RequestPropertySetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + "io.opentelemetry.http-url-connection", + new HttpUrlHttpAttributesGetter(), + RequestPropertySetter.INSTANCE, + builder -> + builder + .addAttributesExtractor( + HttpMethodAttributeExtractor.create( + CommonConfig.get().getKnownHttpRequestMethods())) + .addContextCustomizer( + (context, httpRequestPacket, startAttributes) -> + GetOutputStreamContext.init(context))); } public static Instrumenter instrumenter() { 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/httpclient/JavaHttpClientSingletons.java index 73d7d2aef13a..afbf19dfc4d3 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/httpclient/JavaHttpClientSingletons.java @@ -5,18 +5,13 @@ package io.opentelemetry.javaagent.instrumentation.httpclient; -import static java.util.Collections.singletonList; - import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.httpclient.JavaHttpClientTelemetry; import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter; -import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientAttributesGetter; -import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientInstrumenterFactory; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.util.function.Function; public class JavaHttpClientSingletons { @@ -27,20 +22,8 @@ public class JavaHttpClientSingletons { SETTER = new HttpHeadersSetter(GlobalOpenTelemetry.getPropagators()); INSTRUMENTER = - JavaHttpClientInstrumenterFactory.createInstrumenter( - GlobalOpenTelemetry.get(), - builder -> - builder - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), - builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), - Function.identity(), - singletonList( - HttpClientPeerServiceAttributesExtractor.create( - JavaHttpClientAttributesGetter.INSTANCE, - CommonConfig.get().getPeerServiceResolver())), - CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()); + JavaagentHttpClientInstrumenters.create( + JavaHttpClientTelemetry.builder(GlobalOpenTelemetry.get())); } public static Instrumenter> instrumenter() { 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 ca1f753044a7..68139059f270 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 @@ -7,37 +7,27 @@ 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.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder; import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter; -import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientInstrumenterFactory; +import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientAttributesGetter; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.function.Consumer; import java.util.function.Function; public final class JavaHttpClientTelemetryBuilder { - private final OpenTelemetry openTelemetry; - - private final List>> - additionalExtractors = new ArrayList<>(); - private Consumer>> - extractorConfigurer = builder -> {}; - private Consumer> spanNameExtractorConfigurer = - builder -> {}; - private Function, ? extends SpanNameExtractor> - spanNameExtractorTransformer = Function.identity(); - private boolean emitExperimentalHttpClientMetrics = false; + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.java-http-client"; + private final DefaultHttpClientInstrumenterBuilder> builder; JavaHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) { - this.openTelemetry = openTelemetry; + builder = + new DefaultHttpClientInstrumenterBuilder<>( + INSTRUMENTATION_NAME, openTelemetry, JavaHttpClientAttributesGetter.INSTANCE); } /** @@ -47,31 +37,29 @@ public final class JavaHttpClientTelemetryBuilder { @CanIgnoreReturnValue public JavaHttpClientTelemetryBuilder addAttributeExtractor( AttributesExtractor> attributesExtractor) { - additionalExtractors.add(attributesExtractor); + builder.addAttributeExtractor(attributesExtractor); return this; } /** - * Configures the HTTP client request headers that will be captured as span attributes. + * Configures the HTTP request headers that will be captured as span attributes. * * @param requestHeaders A list of HTTP header names. */ @CanIgnoreReturnValue public JavaHttpClientTelemetryBuilder setCapturedRequestHeaders(List requestHeaders) { - extractorConfigurer = - extractorConfigurer.andThen(builder -> builder.setCapturedRequestHeaders(requestHeaders)); + builder.setCapturedRequestHeaders(requestHeaders); return this; } /** - * Configures the HTTP client response headers that will be captured as span attributes. + * Configures the HTTP response headers that will be captured as span attributes. * * @param responseHeaders A list of HTTP header names. */ @CanIgnoreReturnValue public JavaHttpClientTelemetryBuilder setCapturedResponseHeaders(List responseHeaders) { - extractorConfigurer = - extractorConfigurer.andThen(builder -> builder.setCapturedResponseHeaders(responseHeaders)); + builder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -90,10 +78,7 @@ public JavaHttpClientTelemetryBuilder setCapturedResponseHeaders(List re */ @CanIgnoreReturnValue public JavaHttpClientTelemetryBuilder setKnownMethods(Set knownMethods) { - extractorConfigurer = - extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); - spanNameExtractorConfigurer = - spanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); + builder.setKnownMethods(knownMethods); return this; } @@ -106,7 +91,7 @@ public JavaHttpClientTelemetryBuilder setKnownMethods(Set knownMethods) @CanIgnoreReturnValue public JavaHttpClientTelemetryBuilder setEmitExperimentalHttpClientMetrics( boolean emitExperimentalHttpClientMetrics) { - this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics; + builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); return this; } @@ -115,21 +100,12 @@ public JavaHttpClientTelemetryBuilder setEmitExperimentalHttpClientMetrics( public JavaHttpClientTelemetryBuilder setSpanNameExtractor( Function, ? extends SpanNameExtractor> spanNameExtractorTransformer) { - this.spanNameExtractorTransformer = spanNameExtractorTransformer; + builder.setSpanNameExtractor(spanNameExtractorTransformer); return this; } public JavaHttpClientTelemetry build() { - Instrumenter> instrumenter = - JavaHttpClientInstrumenterFactory.createInstrumenter( - openTelemetry, - extractorConfigurer, - spanNameExtractorConfigurer, - spanNameExtractorTransformer, - additionalExtractors, - emitExperimentalHttpClientMetrics); - return new JavaHttpClientTelemetry( - instrumenter, new HttpHeadersSetter(openTelemetry.getPropagators())); + builder.build(), new HttpHeadersSetter(builder.getOpenTelemetry().getPropagators())); } } diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterFactory.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterFactory.java deleted file mode 100644 index 12c5439fcb7b..000000000000 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterFactory.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.httpclient.internal; - -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.instrumenter.SpanKindExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; -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.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public final class JavaHttpClientInstrumenterFactory { - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.java-http-client"; - - public static Instrumenter> createInstrumenter( - OpenTelemetry openTelemetry, - Consumer>> - extractorConfigurer, - Consumer> spanNameExtractorConfigurer, - Function, ? extends SpanNameExtractor> - spanNameExtractorTransformer, - List>> additionalExtractors, - boolean emitExperimentalHttpClientMetrics) { - - JavaHttpClientAttributesGetter httpAttributesGetter = JavaHttpClientAttributesGetter.INSTANCE; - - HttpClientAttributesExtractorBuilder> - httpAttributesExtractorBuilder = - HttpClientAttributesExtractor.builder(httpAttributesGetter); - extractorConfigurer.accept(httpAttributesExtractorBuilder); - - HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = - HttpSpanNameExtractor.builder(httpAttributesGetter); - spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder); - SpanNameExtractor spanNameExtractor = - spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); - - InstrumenterBuilder> builder = - Instrumenter.>builder( - openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor(httpAttributesExtractorBuilder.build()) - .addAttributesExtractors(additionalExtractors) - .addOperationMetrics(HttpClientMetrics.get()); - if (emitExperimentalHttpClientMetrics) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - return builder.buildInstrumenter(SpanKindExtractor.alwaysClient()); - } - - private JavaHttpClientInstrumenterFactory() {} -} diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/httpclient/v9_2/JettyHttpClientSingletons.java b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/httpclient/v9_2/JettyHttpClientSingletons.java index 07ab0522137d..3ca5672ac5fb 100644 --- a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/httpclient/v9_2/JettyHttpClientSingletons.java +++ b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/httpclient/v9_2/JettyHttpClientSingletons.java @@ -5,35 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.jetty.httpclient.v9_2; -import static java.util.Collections.singletonList; - import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientHttpAttributesGetter; -import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientInstrumenterFactory; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; -import java.util.function.Function; +import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.JettyClientTelemetry; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.api.Response; public class JettyHttpClientSingletons { private static final Instrumenter INSTRUMENTER = - JettyClientInstrumenterFactory.create( - GlobalOpenTelemetry.get(), - builder -> - builder - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), - builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), - Function.identity(), - singletonList( - HttpClientPeerServiceAttributesExtractor.create( - JettyClientHttpAttributesGetter.INSTANCE, - CommonConfig.get().getPeerServiceResolver())), - CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()); + JavaagentHttpClientInstrumenters.create( + JettyClientTelemetry.builder(GlobalOpenTelemetry.get())); public static Instrumenter instrumenter() { return INSTRUMENTER; diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTelemetryBuilder.java b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTelemetryBuilder.java index dd6cb72ee7f0..75452e62f3e8 100644 --- a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTelemetryBuilder.java +++ b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTelemetryBuilder.java @@ -7,15 +7,14 @@ 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.api.semconv.http.HttpSpanNameExtractorBuilder; -import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientInstrumenterFactory; -import java.util.ArrayList; +import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.HttpHeaderSetter; +import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientHttpAttributesGetter; import java.util.List; import java.util.Set; -import java.util.function.Consumer; import java.util.function.Function; import org.eclipse.jetty.client.HttpClientTransport; import org.eclipse.jetty.client.api.Request; @@ -25,21 +24,16 @@ /** A builder of {@link JettyClientTelemetry}. */ public final class JettyClientTelemetryBuilder { - private final OpenTelemetry openTelemetry; - private final List> additionalExtractors = - new ArrayList<>(); - private Consumer> extractorConfigurer = - builder -> {}; - private Consumer> spanNameExtractorConfigurer = - builder -> {}; - private Function, ? extends SpanNameExtractor> - spanNameExtractorTransformer = Function.identity(); - private boolean emitExperimentalHttpClientMetrics = false; + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jetty-httpclient-9.2"; + private final DefaultHttpClientInstrumenterBuilder builder; private HttpClientTransport httpClientTransport; private SslContextFactory sslContextFactory; JettyClientTelemetryBuilder(OpenTelemetry openTelemetry) { - this.openTelemetry = openTelemetry; + builder = + new DefaultHttpClientInstrumenterBuilder<>( + INSTRUMENTATION_NAME, openTelemetry, JettyClientHttpAttributesGetter.INSTANCE) + .setHeaderSetter(HttpHeaderSetter.INSTANCE); } @CanIgnoreReturnValue @@ -62,7 +56,7 @@ public JettyClientTelemetryBuilder setSslContextFactory(SslContextFactory sslCon @CanIgnoreReturnValue public JettyClientTelemetryBuilder addAttributeExtractor( AttributesExtractor attributesExtractor) { - additionalExtractors.add(attributesExtractor); + builder.addAttributeExtractor(attributesExtractor); return this; } @@ -73,8 +67,7 @@ public JettyClientTelemetryBuilder addAttributeExtractor( */ @CanIgnoreReturnValue public JettyClientTelemetryBuilder setCapturedRequestHeaders(List requestHeaders) { - extractorConfigurer = - extractorConfigurer.andThen(builder -> builder.setCapturedRequestHeaders(requestHeaders)); + builder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -85,8 +78,7 @@ public JettyClientTelemetryBuilder setCapturedRequestHeaders(List reques */ @CanIgnoreReturnValue public JettyClientTelemetryBuilder setCapturedResponseHeaders(List responseHeaders) { - extractorConfigurer = - extractorConfigurer.andThen(builder -> builder.setCapturedResponseHeaders(responseHeaders)); + builder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -105,10 +97,7 @@ public JettyClientTelemetryBuilder setCapturedResponseHeaders(List respo */ @CanIgnoreReturnValue public JettyClientTelemetryBuilder setKnownMethods(Set knownMethods) { - extractorConfigurer = - extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); - spanNameExtractorConfigurer = - spanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); + builder.setKnownMethods(knownMethods); return this; } @@ -121,7 +110,7 @@ public JettyClientTelemetryBuilder setKnownMethods(Set knownMethods) { @CanIgnoreReturnValue public JettyClientTelemetryBuilder setEmitExperimentalHttpClientMetrics( boolean emitExperimentalHttpClientMetrics) { - this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics; + builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); return this; } @@ -130,7 +119,7 @@ public JettyClientTelemetryBuilder setEmitExperimentalHttpClientMetrics( public JettyClientTelemetryBuilder setSpanNameExtractor( Function, ? extends SpanNameExtractor> spanNameExtractorTransformer) { - this.spanNameExtractorTransformer = spanNameExtractorTransformer; + builder.setSpanNameExtractor(spanNameExtractorTransformer); return this; } @@ -140,16 +129,7 @@ public JettyClientTelemetryBuilder setSpanNameExtractor( */ public JettyClientTelemetry build() { TracingHttpClient tracingHttpClient = - TracingHttpClient.buildNew( - JettyClientInstrumenterFactory.create( - openTelemetry, - extractorConfigurer, - spanNameExtractorConfigurer, - spanNameExtractorTransformer, - additionalExtractors, - emitExperimentalHttpClientMetrics), - sslContextFactory, - httpClientTransport); + TracingHttpClient.buildNew(builder.build(), sslContextFactory, httpClientTransport); return new JettyClientTelemetry(tracingHttpClient); } diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/HttpHeaderSetter.java b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/HttpHeaderSetter.java index bc2c8ab1e255..da4b7d03cfe8 100644 --- a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/HttpHeaderSetter.java +++ b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/HttpHeaderSetter.java @@ -8,7 +8,11 @@ import io.opentelemetry.context.propagation.TextMapSetter; import org.eclipse.jetty.client.api.Request; -enum HttpHeaderSetter implements TextMapSetter { +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public enum HttpHeaderSetter implements TextMapSetter { INSTANCE; @Override diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientInstrumenterFactory.java b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientInstrumenterFactory.java deleted file mode 100644 index d07edd2038af..000000000000 --- a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientInstrumenterFactory.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal; - -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.instrumenter.SpanNameExtractor; -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.List; -import java.util.function.Consumer; -import java.util.function.Function; -import org.eclipse.jetty.client.api.Request; -import org.eclipse.jetty.client.api.Response; - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public final class JettyClientInstrumenterFactory { - - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jetty-httpclient-9.2"; - - public static Instrumenter create( - OpenTelemetry openTelemetry, - Consumer> extractorConfigurer, - Consumer> spanNameExtractorConfigurer, - Function, ? extends SpanNameExtractor> - spanNameExtractorTransformer, - List> additionalExtractors, - boolean emitExperimentalHttpClientMetrics) { - - JettyClientHttpAttributesGetter httpAttributesGetter = JettyClientHttpAttributesGetter.INSTANCE; - - HttpClientAttributesExtractorBuilder httpAttributesExtractorBuilder = - HttpClientAttributesExtractor.builder(httpAttributesGetter); - extractorConfigurer.accept(httpAttributesExtractorBuilder); - - HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = - HttpSpanNameExtractor.builder(httpAttributesGetter); - spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder); - SpanNameExtractor spanNameExtractor = - spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); - - InstrumenterBuilder builder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor(httpAttributesExtractorBuilder.build()) - .addAttributesExtractors(additionalExtractors) - .addOperationMetrics(HttpClientMetrics.get()); - if (emitExperimentalHttpClientMetrics) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - - return builder.buildClientInstrumenter(HttpHeaderSetter.INSTANCE); - } - - private JettyClientInstrumenterFactory() {} -} diff --git a/instrumentation/jodd-http-4.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/joddhttp/v4_2/JoddHttpSingletons.java b/instrumentation/jodd-http-4.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/joddhttp/v4_2/JoddHttpSingletons.java index ec1e8bb99acb..9bc4838f4b1f 100644 --- a/instrumentation/jodd-http-4.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/joddhttp/v4_2/JoddHttpSingletons.java +++ b/instrumentation/jodd-http-4.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/joddhttp/v4_2/JoddHttpSingletons.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.joddhttp.v4_2; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import jodd.http.HttpRequest; import jodd.http.HttpResponse; @@ -25,32 +16,9 @@ public final class JoddHttpSingletons { private static final Instrumenter INSTRUMENTER; static { - JoddHttpHttpAttributesGetter httpAttributesGetter = new JoddHttpHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildClientInstrumenter(HttpHeaderSetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + INSTRUMENTATION_NAME, new JoddHttpHttpAttributesGetter(), HttpHeaderSetter.INSTANCE); } public static Instrumenter instrumenter() { diff --git a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/NettyClientSingletons.java b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/NettyClientSingletons.java index 2c4733f4eb57..4670cf8cabfd 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/NettyClientSingletons.java +++ b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/NettyClientSingletons.java @@ -6,19 +6,14 @@ package io.opentelemetry.javaagent.instrumentation.netty.v3_8.client; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.netty.common.internal.NettyConnectionRequest; import io.opentelemetry.instrumentation.netty.common.internal.NettyErrorHolder; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import io.opentelemetry.javaagent.instrumentation.netty.v3_8.HttpRequestAndChannel; import org.jboss.netty.channel.Channel; import org.jboss.netty.handler.codec.http.HttpResponse; @@ -31,34 +26,15 @@ public final class NettyClientSingletons { private static final Instrumenter CONNECTION_INSTRUMENTER; static { - NettyHttpClientAttributesGetter httpAttributesGetter = new NettyHttpClientAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()) - .addContextCustomizer( - (context, requestAndChannel, startAttributes) -> NettyErrorHolder.init(context)); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildClientInstrumenter(HttpRequestHeadersSetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + INSTRUMENTATION_NAME, + new NettyHttpClientAttributesGetter(), + HttpRequestHeadersSetter.INSTANCE, + builder -> { + builder.addContextCustomizer( + (context, requestAndChannel, startAttributes) -> NettyErrorHolder.init(context)); + }); CONNECTION_INSTRUMENTER = Instrumenter.builder( diff --git a/instrumentation/okhttp/okhttp-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2Singletons.java b/instrumentation/okhttp/okhttp-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2Singletons.java index 06495ceb9e63..0cc51730f0b9 100644 --- a/instrumentation/okhttp/okhttp-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2Singletons.java +++ b/instrumentation/okhttp/okhttp-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2Singletons.java @@ -5,23 +5,12 @@ package io.opentelemetry.javaagent.instrumentation.okhttp.v2_2; -import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient; - import com.squareup.okhttp.Interceptor; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; public final class OkHttp2Singletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.okhttp-2.2"; @@ -30,36 +19,12 @@ public final class OkHttp2Singletons { private static final TracingInterceptor TRACING_INTERCEPTOR; static { - OkHttp2HttpAttributesGetter httpAttributesGetter = new OkHttp2HttpAttributesGetter(); - - OpenTelemetry openTelemetry = GlobalOpenTelemetry.get(); - - InstrumenterBuilder builder = - Instrumenter.builder( - openTelemetry, - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildInstrumenter(alwaysClient()); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + INSTRUMENTATION_NAME, new OkHttp2HttpAttributesGetter()); - TRACING_INTERCEPTOR = new TracingInterceptor(INSTRUMENTER, openTelemetry.getPropagators()); + TRACING_INTERCEPTOR = + new TracingInterceptor(INSTRUMENTER, GlobalOpenTelemetry.get().getPropagators()); } public static Instrumenter instrumenter() { diff --git a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java index 8c4d3a0ee8da..4dc49d99520d 100644 --- a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java +++ b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java @@ -5,20 +5,15 @@ package io.opentelemetry.javaagent.instrumentation.okhttp.v3_0; -import static java.util.Collections.singletonList; - import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount; +import io.opentelemetry.instrumentation.okhttp.v3_0.OkHttpTelemetry; import io.opentelemetry.instrumentation.okhttp.v3_0.internal.ConnectionErrorSpanInterceptor; -import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpAttributesGetter; -import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpInstrumenterFactory; import io.opentelemetry.instrumentation.okhttp.v3_0.internal.TracingInterceptor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; -import java.util.function.Function; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; @@ -27,19 +22,7 @@ public final class OkHttp3Singletons { private static final Instrumenter INSTRUMENTER = - OkHttpInstrumenterFactory.create( - GlobalOpenTelemetry.get(), - builder -> - builder - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), - builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), - Function.identity(), - singletonList( - HttpClientPeerServiceAttributesExtractor.create( - OkHttpAttributesGetter.INSTANCE, CommonConfig.get().getPeerServiceResolver())), - CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()); + JavaagentHttpClientInstrumenters.create(OkHttpTelemetry.builder(GlobalOpenTelemetry.get())); public static final Interceptor CONTEXT_INTERCEPTOR = chain -> { diff --git a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTelemetryBuilder.java b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTelemetryBuilder.java index 131b03648414..aeb02eb366b2 100644 --- a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTelemetryBuilder.java +++ b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTelemetryBuilder.java @@ -7,15 +7,13 @@ 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.api.semconv.http.HttpSpanNameExtractorBuilder; -import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpInstrumenterFactory; -import java.util.ArrayList; +import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpAttributesGetter; import java.util.List; import java.util.Set; -import java.util.function.Consumer; import java.util.function.Function; import okhttp3.Request; import okhttp3.Response; @@ -23,19 +21,13 @@ /** A builder of {@link OkHttpTelemetry}. */ public final class OkHttpTelemetryBuilder { - private final OpenTelemetry openTelemetry; - private final List> additionalExtractors = - new ArrayList<>(); - private Consumer> extractorConfigurer = - builder -> {}; - private Consumer> spanNameExtractorConfigurer = - builder -> {}; - private Function, ? extends SpanNameExtractor> - spanNameExtractorTransformer = Function.identity(); - private boolean emitExperimentalHttpClientMetrics = false; + public static final String INSTRUMENTATION_NAME = "io.opentelemetry.okhttp-3.0"; + private final DefaultHttpClientInstrumenterBuilder builder; OkHttpTelemetryBuilder(OpenTelemetry openTelemetry) { - this.openTelemetry = openTelemetry; + builder = + new DefaultHttpClientInstrumenterBuilder<>( + INSTRUMENTATION_NAME, openTelemetry, OkHttpAttributesGetter.INSTANCE); } /** @@ -43,9 +35,9 @@ public final class OkHttpTelemetryBuilder { * items. */ @CanIgnoreReturnValue - public OkHttpTelemetryBuilder addAttributesExtractor( - AttributesExtractor attributesExtractor) { - additionalExtractors.add(attributesExtractor); + public OkHttpTelemetryBuilder addAttributeExtractor( + AttributesExtractor attributesExtractor) { + builder.addAttributeExtractor(attributesExtractor); return this; } @@ -56,8 +48,7 @@ public OkHttpTelemetryBuilder addAttributesExtractor( */ @CanIgnoreReturnValue public OkHttpTelemetryBuilder setCapturedRequestHeaders(List requestHeaders) { - extractorConfigurer = - extractorConfigurer.andThen(builder -> builder.setCapturedRequestHeaders(requestHeaders)); + builder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -68,8 +59,7 @@ public OkHttpTelemetryBuilder setCapturedRequestHeaders(List requestHead */ @CanIgnoreReturnValue public OkHttpTelemetryBuilder setCapturedResponseHeaders(List responseHeaders) { - extractorConfigurer = - extractorConfigurer.andThen(builder -> builder.setCapturedResponseHeaders(responseHeaders)); + builder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -88,10 +78,7 @@ public OkHttpTelemetryBuilder setCapturedResponseHeaders(List responseHe */ @CanIgnoreReturnValue public OkHttpTelemetryBuilder setKnownMethods(Set knownMethods) { - extractorConfigurer = - extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); - spanNameExtractorConfigurer = - spanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); + builder.setKnownMethods(knownMethods); return this; } @@ -104,7 +91,7 @@ public OkHttpTelemetryBuilder setKnownMethods(Set knownMethods) { @CanIgnoreReturnValue public OkHttpTelemetryBuilder setEmitExperimentalHttpClientMetrics( boolean emitExperimentalHttpClientMetrics) { - this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics; + builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); return this; } @@ -113,7 +100,7 @@ public OkHttpTelemetryBuilder setEmitExperimentalHttpClientMetrics( public OkHttpTelemetryBuilder setSpanNameExtractor( Function, ? extends SpanNameExtractor> spanNameExtractorTransformer) { - this.spanNameExtractorTransformer = spanNameExtractorTransformer; + builder.setSpanNameExtractor(spanNameExtractorTransformer); return this; } @@ -121,14 +108,6 @@ public OkHttpTelemetryBuilder setSpanNameExtractor( * Returns a new {@link OkHttpTelemetry} with the settings of this {@link OkHttpTelemetryBuilder}. */ public OkHttpTelemetry build() { - return new OkHttpTelemetry( - OkHttpInstrumenterFactory.create( - openTelemetry, - extractorConfigurer, - spanNameExtractorConfigurer, - spanNameExtractorTransformer, - additionalExtractors, - emitExperimentalHttpClientMetrics), - openTelemetry.getPropagators()); + return new OkHttpTelemetry(builder.build(), builder.getOpenTelemetry().getPropagators()); } } diff --git a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpInstrumenterFactory.java b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpInstrumenterFactory.java deleted file mode 100644 index bc2b76f8fe67..000000000000 --- a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpInstrumenterFactory.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.okhttp.v3_0.internal; - -import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient; - -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.instrumenter.SpanNameExtractor; -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.List; -import java.util.function.Consumer; -import java.util.function.Function; -import okhttp3.Request; -import okhttp3.Response; - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public final class OkHttpInstrumenterFactory { - - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.okhttp-3.0"; - - public static Instrumenter create( - OpenTelemetry openTelemetry, - Consumer> extractorConfigurer, - Consumer> spanNameExtractorConfigurer, - Function, ? extends SpanNameExtractor> - spanNameExtractorTransformer, - List> additionalAttributesExtractors, - boolean emitExperimentalHttpClientMetrics) { - - OkHttpAttributesGetter httpAttributesGetter = OkHttpAttributesGetter.INSTANCE; - - HttpClientAttributesExtractorBuilder extractorBuilder = - HttpClientAttributesExtractor.builder(httpAttributesGetter); - extractorConfigurer.accept(extractorBuilder); - - HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = - HttpSpanNameExtractor.builder(httpAttributesGetter); - spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder); - SpanNameExtractor spanNameExtractor = - spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); - - InstrumenterBuilder builder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor(extractorBuilder.build()) - .addAttributesExtractors(additionalAttributesExtractors) - .addOperationMetrics(HttpClientMetrics.get()); - if (emitExperimentalHttpClientMetrics) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - - return builder.buildInstrumenter(alwaysClient()); - } - - private OkHttpInstrumenterFactory() {} -} diff --git a/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/client/PekkoHttpClientSingletons.java b/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/client/PekkoHttpClientSingletons.java index fda4e4ed6edf..79062bf38803 100644 --- a/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/client/PekkoHttpClientSingletons.java +++ b/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/client/PekkoHttpClientSingletons.java @@ -6,17 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.pekkohttp.v1_0.client; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import io.opentelemetry.javaagent.instrumentation.pekkohttp.v1_0.PekkoHttpUtil; import org.apache.pekko.http.scaladsl.model.HttpRequest; import org.apache.pekko.http.scaladsl.model.HttpResponse; @@ -28,29 +19,10 @@ public class PekkoHttpClientSingletons { static { SETTER = new HttpHeaderSetter(GlobalOpenTelemetry.getPropagators()); - PekkoHttpClientAttributesGetter httpAttributesGetter = new PekkoHttpClientAttributesGetter(); - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - PekkoHttpUtil.instrumentationName(), - HttpSpanNameExtractor.create(httpAttributesGetter)) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - PeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildInstrumenter(SpanKindExtractor.alwaysClient()); + + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + PekkoHttpUtil.instrumentationName(), new PekkoHttpClientAttributesGetter()); } public static Instrumenter instrumenter() { diff --git a/instrumentation/play/play-ws/play-ws-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayWsClientInstrumenterFactory.java b/instrumentation/play/play-ws/play-ws-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayWsClientInstrumenterFactory.java index 44501c1ec9a3..3aa1baa07114 100644 --- a/instrumentation/play/play-ws/play-ws-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayWsClientInstrumenterFactory.java +++ b/instrumentation/play/play-ws/play-ws-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayWsClientInstrumenterFactory.java @@ -5,49 +5,16 @@ package io.opentelemetry.javaagent.instrumentation.playws; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import play.shaded.ahc.org.asynchttpclient.Request; import play.shaded.ahc.org.asynchttpclient.Response; public final class PlayWsClientInstrumenterFactory { public static Instrumenter createInstrumenter(String instrumentationName) { - PlayWsClientHttpAttributesGetter httpAttributesGetter = new PlayWsClientHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - instrumentationName, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - return builder.buildClientInstrumenter(HttpHeaderSetter.INSTANCE); + return JavaagentHttpClientInstrumenters.create( + instrumentationName, new PlayWsClientHttpAttributesGetter(), HttpHeaderSetter.INSTANCE); } private PlayWsClientInstrumenterFactory() {} 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..be0e19fb22cf 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 @@ -6,20 +6,13 @@ package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; 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.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import reactor.netty.http.client.HttpClientRequest; import reactor.netty.http.client.HttpClientResponse; @@ -35,33 +28,11 @@ public final class ReactorNettySingletons { private static final NettyConnectionInstrumenter CONNECTION_INSTRUMENTER; static { - ReactorNettyHttpClientAttributesGetter httpAttributesGetter = - new ReactorNettyHttpClientAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildClientInstrumenter(HttpClientRequestHeadersSetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpClientInstrumenters.create( + INSTRUMENTATION_NAME, + new ReactorNettyHttpClientAttributesGetter(), + HttpClientRequestHeadersSetter.INSTANCE); NettyClientInstrumenterFactory instrumenterFactory = new NettyClientInstrumenterFactory( diff --git a/instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebTelemetryBuilder.java b/instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebTelemetryBuilder.java index 20fae270a2ea..35e50ce426be 100644 --- a/instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebTelemetryBuilder.java +++ b/instrumentation/spring/spring-web/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebTelemetryBuilder.java @@ -7,19 +7,10 @@ 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.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; 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.instrumenter.SpanNameExtractor; -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.Function; @@ -29,21 +20,13 @@ /** A builder of {@link SpringWebTelemetry}. */ public final class SpringWebTelemetryBuilder { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-web-3.1"; - - private final OpenTelemetry openTelemetry; - private final List> additionalExtractors = - new ArrayList<>(); - private final HttpClientAttributesExtractorBuilder - httpAttributesExtractorBuilder = - HttpClientAttributesExtractor.builder(SpringWebHttpAttributesGetter.INSTANCE); - private final HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = - HttpSpanNameExtractor.builder(SpringWebHttpAttributesGetter.INSTANCE); - private Function, ? extends SpanNameExtractor> - spanNameExtractorTransformer = Function.identity(); - private boolean emitExperimentalHttpClientMetrics = false; + private final DefaultHttpClientInstrumenterBuilder builder; SpringWebTelemetryBuilder(OpenTelemetry openTelemetry) { - this.openTelemetry = openTelemetry; + builder = + new DefaultHttpClientInstrumenterBuilder<>( + INSTRUMENTATION_NAME, openTelemetry, SpringWebHttpAttributesGetter.INSTANCE) + .setHeaderSetter(HttpRequestSetter.INSTANCE); } /** @@ -51,9 +34,9 @@ public final class SpringWebTelemetryBuilder { * items. */ @CanIgnoreReturnValue - public SpringWebTelemetryBuilder addAttributesExtractor( - AttributesExtractor attributesExtractor) { - additionalExtractors.add(attributesExtractor); + public SpringWebTelemetryBuilder addAttributeExtractor( + AttributesExtractor attributesExtractor) { + builder.addAttributeExtractor(attributesExtractor); return this; } @@ -64,7 +47,7 @@ public SpringWebTelemetryBuilder addAttributesExtractor( */ @CanIgnoreReturnValue public SpringWebTelemetryBuilder setCapturedRequestHeaders(List requestHeaders) { - httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + builder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -75,7 +58,7 @@ public SpringWebTelemetryBuilder setCapturedRequestHeaders(List requestH */ @CanIgnoreReturnValue public SpringWebTelemetryBuilder setCapturedResponseHeaders(List responseHeaders) { - httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); + builder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -83,8 +66,8 @@ public SpringWebTelemetryBuilder setCapturedResponseHeaders(List respons @CanIgnoreReturnValue public SpringWebTelemetryBuilder setSpanNameExtractor( Function, ? extends SpanNameExtractor> - spanNameExtractor) { - this.spanNameExtractorTransformer = spanNameExtractor; + spanNameExtractorTransformer) { + builder.setSpanNameExtractor(spanNameExtractorTransformer); return this; } @@ -103,8 +86,7 @@ public SpringWebTelemetryBuilder setSpanNameExtractor( */ @CanIgnoreReturnValue public SpringWebTelemetryBuilder setKnownMethods(Set knownMethods) { - httpAttributesExtractorBuilder.setKnownMethods(knownMethods); - httpSpanNameExtractorBuilder.setKnownMethods(knownMethods); + builder.setKnownMethods(knownMethods); return this; } @@ -117,7 +99,7 @@ public SpringWebTelemetryBuilder setKnownMethods(Set knownMethods) { @CanIgnoreReturnValue public SpringWebTelemetryBuilder setEmitExperimentalHttpClientMetrics( boolean emitExperimentalHttpClientMetrics) { - this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics; + builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); return this; } @@ -126,25 +108,6 @@ public SpringWebTelemetryBuilder setEmitExperimentalHttpClientMetrics( * SpringWebTelemetryBuilder}. */ public SpringWebTelemetry build() { - SpringWebHttpAttributesGetter httpAttributesGetter = SpringWebHttpAttributesGetter.INSTANCE; - SpanNameExtractor spanNameExtractor = - spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); - - InstrumenterBuilder builder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor(httpAttributesExtractorBuilder.build()) - .addAttributesExtractors(additionalExtractors) - .addOperationMetrics(HttpClientMetrics.get()); - if (emitExperimentalHttpClientMetrics) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - - Instrumenter instrumenter = - builder.buildClientInstrumenter(HttpRequestSetter.INSTANCE); - return new SpringWebTelemetry(instrumenter); + return new SpringWebTelemetry(builder.build()); } } diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/client/VertxClientInstrumenterFactory.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/client/VertxClientInstrumenterFactory.java index 7817020fa808..5f4801f43e13 100644 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/client/VertxClientInstrumenterFactory.java +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/client/VertxClientInstrumenterFactory.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.vertx.client; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; 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.HttpClientMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import io.vertx.core.http.HttpClientRequest; import io.vertx.core.http.HttpClientResponse; @@ -24,31 +15,8 @@ public final class VertxClientInstrumenterFactory { public static Instrumenter create( String instrumentationName, AbstractVertxHttpAttributesGetter httpAttributesGetter) { - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - instrumentationName, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor( - HttpClientPeerServiceAttributesExtractor.create( - httpAttributesGetter, CommonConfig.get().getPeerServiceResolver())) - .addOperationMetrics(HttpClientMetrics.get()); - if (CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - - return builder.buildClientInstrumenter(new HttpRequestHeaderSetter()); + return JavaagentHttpClientInstrumenters.create( + instrumentationName, httpAttributesGetter, new HttpRequestHeaderSetter()); } private VertxClientInstrumenterFactory() {} diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpClientInstrumenters.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpClientInstrumenters.java new file mode 100644 index 000000000000..14677fd88339 --- /dev/null +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpClientInstrumenters.java @@ -0,0 +1,103 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.bootstrap.internal; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.context.propagation.TextMapSetter; +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter; +import java.lang.reflect.Field; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public final class JavaagentHttpClientInstrumenters { + + private JavaagentHttpClientInstrumenters() {} + + public static Instrumenter create( + String instrumentationName, + HttpClientAttributesGetter httpAttributesGetter) { + return create(instrumentationName, httpAttributesGetter, null); + } + + public static Instrumenter create( + String instrumentationName, + HttpClientAttributesGetter httpAttributesGetter, + TextMapSetter headerSetter) { + return create(instrumentationName, httpAttributesGetter, headerSetter, b -> {}); + } + + // this is where an HttpClientTelemetryBuilder interface would be nice + // instead of having to pass Object and using reflection to unwrap the underlying builder + public static Instrumenter create(Object builder) { + DefaultHttpClientInstrumenterBuilder defaultBuilder = unwrapBuilder(builder); + return create(defaultBuilder, customizer -> {}); + } + + public static Instrumenter create( + String instrumentationName, + HttpClientAttributesGetter httpAttributesGetter, + TextMapSetter headerSetter, + Consumer> instrumenterBuilderConsumer) { + DefaultHttpClientInstrumenterBuilder defaultHttpClientTelemetryBuilder = + new DefaultHttpClientInstrumenterBuilder<>( + instrumentationName, GlobalOpenTelemetry.get(), httpAttributesGetter); + if (headerSetter != null) { + defaultHttpClientTelemetryBuilder.setHeaderSetter(headerSetter); + } + return create(defaultHttpClientTelemetryBuilder, instrumenterBuilderConsumer); + } + + private static Instrumenter create( + DefaultHttpClientInstrumenterBuilder builder, + Consumer> builderCustomizer) { + CommonConfig config = CommonConfig.get(); + set(config::getKnownHttpRequestMethods, builder::setKnownMethods); + set(config::getClientRequestHeaders, builder::setCapturedRequestHeaders); + set(config::getClientResponseHeaders, builder::setCapturedResponseHeaders); + // is not exposed in the public API + set(config::getPeerServiceResolver, builder::setPeerServiceResolver); + set( + config::shouldEmitExperimentalHttpClientTelemetry, + builder::setEmitExperimentalHttpClientMetrics); + // is not exposed in the public API + builder.setBuilderCustomizer(builderCustomizer); + return builder.build(); + } + + /** + * This method is used to access the builder field of the builder object. + * + *

This approach allows us to re-use the existing builder classes from the library modules + */ + @SuppressWarnings("unchecked") + private static + DefaultHttpClientInstrumenterBuilder unwrapBuilder(Object builder) { + if (builder instanceof DefaultHttpClientInstrumenterBuilder) { + return (DefaultHttpClientInstrumenterBuilder) builder; + } + try { + Field field = builder.getClass().getDeclaredField("builder"); + field.setAccessible(true); + return (DefaultHttpClientInstrumenterBuilder) field.get(builder); + } catch (Exception e) { + throw new IllegalStateException("Could not access builder field", e); + } + } + + private static void set(Supplier supplier, Consumer consumer) { + T t = supplier.get(); + if (t != null) { + consumer.accept(t); + } + } +}