From 7a06507f80f2fce96f4e47b72989cf1044dbe902 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Fri, 17 May 2024 12:10:32 +0300 Subject: [PATCH] Allow library instrumentations to override span name (#11355) Co-authored-by: Trask Stalnaker --- .../v2_7/DubboTelemetryBuilder.java | 33 ++++++++++++++- .../ApacheHttpClientTelemetryBuilder.java | 21 +++++++++- .../ApacheHttpClient5TelemetryBuilder.java | 22 +++++++++- .../armeria/v1_3/ArmeriaTelemetryBuilder.java | 40 +++++++++++++++++-- .../ElasticsearchRest7TelemetryBuilder.java | 24 ++++++++++- ...earchRestJavaagentInstrumenterFactory.java | 2 + .../ElasticsearchRestInstrumenterFactory.java | 13 ++++-- .../grpc/v1_6/GrpcTelemetryBuilder.java | 23 +++-------- .../httpclient/JavaHttpClientSingletons.java | 2 + .../JavaHttpClientTelemetryBuilder.java | 14 +++++++ .../JavaHttpClientInstrumenterFactory.java | 8 +++- .../v9_2/JettyHttpClientSingletons.java | 2 + .../v9_2/JettyClientTelemetryBuilder.java | 14 +++++++ .../JettyClientInstrumenterFactory.java | 8 +++- .../NettyClientInstrumenterFactory.java | 10 ++++- .../v4_0/client/NettyClientSingletons.java | 2 + .../netty/v4_1/NettyClientSingletons.java | 2 + .../v4_1/NettyClientTelemetryBuilder.java | 23 ++++++++++- .../okhttp/v3_0/OkHttp3Singletons.java | 2 + .../okhttp/v3_0/OkHttpTelemetryBuilder.java | 14 +++++++ .../internal/OkHttpInstrumenterFactory.java | 8 +++- .../quartz/v2_0/QuartzTelemetryBuilder.java | 25 ++++++++++-- .../r2dbc/v1_0/R2dbcTelemetryBuilder.java | 16 +++++++- .../internal/R2dbcInstrumenterBuilder.java | 16 ++++++-- .../ratpack/v1_7/RatpackTelemetryBuilder.java | 33 ++++++++++++++- .../restlet/v1_1/RestletTelemetryBuilder.java | 17 +++++++- .../restlet/v2_0/RestletTelemetryBuilder.java | 19 ++++++++- .../internal/RestletInstrumenterFactory.java | 2 +- .../web/v3_1/SpringWebTelemetryBuilder.java | 15 ++----- .../webflux/v5_0/client/WebClientHelper.java | 2 + .../v5_3/SpringWebfluxTelemetryBuilder.java | 36 ++++++++++++++++- .../internal/ClientInstrumenterFactory.java | 8 +++- .../v5_3/SpringWebMvcTelemetryBuilder.java | 15 ++----- .../v6_0/SpringWebMvcTelemetryBuilder.java | 15 ++----- 34 files changed, 418 insertions(+), 88 deletions(-) diff --git a/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboTelemetryBuilder.java b/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboTelemetryBuilder.java index 83fb14de6f..bbd4f9ad1d 100644 --- a/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboTelemetryBuilder.java +++ b/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboTelemetryBuilder.java @@ -20,6 +20,7 @@ import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesExt import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor; import java.util.ArrayList; import java.util.List; +import java.util.function.Function; import javax.annotation.Nullable; import org.apache.dubbo.rpc.Result; @@ -35,6 +36,12 @@ public final class DubboTelemetryBuilder { @Nullable private String peerService; private final List> attributesExtractors = new ArrayList<>(); + private Function< + SpanNameExtractor, ? extends SpanNameExtractor> + clientSpanNameExtractorTransformer = Function.identity(); + private Function< + SpanNameExtractor, ? extends SpanNameExtractor> + serverSpanNameExtractorTransformer = Function.identity(); DubboTelemetryBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -56,6 +63,24 @@ public final class DubboTelemetryBuilder { return this; } + /** Sets custom client {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public DubboTelemetryBuilder setClientSpanNameExtractor( + Function, ? extends SpanNameExtractor> + clientSpanNameExtractor) { + this.clientSpanNameExtractorTransformer = clientSpanNameExtractor; + return this; + } + + /** Sets custom server {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public DubboTelemetryBuilder setServerSpanNameExtractor( + Function, ? extends SpanNameExtractor> + serverSpanNameExtractor) { + this.serverSpanNameExtractorTransformer = serverSpanNameExtractor; + return this; + } + /** * Returns a new {@link DubboTelemetry} with the settings of this {@link DubboTelemetryBuilder}. */ @@ -63,6 +88,10 @@ public final class DubboTelemetryBuilder { DubboRpcAttributesGetter rpcAttributesGetter = DubboRpcAttributesGetter.INSTANCE; SpanNameExtractor spanNameExtractor = RpcSpanNameExtractor.create(rpcAttributesGetter); + SpanNameExtractor clientSpanNameExtractor = + clientSpanNameExtractorTransformer.apply(spanNameExtractor); + SpanNameExtractor serverSpanNameExtractor = + serverSpanNameExtractorTransformer.apply(spanNameExtractor); DubboClientNetworkAttributesGetter netClientAttributesGetter = new DubboClientNetworkAttributesGetter(); DubboNetworkServerAttributesGetter netServerAttributesGetter = @@ -70,14 +99,14 @@ public final class DubboTelemetryBuilder { InstrumenterBuilder serverInstrumenterBuilder = Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) + openTelemetry, INSTRUMENTATION_NAME, serverSpanNameExtractor) .addAttributesExtractor(RpcServerAttributesExtractor.create(rpcAttributesGetter)) .addAttributesExtractor(NetworkAttributesExtractor.create(netServerAttributesGetter)) .addAttributesExtractors(attributesExtractors); InstrumenterBuilder clientInstrumenterBuilder = Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) + openTelemetry, INSTRUMENTATION_NAME, clientSpanNameExtractor) .addAttributesExtractor(RpcClientAttributesExtractor.create(rpcAttributesGetter)) .addAttributesExtractor(ServerAttributesExtractor.create(netClientAttributesGetter)) .addAttributesExtractor(NetworkAttributesExtractor.create(netClientAttributesGetter)) 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 d664f15c75..daf0d8c688 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 @@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics; @@ -22,6 +23,7 @@ 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; import org.apache.http.HttpResponse; /** A builder for {@link ApacheHttpClientTelemetry}. */ @@ -38,6 +40,10 @@ public final class ApacheHttpClientTelemetryBuilder { HttpClientAttributesExtractor.builder(ApacheHttpClientHttpAttributesGetter.INSTANCE); private final HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(ApacheHttpClientHttpAttributesGetter.INSTANCE); + private Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer = Function.identity(); private boolean emitExperimentalHttpClientMetrics = false; ApacheHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) { @@ -111,6 +117,17 @@ public final class ApacheHttpClientTelemetryBuilder { return this; } + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public ApacheHttpClientTelemetryBuilder setSpanNameExtractor( + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + /** * Returns a new {@link ApacheHttpClientTelemetry} configured with this {@link * ApacheHttpClientTelemetryBuilder}. @@ -118,10 +135,12 @@ public final class ApacheHttpClientTelemetryBuilder { public ApacheHttpClientTelemetry build() { ApacheHttpClientHttpAttributesGetter httpAttributesGetter = ApacheHttpClientHttpAttributesGetter.INSTANCE; + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build()) + openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractors(additionalExtractors) 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 5097b8b204..1765558468 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 @@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics; @@ -22,6 +23,7 @@ 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; import org.apache.hc.core5.http.HttpResponse; /** A builder for {@link ApacheHttpClient5Telemetry}. */ @@ -40,7 +42,10 @@ public final class ApacheHttpClient5TelemetryBuilder { private final HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(ApacheHttpClient5HttpAttributesGetter.INSTANCE); - + private Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer = Function.identity(); private boolean emitExperimentalHttpClientMetrics = false; ApacheHttpClient5TelemetryBuilder(OpenTelemetry openTelemetry) { @@ -115,6 +120,17 @@ public final class ApacheHttpClient5TelemetryBuilder { return this; } + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public ApacheHttpClient5TelemetryBuilder setSpanNameExtractor( + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + /** * Returns a new {@link ApacheHttpClient5Telemetry} configured with this {@link * ApacheHttpClient5TelemetryBuilder}. @@ -122,10 +138,12 @@ public final class ApacheHttpClient5TelemetryBuilder { public ApacheHttpClient5Telemetry build() { ApacheHttpClient5HttpAttributesGetter httpAttributesGetter = ApacheHttpClient5HttpAttributesGetter.INSTANCE; + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build()) + openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractors(additionalExtractors) diff --git a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java index 8fe8f7051e..d39d8dcbb4 100644 --- a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java @@ -18,6 +18,7 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExp 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.instrumenter.SpanStatusExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; @@ -65,6 +66,12 @@ public final class ArmeriaTelemetryBuilder { HttpSpanNameExtractor.builder(ArmeriaHttpClientAttributesGetter.INSTANCE); private final HttpSpanNameExtractorBuilder httpServerSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(ArmeriaHttpServerAttributesGetter.INSTANCE); + private Function< + SpanNameExtractor, ? extends SpanNameExtractor> + clientSpanNameExtractorTransformer = Function.identity(); + private Function< + SpanNameExtractor, ? extends SpanNameExtractor> + serverSpanNameExtractorTransformer = Function.identity(); private final HttpServerRouteBuilder httpServerRouteBuilder = HttpServerRoute.builder(ArmeriaHttpServerAttributesGetter.INSTANCE); @@ -212,18 +219,43 @@ public final class ArmeriaTelemetryBuilder { return this; } + /** Sets custom client {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public ArmeriaTelemetryBuilder setClientSpanNameExtractor( + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + clientSpanNameExtractor) { + this.clientSpanNameExtractorTransformer = clientSpanNameExtractor; + return this; + } + + /** Sets custom server {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public ArmeriaTelemetryBuilder setServerSpanNameExtractor( + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + serverSpanNameExtractor) { + this.serverSpanNameExtractorTransformer = serverSpanNameExtractor; + return this; + } + public ArmeriaTelemetry build() { ArmeriaHttpClientAttributesGetter clientAttributesGetter = ArmeriaHttpClientAttributesGetter.INSTANCE; ArmeriaHttpServerAttributesGetter serverAttributesGetter = ArmeriaHttpServerAttributesGetter.INSTANCE; + SpanNameExtractor clientSpanNameExtractor = + clientSpanNameExtractorTransformer.apply(httpClientSpanNameExtractorBuilder.build()); + SpanNameExtractor serverSpanNameExtractor = + serverSpanNameExtractorTransformer.apply(httpServerSpanNameExtractorBuilder.build()); + InstrumenterBuilder clientInstrumenterBuilder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpClientSpanNameExtractorBuilder.build()); + Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, clientSpanNameExtractor); InstrumenterBuilder serverInstrumenterBuilder = - Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpServerSpanNameExtractorBuilder.build()); + Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, serverSpanNameExtractor); Stream.of(clientInstrumenterBuilder, serverInstrumenterBuilder) .forEach(instrumenter -> instrumenter.addAttributesExtractors(additionalExtractors)); diff --git a/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7TelemetryBuilder.java b/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7TelemetryBuilder.java index df4b9df3ca..8145d8e4fc 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7TelemetryBuilder.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7TelemetryBuilder.java @@ -9,6 +9,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; 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.internal.HttpConstants; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestInstrumenterFactory; @@ -17,6 +18,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.function.Function; import org.elasticsearch.client.Response; public final class ElasticsearchRest7TelemetryBuilder { @@ -27,6 +29,10 @@ public final class ElasticsearchRest7TelemetryBuilder { private final List> attributesExtractors = new ArrayList<>(); private Set knownMethods = HttpConstants.KNOWN_METHODS; + private Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer = Function.identity(); ElasticsearchRest7TelemetryBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -62,6 +68,17 @@ public final class ElasticsearchRest7TelemetryBuilder { return this; } + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public ElasticsearchRest7TelemetryBuilder setSpanNameExtractor( + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + /** * Returns a new {@link ElasticsearchRest7Telemetry} with the settings of this {@link * ElasticsearchRest7TelemetryBuilder}. @@ -69,7 +86,12 @@ public final class ElasticsearchRest7TelemetryBuilder { public ElasticsearchRest7Telemetry build() { Instrumenter instrumenter = ElasticsearchRestInstrumenterFactory.create( - openTelemetry, INSTRUMENTATION_NAME, attributesExtractors, knownMethods, false); + openTelemetry, + INSTRUMENTATION_NAME, + attributesExtractors, + spanNameExtractorTransformer, + knownMethods, + false); return new ElasticsearchRest7Telemetry(instrumenter); } diff --git a/instrumentation/elasticsearch/elasticsearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestJavaagentInstrumenterFactory.java b/instrumentation/elasticsearch/elasticsearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestJavaagentInstrumenterFactory.java index 7b2b4fd853..6c160b9ff5 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestJavaagentInstrumenterFactory.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestJavaagentInstrumenterFactory.java @@ -12,6 +12,7 @@ import io.opentelemetry.instrumentation.elasticsearch.rest.internal.Elasticsearc import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import java.util.Collections; +import java.util.function.Function; import org.elasticsearch.client.Response; public final class ElasticsearchRestJavaagentInstrumenterFactory { @@ -28,6 +29,7 @@ public final class ElasticsearchRestJavaagentInstrumenterFactory { GlobalOpenTelemetry.get(), instrumentationName, Collections.emptyList(), + Function.identity(), CommonConfig.get().getKnownHttpRequestMethods(), CAPTURE_SEARCH_QUERY); } diff --git a/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchRestInstrumenterFactory.java b/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchRestInstrumenterFactory.java index a40c4a75ea..75feafca22 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchRestInstrumenterFactory.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchRestInstrumenterFactory.java @@ -10,8 +10,10 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttribu 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.SpanNameExtractor; import java.util.List; import java.util.Set; +import java.util.function.Function; import org.elasticsearch.client.Response; /** @@ -26,17 +28,22 @@ public final class ElasticsearchRestInstrumenterFactory { OpenTelemetry openTelemetry, String instrumentationName, List> attributesExtractors, + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer, Set knownMethods, boolean captureSearchQuery) { ElasticsearchDbAttributesGetter dbClientAttributesGetter = new ElasticsearchDbAttributesGetter(captureSearchQuery); ElasticsearchClientAttributeExtractor esClientAtrributesExtractor = new ElasticsearchClientAttributeExtractor(knownMethods); - ElasticsearchSpanNameExtractor nameExtractor = - new ElasticsearchSpanNameExtractor(dbClientAttributesGetter); + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply( + new ElasticsearchSpanNameExtractor(dbClientAttributesGetter)); return Instrumenter.builder( - openTelemetry, instrumentationName, nameExtractor) + openTelemetry, instrumentationName, spanNameExtractor) .addAttributesExtractor(DbClientAttributesExtractor.create(dbClientAttributesGetter)) .addAttributesExtractor(esClientAtrributesExtractor) .addAttributesExtractors(attributesExtractors) diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcTelemetryBuilder.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcTelemetryBuilder.java index 499b229fbb..98a9ae52ed 100644 --- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcTelemetryBuilder.java +++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcTelemetryBuilder.java @@ -37,14 +37,10 @@ public final class GrpcTelemetryBuilder { private final OpenTelemetry openTelemetry; @Nullable private String peerService; - @Nullable private Function, ? extends SpanNameExtractor> - clientSpanNameExtractorTransformer; - - @Nullable + clientSpanNameExtractorTransformer = Function.identity(); private Function, ? extends SpanNameExtractor> - serverSpanNameExtractorTransformer; - + serverSpanNameExtractorTransformer = Function.identity(); private final List> additionalExtractors = new ArrayList<>(); private final List> @@ -149,19 +145,12 @@ public final class GrpcTelemetryBuilder { } /** Returns a new {@link GrpcTelemetry} with the settings of this {@link GrpcTelemetryBuilder}. */ - @SuppressWarnings("deprecation") // using createForServerSide() for the old->stable semconv story public GrpcTelemetry build() { SpanNameExtractor originalSpanNameExtractor = new GrpcSpanNameExtractor(); - - SpanNameExtractor clientSpanNameExtractor = originalSpanNameExtractor; - if (clientSpanNameExtractorTransformer != null) { - clientSpanNameExtractor = clientSpanNameExtractorTransformer.apply(originalSpanNameExtractor); - } - - SpanNameExtractor serverSpanNameExtractor = originalSpanNameExtractor; - if (serverSpanNameExtractorTransformer != null) { - serverSpanNameExtractor = serverSpanNameExtractorTransformer.apply(originalSpanNameExtractor); - } + SpanNameExtractor clientSpanNameExtractor = + clientSpanNameExtractorTransformer.apply(originalSpanNameExtractor); + SpanNameExtractor serverSpanNameExtractor = + serverSpanNameExtractorTransformer.apply(originalSpanNameExtractor); InstrumenterBuilder clientInstrumenterBuilder = Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, clientSpanNameExtractor); diff --git a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/JavaHttpClientSingletons.java b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/JavaHttpClientSingletons.java index 6036a0443d..73d7d2aef1 100644 --- a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/JavaHttpClientSingletons.java +++ b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/JavaHttpClientSingletons.java @@ -16,6 +16,7 @@ import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientInstru import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.util.function.Function; public class JavaHttpClientSingletons { @@ -34,6 +35,7 @@ public class JavaHttpClientSingletons { .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), + Function.identity(), singletonList( HttpClientPeerServiceAttributesExtractor.create( JavaHttpClientAttributesGetter.INSTANCE, diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java index 5de01206bc..ca1f753044 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java @@ -9,6 +9,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder; import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter; @@ -19,6 +20,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.function.Consumer; +import java.util.function.Function; public final class JavaHttpClientTelemetryBuilder { @@ -30,6 +32,8 @@ public final class JavaHttpClientTelemetryBuilder { extractorConfigurer = builder -> {}; private Consumer> spanNameExtractorConfigurer = builder -> {}; + private Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer = Function.identity(); private boolean emitExperimentalHttpClientMetrics = false; JavaHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) { @@ -106,12 +110,22 @@ public final class JavaHttpClientTelemetryBuilder { return this; } + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public JavaHttpClientTelemetryBuilder setSpanNameExtractor( + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + public JavaHttpClientTelemetry build() { Instrumenter> instrumenter = JavaHttpClientInstrumenterFactory.createInstrumenter( openTelemetry, extractorConfigurer, spanNameExtractorConfigurer, + spanNameExtractorTransformer, additionalExtractors, emitExperimentalHttpClientMetrics); diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterFactory.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterFactory.java index 40d312298a..12c5439fcb 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterFactory.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientInstrumenterFactory.java @@ -12,6 +12,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics; @@ -22,6 +23,7 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.List; import java.util.function.Consumer; +import java.util.function.Function; /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at @@ -35,6 +37,8 @@ public final class JavaHttpClientInstrumenterFactory { Consumer>> extractorConfigurer, Consumer> spanNameExtractorConfigurer, + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer, List>> additionalExtractors, boolean emitExperimentalHttpClientMetrics) { @@ -48,10 +52,12 @@ public final class JavaHttpClientInstrumenterFactory { HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(httpAttributesGetter); spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder); + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); InstrumenterBuilder> builder = Instrumenter.>builder( - openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build()) + openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractors(additionalExtractors) diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/httpclient/v9_2/JettyHttpClientSingletons.java b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/httpclient/v9_2/JettyHttpClientSingletons.java index 001a8d2b9d..07ab052213 100644 --- a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/httpclient/v9_2/JettyHttpClientSingletons.java +++ b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/httpclient/v9_2/JettyHttpClientSingletons.java @@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientHttpAttributesGetter; import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientInstrumenterFactory; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import java.util.function.Function; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.api.Response; @@ -27,6 +28,7 @@ public class JettyHttpClientSingletons { .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), + Function.identity(), singletonList( HttpClientPeerServiceAttributesExtractor.create( JettyClientHttpAttributesGetter.INSTANCE, diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTelemetryBuilder.java b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTelemetryBuilder.java index 308a2dc2a1..dd6cb72ee7 100644 --- a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTelemetryBuilder.java +++ b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTelemetryBuilder.java @@ -8,6 +8,7 @@ package io.opentelemetry.instrumentation.jetty.httpclient.v9_2; import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder; import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientInstrumenterFactory; @@ -15,6 +16,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.function.Consumer; +import java.util.function.Function; import org.eclipse.jetty.client.HttpClientTransport; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.api.Response; @@ -30,6 +32,8 @@ public final class JettyClientTelemetryBuilder { builder -> {}; private Consumer> spanNameExtractorConfigurer = builder -> {}; + private Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer = Function.identity(); private boolean emitExperimentalHttpClientMetrics = false; private HttpClientTransport httpClientTransport; private SslContextFactory sslContextFactory; @@ -121,6 +125,15 @@ public final class JettyClientTelemetryBuilder { return this; } + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public JettyClientTelemetryBuilder setSpanNameExtractor( + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + /** * Returns a new {@link JettyClientTelemetry} with the settings of this {@link * JettyClientTelemetryBuilder}. @@ -132,6 +145,7 @@ public final class JettyClientTelemetryBuilder { openTelemetry, extractorConfigurer, spanNameExtractorConfigurer, + spanNameExtractorTransformer, additionalExtractors, emitExperimentalHttpClientMetrics), sslContextFactory, diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientInstrumenterFactory.java b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientInstrumenterFactory.java index 57931de103..d07edd2038 100644 --- a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientInstrumenterFactory.java +++ b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientInstrumenterFactory.java @@ -11,6 +11,7 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimen 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; @@ -19,6 +20,7 @@ import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBu import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; import java.util.List; import java.util.function.Consumer; +import java.util.function.Function; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.api.Response; @@ -34,6 +36,8 @@ public final class JettyClientInstrumenterFactory { OpenTelemetry openTelemetry, Consumer> extractorConfigurer, Consumer> spanNameExtractorConfigurer, + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer, List> additionalExtractors, boolean emitExperimentalHttpClientMetrics) { @@ -46,10 +50,12 @@ public final class JettyClientInstrumenterFactory { HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(httpAttributesGetter); spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder); + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build()) + openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractors(additionalExtractors) diff --git a/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/client/NettyClientInstrumenterFactory.java b/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/client/NettyClientInstrumenterFactory.java index 716a713ada..333d43e21f 100644 --- a/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/client/NettyClientInstrumenterFactory.java +++ b/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/client/NettyClientInstrumenterFactory.java @@ -16,6 +16,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics; @@ -28,6 +29,7 @@ import io.opentelemetry.instrumentation.netty.common.internal.NettyConnectionReq import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel; import java.util.List; import java.util.function.Consumer; +import java.util.function.Function; /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at @@ -61,6 +63,10 @@ public final class NettyClientInstrumenterFactory { Consumer> extractorConfigurer, Consumer> spanNameExtractorConfigurer, + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer, List> additionalHttpAttributeExtractors) { NettyHttpClientAttributesGetter httpAttributesGetter = new NettyHttpClientAttributesGetter(); @@ -72,10 +78,12 @@ public final class NettyClientInstrumenterFactory { HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(httpAttributesGetter); spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder); + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder( - openTelemetry, instrumentationName, httpSpanNameExtractorBuilder.build()) + openTelemetry, instrumentationName, spanNameExtractor) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor(extractorBuilder.build()) .addAttributesExtractor( diff --git a/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/NettyClientSingletons.java b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/NettyClientSingletons.java index 30dea16b42..fe0ae9006d 100644 --- a/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/NettyClientSingletons.java +++ b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/NettyClientSingletons.java @@ -17,6 +17,7 @@ import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettySsl import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import java.util.Collections; +import java.util.function.Function; public final class NettyClientSingletons { @@ -48,6 +49,7 @@ public final class NettyClientSingletons { .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), + Function.identity(), Collections.emptyList()); CONNECTION_INSTRUMENTER = factory.createConnectionInstrumenter(); SSL_INSTRUMENTER = factory.createSslInstrumenter(); diff --git a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyClientSingletons.java b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyClientSingletons.java index e7d4f7b55c..e49c8c5375 100644 --- a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyClientSingletons.java +++ b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyClientSingletons.java @@ -18,6 +18,7 @@ import io.opentelemetry.instrumentation.netty.v4_1.internal.client.NettyClientHa import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import java.util.Collections; +import java.util.function.Function; public final class NettyClientSingletons { @@ -50,6 +51,7 @@ public final class NettyClientSingletons { .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), + Function.identity(), Collections.emptyList()); CONNECTION_INSTRUMENTER = factory.createConnectionInstrumenter(); SSL_INSTRUMENTER = factory.createSslInstrumenter(); diff --git a/instrumentation/netty/netty-4.1/library/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/NettyClientTelemetryBuilder.java b/instrumentation/netty/netty-4.1/library/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/NettyClientTelemetryBuilder.java index 84fb441aac..5d32493bc3 100644 --- a/instrumentation/netty/netty-4.1/library/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/NettyClientTelemetryBuilder.java +++ b/instrumentation/netty/netty-4.1/library/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/NettyClientTelemetryBuilder.java @@ -10,6 +10,7 @@ import io.netty.handler.codec.http.HttpResponse; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder; import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel; @@ -20,6 +21,7 @@ import java.util.Collections; import java.util.List; import java.util.Set; import java.util.function.Consumer; +import java.util.function.Function; /** A builder of {@link NettyClientTelemetry}. */ public final class NettyClientTelemetryBuilder { @@ -32,6 +34,11 @@ public final class NettyClientTelemetryBuilder { extractorConfigurer = builder -> {}; private Consumer> spanNameExtractorConfigurer = builder -> {}; + private Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer = Function.identity(); + private boolean emitExperimentalHttpClientMetrics = false; private boolean emitExperimentalHttpClientEvents = false; @@ -120,6 +127,17 @@ public final class NettyClientTelemetryBuilder { return this; } + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public NettyClientTelemetryBuilder setSpanNameExtractor( + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + /** Returns a new {@link NettyClientTelemetry} with the given configuration. */ public NettyClientTelemetry build() { return new NettyClientTelemetry( @@ -131,7 +149,10 @@ public final class NettyClientTelemetryBuilder { PeerServiceResolver.create(Collections.emptyMap()), emitExperimentalHttpClientMetrics) .createHttpInstrumenter( - extractorConfigurer, spanNameExtractorConfigurer, additionalAttributesExtractors), + extractorConfigurer, + spanNameExtractorConfigurer, + spanNameExtractorTransformer, + additionalAttributesExtractors), emitExperimentalHttpClientEvents); } } diff --git a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java index 0d379f21e9..8c4d3a0ee8 100644 --- a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java +++ b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java @@ -18,6 +18,7 @@ import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpAttributesGet import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpInstrumenterFactory; import io.opentelemetry.instrumentation.okhttp.v3_0.internal.TracingInterceptor; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import java.util.function.Function; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; @@ -34,6 +35,7 @@ public final class OkHttp3Singletons { .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), + Function.identity(), singletonList( HttpClientPeerServiceAttributesExtractor.create( OkHttpAttributesGetter.INSTANCE, CommonConfig.get().getPeerServiceResolver())), diff --git a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTelemetryBuilder.java b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTelemetryBuilder.java index 1df67fef29..131b036484 100644 --- a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTelemetryBuilder.java +++ b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTelemetryBuilder.java @@ -8,6 +8,7 @@ package io.opentelemetry.instrumentation.okhttp.v3_0; import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder; import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpInstrumenterFactory; @@ -15,6 +16,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.function.Consumer; +import java.util.function.Function; import okhttp3.Request; import okhttp3.Response; @@ -28,6 +30,8 @@ public final class OkHttpTelemetryBuilder { builder -> {}; private Consumer> spanNameExtractorConfigurer = builder -> {}; + private Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer = Function.identity(); private boolean emitExperimentalHttpClientMetrics = false; OkHttpTelemetryBuilder(OpenTelemetry openTelemetry) { @@ -104,6 +108,15 @@ public final class OkHttpTelemetryBuilder { return this; } + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public OkHttpTelemetryBuilder setSpanNameExtractor( + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + /** * Returns a new {@link OkHttpTelemetry} with the settings of this {@link OkHttpTelemetryBuilder}. */ @@ -113,6 +126,7 @@ public final class OkHttpTelemetryBuilder { openTelemetry, extractorConfigurer, spanNameExtractorConfigurer, + spanNameExtractorTransformer, additionalExtractors, emitExperimentalHttpClientMetrics), openTelemetry.getPropagators()); diff --git a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpInstrumenterFactory.java b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpInstrumenterFactory.java index 44b9ed7e17..bc2b76f8fe 100644 --- a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpInstrumenterFactory.java +++ b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpInstrumenterFactory.java @@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimen 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; @@ -21,6 +22,7 @@ import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBu import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; import java.util.List; import java.util.function.Consumer; +import java.util.function.Function; import okhttp3.Request; import okhttp3.Response; @@ -36,6 +38,8 @@ public final class OkHttpInstrumenterFactory { OpenTelemetry openTelemetry, Consumer> extractorConfigurer, Consumer> spanNameExtractorConfigurer, + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer, List> additionalAttributesExtractors, boolean emitExperimentalHttpClientMetrics) { @@ -48,10 +52,12 @@ public final class OkHttpInstrumenterFactory { HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(httpAttributesGetter); spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder); + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build()) + openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor(extractorBuilder.build()) .addAttributesExtractors(additionalAttributesExtractors) diff --git a/instrumentation/quartz-2.0/library/src/main/java/io/opentelemetry/instrumentation/quartz/v2_0/QuartzTelemetryBuilder.java b/instrumentation/quartz-2.0/library/src/main/java/io/opentelemetry/instrumentation/quartz/v2_0/QuartzTelemetryBuilder.java index 2cbc4785fb..27269c4b45 100644 --- a/instrumentation/quartz-2.0/library/src/main/java/io/opentelemetry/instrumentation/quartz/v2_0/QuartzTelemetryBuilder.java +++ b/instrumentation/quartz-2.0/library/src/main/java/io/opentelemetry/instrumentation/quartz/v2_0/QuartzTelemetryBuilder.java @@ -12,21 +12,24 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttribute 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 java.util.ArrayList; import java.util.List; +import java.util.function.Function; import org.quartz.JobExecutionContext; /** A builder of {@link QuartzTelemetry}. */ public final class QuartzTelemetryBuilder { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.quartz-2.0"; - private final OpenTelemetry openTelemetry; - private final List> additionalExtractors = new ArrayList<>(); - private boolean captureExperimentalSpanAttributes; + private Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer = Function.identity(); QuartzTelemetryBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -55,12 +58,26 @@ public final class QuartzTelemetryBuilder { return this; } + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public QuartzTelemetryBuilder setSpanNameExtractor( + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + /** * Returns a new {@link QuartzTelemetry} with the settings of this {@link QuartzTelemetryBuilder}. */ public QuartzTelemetry build() { + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(new QuartzSpanNameExtractor()); + InstrumenterBuilder instrumenter = - Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, new QuartzSpanNameExtractor()); + Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor); if (captureExperimentalSpanAttributes) { instrumenter.addAttributesExtractor( diff --git a/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/R2dbcTelemetryBuilder.java b/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/R2dbcTelemetryBuilder.java index 16627220bb..3cd1f16e0e 100644 --- a/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/R2dbcTelemetryBuilder.java +++ b/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/R2dbcTelemetryBuilder.java @@ -8,14 +8,18 @@ package io.opentelemetry.instrumentation.r2dbc.v1_0; import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.r2dbc.v1_0.internal.DbExecution; import io.opentelemetry.instrumentation.r2dbc.v1_0.internal.R2dbcInstrumenterBuilder; +import java.util.function.Function; /** A builder of {@link R2dbcTelemetry}. */ public final class R2dbcTelemetryBuilder { private final R2dbcInstrumenterBuilder instrumenterBuilder; private boolean statementSanitizationEnabled = true; + private Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer = Function.identity(); R2dbcTelemetryBuilder(OpenTelemetry openTelemetry) { instrumenterBuilder = new R2dbcInstrumenterBuilder(openTelemetry); @@ -39,10 +43,20 @@ public final class R2dbcTelemetryBuilder { return this; } + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public R2dbcTelemetryBuilder setSpanNameExtractor( + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + /** * Returns a new {@link R2dbcTelemetry} with the settings of this {@link R2dbcTelemetryBuilder}. */ public R2dbcTelemetry build() { - return new R2dbcTelemetry(instrumenterBuilder.build(statementSanitizationEnabled)); + return new R2dbcTelemetry( + instrumenterBuilder.build(spanNameExtractorTransformer, statementSanitizationEnabled)); } } diff --git a/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcInstrumenterBuilder.java b/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcInstrumenterBuilder.java index c24a1e9230..0b15861ff9 100644 --- a/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcInstrumenterBuilder.java +++ b/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcInstrumenterBuilder.java @@ -12,9 +12,11 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttrib 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.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor; import java.util.ArrayList; import java.util.List; +import java.util.function.Function; /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at @@ -40,16 +42,22 @@ public final class R2dbcInstrumenterBuilder { return this; } - public Instrumenter build(boolean statementSanitizationEnabled) { + public Instrumenter build( + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer, + boolean statementSanitizationEnabled) { + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply( + DbClientSpanNameExtractor.create(R2dbcSqlAttributesGetter.INSTANCE)); + return Instrumenter.builder( - openTelemetry, - INSTRUMENTATION_NAME, - DbClientSpanNameExtractor.create(R2dbcSqlAttributesGetter.INSTANCE)) + openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) .addAttributesExtractor( SqlClientAttributesExtractor.builder(R2dbcSqlAttributesGetter.INSTANCE) .setStatementSanitizationEnabled(statementSanitizationEnabled) .build()) .addAttributesExtractor(ServerAttributesExtractor.create(R2dbcNetAttributesGetter.INSTANCE)) + .addAttributesExtractors(additionalExtractors) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } } 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 cc3a103c3e..1542d5070d 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 @@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExp 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; @@ -27,6 +28,7 @@ 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; import ratpack.http.Request; import ratpack.http.Response; import ratpack.http.client.HttpResponse; @@ -53,6 +55,11 @@ public final class RatpackTelemetryBuilder { 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); @@ -178,6 +185,24 @@ public final class RatpackTelemetryBuilder { return this; } + /** Sets custom client {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public RatpackTelemetryBuilder setClientSpanNameExtractor( + Function, ? extends SpanNameExtractor> + clientSpanNameExtractor) { + this.clientSpanNameExtractorTransformer = clientSpanNameExtractor; + return this; + } + + /** Sets custom server {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public RatpackTelemetryBuilder setServerSpanNameExtractor( + Function, ? extends SpanNameExtractor> + serverSpanNameExtractor) { + this.serverSpanNameExtractorTransformer = serverSpanNameExtractor; + return this; + } + /** Returns a new {@link RatpackTelemetry} with the configuration of this builder. */ public RatpackTelemetry build() { return new RatpackTelemetry(buildServerInstrumenter(), httpClientInstrumenter()); @@ -185,10 +210,12 @@ public final class RatpackTelemetryBuilder { private Instrumenter buildServerInstrumenter() { RatpackHttpAttributesGetter httpAttributes = RatpackHttpAttributesGetter.INSTANCE; + SpanNameExtractor spanNameExtractor = + serverSpanNameExtractorTransformer.apply(httpServerSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpServerSpanNameExtractorBuilder.build()) + openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes)) .addAttributesExtractor(httpServerAttributesExtractorBuilder.build()) .addAttributesExtractors(additionalExtractors) @@ -204,10 +231,12 @@ public final class RatpackTelemetryBuilder { private Instrumenter httpClientInstrumenter() { RatpackHttpClientAttributesGetter httpAttributes = RatpackHttpClientAttributesGetter.INSTANCE; + SpanNameExtractor spanNameExtractor = + clientSpanNameExtractorTransformer.apply(httpClientSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpClientSpanNameExtractorBuilder.build()) + openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes)) .addAttributesExtractor(httpClientAttributesExtractorBuilder.build()) .addAttributesExtractors(additionalHttpClientExtractors) 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 d2a61312c2..d5711895e9 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 @@ -12,6 +12,7 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExp 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; @@ -23,6 +24,7 @@ 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; import org.restlet.data.Request; import org.restlet.data.Response; @@ -39,6 +41,8 @@ public final class RestletTelemetryBuilder { 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; @@ -114,16 +118,27 @@ public final class RestletTelemetryBuilder { return this; } + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public RestletTelemetryBuilder setSpanNameExtractor( + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + /** * Returns a new {@link RestletTelemetry} with the settings of this {@link * RestletTelemetryBuilder}. */ public RestletTelemetry build() { RestletHttpAttributesGetter httpAttributesGetter = RestletHttpAttributesGetter.INSTANCE; + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build()) + openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractors(additionalExtractors) 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 bdad77bc98..86cc9544a7 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 @@ -9,6 +9,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; 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; @@ -20,6 +21,7 @@ import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumente import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.function.Function; import org.restlet.Request; import org.restlet.Response; @@ -34,9 +36,10 @@ public final class RestletTelemetryBuilder { 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; RestletTelemetryBuilder(OpenTelemetry openTelemetry) { @@ -110,16 +113,28 @@ public final class RestletTelemetryBuilder { return this; } + /** Sets custom {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public RestletTelemetryBuilder setSpanNameExtractor( + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer) { + this.spanNameExtractorTransformer = spanNameExtractorTransformer; + return this; + } + /** * Returns a new {@link RestletTelemetry} with the settings of this {@link * RestletTelemetryBuilder}. */ public RestletTelemetry build() { + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); + Instrumenter serverInstrumenter = RestletInstrumenterFactory.newServerInstrumenter( openTelemetry, httpAttributesExtractorBuilder.build(), - httpSpanNameExtractorBuilder.build(), + spanNameExtractor, httpServerRouteBuilder.build(), additionalExtractors, emitExperimentalHttpServerMetrics); 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 index 5b3ae105a7..54a60a980e 100644 --- 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 @@ -30,7 +30,7 @@ public final class RestletInstrumenterFactory { public static Instrumenter newServerInstrumenter( OpenTelemetry openTelemetry, AttributesExtractor httpServerAttributesExtractor, - SpanNameExtractor httpServerSpanNameExtractor, + SpanNameExtractor httpServerSpanNameExtractor, ContextCustomizer httpServerRoute, List> additionalExtractors, boolean emitExperimentalHttpServerMetrics) { 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 8809487b9f..20fae270a2 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 @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.function.Function; -import javax.annotation.Nullable; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpResponse; @@ -39,11 +38,9 @@ public final class SpringWebTelemetryBuilder { HttpClientAttributesExtractor.builder(SpringWebHttpAttributesGetter.INSTANCE); private final HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(SpringWebHttpAttributesGetter.INSTANCE); - private boolean emitExperimentalHttpClientMetrics = false; - - @Nullable private Function, ? extends SpanNameExtractor> - spanNameExtractorTransformer; + spanNameExtractorTransformer = Function.identity(); + private boolean emitExperimentalHttpClientMetrics = false; SpringWebTelemetryBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -130,12 +127,8 @@ public final class SpringWebTelemetryBuilder { */ public SpringWebTelemetry build() { SpringWebHttpAttributesGetter httpAttributesGetter = SpringWebHttpAttributesGetter.INSTANCE; - - SpanNameExtractor originalSpanNameExtractor = httpSpanNameExtractorBuilder.build(); - SpanNameExtractor spanNameExtractor = originalSpanNameExtractor; - if (spanNameExtractorTransformer != null) { - spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor); - } + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder( diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/client/WebClientHelper.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/client/WebClientHelper.java index 3d77440012..b5bd239c13 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/client/WebClientHelper.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/client/WebClientHelper.java @@ -15,6 +15,7 @@ import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.WebClientHt import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.WebClientTracingFilter; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import java.util.List; +import java.util.function.Function; import org.springframework.web.reactive.function.client.ClientRequest; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.ExchangeFilterFunction; @@ -30,6 +31,7 @@ public final class WebClientHelper { .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), + Function.identity(), singletonList( HttpClientPeerServiceAttributesExtractor.create( WebClientHttpAttributesGetter.INSTANCE, 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 8908ab2972..a24930d016 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 @@ -12,6 +12,7 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExp 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.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; @@ -26,6 +27,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.function.Consumer; +import java.util.function.Function; import org.springframework.web.reactive.function.client.ClientRequest; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.server.ServerWebExchange; @@ -49,6 +51,14 @@ public final class SpringWebfluxTelemetryBuilder { private final HttpServerRouteBuilder httpServerRouteBuilder = HttpServerRoute.builder(WebfluxServerHttpAttributesGetter.INSTANCE); + private Function< + SpanNameExtractor, ? extends SpanNameExtractor> + clientSpanNameExtractorTransformer = Function.identity(); + private Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + serverSpanNameExtractorTransformer = Function.identity(); + private Consumer> clientExtractorConfigurer = builder -> {}; private Consumer> clientSpanNameExtractorConfigurer = @@ -188,17 +198,37 @@ public final class SpringWebfluxTelemetryBuilder { return this; } + /** Sets custom client {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public SpringWebfluxTelemetryBuilder setClientSpanNameExtractor( + Function, ? extends SpanNameExtractor> + clientSpanNameExtractor) { + this.clientSpanNameExtractorTransformer = clientSpanNameExtractor; + return this; + } + + /** Sets custom server {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public SpringWebfluxTelemetryBuilder setServerSpanNameExtractor( + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + serverSpanNameExtractor) { + this.serverSpanNameExtractorTransformer = serverSpanNameExtractor; + return this; + } + /** * Returns a new {@link SpringWebfluxTelemetry} with the settings of this {@link * SpringWebfluxTelemetryBuilder}. */ public SpringWebfluxTelemetry build() { - Instrumenter clientInstrumenter = ClientInstrumenterFactory.create( openTelemetry, clientExtractorConfigurer, clientSpanNameExtractorConfigurer, + clientSpanNameExtractorTransformer, clientAdditionalExtractors, emitExperimentalHttpClientTelemetry); @@ -211,10 +241,12 @@ public final class SpringWebfluxTelemetryBuilder { private Instrumenter buildServerInstrumenter() { WebfluxServerHttpAttributesGetter getter = WebfluxServerHttpAttributesGetter.INSTANCE; + SpanNameExtractor spanNameExtractor = + serverSpanNameExtractorTransformer.apply(httpServerSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpServerSpanNameExtractorBuilder.build()) + openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(getter)) .addAttributesExtractor(httpServerAttributesExtractorBuilder.build()) .addAttributesExtractors(serverAdditionalExtractors) diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/ClientInstrumenterFactory.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/ClientInstrumenterFactory.java index 262faa1701..bb8217539d 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/ClientInstrumenterFactory.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/ClientInstrumenterFactory.java @@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimen 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; @@ -21,6 +22,7 @@ import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBu import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor; import java.util.List; import java.util.function.Consumer; +import java.util.function.Function; import org.springframework.web.reactive.function.client.ClientRequest; import org.springframework.web.reactive.function.client.ClientResponse; @@ -39,6 +41,8 @@ public final class ClientInstrumenterFactory { Consumer> extractorConfigurer, Consumer> spanNameExtractorConfigurer, + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer, List> additionalExtractors, boolean emitExperimentalHttpClientTelemetry) { @@ -51,10 +55,12 @@ public final class ClientInstrumenterFactory { HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(httpAttributesGetter); spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder); + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); InstrumenterBuilder clientBuilder = Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build()) + openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor(extractorBuilder.build()) .addAttributesExtractors(additionalExtractors) 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 a7b487fbdd..67a3a000b3 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 @@ -25,7 +25,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.function.Function; -import javax.annotation.Nullable; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -44,13 +43,10 @@ public final class SpringWebMvcTelemetryBuilder { HttpSpanNameExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE); private final HttpServerRouteBuilder httpServerRouteBuilder = HttpServerRoute.builder(SpringWebMvcHttpAttributesGetter.INSTANCE); - - @Nullable private Function< SpanNameExtractor, ? extends SpanNameExtractor> - spanNameExtractorTransformer; - + spanNameExtractorTransformer = Function.identity(); private boolean emitExperimentalHttpServerMetrics = false; SpringWebMvcTelemetryBuilder(OpenTelemetry openTelemetry) { @@ -142,13 +138,8 @@ public final class SpringWebMvcTelemetryBuilder { public SpringWebMvcTelemetry build() { SpringWebMvcHttpAttributesGetter httpAttributesGetter = SpringWebMvcHttpAttributesGetter.INSTANCE; - - SpanNameExtractor originalSpanNameExtractor = - httpSpanNameExtractorBuilder.build(); - SpanNameExtractor spanNameExtractor = originalSpanNameExtractor; - if (spanNameExtractorTransformer != null) { - spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor); - } + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder( 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 2f135227f7..9b3e3b9e4e 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 @@ -27,7 +27,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.function.Function; -import javax.annotation.Nullable; /** A builder of {@link SpringWebMvcTelemetry}. */ public final class SpringWebMvcTelemetryBuilder { @@ -44,13 +43,10 @@ public final class SpringWebMvcTelemetryBuilder { HttpSpanNameExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE); private final HttpServerRouteBuilder httpServerRouteBuilder = HttpServerRoute.builder(SpringWebMvcHttpAttributesGetter.INSTANCE); - - @Nullable private Function< SpanNameExtractor, ? extends SpanNameExtractor> - spanNameExtractorTransformer; - + spanNameExtractorTransformer = Function.identity(); private boolean emitExperimentalHttpServerMetrics = false; SpringWebMvcTelemetryBuilder(OpenTelemetry openTelemetry) { @@ -142,13 +138,8 @@ public final class SpringWebMvcTelemetryBuilder { public SpringWebMvcTelemetry build() { SpringWebMvcHttpAttributesGetter httpAttributesGetter = SpringWebMvcHttpAttributesGetter.INSTANCE; - - SpanNameExtractor originalSpanNameExtractor = - httpSpanNameExtractorBuilder.build(); - SpanNameExtractor spanNameExtractor = originalSpanNameExtractor; - if (spanNameExtractorTransformer != null) { - spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor); - } + SpanNameExtractor spanNameExtractor = + spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build()); InstrumenterBuilder builder = Instrumenter.builder(