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 83fb14de6ff4..bbd4f9ad1d01 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.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 DubboTelemetryBuilder addAttributesExtractor( 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 DubboTelemetry build() { 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 DubboTelemetry build() { 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 d664f15c7522..daf0d8c6889e 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.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.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 ApacheHttpClientTelemetryBuilder setEmitExperimentalHttpClientMetrics( 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 ApacheHttpClientTelemetryBuilder setEmitExperimentalHttpClientMetrics( 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 5097b8b204a4..176555846849 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.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.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 ApacheHttpClient5TelemetryBuilder setEmitExperimentalHttpClientMetrics( 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 ApacheHttpClient5TelemetryBuilder setEmitExperimentalHttpClientMetrics( 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 8fe8f7051e41..d39d8dcbb47a 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.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 ArmeriaTelemetryBuilder setEmitExperimentalHttpServerMetrics( 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 df4b9df3ca93..8145d8e4fc91 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 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.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 ElasticsearchRest7TelemetryBuilder setKnownMethods(Set knownMetho 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 ElasticsearchRest7TelemetryBuilder setKnownMethods(Set knownMetho 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 7b2b4fd85337..6c160b9ff546 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.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 static Instrumenter create( 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 a40c4a75eae7..75feafca224c 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.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 static Instrumenter create( 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 499b229fbb1f..98a9ae52ed94 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 GrpcTelemetryBuilder setCapturedServerRequestMetadata( } /** 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 6036a0443dcb..73d7d2aef13a 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.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 5de01206bc61..ca1f753044a7 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 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.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 JavaHttpClientTelemetryBuilder setEmitExperimentalHttpClientMetrics( 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 40d312298add..12c5439fcb7b 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.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.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 static Instrumenter> createInstrumenter( Consumer>> extractorConfigurer, Consumer> spanNameExtractorConfigurer, + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer, List>> additionalExtractors, boolean emitExperimentalHttpClientMetrics) { @@ -48,10 +52,12 @@ public static Instrumenter> createInstrumenter( 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 001a8d2b9d62..07ab0522137d 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.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 308a2dc2a135..dd6cb72ee7f0 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 @@ 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.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 JettyClientTelemetryBuilder setEmitExperimentalHttpClientMetrics( 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 JettyClientTelemetry build() { 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 57931de10305..d07edd2038af 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.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.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 static Instrumenter create( OpenTelemetry openTelemetry, Consumer> extractorConfigurer, Consumer> spanNameExtractorConfigurer, + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer, List> additionalExtractors, boolean emitExperimentalHttpClientMetrics) { @@ -46,10 +50,12 @@ public static Instrumenter create( 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 716a713ada17..333d43e21f41 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.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.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 Instrumenter createHttpInstrumenter( Consumer> extractorConfigurer, Consumer> spanNameExtractorConfigurer, + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + spanNameExtractorTransformer, List> additionalHttpAttributeExtractors) { NettyHttpClientAttributesGetter httpAttributesGetter = new NettyHttpClientAttributesGetter(); @@ -72,10 +78,12 @@ public Instrumenter createHttpInstrumenter( 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 30dea16b42e1..fe0ae9006dc3 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.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 e7d4f7b55cf3..e49c8c5375dd 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.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 84fb441aacb1..5d32493bc33f 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.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.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 NettyClientTelemetryBuilder setEmitExperimentalHttpClientMetrics( 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 NettyClientTelemetry build() { 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 0d379f21e977..8c4d3a0ee8da 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.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 1df67fef295f..131b03648414 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 @@ 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.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 OkHttpTelemetryBuilder setEmitExperimentalHttpClientMetrics( 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 OkHttpTelemetry build() { 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 44b9ed7e1754..bc2b76f8fe67 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.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.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 static Instrumenter create( OpenTelemetry openTelemetry, Consumer> extractorConfigurer, Consumer> spanNameExtractorConfigurer, + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer, List> additionalAttributesExtractors, boolean emitExperimentalHttpClientMetrics) { @@ -48,10 +52,12 @@ public static Instrumenter create( 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 2cbc4785fb70..27269c4b45e1 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.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 QuartzTelemetryBuilder setCaptureExperimentalSpanAttributes( 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 16627220bb42..3cd1f16e0eaf 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 @@ 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 R2dbcTelemetryBuilder setStatementSanitizationEnabled(boolean enabled) { 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 c24a1e9230b1..0b15861ff915 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.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 R2dbcInstrumenterBuilder addAttributeExtractor( 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 cc3a103c3e76..1542d5070dab 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.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 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 RatpackTelemetryBuilder setEmitExperimentalHttpServerMetrics( 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 RatpackTelemetry build() { 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 @@ private Instrumenter buildServerInstrumenter() { 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 d2a61312c2d0..d5711895e9d5 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.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 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 RestletTelemetryBuilder setEmitExperimentalHttpServerMetrics( 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 bdad77bc980b..86cc9544a729 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 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 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 RestletTelemetryBuilder setEmitExperimentalHttpServerMetrics( 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 5b3ae105a7b5..54a60a980ec4 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 8809487b9f21..20fae270a2ea 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.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 SpringWebTelemetryBuilder setEmitExperimentalHttpClientMetrics( */ 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 3d77440012a3..b5bd239c1388 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.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 8908ab2972eb..a24930d01695 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.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.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 SpringWebfluxTelemetryBuilder setEmitExperimentalHttpServerTelemetry( 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 SpringWebfluxTelemetry build() { 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 262faa170141..bb8217539da3 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.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.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 static Instrumenter create( Consumer> extractorConfigurer, Consumer> spanNameExtractorConfigurer, + Function, ? extends SpanNameExtractor> + spanNameExtractorTransformer, List> additionalExtractors, boolean emitExperimentalHttpClientTelemetry) { @@ -51,10 +55,12 @@ public static Instrumenter create( 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 a7b487fbdd3f..67a3a000b3ae 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.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 SpringWebMvcTelemetryBuilder setEmitExperimentalHttpServerMetrics( 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 2f135227f735..9b3e3b9e4e48 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.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 SpringWebMvcTelemetryBuilder setEmitExperimentalHttpServerMetrics( 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(