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 index 78af582fe689..d2ef015383d9 100644 --- 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 @@ -29,6 +29,7 @@ import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; @@ -58,21 +59,43 @@ public final class DefaultHttpClientInstrumenterBuilder { private final HttpClientAttributesGetter attributesGetter; private final HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder; - @Nullable private TextMapSetter headerSetter; + @Nullable private final TextMapSetter headerSetter; private Function, ? extends SpanNameExtractor> spanNameExtractorTransformer = Function.identity(); private boolean emitExperimentalHttpClientMetrics = false; private Consumer> builderCustomizer = b -> {}; - public DefaultHttpClientInstrumenterBuilder( + private DefaultHttpClientInstrumenterBuilder( String instrumentationName, OpenTelemetry openTelemetry, - HttpClientAttributesGetter attributesGetter) { - this.instrumentationName = instrumentationName; - this.openTelemetry = openTelemetry; + HttpClientAttributesGetter attributesGetter, + TextMapSetter headerSetter) { + this.instrumentationName = Objects.requireNonNull(instrumentationName, "instrumentationName"); + this.openTelemetry = Objects.requireNonNull(openTelemetry, "openTelemetry"); + this.attributesGetter = Objects.requireNonNull(attributesGetter, "attributesGetter"); httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(attributesGetter); httpAttributesExtractorBuilder = HttpClientAttributesExtractor.builder(attributesGetter); - this.attributesGetter = attributesGetter; + this.headerSetter = headerSetter; + } + + public static DefaultHttpClientInstrumenterBuilder create( + String instrumentationName, + OpenTelemetry openTelemetry, + HttpClientAttributesGetter attributesGetter) { + return new DefaultHttpClientInstrumenterBuilder( + instrumentationName, openTelemetry, attributesGetter, null); + } + + public static DefaultHttpClientInstrumenterBuilder create( + String instrumentationName, + OpenTelemetry openTelemetry, + HttpClientAttributesGetter attributesGetter, + TextMapSetter headerSetter) { + return new DefaultHttpClientInstrumenterBuilder( + instrumentationName, + openTelemetry, + attributesGetter, + Objects.requireNonNull(headerSetter, "headerSetter")); } /** @@ -141,13 +164,6 @@ public DefaultHttpClientInstrumenterBuilder setKnownMethods( return this; } - @CanIgnoreReturnValue - public DefaultHttpClientInstrumenterBuilder setHeaderSetter( - @Nullable TextMapSetter headerSetter) { - this.headerSetter = headerSetter; - return this; - } - /** * Configures the instrumentation to emit experimental HTTP client metrics. * @@ -193,7 +209,6 @@ public DefaultHttpClientInstrumenterBuilder setBuilderCustomi } public Instrumenter build() { - SpanNameExtractor spanNameExtractor = spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java index 0085f8c09a13..caee6c007da7 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java @@ -28,6 +28,7 @@ import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; @@ -61,20 +62,40 @@ public final class DefaultHttpServerInstrumenterBuilder { private boolean emitExperimentalHttpServerMetrics = false; private Consumer> builderCustomizer = b -> {}; - public DefaultHttpServerInstrumenterBuilder( + private DefaultHttpServerInstrumenterBuilder( String instrumentationName, OpenTelemetry openTelemetry, HttpServerAttributesGetter attributesGetter, - @Nullable TextMapGetter headerGetter) { - this.instrumentationName = instrumentationName; - this.openTelemetry = openTelemetry; + TextMapGetter headerGetter) { + this.instrumentationName = Objects.requireNonNull(instrumentationName, "instrumentationName"); + this.openTelemetry = Objects.requireNonNull(openTelemetry, "openTelemetry"); + this.attributesGetter = Objects.requireNonNull(attributesGetter, "attributesGetter"); httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(attributesGetter); httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(attributesGetter); httpServerRouteBuilder = HttpServerRoute.builder(attributesGetter); - this.attributesGetter = attributesGetter; this.headerGetter = headerGetter; } + public static DefaultHttpServerInstrumenterBuilder create( + String instrumentationName, + OpenTelemetry openTelemetry, + HttpServerAttributesGetter attributesGetter) { + return new DefaultHttpServerInstrumenterBuilder<>( + instrumentationName, openTelemetry, attributesGetter, null); + } + + public static DefaultHttpServerInstrumenterBuilder create( + String instrumentationName, + OpenTelemetry openTelemetry, + HttpServerAttributesGetter attributesGetter, + TextMapGetter headerGetter) { + return new DefaultHttpServerInstrumenterBuilder<>( + instrumentationName, + openTelemetry, + attributesGetter, + Objects.requireNonNull(headerGetter, "headerGetter")); + } + /** * Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented * items. @@ -172,6 +193,15 @@ public DefaultHttpServerInstrumenterBuilder setBuilderCustomi } public Instrumenter build() { + InstrumenterBuilder builder = instrumenterBuilder(); + + if (headerGetter != null) { + return builder.buildServerInstrumenter(headerGetter); + } + return builder.buildInstrumenter(SpanKindExtractor.alwaysServer()); + } + + public InstrumenterBuilder instrumenterBuilder() { SpanNameExtractor spanNameExtractor = spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); @@ -190,11 +220,7 @@ public Instrumenter build() { .addOperationMetrics(HttpServerExperimentalMetrics.get()); } builderCustomizer.accept(builder); - - if (headerGetter != null) { - return builder.buildServerInstrumenter(headerGetter); - } - return builder.buildInstrumenter(SpanKindExtractor.alwaysServer()); + return builder; } @CanIgnoreReturnValue diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaHttpServerSingletons.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaHttpServerSingletons.java index af0a3d61da82..a52da0636ffc 100644 --- a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaHttpServerSingletons.java +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaHttpServerSingletons.java @@ -7,17 +7,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.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpServerInstrumenters; import io.opentelemetry.javaagent.instrumentation.akkahttp.AkkaHttpUtil; public final class AkkaHttpServerSingletons { @@ -25,32 +16,11 @@ public final class AkkaHttpServerSingletons { private static final Instrumenter INSTRUMENTER; static { - AkkaHttpServerAttributesGetter httpAttributesGetter = new AkkaHttpServerAttributesGetter(); - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - AkkaHttpUtil.instrumentationName(), - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders()) - .setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders()) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addOperationMetrics(HttpServerMetrics.get()) - .addContextCustomizer( - HttpServerRoute.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()); - if (AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpServerExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildServerInstrumenter(AkkaHttpServerHeaders.INSTANCE); + INSTRUMENTER = + JavaagentHttpServerInstrumenters.create( + AkkaHttpUtil.instrumentationName(), + new AkkaHttpServerAttributesGetter(), + AkkaHttpServerHeaders.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 dd128f7930ef..1d0d497317b9 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 @@ -25,7 +25,7 @@ public final class ApacheHttpClientTelemetryBuilder { ApacheHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) { builder = - new DefaultHttpClientInstrumenterBuilder<>( + DefaultHttpClientInstrumenterBuilder.create( INSTRUMENTATION_NAME, openTelemetry, ApacheHttpClientHttpAttributesGetter.INSTANCE); this.openTelemetry = openTelemetry; } 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 061919ff1587..8d7b323462cf 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 @@ -26,7 +26,7 @@ public final class ApacheHttpClient5TelemetryBuilder { ApacheHttpClient5TelemetryBuilder(OpenTelemetry openTelemetry) { builder = - new DefaultHttpClientInstrumenterBuilder<>( + DefaultHttpClientInstrumenterBuilder.create( INSTRUMENTATION_NAME, openTelemetry, ApacheHttpClient5HttpAttributesGetter.INSTANCE); this.openTelemetry = openTelemetry; } diff --git a/instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/internal/ArmeriaInstrumenterBuilderFactory.java b/instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/internal/ArmeriaInstrumenterBuilderFactory.java index 37834dccc286..7ac77ba5287c 100644 --- a/instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/internal/ArmeriaInstrumenterBuilderFactory.java +++ b/instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/internal/ArmeriaInstrumenterBuilderFactory.java @@ -23,7 +23,7 @@ private ArmeriaInstrumenterBuilderFactory() {} public static DefaultHttpServerInstrumenterBuilder getServerBuilder(OpenTelemetry openTelemetry) { - return new DefaultHttpServerInstrumenterBuilder<>( + return DefaultHttpServerInstrumenterBuilder.create( INSTRUMENTATION_NAME, openTelemetry, ArmeriaHttpServerAttributesGetter.INSTANCE, @@ -32,8 +32,10 @@ private ArmeriaInstrumenterBuilderFactory() {} public static DefaultHttpClientInstrumenterBuilder getClientBuilder(OpenTelemetry openTelemetry) { - return new DefaultHttpClientInstrumenterBuilder<>( - INSTRUMENTATION_NAME, openTelemetry, ArmeriaHttpClientAttributesGetter.INSTANCE) - .setHeaderSetter(ClientRequestContextSetter.INSTANCE); + return DefaultHttpClientInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + ArmeriaHttpClientAttributesGetter.INSTANCE, + ClientRequestContextSetter.INSTANCE); } } diff --git a/instrumentation/grizzly-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlySingletons.java b/instrumentation/grizzly-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlySingletons.java index 7633c3bf7d56..f19965d65ad4 100644 --- a/instrumentation/grizzly-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlySingletons.java +++ b/instrumentation/grizzly-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlySingletons.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.grizzly; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpServerInstrumenters; import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge; import org.glassfish.grizzly.http.HttpRequestPacket; import org.glassfish.grizzly.http.HttpResponsePacket; @@ -25,43 +16,22 @@ public final class GrizzlySingletons { private static final Instrumenter INSTRUMENTER; static { - GrizzlyHttpAttributesGetter httpAttributesGetter = new GrizzlyHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - "io.opentelemetry.grizzly-2.3", - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders()) - .setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders()) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addOperationMetrics(HttpServerMetrics.get()); - if (AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpServerExperimentalMetrics.get()); - } INSTRUMENTER = - builder - .addContextCustomizer( - (context, request, attributes) -> - new AppServerBridge.Builder() - .captureServletAttributes() - .recordException() - .init(context)) - .addContextCustomizer( - (context, httpRequestPacket, startAttributes) -> GrizzlyErrorHolder.init(context)) - .addContextCustomizer( - HttpServerRoute.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .buildServerInstrumenter(HttpRequestHeadersGetter.INSTANCE); + JavaagentHttpServerInstrumenters.create( + "io.opentelemetry.grizzly-2.3", + new GrizzlyHttpAttributesGetter(), + HttpRequestHeadersGetter.INSTANCE, + builder -> + builder + .addContextCustomizer( + (context, request, attributes) -> + new AppServerBridge.Builder() + .captureServletAttributes() + .recordException() + .init(context)) + .addContextCustomizer( + (context, httpRequestPacket, startAttributes) -> + GrizzlyErrorHolder.init(context))); } public static Instrumenter instrumenter() { diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java index 9f9bb506f643..bb8b2e48ba07 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java @@ -21,7 +21,7 @@ private JavaHttpClientInstrumenterBuilderFactory() {} public static DefaultHttpClientInstrumenterBuilder> create( OpenTelemetry openTelemetry) { - return new DefaultHttpClientInstrumenterBuilder<>( + return DefaultHttpClientInstrumenterBuilder.create( INSTRUMENTATION_NAME, openTelemetry, JavaHttpClientAttributesGetter.INSTANCE); } } diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-12.0/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v12_0/internal/JettyHttpClientInstrumenterBuilderFactory.java b/instrumentation/jetty-httpclient/jetty-httpclient-12.0/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v12_0/internal/JettyHttpClientInstrumenterBuilderFactory.java index 386a5e6c816b..b395f04f872a 100644 --- a/instrumentation/jetty-httpclient/jetty-httpclient-12.0/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v12_0/internal/JettyHttpClientInstrumenterBuilderFactory.java +++ b/instrumentation/jetty-httpclient/jetty-httpclient-12.0/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v12_0/internal/JettyHttpClientInstrumenterBuilderFactory.java @@ -21,8 +21,10 @@ private JettyHttpClientInstrumenterBuilderFactory() {} public static DefaultHttpClientInstrumenterBuilder create( OpenTelemetry openTelemetry) { - return new DefaultHttpClientInstrumenterBuilder<>( - INSTRUMENTATION_NAME, openTelemetry, JettyClientHttpAttributesGetter.INSTANCE) - .setHeaderSetter(HttpHeaderSetter.INSTANCE); + return DefaultHttpClientInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + JettyClientHttpAttributesGetter.INSTANCE, + HttpHeaderSetter.INSTANCE); } } diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyHttpClientInstrumenterBuilderFactory.java b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyHttpClientInstrumenterBuilderFactory.java index f2be57153580..df476aabed38 100644 --- a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyHttpClientInstrumenterBuilderFactory.java +++ b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyHttpClientInstrumenterBuilderFactory.java @@ -21,8 +21,10 @@ private JettyHttpClientInstrumenterBuilderFactory() {} public static DefaultHttpClientInstrumenterBuilder create( OpenTelemetry openTelemetry) { - return new DefaultHttpClientInstrumenterBuilder<>( - INSTRUMENTATION_NAME, openTelemetry, JettyClientHttpAttributesGetter.INSTANCE) - .setHeaderSetter(HttpHeaderSetter.INSTANCE); + return DefaultHttpClientInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + JettyClientHttpAttributesGetter.INSTANCE, + HttpHeaderSetter.INSTANCE); } } diff --git a/instrumentation/jetty/jetty-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12Singletons.java b/instrumentation/jetty/jetty-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12Singletons.java index b9866c2cef93..4017379dc172 100644 --- a/instrumentation/jetty/jetty-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12Singletons.java +++ b/instrumentation/jetty/jetty-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12Singletons.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.jetty.v12_0; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpServerInstrumenters; import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Response; @@ -26,39 +17,18 @@ public final class Jetty12Singletons { private static final Instrumenter INSTRUMENTER; static { - Jetty12HttpAttributesGetter httpAttributesGetter = new Jetty12HttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders()) - .setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders()) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addContextCustomizer( - HttpServerRoute.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addContextCustomizer( - (context, request, attributes) -> - new AppServerBridge.Builder() - .captureServletAttributes() - .recordException() - .init(context)) - .addOperationMetrics(HttpServerMetrics.get()); - if (AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpServerExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildServerInstrumenter(Jetty12TextMapGetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpServerInstrumenters.create( + INSTRUMENTATION_NAME, + new Jetty12HttpAttributesGetter(), + Jetty12TextMapGetter.INSTANCE, + builder -> + builder.addContextCustomizer( + (context, request, attributes) -> + new AppServerBridge.Builder() + .captureServletAttributes() + .recordException() + .init(context))); } private static final Jetty12Helper HELPER = new Jetty12Helper(INSTRUMENTER); diff --git a/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt b/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt index 949efcf2c313..844cbe2895fd 100644 --- a/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt +++ b/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt @@ -14,17 +14,15 @@ import io.ktor.util.pipeline.* import io.opentelemetry.api.OpenTelemetry import io.opentelemetry.context.Context import io.opentelemetry.extension.kotlin.asContextElement +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor +import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusBuilder import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor import kotlinx.coroutines.withContext class KtorServerTracing private constructor( @@ -32,30 +30,31 @@ class KtorServerTracing private constructor( ) { class Configuration { - internal lateinit var openTelemetry: OpenTelemetry - - internal val additionalExtractors = mutableListOf>() - - internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE) - - internal val httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE) - - internal val httpServerRouteBuilder = HttpServerRoute.builder(KtorHttpServerAttributesGetter.INSTANCE) - - internal var statusExtractor: - (SpanStatusExtractor) -> SpanStatusExtractor = { a -> a } + internal lateinit var builder: DefaultHttpServerInstrumenterBuilder internal var spanKindExtractor: (SpanKindExtractor) -> SpanKindExtractor = { a -> a } fun setOpenTelemetry(openTelemetry: OpenTelemetry) { - this.openTelemetry = openTelemetry + this.builder = + DefaultHttpServerInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + KtorHttpServerAttributesGetter.INSTANCE + ) } fun setStatusExtractor( - extractor: (SpanStatusExtractor) -> SpanStatusExtractor + extractor: (SpanStatusExtractor) -> SpanStatusExtractor ) { - this.statusExtractor = extractor + builder.setStatusExtractor { prevExtractor -> + SpanStatusExtractor { spanStatusBuilder: SpanStatusBuilder, + request: ApplicationRequest, + response: ApplicationResponse?, + throwable: Throwable? -> + extractor(prevExtractor).extract(spanStatusBuilder, request, response, throwable) + } + } } fun setSpanKindExtractor(extractor: (SpanKindExtractor) -> SpanKindExtractor) { @@ -63,24 +62,22 @@ class KtorServerTracing private constructor( } fun addAttributeExtractor(extractor: AttributesExtractor) { - additionalExtractors.add(extractor) + builder.addAttributesExtractor(extractor) } fun setCapturedRequestHeaders(requestHeaders: List) { - httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders) + builder.setCapturedRequestHeaders(requestHeaders) } fun setCapturedResponseHeaders(responseHeaders: List) { - httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders) + builder.setCapturedResponseHeaders(responseHeaders) } fun setKnownMethods(knownMethods: Set) { - httpAttributesExtractorBuilder.setKnownMethods(knownMethods) - httpSpanNameExtractorBuilder.setKnownMethods(knownMethods) - httpServerRouteBuilder.setKnownMethods(knownMethods) + builder.setKnownMethods(knownMethods) } - internal fun isOpenTelemetryInitialized(): Boolean = this::openTelemetry.isInitialized + internal fun isOpenTelemetryInitialized(): Boolean = this::builder.isInitialized } private fun start(call: ApplicationCall): Context? { @@ -97,7 +94,7 @@ class KtorServerTracing private constructor( } companion object Feature : ApplicationFeature { - private val INSTRUMENTATION_NAME = "io.opentelemetry.ktor-1.0" + private const val INSTRUMENTATION_NAME = "io.opentelemetry.ktor-1.0" private val contextKey = AttributeKey("OpenTelemetry") private val errorKey = AttributeKey("OpenTelemetryException") @@ -111,25 +108,8 @@ class KtorServerTracing private constructor( throw IllegalArgumentException("OpenTelemetry must be set") } - val httpAttributesGetter = KtorHttpServerAttributesGetter.INSTANCE - - val instrumenterBuilder = Instrumenter.builder( - configuration.openTelemetry, - INSTRUMENTATION_NAME, - configuration.httpSpanNameExtractorBuilder.build() - ) - - configuration.additionalExtractors.forEach { instrumenterBuilder.addAttributesExtractor(it) } - - with(instrumenterBuilder) { - setSpanStatusExtractor(configuration.statusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))) - addAttributesExtractor(configuration.httpAttributesExtractorBuilder.build()) - addOperationMetrics(HttpServerMetrics.get()) - addContextCustomizer(configuration.httpServerRouteBuilder.build()) - } - val instrumenter = InstrumenterUtil.buildUpstreamInstrumenter( - instrumenterBuilder, + configuration.builder.instrumenterBuilder(), ApplicationRequestGetter, configuration.spanKindExtractor(SpanKindExtractor.alwaysServer()) ) diff --git a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java index 43f89f9968a5..f1b54532f728 100644 --- a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java +++ b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java @@ -13,9 +13,9 @@ import io.ktor.client.HttpClientConfig; import io.ktor.client.engine.HttpClientEngineConfig; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.ktor.v2_0.client.KtorClientTracing; import io.opentelemetry.instrumentation.ktor.v2_0.client.KtorClientTracingBuilder; +import io.opentelemetry.instrumentation.ktor.v2_0.internal.KtorBuilderUtil; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -54,12 +54,8 @@ public static class SetupFunction implements Function1>() - private val httpAttributesExtractorBuilder = HttpClientAttributesExtractor.builder(KtorHttpClientAttributesGetter) - private val httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(KtorHttpClientAttributesGetter) - private var emitExperimentalHttpClientMetrics = false + private lateinit var openTelemetry: OpenTelemetry + private lateinit var clientBuilder: DefaultHttpClientInstrumenterBuilder fun setOpenTelemetry(openTelemetry: OpenTelemetry) { this.openTelemetry = openTelemetry + this.clientBuilder = DefaultHttpClientInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + KtorHttpClientAttributesGetter + ) } @Deprecated( @@ -49,7 +50,7 @@ class KtorClientTracingBuilder { fun capturedRequestHeaders(vararg headers: String) = capturedRequestHeaders(headers.asIterable()) fun capturedRequestHeaders(headers: Iterable) { - httpAttributesExtractorBuilder.setCapturedRequestHeaders(headers.toList()) + clientBuilder.setCapturedRequestHeaders(headers.toList()) } @Deprecated( @@ -67,7 +68,7 @@ class KtorClientTracingBuilder { fun capturedResponseHeaders(vararg headers: String) = capturedResponseHeaders(headers.asIterable()) fun capturedResponseHeaders(headers: Iterable) { - httpAttributesExtractorBuilder.setCapturedResponseHeaders(headers.toList()) + clientBuilder.setCapturedResponseHeaders(headers.toList()) } @Deprecated( @@ -84,10 +85,7 @@ class KtorClientTracingBuilder { fun knownMethods(methods: Iterable) = knownMethods(methods.map { it.value }) fun knownMethods(methods: Iterable) { - methods.toSet().apply { - httpAttributesExtractorBuilder.setKnownMethods(this) - httpSpanNameExtractorBuilder.setKnownMethods(this) - } + clientBuilder.setKnownMethods(methods.toSet()) } @Deprecated("Please use method `attributeExtractor`") @@ -105,7 +103,7 @@ class KtorClientTracingBuilder { fun attributeExtractor(extractorBuilder: ExtractorBuilder.() -> Unit = {}) { val builder = ExtractorBuilder().apply(extractorBuilder).build() - additionalExtractors.add( + this.clientBuilder.addAttributeExtractor( object : AttributesExtractor { override fun onStart(attributes: AttributesBuilder, parentContext: Context, request: HttpRequestData) { builder.onStart(OnStartData(attributes, parentContext, request)) @@ -164,35 +162,11 @@ class KtorClientTracingBuilder { } fun emitExperimentalHttpClientMetrics() { - emitExperimentalHttpClientMetrics = true + clientBuilder.setEmitExperimentalHttpClientMetrics(true) } - internal fun build(): KtorClientTracing { - val initializedOpenTelemetry = openTelemetry - ?: throw IllegalArgumentException("OpenTelemetry must be set") - - val instrumenterBuilder = Instrumenter.builder( - initializedOpenTelemetry, - INSTRUMENTATION_NAME, - httpSpanNameExtractorBuilder.build() - ) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(KtorHttpClientAttributesGetter)) - .addAttributesExtractor(httpAttributesExtractorBuilder.build()) - .addAttributesExtractors(additionalExtractors) - .addOperationMetrics(HttpClientMetrics.get()) - - if (emitExperimentalHttpClientMetrics) { - instrumenterBuilder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(KtorHttpClientAttributesGetter)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()) - } - - val instrumenter = instrumenterBuilder - .buildInstrumenter(alwaysClient()) - - return KtorClientTracing( - instrumenter = instrumenter, - propagators = initializedOpenTelemetry.propagators, - ) - } + internal fun build(): KtorClientTracing = KtorClientTracing( + instrumenter = clientBuilder.build(), + propagators = openTelemetry.propagators, + ) } diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/internal/KtorBuilderUtil.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/internal/KtorBuilderUtil.kt new file mode 100644 index 000000000000..10bb56d5a720 --- /dev/null +++ b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/internal/KtorBuilderUtil.kt @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v2_0.internal + +import io.ktor.client.request.* +import io.ktor.client.statement.* +import io.ktor.server.request.* +import io.ktor.server.response.* +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder +import io.opentelemetry.instrumentation.ktor.v2_0.client.KtorClientTracingBuilder +import io.opentelemetry.instrumentation.ktor.v2_0.server.KtorServerTracing + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +object KtorBuilderUtil { + lateinit var clientBuilderExtractor: (KtorClientTracingBuilder) -> DefaultHttpClientInstrumenterBuilder + lateinit var serverBuilderExtractor: (KtorServerTracing.Configuration) -> DefaultHttpServerInstrumenterBuilder +} diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracing.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracing.kt index 2e4c203eb3ed..66d0324a60e1 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracing.kt +++ b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracing.kt @@ -17,19 +17,17 @@ import io.opentelemetry.api.common.AttributesBuilder import io.opentelemetry.api.trace.SpanKind import io.opentelemetry.context.Context import io.opentelemetry.extension.kotlin.asContextElement +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusBuilder import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor import io.opentelemetry.instrumentation.ktor.v2_0.InstrumentationProperties.INSTRUMENTATION_NAME +import io.opentelemetry.instrumentation.ktor.v2_0.internal.KtorBuilderUtil import kotlinx.coroutines.withContext class KtorServerTracing private constructor( @@ -37,42 +35,45 @@ class KtorServerTracing private constructor( ) { class Configuration { - internal lateinit var openTelemetry: OpenTelemetry - - internal val additionalExtractors = mutableListOf>() - - internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE) - - internal val httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE) - - internal val httpServerRouteBuilder = HttpServerRoute.builder(KtorHttpServerAttributesGetter.INSTANCE) + companion object { + init { + KtorBuilderUtil.serverBuilderExtractor = { it.serverBuilder } + } + } - internal var statusExtractor: - (SpanStatusExtractor) -> SpanStatusExtractor = { a -> a } + internal lateinit var serverBuilder: DefaultHttpServerInstrumenterBuilder internal var spanKindExtractor: (SpanKindExtractor) -> SpanKindExtractor = { a -> a } fun setOpenTelemetry(openTelemetry: OpenTelemetry) { - this.openTelemetry = openTelemetry + this.serverBuilder = + DefaultHttpServerInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + KtorHttpServerAttributesGetter.INSTANCE + ) } @Deprecated("Please use method `spanStatusExtractor`") fun setStatusExtractor( - extractor: (SpanStatusExtractor) -> SpanStatusExtractor + extractor: (SpanStatusExtractor) -> SpanStatusExtractor ) { spanStatusExtractor { prevStatusExtractor -> extractor(prevStatusExtractor).extract(spanStatusBuilder, request, response, error) } } - fun spanStatusExtractor(extract: SpanStatusData.(SpanStatusExtractor) -> Unit) { - statusExtractor = { prevExtractor -> - SpanStatusExtractor { spanStatusBuilder: SpanStatusBuilder, - request: ApplicationRequest, - response: ApplicationResponse?, - throwable: Throwable? -> - extract(SpanStatusData(spanStatusBuilder, request, response, throwable), prevExtractor) + fun spanStatusExtractor(extract: SpanStatusData.(SpanStatusExtractor) -> Unit) { + serverBuilder.setStatusExtractor { prevExtractor -> + SpanStatusExtractor { spanStatusBuilder: SpanStatusBuilder, + request: ApplicationRequest, + response: ApplicationResponse?, + throwable: Throwable? -> + extract( + SpanStatusData(spanStatusBuilder, request, response, throwable), + prevExtractor + ) } } } @@ -113,7 +114,7 @@ class KtorServerTracing private constructor( fun attributeExtractor(extractorBuilder: ExtractorBuilder.() -> Unit = {}) { val builder = ExtractorBuilder().apply(extractorBuilder).build() - additionalExtractors.add( + serverBuilder.addAttributesExtractor( object : AttributesExtractor { override fun onStart(attributes: AttributesBuilder, parentContext: Context, request: ApplicationRequest) { builder.onStart(OnStartData(attributes, parentContext, request)) @@ -168,7 +169,7 @@ class KtorServerTracing private constructor( fun capturedRequestHeaders(vararg headers: String) = capturedRequestHeaders(headers.asIterable()) fun capturedRequestHeaders(headers: Iterable) { - httpAttributesExtractorBuilder.setCapturedRequestHeaders(headers.toList()) + serverBuilder.setCapturedRequestHeaders(headers.toList()) } @Deprecated( @@ -180,7 +181,7 @@ class KtorServerTracing private constructor( fun capturedResponseHeaders(vararg headers: String) = capturedResponseHeaders(headers.asIterable()) fun capturedResponseHeaders(headers: Iterable) { - httpAttributesExtractorBuilder.setCapturedResponseHeaders(headers.toList()) + serverBuilder.setCapturedResponseHeaders(headers.toList()) } @Deprecated( @@ -198,13 +199,14 @@ class KtorServerTracing private constructor( fun knownMethods(methods: Iterable) { methods.toSet().apply { - httpAttributesExtractorBuilder.setKnownMethods(this) - httpSpanNameExtractorBuilder.setKnownMethods(this) - httpServerRouteBuilder.setKnownMethods(this) + serverBuilder.setKnownMethods(this) } } - internal fun isOpenTelemetryInitialized(): Boolean = this::openTelemetry.isInitialized + /** + * {@link #setOpenTelemetry(OpenTelemetry)} sets the serverBuilder to a non-null value. + */ + internal fun isOpenTelemetryInitialized(): Boolean = this::serverBuilder.isInitialized } private fun start(call: ApplicationCall): Context? { @@ -232,25 +234,8 @@ class KtorServerTracing private constructor( require(configuration.isOpenTelemetryInitialized()) { "OpenTelemetry must be set" } - val httpAttributesGetter = KtorHttpServerAttributesGetter.INSTANCE - - val instrumenterBuilder = Instrumenter.builder( - configuration.openTelemetry, - INSTRUMENTATION_NAME, - configuration.httpSpanNameExtractorBuilder.build() - ) - - configuration.additionalExtractors.forEach { instrumenterBuilder.addAttributesExtractor(it) } - - with(instrumenterBuilder) { - setSpanStatusExtractor(configuration.statusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))) - addAttributesExtractor(configuration.httpAttributesExtractorBuilder.build()) - addOperationMetrics(HttpServerMetrics.get()) - addContextCustomizer(configuration.httpServerRouteBuilder.build()) - } - val instrumenter = InstrumenterUtil.buildUpstreamInstrumenter( - instrumenterBuilder, + configuration.serverBuilder.instrumenterBuilder(), ApplicationRequestGetter, configuration.spanKindExtractor(SpanKindExtractor.alwaysServer()) ) diff --git a/instrumentation/kubernetes-client-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientSingletons.java b/instrumentation/kubernetes-client-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientSingletons.java index 31bad69e3bbb..b6ce1ac000ff 100644 --- a/instrumentation/kubernetes-client-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientSingletons.java +++ b/instrumentation/kubernetes-client-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientSingletons.java @@ -5,16 +5,12 @@ package io.opentelemetry.javaagent.instrumentation.kubernetesclient; -import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient; - import io.kubernetes.client.openapi.ApiResponse; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.ContextPropagators; +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.HttpClientAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import okhttp3.Request; @@ -28,28 +24,23 @@ public class KubernetesClientSingletons { private static final ContextPropagators CONTEXT_PROPAGATORS; static { - KubernetesHttpAttributesGetter httpAttributesGetter = new KubernetesHttpAttributesGetter(); - - InstrumenterBuilder> instrumenterBuilder = - Instrumenter.>builder( - GlobalOpenTelemetry.get(), + INSTRUMENTER = + DefaultHttpClientInstrumenterBuilder.create( "io.opentelemetry.kubernetes-client-7.0", - request -> KubernetesRequestDigest.parse(request).toString()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(AgentCommonConfig.get().getClientRequestHeaders()) - .setCapturedResponseHeaders(AgentCommonConfig.get().getClientResponseHeaders()) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()); - - if (CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES) { - instrumenterBuilder.addAttributesExtractor(new KubernetesExperimentalAttributesExtractor()); - } - - // Initialize with .newInstrumenter(alwaysClient()) instead of .newClientInstrumenter(..) - // because Request is immutable so context must be injected manually - INSTRUMENTER = instrumenterBuilder.buildInstrumenter(alwaysClient()); + GlobalOpenTelemetry.get(), + new KubernetesHttpAttributesGetter()) + .configure(AgentCommonConfig.get()) + .setBuilderCustomizer( + instrumenterBuilder -> { + if (CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES) { + instrumenterBuilder.addAttributesExtractor( + new KubernetesExperimentalAttributesExtractor()); + } + }) + .setSpanNameExtractor( + requestSpanNameExtractor -> + request -> KubernetesRequestDigest.parse(request).toString()) + .build(); CONTEXT_PROPAGATORS = GlobalOpenTelemetry.getPropagators(); } diff --git a/instrumentation/liberty/liberty-dispatcher-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/dispatcher/LibertyDispatcherSingletons.java b/instrumentation/liberty/liberty-dispatcher-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/dispatcher/LibertyDispatcherSingletons.java index 5dc10034fd21..609a6824b9e2 100644 --- a/instrumentation/liberty/liberty-dispatcher-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/dispatcher/LibertyDispatcherSingletons.java +++ b/instrumentation/liberty/liberty-dispatcher-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/dispatcher/LibertyDispatcherSingletons.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.liberty.dispatcher; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpServerInstrumenters; public final class LibertyDispatcherSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.liberty-dispatcher-20.0"; @@ -23,34 +14,11 @@ public final class LibertyDispatcherSingletons { private static final Instrumenter INSTRUMENTER; static { - LibertyDispatcherHttpAttributesGetter httpAttributesGetter = - new LibertyDispatcherHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders()) - .setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders()) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addContextCustomizer( - HttpServerRoute.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addOperationMetrics(HttpServerMetrics.get()); - if (AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpServerExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildServerInstrumenter(LibertyDispatcherRequestGetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpServerInstrumenters.create( + INSTRUMENTATION_NAME, + new LibertyDispatcherHttpAttributesGetter(), + LibertyDispatcherRequestGetter.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 3db67f23dc80..08733dd46d42 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 @@ -31,10 +31,10 @@ public final class NettyClientSingletons { INSTRUMENTATION_NAME, new NettyHttpClientAttributesGetter(), HttpRequestHeadersSetter.INSTANCE, - builder -> { - builder.addContextCustomizer( - (context, requestAndChannel, startAttributes) -> NettyErrorHolder.init(context)); - }); + builder -> + builder.addContextCustomizer( + (context, requestAndChannel, startAttributes) -> + NettyErrorHolder.init(context))); CONNECTION_INSTRUMENTER = Instrumenter.builder( diff --git a/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/client/NettyClientInstrumenterBuilderFactory.java b/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/client/NettyClientInstrumenterBuilderFactory.java index 088fb0031338..713fc73834ef 100644 --- a/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/client/NettyClientInstrumenterBuilderFactory.java +++ b/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/client/NettyClientInstrumenterBuilderFactory.java @@ -20,8 +20,10 @@ private NettyClientInstrumenterBuilderFactory() {} public static DefaultHttpClientInstrumenterBuilder create( String instrumentationName, OpenTelemetry openTelemetry) { - return new DefaultHttpClientInstrumenterBuilder<>( - instrumentationName, openTelemetry, new NettyHttpClientAttributesGetter()) - .setHeaderSetter(HttpRequestHeadersSetter.INSTANCE); + return DefaultHttpClientInstrumenterBuilder.create( + instrumentationName, + openTelemetry, + new NettyHttpClientAttributesGetter(), + HttpRequestHeadersSetter.INSTANCE); } } diff --git a/instrumentation/netty/netty-4.1/library/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/NettyServerTelemetryBuilder.java b/instrumentation/netty/netty-4.1/library/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/NettyServerTelemetryBuilder.java index 0744ab4658a3..874bcb586bed 100644 --- a/instrumentation/netty/netty-4.1/library/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/NettyServerTelemetryBuilder.java +++ b/instrumentation/netty/netty-4.1/library/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/NettyServerTelemetryBuilder.java @@ -32,7 +32,7 @@ public final class NettyServerTelemetryBuilder { NettyServerTelemetryBuilder(OpenTelemetry openTelemetry) { builder = - new DefaultHttpServerInstrumenterBuilder<>( + DefaultHttpServerInstrumenterBuilder.create( "io.opentelemetry.netty-4.1", openTelemetry, new NettyHttpServerAttributesGetter(), diff --git a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpClientInstrumenterBuilderFactory.java b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpClientInstrumenterBuilderFactory.java index 4dbaf771d24d..7d79a333c7ee 100644 --- a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpClientInstrumenterBuilderFactory.java +++ b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpClientInstrumenterBuilderFactory.java @@ -21,7 +21,7 @@ private OkHttpClientInstrumenterBuilderFactory() {} public static DefaultHttpClientInstrumenterBuilder create( OpenTelemetry openTelemetry) { - return new DefaultHttpClientInstrumenterBuilder<>( + return DefaultHttpClientInstrumenterBuilder.create( INSTRUMENTATION_NAME, openTelemetry, OkHttpAttributesGetter.INSTANCE); } } diff --git a/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/server/PekkoHttpServerSingletons.java b/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/server/PekkoHttpServerSingletons.java index 8618492181d6..3c865385e14d 100644 --- a/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/server/PekkoHttpServerSingletons.java +++ b/instrumentation/pekko/pekko-http-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkohttp/v1_0/server/PekkoHttpServerSingletons.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.pekkohttp.v1_0.server; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpServerInstrumenters; 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; @@ -25,30 +16,11 @@ public final class PekkoHttpServerSingletons { private static final Instrumenter INSTRUMENTER; static { - PekkoHttpServerAttributesGetter httpAttributesGetter = new PekkoHttpServerAttributesGetter(); - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - PekkoHttpUtil.instrumentationName(), - HttpSpanNameExtractor.create(httpAttributesGetter)) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders()) - .setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders()) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addOperationMetrics(HttpServerMetrics.get()) - .addContextCustomizer( - HttpServerRoute.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()); - if (AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpServerExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildServerInstrumenter(PekkoHttpServerHeaders.INSTANCE); + INSTRUMENTER = + JavaagentHttpServerInstrumenters.create( + PekkoHttpUtil.instrumentationName(), + new PekkoHttpServerAttributesGetter(), + PekkoHttpServerHeaders.INSTANCE); } public static Instrumenter instrumenter() { diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackTelemetryBuilder.java b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackTelemetryBuilder.java index 1542d5070dab..a7e56610913a 100644 --- a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackTelemetryBuilder.java +++ b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackTelemetryBuilder.java @@ -7,25 +7,12 @@ 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.semconv.http.HttpServerExperimentalMetrics; +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; 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.HttpServerAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteBuilder; -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; @@ -39,38 +26,22 @@ public final class RatpackTelemetryBuilder { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.ratpack-1.7"; - private final OpenTelemetry openTelemetry; - - private final List> additionalExtractors = - new ArrayList<>(); - private final HttpClientAttributesExtractorBuilder - httpClientAttributesExtractorBuilder = - HttpClientAttributesExtractor.builder(RatpackHttpClientAttributesGetter.INSTANCE); - private final HttpServerAttributesExtractorBuilder - httpServerAttributesExtractorBuilder = - HttpServerAttributesExtractor.builder(RatpackHttpAttributesGetter.INSTANCE); - - private final HttpSpanNameExtractorBuilder httpClientSpanNameExtractorBuilder = - HttpSpanNameExtractor.builder(RatpackHttpClientAttributesGetter.INSTANCE); - private final HttpSpanNameExtractorBuilder httpServerSpanNameExtractorBuilder = - HttpSpanNameExtractor.builder(RatpackHttpAttributesGetter.INSTANCE); - - private Function, ? extends SpanNameExtractor> - clientSpanNameExtractorTransformer = Function.identity(); - private Function, ? extends SpanNameExtractor> - serverSpanNameExtractorTransformer = Function.identity(); - - private final HttpServerRouteBuilder httpServerRouteBuilder = - HttpServerRoute.builder(RatpackHttpAttributesGetter.INSTANCE); - - private final List> - additionalHttpClientExtractors = new ArrayList<>(); - - private boolean emitExperimentalHttpClientMetrics = false; - private boolean emitExperimentalHttpServerMetrics = false; + private final DefaultHttpClientInstrumenterBuilder clientBuilder; + private final DefaultHttpServerInstrumenterBuilder serverBuilder; RatpackTelemetryBuilder(OpenTelemetry openTelemetry) { - this.openTelemetry = openTelemetry; + clientBuilder = + DefaultHttpClientInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + RatpackHttpClientAttributesGetter.INSTANCE, + RequestHeaderSetter.INSTANCE); + serverBuilder = + DefaultHttpServerInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + RatpackHttpAttributesGetter.INSTANCE, + RatpackGetter.INSTANCE); } /** @@ -80,14 +51,14 @@ public final class RatpackTelemetryBuilder { @CanIgnoreReturnValue public RatpackTelemetryBuilder addAttributeExtractor( AttributesExtractor attributesExtractor) { - additionalExtractors.add(attributesExtractor); + serverBuilder.addAttributesExtractor(attributesExtractor); return this; } @CanIgnoreReturnValue public RatpackTelemetryBuilder addClientAttributeExtractor( AttributesExtractor attributesExtractor) { - additionalHttpClientExtractors.add(attributesExtractor); + clientBuilder.addAttributeExtractor(attributesExtractor); return this; } @@ -98,7 +69,7 @@ public RatpackTelemetryBuilder addClientAttributeExtractor( */ @CanIgnoreReturnValue public RatpackTelemetryBuilder setCapturedServerRequestHeaders(List requestHeaders) { - httpServerAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + serverBuilder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -109,7 +80,7 @@ public RatpackTelemetryBuilder setCapturedServerRequestHeaders(List requ */ @CanIgnoreReturnValue public RatpackTelemetryBuilder setCapturedServerResponseHeaders(List responseHeaders) { - httpServerAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); + serverBuilder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -120,7 +91,7 @@ public RatpackTelemetryBuilder setCapturedServerResponseHeaders(List res */ @CanIgnoreReturnValue public RatpackTelemetryBuilder setCapturedClientRequestHeaders(List requestHeaders) { - httpClientAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + clientBuilder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -131,7 +102,7 @@ public RatpackTelemetryBuilder setCapturedClientRequestHeaders(List requ */ @CanIgnoreReturnValue public RatpackTelemetryBuilder setCapturedClientResponseHeaders(List responseHeaders) { - httpClientAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); + clientBuilder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -151,11 +122,8 @@ public RatpackTelemetryBuilder setCapturedClientResponseHeaders(List res */ @CanIgnoreReturnValue public RatpackTelemetryBuilder setKnownMethods(Set knownMethods) { - httpClientAttributesExtractorBuilder.setKnownMethods(knownMethods); - httpServerAttributesExtractorBuilder.setKnownMethods(knownMethods); - httpClientSpanNameExtractorBuilder.setKnownMethods(knownMethods); - httpServerSpanNameExtractorBuilder.setKnownMethods(knownMethods); - httpServerRouteBuilder.setKnownMethods(knownMethods); + clientBuilder.setKnownMethods(knownMethods); + serverBuilder.setKnownMethods(knownMethods); return this; } @@ -168,7 +136,7 @@ public RatpackTelemetryBuilder setKnownMethods(Set knownMethods) { @CanIgnoreReturnValue public RatpackTelemetryBuilder setEmitExperimentalHttpClientMetrics( boolean emitExperimentalHttpClientMetrics) { - this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics; + clientBuilder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); return this; } @@ -181,71 +149,32 @@ public RatpackTelemetryBuilder setEmitExperimentalHttpClientMetrics( @CanIgnoreReturnValue public RatpackTelemetryBuilder setEmitExperimentalHttpServerMetrics( boolean emitExperimentalHttpServerMetrics) { - this.emitExperimentalHttpServerMetrics = emitExperimentalHttpServerMetrics; + serverBuilder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerMetrics); return this; } /** Sets custom client {@link SpanNameExtractor} via transform function. */ @CanIgnoreReturnValue public RatpackTelemetryBuilder setClientSpanNameExtractor( - Function, ? extends SpanNameExtractor> + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> clientSpanNameExtractor) { - this.clientSpanNameExtractorTransformer = clientSpanNameExtractor; + clientBuilder.setSpanNameExtractor(clientSpanNameExtractor); return this; } /** Sets custom server {@link SpanNameExtractor} via transform function. */ @CanIgnoreReturnValue public RatpackTelemetryBuilder setServerSpanNameExtractor( - Function, ? extends SpanNameExtractor> + Function, ? extends SpanNameExtractor> serverSpanNameExtractor) { - this.serverSpanNameExtractorTransformer = serverSpanNameExtractor; + serverBuilder.setSpanNameExtractor(serverSpanNameExtractor); return this; } /** Returns a new {@link RatpackTelemetry} with the configuration of this builder. */ public RatpackTelemetry build() { - return new RatpackTelemetry(buildServerInstrumenter(), httpClientInstrumenter()); - } - - private Instrumenter buildServerInstrumenter() { - RatpackHttpAttributesGetter httpAttributes = RatpackHttpAttributesGetter.INSTANCE; - SpanNameExtractor spanNameExtractor = - serverSpanNameExtractorTransformer.apply(httpServerSpanNameExtractorBuilder.build()); - - InstrumenterBuilder builder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes)) - .addAttributesExtractor(httpServerAttributesExtractorBuilder.build()) - .addAttributesExtractors(additionalExtractors) - .addOperationMetrics(HttpServerMetrics.get()) - .addContextCustomizer(httpServerRouteBuilder.build()); - if (emitExperimentalHttpServerMetrics) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributes)) - .addOperationMetrics(HttpServerExperimentalMetrics.get()); - } - return builder.buildServerInstrumenter(RatpackGetter.INSTANCE); - } - - private Instrumenter httpClientInstrumenter() { - RatpackHttpClientAttributesGetter httpAttributes = RatpackHttpClientAttributesGetter.INSTANCE; - SpanNameExtractor spanNameExtractor = - clientSpanNameExtractorTransformer.apply(httpClientSpanNameExtractorBuilder.build()); - - InstrumenterBuilder builder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes)) - .addAttributesExtractor(httpClientAttributesExtractorBuilder.build()) - .addAttributesExtractors(additionalHttpClientExtractors) - .addOperationMetrics(HttpClientMetrics.get()); - if (emitExperimentalHttpClientMetrics) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributes)) - .addOperationMetrics(HttpClientExperimentalMetrics.get()); - } - return builder.buildClientInstrumenter(RequestHeaderSetter.INSTANCE); + return new RatpackTelemetry(serverBuilder.build(), clientBuilder.build()); } } diff --git a/instrumentation/restlet/restlet-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v1_1/RestletSingletons.java b/instrumentation/restlet/restlet-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v1_1/RestletSingletons.java index 0e2332b1e984..fbdb30e05d47 100644 --- a/instrumentation/restlet/restlet-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v1_1/RestletSingletons.java +++ b/instrumentation/restlet/restlet-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v1_1/RestletSingletons.java @@ -8,21 +8,21 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteGetter; -import io.opentelemetry.instrumentation.restlet.v1_1.RestletTelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.instrumentation.restlet.v1_1.internal.RestletTelemetryBuilderFactory; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpServerInstrumenters; import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath; import org.restlet.data.Request; import org.restlet.data.Response; public final class RestletSingletons { - private static final Instrumenter INSTRUMENTER = - RestletTelemetry.builder(GlobalOpenTelemetry.get()) - .setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders()) - .setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders()) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build() - .getServerInstrumenter(); + private static final Instrumenter INSTRUMENTER; + + static { + INSTRUMENTER = + JavaagentHttpServerInstrumenters.create( + RestletTelemetryBuilderFactory.create(GlobalOpenTelemetry.get())); + } public static Instrumenter instrumenter() { return INSTRUMENTER; diff --git a/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetry.java b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetry.java index ba29b9b6d64d..996a912004d0 100644 --- a/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetry.java +++ b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetry.java @@ -39,9 +39,4 @@ public static RestletTelemetryBuilder builder(OpenTelemetry openTelemetry) { public Filter newFilter(String path) { return new TracingFilter(serverInstrumenter, path); } - - /** Returns a server {@link Instrumenter}. */ - public Instrumenter getServerInstrumenter() { - return serverInstrumenter; - } } diff --git a/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetryBuilder.java b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetryBuilder.java index d5711895e9d5..3ff61af4a73f 100644 --- a/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetryBuilder.java +++ b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetryBuilder.java @@ -7,21 +7,11 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics; +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; 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.HttpServerAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteBuilder; -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 io.opentelemetry.instrumentation.restlet.v1_1.internal.RestletTelemetryBuilderFactory; import java.util.List; import java.util.Set; import java.util.function.Function; @@ -31,24 +21,10 @@ /** A builder of {@link RestletTelemetry}. */ public final class RestletTelemetryBuilder { - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.restlet-1.1"; - - private final OpenTelemetry openTelemetry; - private final List> additionalExtractors = - new ArrayList<>(); - private final HttpServerAttributesExtractorBuilder - httpAttributesExtractorBuilder = - HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE); - private final HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = - HttpSpanNameExtractor.builder(RestletHttpAttributesGetter.INSTANCE); - private Function, ? extends SpanNameExtractor> - spanNameExtractorTransformer = Function.identity(); - private final HttpServerRouteBuilder httpServerRouteBuilder = - HttpServerRoute.builder(RestletHttpAttributesGetter.INSTANCE); - private boolean emitExperimentalHttpServerMetrics = false; + private final DefaultHttpServerInstrumenterBuilder builder; RestletTelemetryBuilder(OpenTelemetry openTelemetry) { - this.openTelemetry = openTelemetry; + builder = RestletTelemetryBuilderFactory.create(openTelemetry); } /** @@ -58,7 +34,7 @@ public final class RestletTelemetryBuilder { @CanIgnoreReturnValue public RestletTelemetryBuilder addAttributesExtractor( AttributesExtractor attributesExtractor) { - additionalExtractors.add(attributesExtractor); + builder.addAttributesExtractor(attributesExtractor); return this; } @@ -69,7 +45,7 @@ public RestletTelemetryBuilder addAttributesExtractor( */ @CanIgnoreReturnValue public RestletTelemetryBuilder setCapturedRequestHeaders(List requestHeaders) { - httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + builder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -80,7 +56,7 @@ public RestletTelemetryBuilder setCapturedRequestHeaders(List requestHea */ @CanIgnoreReturnValue public RestletTelemetryBuilder setCapturedResponseHeaders(List responseHeaders) { - httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); + builder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -99,9 +75,7 @@ public RestletTelemetryBuilder setCapturedResponseHeaders(List responseH */ @CanIgnoreReturnValue public RestletTelemetryBuilder setKnownMethods(Set knownMethods) { - httpAttributesExtractorBuilder.setKnownMethods(knownMethods); - httpSpanNameExtractorBuilder.setKnownMethods(knownMethods); - httpServerRouteBuilder.setKnownMethods(knownMethods); + builder.setKnownMethods(knownMethods); return this; } @@ -114,16 +88,16 @@ public RestletTelemetryBuilder setKnownMethods(Set knownMethods) { @CanIgnoreReturnValue public RestletTelemetryBuilder setEmitExperimentalHttpServerMetrics( boolean emitExperimentalHttpServerMetrics) { - this.emitExperimentalHttpServerMetrics = emitExperimentalHttpServerMetrics; + builder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerMetrics); return this; } /** Sets custom {@link SpanNameExtractor} via transform function. */ @CanIgnoreReturnValue public RestletTelemetryBuilder setSpanNameExtractor( - Function, ? extends SpanNameExtractor> + Function, ? extends SpanNameExtractor> spanNameExtractorTransformer) { - this.spanNameExtractorTransformer = spanNameExtractorTransformer; + builder.setSpanNameExtractor(spanNameExtractorTransformer); return this; } @@ -132,24 +106,6 @@ public RestletTelemetryBuilder setSpanNameExtractor( * RestletTelemetryBuilder}. */ public RestletTelemetry build() { - RestletHttpAttributesGetter httpAttributesGetter = RestletHttpAttributesGetter.INSTANCE; - SpanNameExtractor spanNameExtractor = - spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); - - InstrumenterBuilder builder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor(httpAttributesExtractorBuilder.build()) - .addAttributesExtractors(additionalExtractors) - .addContextCustomizer(httpServerRouteBuilder.build()) - .addOperationMetrics(HttpServerMetrics.get()); - if (emitExperimentalHttpServerMetrics) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpServerExperimentalMetrics.get()); - } - - return new RestletTelemetry(builder.buildServerInstrumenter(RestletHeadersGetter.INSTANCE)); + return new RestletTelemetry(builder.build()); } } diff --git a/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletHeadersGetter.java b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/internal/RestletHeadersGetter.java similarity index 92% rename from instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletHeadersGetter.java rename to instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/internal/RestletHeadersGetter.java index 13d06f8ce1b9..7f137049d502 100644 --- a/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletHeadersGetter.java +++ b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/internal/RestletHeadersGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.restlet.v1_1; +package io.opentelemetry.instrumentation.restlet.v1_1.internal; import io.opentelemetry.context.propagation.TextMapGetter; import java.util.Locale; diff --git a/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletHttpAttributesGetter.java b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/internal/RestletHttpAttributesGetter.java similarity index 95% rename from instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletHttpAttributesGetter.java rename to instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/internal/RestletHttpAttributesGetter.java index 8378b494045e..64d52656d373 100644 --- a/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletHttpAttributesGetter.java +++ b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/internal/RestletHttpAttributesGetter.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.restlet.v1_1; +package io.opentelemetry.instrumentation.restlet.v1_1.internal; -import static io.opentelemetry.instrumentation.restlet.v1_1.RestletHeadersGetter.getHeaders; +import static io.opentelemetry.instrumentation.restlet.v1_1.internal.RestletHeadersGetter.getHeaders; import com.noelios.restlet.http.HttpCall; import com.noelios.restlet.http.HttpRequest; diff --git a/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/internal/RestletTelemetryBuilderFactory.java b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/internal/RestletTelemetryBuilderFactory.java new file mode 100644 index 000000000000..9c7ead4b2582 --- /dev/null +++ b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/internal/RestletTelemetryBuilderFactory.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.restlet.v1_1.internal; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; +import org.restlet.data.Request; +import org.restlet.data.Response; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public class RestletTelemetryBuilderFactory { + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.restlet-1.1"; + + private RestletTelemetryBuilderFactory() {} + + public static DefaultHttpServerInstrumenterBuilder create( + OpenTelemetry openTelemetry) { + return DefaultHttpServerInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + RestletHttpAttributesGetter.INSTANCE, + RestletHeadersGetter.INSTANCE); + } +} diff --git a/instrumentation/restlet/restlet-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/RestletSingletons.java b/instrumentation/restlet/restlet-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/RestletSingletons.java index 0b8f6607964c..59d25f717636 100644 --- a/instrumentation/restlet/restlet-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/RestletSingletons.java +++ b/instrumentation/restlet/restlet-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/RestletSingletons.java @@ -7,36 +7,18 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteGetter; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletHttpAttributesGetter; -import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumenterFactory; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletTelemetryBuilderFactory; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpServerInstrumenters; import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath; -import java.util.Collections; import org.restlet.Request; import org.restlet.Response; public final class RestletSingletons { private static final Instrumenter INSTRUMENTER = - RestletInstrumenterFactory.newServerInstrumenter( - GlobalOpenTelemetry.get(), - HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE) - .setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders()) - .setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders()) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build(), - HttpSpanNameExtractor.builder(RestletHttpAttributesGetter.INSTANCE) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build(), - HttpServerRoute.builder(RestletHttpAttributesGetter.INSTANCE) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build(), - Collections.emptyList(), - AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()); + JavaagentHttpServerInstrumenters.create( + RestletTelemetryBuilderFactory.create(GlobalOpenTelemetry.get())); public static Instrumenter instrumenter() { return INSTRUMENTER; diff --git a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTelemetryBuilder.java b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTelemetryBuilder.java index 86cc9544a729..a933f52cdea4 100644 --- a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTelemetryBuilder.java +++ b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTelemetryBuilder.java @@ -7,18 +7,11 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; 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.HttpServerAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder; -import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletHttpAttributesGetter; -import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumenterFactory; -import java.util.ArrayList; +import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletTelemetryBuilderFactory; import java.util.List; import java.util.Set; import java.util.function.Function; @@ -28,22 +21,10 @@ /** A builder of {@link RestletTelemetry}. */ public final class RestletTelemetryBuilder { - private final OpenTelemetry openTelemetry; - private final List> additionalExtractors = - new ArrayList<>(); - private final HttpServerAttributesExtractorBuilder - httpAttributesExtractorBuilder = - HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE); - private final HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = - HttpSpanNameExtractor.builder(RestletHttpAttributesGetter.INSTANCE); - private Function, ? extends SpanNameExtractor> - spanNameExtractorTransformer = Function.identity(); - private final HttpServerRouteBuilder httpServerRouteBuilder = - HttpServerRoute.builder(RestletHttpAttributesGetter.INSTANCE); - private boolean emitExperimentalHttpServerMetrics = false; + private final DefaultHttpServerInstrumenterBuilder builder; RestletTelemetryBuilder(OpenTelemetry openTelemetry) { - this.openTelemetry = openTelemetry; + builder = RestletTelemetryBuilderFactory.create(openTelemetry); } /** @@ -53,7 +34,7 @@ public final class RestletTelemetryBuilder { @CanIgnoreReturnValue public RestletTelemetryBuilder addAttributesExtractor( AttributesExtractor attributesExtractor) { - additionalExtractors.add(attributesExtractor); + builder.addAttributesExtractor(attributesExtractor); return this; } @@ -64,7 +45,7 @@ public RestletTelemetryBuilder addAttributesExtractor( */ @CanIgnoreReturnValue public RestletTelemetryBuilder setCapturedRequestHeaders(List requestHeaders) { - httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + builder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -75,7 +56,7 @@ public RestletTelemetryBuilder setCapturedRequestHeaders(List requestHea */ @CanIgnoreReturnValue public RestletTelemetryBuilder setCapturedResponseHeaders(List responseHeaders) { - httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); + builder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -94,9 +75,7 @@ public RestletTelemetryBuilder setCapturedResponseHeaders(List responseH */ @CanIgnoreReturnValue public RestletTelemetryBuilder setKnownMethods(Set knownMethods) { - httpAttributesExtractorBuilder.setKnownMethods(knownMethods); - httpSpanNameExtractorBuilder.setKnownMethods(knownMethods); - httpServerRouteBuilder.setKnownMethods(knownMethods); + builder.setKnownMethods(knownMethods); return this; } @@ -109,16 +88,16 @@ public RestletTelemetryBuilder setKnownMethods(Set knownMethods) { @CanIgnoreReturnValue public RestletTelemetryBuilder setEmitExperimentalHttpServerMetrics( boolean emitExperimentalHttpServerMetrics) { - this.emitExperimentalHttpServerMetrics = emitExperimentalHttpServerMetrics; + builder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerMetrics); return this; } /** Sets custom {@link SpanNameExtractor} via transform function. */ @CanIgnoreReturnValue public RestletTelemetryBuilder setSpanNameExtractor( - Function, ? extends SpanNameExtractor> + Function, ? extends SpanNameExtractor> spanNameExtractorTransformer) { - this.spanNameExtractorTransformer = spanNameExtractorTransformer; + builder.setSpanNameExtractor(spanNameExtractorTransformer); return this; } @@ -127,18 +106,6 @@ public RestletTelemetryBuilder setSpanNameExtractor( * RestletTelemetryBuilder}. */ public RestletTelemetry build() { - SpanNameExtractor spanNameExtractor = - spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); - - Instrumenter serverInstrumenter = - RestletInstrumenterFactory.newServerInstrumenter( - openTelemetry, - httpAttributesExtractorBuilder.build(), - spanNameExtractor, - httpServerRouteBuilder.build(), - additionalExtractors, - emitExperimentalHttpServerMetrics); - - return new RestletTelemetry(serverInstrumenter); + return new RestletTelemetry(builder.build()); } } diff --git a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletHttpAttributesGetter.java b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletHttpAttributesGetter.java index 38c5a96c2ffc..fa5554e81e9f 100644 --- a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletHttpAttributesGetter.java +++ b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletHttpAttributesGetter.java @@ -16,11 +16,7 @@ import org.restlet.Response; import org.restlet.util.Series; -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public enum RestletHttpAttributesGetter implements HttpServerAttributesGetter { +enum RestletHttpAttributesGetter implements HttpServerAttributesGetter { INSTANCE; @Override diff --git a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletInstrumenterFactory.java b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletInstrumenterFactory.java deleted file mode 100644 index 54a60a980ec4..000000000000 --- a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletInstrumenterFactory.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.restlet.v2_0.internal; - -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics; -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer; -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.HttpServerMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import java.util.List; -import org.restlet.Request; -import org.restlet.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 RestletInstrumenterFactory { - - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.restlet-2.0"; - - public static Instrumenter newServerInstrumenter( - OpenTelemetry openTelemetry, - AttributesExtractor httpServerAttributesExtractor, - SpanNameExtractor httpServerSpanNameExtractor, - ContextCustomizer httpServerRoute, - List> additionalExtractors, - boolean emitExperimentalHttpServerMetrics) { - - RestletHttpAttributesGetter httpAttributesGetter = RestletHttpAttributesGetter.INSTANCE; - - InstrumenterBuilder builder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpServerSpanNameExtractor) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor(httpServerAttributesExtractor) - .addAttributesExtractors(additionalExtractors) - .addContextCustomizer(httpServerRoute) - .addOperationMetrics(HttpServerMetrics.get()); - if (emitExperimentalHttpServerMetrics) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpServerExperimentalMetrics.get()); - } - return builder.buildServerInstrumenter(new RestletHeadersGetter()); - } - - private RestletInstrumenterFactory() {} -} diff --git a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletTelemetryBuilderFactory.java b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletTelemetryBuilderFactory.java new file mode 100644 index 000000000000..552e0c301ac5 --- /dev/null +++ b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletTelemetryBuilderFactory.java @@ -0,0 +1,28 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.restlet.v2_0.internal; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; +import org.restlet.Request; +import org.restlet.Response; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public class RestletTelemetryBuilderFactory { + private RestletTelemetryBuilderFactory() {} + + public static DefaultHttpServerInstrumenterBuilder create( + OpenTelemetry openTelemetry) { + return DefaultHttpServerInstrumenterBuilder.create( + "io.opentelemetry.restlet-2.0", + openTelemetry, + RestletHttpAttributesGetter.INSTANCE, + new RestletHeadersGetter()); + } +} diff --git a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java index 10b221f613a1..28327c9cdfa8 100644 --- a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java +++ b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java @@ -7,21 +7,16 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics; +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer; 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.internal.InstrumenterUtil; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpServerInstrumenters; import java.util.ArrayList; import java.util.List; @@ -58,46 +53,37 @@ public Instrumenter, ServletResponseContext, ServletResponseContext> httpAttributesGetter) { - ServletErrorCauseExtractor errorCauseExtractor = - new ServletErrorCauseExtractor<>(accessor); - AttributesExtractor, ServletResponseContext> - additionalAttributesExtractor = new ServletAdditionalAttributesExtractor<>(accessor); - - InstrumenterBuilder, ServletResponseContext> builder = - Instrumenter., ServletResponseContext>builder( - GlobalOpenTelemetry.get(), instrumentationName, spanNameExtractor) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .setErrorCauseExtractor(errorCauseExtractor) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders()) - .setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders()) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addAttributesExtractor(additionalAttributesExtractor) - .addOperationMetrics(HttpServerMetrics.get()) - .addContextCustomizer( - HttpServerRoute.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()); - if (ServletRequestParametersExtractor.enabled()) { - AttributesExtractor, ServletResponseContext> - requestParametersExtractor = new ServletRequestParametersExtractor<>(accessor); - builder.addAttributesExtractor(requestParametersExtractor); - } - for (ContextCustomizer> contextCustomizer : - contextCustomizers) { - builder.addContextCustomizer(contextCustomizer); - } - if (AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpServerExperimentalMetrics.get()); - } - if (propagateOperationListenersToOnEnd) { - InstrumenterUtil.propagateOperationListenersToOnEnd(builder); - } - return builder.buildServerInstrumenter(new ServletRequestGetter<>(accessor)); + DefaultHttpServerInstrumenterBuilder< + ServletRequestContext, ServletResponseContext> + serverBuilder = + DefaultHttpServerInstrumenterBuilder.create( + instrumentationName, + GlobalOpenTelemetry.get(), + httpAttributesGetter, + new ServletRequestGetter<>(accessor)); + serverBuilder.setSpanNameExtractor(e -> spanNameExtractor); + + return JavaagentHttpServerInstrumenters.create( + serverBuilder, + builder -> { + if (ServletRequestParametersExtractor.enabled()) { + AttributesExtractor, ServletResponseContext> + requestParametersExtractor = new ServletRequestParametersExtractor<>(accessor); + builder.addAttributesExtractor(requestParametersExtractor); + } + for (ContextCustomizer> contextCustomizer : + contextCustomizers) { + builder.addContextCustomizer(contextCustomizer); + } + + if (propagateOperationListenersToOnEnd) { + InstrumenterUtil.propagateOperationListenersToOnEnd(builder); + } + + builder + .addAttributesExtractor(new ServletAdditionalAttributesExtractor<>(accessor)) + .setErrorCauseExtractor(new ServletErrorCauseExtractor<>(accessor)); + }); } public Instrumenter, ServletResponseContext> build( 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 36fde223c3ec..86771bfa3313 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 @@ -29,9 +29,11 @@ public final class SpringWebTelemetryBuilder { SpringWebTelemetryBuilder(OpenTelemetry openTelemetry) { builder = - new DefaultHttpClientInstrumenterBuilder<>( - INSTRUMENTATION_NAME, openTelemetry, SpringWebHttpAttributesGetter.INSTANCE) - .setHeaderSetter(HttpRequestSetter.INSTANCE); + DefaultHttpClientInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + SpringWebHttpAttributesGetter.INSTANCE, + HttpRequestSetter.INSTANCE); } private DefaultHttpClientInstrumenterBuilder getBuilder() { diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetryBuilder.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetryBuilder.java index d8dbc868b211..602ded9c1d4d 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetryBuilder.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetryBuilder.java @@ -40,10 +40,10 @@ public final class SpringWebfluxTelemetryBuilder { SpringWebfluxTelemetryBuilder(OpenTelemetry openTelemetry) { clientBuilder = - new DefaultHttpClientInstrumenterBuilder<>( + DefaultHttpClientInstrumenterBuilder.create( INSTRUMENTATION_NAME, openTelemetry, WebClientHttpAttributesGetter.INSTANCE); serverBuilder = - new DefaultHttpServerInstrumenterBuilder<>( + DefaultHttpServerInstrumenterBuilder.create( INSTRUMENTATION_NAME, openTelemetry, WebfluxServerHttpAttributesGetter.INSTANCE, diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/SpringWebMvcTelemetryBuilder.java b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/SpringWebMvcTelemetryBuilder.java index b6e47c868ff9..0c31ace56234 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/SpringWebMvcTelemetryBuilder.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/SpringWebMvcTelemetryBuilder.java @@ -32,7 +32,7 @@ public final class SpringWebMvcTelemetryBuilder { SpringWebMvcTelemetryBuilder(OpenTelemetry openTelemetry) { builder = - new DefaultHttpServerInstrumenterBuilder<>( + DefaultHttpServerInstrumenterBuilder.create( INSTRUMENTATION_NAME, openTelemetry, SpringWebMvcHttpAttributesGetter.INSTANCE, diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/SpringWebMvcTelemetryBuilder.java b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/SpringWebMvcTelemetryBuilder.java index c87ecf3ab5b4..1c34c847a3b2 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/SpringWebMvcTelemetryBuilder.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/SpringWebMvcTelemetryBuilder.java @@ -31,7 +31,7 @@ public final class SpringWebMvcTelemetryBuilder { SpringWebMvcTelemetryBuilder(OpenTelemetry openTelemetry) { builder = - new DefaultHttpServerInstrumenterBuilder<>( + DefaultHttpServerInstrumenterBuilder.create( INSTRUMENTATION_NAME, openTelemetry, SpringWebMvcHttpAttributesGetter.INSTANCE, diff --git a/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java b/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java index b89d70bc77d3..c2a632918752 100644 --- a/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java +++ b/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java @@ -5,18 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.tomcat.common; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpServerInstrumenters; import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge; import io.opentelemetry.javaagent.instrumentation.servlet.ServletAccessor; import io.opentelemetry.javaagent.instrumentation.servlet.ServletErrorCauseExtractor; @@ -29,40 +20,19 @@ private TomcatInstrumenterFactory() {} public static Instrumenter create( String instrumentationName, ServletAccessor accessor) { - TomcatHttpAttributesGetter httpAttributesGetter = new TomcatHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - instrumentationName, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .setErrorCauseExtractor(new ServletErrorCauseExtractor<>(accessor)) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders()) - .setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders()) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addContextCustomizer( - HttpServerRoute.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addContextCustomizer( - (context, request, attributes) -> - new AppServerBridge.Builder() - .captureServletAttributes() - .recordException() - .init(context)) - .addOperationMetrics(HttpServerMetrics.get()); - if (AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpServerExperimentalMetrics.get()); - } - InstrumenterUtil.propagateOperationListenersToOnEnd(builder); - return builder.buildServerInstrumenter(TomcatRequestGetter.INSTANCE); + return JavaagentHttpServerInstrumenters.create( + instrumentationName, + new TomcatHttpAttributesGetter(), + TomcatRequestGetter.INSTANCE, + builder -> + InstrumenterUtil.propagateOperationListenersToOnEnd( + builder + .setErrorCauseExtractor(new ServletErrorCauseExtractor<>(accessor)) + .addContextCustomizer( + (context, request, attributes) -> + new AppServerBridge.Builder() + .captureServletAttributes() + .recordException() + .init(context)))); } } diff --git a/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowSingletons.java b/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowSingletons.java index cb4e9007afab..fa8e7055c549 100644 --- a/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowSingletons.java +++ b/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowSingletons.java @@ -5,17 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.undertow; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpServerInstrumenters; import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge; import io.opentelemetry.javaagent.bootstrap.undertow.UndertowActiveHandlers; import io.undertow.server.HttpServerExchange; @@ -26,44 +17,23 @@ public final class UndertowSingletons { private static final Instrumenter INSTRUMENTER; static { - UndertowHttpAttributesGetter httpAttributesGetter = new UndertowHttpAttributesGetter(); - - InstrumenterBuilder builder = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - HttpSpanNameExtractor.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) - .setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders()) - .setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders()) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addContextCustomizer( - HttpServerRoute.builder(httpAttributesGetter) - .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()) - .build()) - .addContextCustomizer( - (context, request, attributes) -> { - // span is ended when counter reaches 0, we start from 2 which accounts for the - // handler that started the span and exchange completion listener - context = UndertowActiveHandlers.init(context, 2); - - return new AppServerBridge.Builder() - .captureServletAttributes() - .recordException() - .init(context); - }) - .addOperationMetrics(HttpServerMetrics.get()); - if (AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) { - builder - .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter)) - .addOperationMetrics(HttpServerExperimentalMetrics.get()); - } - INSTRUMENTER = builder.buildServerInstrumenter(UndertowExchangeGetter.INSTANCE); + INSTRUMENTER = + JavaagentHttpServerInstrumenters.create( + INSTRUMENTATION_NAME, + new UndertowHttpAttributesGetter(), + UndertowExchangeGetter.INSTANCE, + builder -> + builder.addContextCustomizer( + (context, request, attributes) -> { + // span is ended when counter reaches 0, we start from 2 which accounts for + // the handler that started the span and exchange completion listener + context = UndertowActiveHandlers.init(context, 2); + + return new AppServerBridge.Builder() + .captureServletAttributes() + .recordException() + .init(context); + })); } private static final UndertowHelper HELPER = new UndertowHelper(INSTRUMENTER); 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 index e7331c550fff..915ab0fa1a26 100644 --- 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 @@ -24,7 +24,10 @@ private JavaagentHttpClientInstrumenters() {} public static Instrumenter create( String instrumentationName, HttpClientAttributesGetter httpAttributesGetter) { - return create(instrumentationName, httpAttributesGetter, null); + return create( + DefaultHttpClientInstrumenterBuilder.create( + instrumentationName, GlobalOpenTelemetry.get(), httpAttributesGetter), + b -> {}); } public static Instrumenter create( @@ -44,13 +47,10 @@ public static Instrumenter create( HttpClientAttributesGetter httpAttributesGetter, TextMapSetter headerSetter, Consumer> instrumenterBuilderConsumer) { - DefaultHttpClientInstrumenterBuilder defaultHttpClientTelemetryBuilder = - new DefaultHttpClientInstrumenterBuilder<>( - instrumentationName, GlobalOpenTelemetry.get(), httpAttributesGetter); - if (headerSetter != null) { - defaultHttpClientTelemetryBuilder.setHeaderSetter(headerSetter); - } - return create(defaultHttpClientTelemetryBuilder, instrumenterBuilderConsumer); + return create( + DefaultHttpClientInstrumenterBuilder.create( + instrumentationName, GlobalOpenTelemetry.get(), httpAttributesGetter, headerSetter), + instrumenterBuilderConsumer); } private static Instrumenter create( diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpServerInstrumenters.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpServerInstrumenters.java index 6e4ce0e43c88..b27cefbfa3a0 100644 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpServerInstrumenters.java +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpServerInstrumenters.java @@ -21,18 +21,30 @@ public final class JavaagentHttpServerInstrumenters { private JavaagentHttpServerInstrumenters() {} + public static Instrumenter create( + String instrumentationName, + HttpServerAttributesGetter httpAttributesGetter, + TextMapGetter headerGetter) { + return create(instrumentationName, httpAttributesGetter, headerGetter, customizer -> {}); + } + + public static Instrumenter create( + DefaultHttpServerInstrumenterBuilder builder) { + return create(builder, customizer -> {}); + } + public static Instrumenter create( String instrumentationName, HttpServerAttributesGetter httpAttributesGetter, TextMapGetter headerGetter, Consumer> instrumenterBuilderConsumer) { return create( - new DefaultHttpServerInstrumenterBuilder<>( + DefaultHttpServerInstrumenterBuilder.create( instrumentationName, GlobalOpenTelemetry.get(), httpAttributesGetter, headerGetter), instrumenterBuilderConsumer); } - private static Instrumenter create( + public static Instrumenter create( DefaultHttpServerInstrumenterBuilder builder, Consumer> builderCustomizer) { return builder