Allow library instrumentations to override span name (#11355)

Co-authored-by: Trask Stalnaker <trask.stalnaker@gmail.com>
This commit is contained in:
Lauri Tulmin 2024-05-17 12:10:32 +03:00 committed by GitHub
parent 004e49d281
commit 7a06507f80
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
34 changed files with 418 additions and 88 deletions

View File

@ -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<AttributesExtractor<DubboRequest, Result>> attributesExtractors =
new ArrayList<>();
private Function<
SpanNameExtractor<DubboRequest>, ? extends SpanNameExtractor<? super DubboRequest>>
clientSpanNameExtractorTransformer = Function.identity();
private Function<
SpanNameExtractor<DubboRequest>, ? extends SpanNameExtractor<? super DubboRequest>>
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<SpanNameExtractor<DubboRequest>, ? extends SpanNameExtractor<? super DubboRequest>>
clientSpanNameExtractor) {
this.clientSpanNameExtractorTransformer = clientSpanNameExtractor;
return this;
}
/** Sets custom server {@link SpanNameExtractor} via transform function. */
@CanIgnoreReturnValue
public DubboTelemetryBuilder setServerSpanNameExtractor(
Function<SpanNameExtractor<DubboRequest>, ? extends SpanNameExtractor<? super DubboRequest>>
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<DubboRequest> spanNameExtractor =
RpcSpanNameExtractor.create(rpcAttributesGetter);
SpanNameExtractor<? super DubboRequest> clientSpanNameExtractor =
clientSpanNameExtractorTransformer.apply(spanNameExtractor);
SpanNameExtractor<? super DubboRequest> serverSpanNameExtractor =
serverSpanNameExtractorTransformer.apply(spanNameExtractor);
DubboClientNetworkAttributesGetter netClientAttributesGetter =
new DubboClientNetworkAttributesGetter();
DubboNetworkServerAttributesGetter netServerAttributesGetter =
@ -70,14 +99,14 @@ public final class DubboTelemetryBuilder {
InstrumenterBuilder<DubboRequest, Result> serverInstrumenterBuilder =
Instrumenter.<DubboRequest, Result>builder(
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
openTelemetry, INSTRUMENTATION_NAME, serverSpanNameExtractor)
.addAttributesExtractor(RpcServerAttributesExtractor.create(rpcAttributesGetter))
.addAttributesExtractor(NetworkAttributesExtractor.create(netServerAttributesGetter))
.addAttributesExtractors(attributesExtractors);
InstrumenterBuilder<DubboRequest, Result> clientInstrumenterBuilder =
Instrumenter.<DubboRequest, Result>builder(
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
openTelemetry, INSTRUMENTATION_NAME, clientSpanNameExtractor)
.addAttributesExtractor(RpcClientAttributesExtractor.create(rpcAttributesGetter))
.addAttributesExtractor(ServerAttributesExtractor.create(netClientAttributesGetter))
.addAttributesExtractor(NetworkAttributesExtractor.create(netClientAttributesGetter))

View File

@ -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<ApacheHttpClientRequest> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(ApacheHttpClientHttpAttributesGetter.INSTANCE);
private Function<
SpanNameExtractor<ApacheHttpClientRequest>,
? extends SpanNameExtractor<? super ApacheHttpClientRequest>>
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<ApacheHttpClientRequest>,
? extends SpanNameExtractor<? super ApacheHttpClientRequest>>
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<? super ApacheHttpClientRequest> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
InstrumenterBuilder<ApacheHttpClientRequest, HttpResponse> builder =
Instrumenter.<ApacheHttpClientRequest, HttpResponse>builder(
openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalExtractors)

View File

@ -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<ApacheHttpClient5Request>
httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(ApacheHttpClient5HttpAttributesGetter.INSTANCE);
private Function<
SpanNameExtractor<ApacheHttpClient5Request>,
? extends SpanNameExtractor<? super ApacheHttpClient5Request>>
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<ApacheHttpClient5Request>,
? extends SpanNameExtractor<? super ApacheHttpClient5Request>>
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<? super ApacheHttpClient5Request> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
InstrumenterBuilder<ApacheHttpClient5Request, HttpResponse> builder =
Instrumenter.<ApacheHttpClient5Request, HttpResponse>builder(
openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalExtractors)

View File

@ -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<RequestContext> httpServerSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(ArmeriaHttpServerAttributesGetter.INSTANCE);
private Function<
SpanNameExtractor<RequestContext>, ? extends SpanNameExtractor<? super RequestContext>>
clientSpanNameExtractorTransformer = Function.identity();
private Function<
SpanNameExtractor<RequestContext>, ? extends SpanNameExtractor<? super RequestContext>>
serverSpanNameExtractorTransformer = Function.identity();
private final HttpServerRouteBuilder<RequestContext> 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<RequestContext>,
? extends SpanNameExtractor<? super RequestContext>>
clientSpanNameExtractor) {
this.clientSpanNameExtractorTransformer = clientSpanNameExtractor;
return this;
}
/** Sets custom server {@link SpanNameExtractor} via transform function. */
@CanIgnoreReturnValue
public ArmeriaTelemetryBuilder setServerSpanNameExtractor(
Function<
SpanNameExtractor<RequestContext>,
? extends SpanNameExtractor<? super RequestContext>>
serverSpanNameExtractor) {
this.serverSpanNameExtractorTransformer = serverSpanNameExtractor;
return this;
}
public ArmeriaTelemetry build() {
ArmeriaHttpClientAttributesGetter clientAttributesGetter =
ArmeriaHttpClientAttributesGetter.INSTANCE;
ArmeriaHttpServerAttributesGetter serverAttributesGetter =
ArmeriaHttpServerAttributesGetter.INSTANCE;
SpanNameExtractor<? super RequestContext> clientSpanNameExtractor =
clientSpanNameExtractorTransformer.apply(httpClientSpanNameExtractorBuilder.build());
SpanNameExtractor<? super RequestContext> serverSpanNameExtractor =
serverSpanNameExtractorTransformer.apply(httpServerSpanNameExtractorBuilder.build());
InstrumenterBuilder<ClientRequestContext, RequestLog> clientInstrumenterBuilder =
Instrumenter.builder(
openTelemetry, INSTRUMENTATION_NAME, httpClientSpanNameExtractorBuilder.build());
Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, clientSpanNameExtractor);
InstrumenterBuilder<ServiceRequestContext, RequestLog> serverInstrumenterBuilder =
Instrumenter.builder(
openTelemetry, INSTRUMENTATION_NAME, httpServerSpanNameExtractorBuilder.build());
Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, serverSpanNameExtractor);
Stream.of(clientInstrumenterBuilder, serverInstrumenterBuilder)
.forEach(instrumenter -> instrumenter.addAttributesExtractors(additionalExtractors));

View File

@ -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<AttributesExtractor<ElasticsearchRestRequest, Response>> attributesExtractors =
new ArrayList<>();
private Set<String> knownMethods = HttpConstants.KNOWN_METHODS;
private Function<
SpanNameExtractor<ElasticsearchRestRequest>,
? extends SpanNameExtractor<? super ElasticsearchRestRequest>>
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<ElasticsearchRestRequest>,
? extends SpanNameExtractor<? super ElasticsearchRestRequest>>
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<ElasticsearchRestRequest, Response> instrumenter =
ElasticsearchRestInstrumenterFactory.create(
openTelemetry, INSTRUMENTATION_NAME, attributesExtractors, knownMethods, false);
openTelemetry,
INSTRUMENTATION_NAME,
attributesExtractors,
spanNameExtractorTransformer,
knownMethods,
false);
return new ElasticsearchRest7Telemetry(instrumenter);
}

View File

@ -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);
}

View File

@ -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<AttributesExtractor<ElasticsearchRestRequest, Response>> attributesExtractors,
Function<
SpanNameExtractor<ElasticsearchRestRequest>,
? extends SpanNameExtractor<? super ElasticsearchRestRequest>>
spanNameExtractorTransformer,
Set<String> knownMethods,
boolean captureSearchQuery) {
ElasticsearchDbAttributesGetter dbClientAttributesGetter =
new ElasticsearchDbAttributesGetter(captureSearchQuery);
ElasticsearchClientAttributeExtractor esClientAtrributesExtractor =
new ElasticsearchClientAttributeExtractor(knownMethods);
ElasticsearchSpanNameExtractor nameExtractor =
new ElasticsearchSpanNameExtractor(dbClientAttributesGetter);
SpanNameExtractor<? super ElasticsearchRestRequest> spanNameExtractor =
spanNameExtractorTransformer.apply(
new ElasticsearchSpanNameExtractor(dbClientAttributesGetter));
return Instrumenter.<ElasticsearchRestRequest, Response>builder(
openTelemetry, instrumentationName, nameExtractor)
openTelemetry, instrumentationName, spanNameExtractor)
.addAttributesExtractor(DbClientAttributesExtractor.create(dbClientAttributesGetter))
.addAttributesExtractor(esClientAtrributesExtractor)
.addAttributesExtractors(attributesExtractors)

View File

@ -37,14 +37,10 @@ public final class GrpcTelemetryBuilder {
private final OpenTelemetry openTelemetry;
@Nullable private String peerService;
@Nullable
private Function<SpanNameExtractor<GrpcRequest>, ? extends SpanNameExtractor<? super GrpcRequest>>
clientSpanNameExtractorTransformer;
@Nullable
clientSpanNameExtractorTransformer = Function.identity();
private Function<SpanNameExtractor<GrpcRequest>, ? extends SpanNameExtractor<? super GrpcRequest>>
serverSpanNameExtractorTransformer;
serverSpanNameExtractorTransformer = Function.identity();
private final List<AttributesExtractor<? super GrpcRequest, ? super Status>>
additionalExtractors = new ArrayList<>();
private final List<AttributesExtractor<? super GrpcRequest, ? super Status>>
@ -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<GrpcRequest> originalSpanNameExtractor = new GrpcSpanNameExtractor();
SpanNameExtractor<? super GrpcRequest> clientSpanNameExtractor = originalSpanNameExtractor;
if (clientSpanNameExtractorTransformer != null) {
clientSpanNameExtractor = clientSpanNameExtractorTransformer.apply(originalSpanNameExtractor);
}
SpanNameExtractor<? super GrpcRequest> serverSpanNameExtractor = originalSpanNameExtractor;
if (serverSpanNameExtractorTransformer != null) {
serverSpanNameExtractor = serverSpanNameExtractorTransformer.apply(originalSpanNameExtractor);
}
SpanNameExtractor<? super GrpcRequest> clientSpanNameExtractor =
clientSpanNameExtractorTransformer.apply(originalSpanNameExtractor);
SpanNameExtractor<? super GrpcRequest> serverSpanNameExtractor =
serverSpanNameExtractorTransformer.apply(originalSpanNameExtractor);
InstrumenterBuilder<GrpcRequest, Status> clientInstrumenterBuilder =
Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, clientSpanNameExtractor);

View File

@ -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,

View File

@ -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<HttpSpanNameExtractorBuilder<HttpRequest>> spanNameExtractorConfigurer =
builder -> {};
private Function<SpanNameExtractor<HttpRequest>, ? extends SpanNameExtractor<? super HttpRequest>>
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<SpanNameExtractor<HttpRequest>, ? extends SpanNameExtractor<? super HttpRequest>>
spanNameExtractorTransformer) {
this.spanNameExtractorTransformer = spanNameExtractorTransformer;
return this;
}
public JavaHttpClientTelemetry build() {
Instrumenter<HttpRequest, HttpResponse<?>> instrumenter =
JavaHttpClientInstrumenterFactory.createInstrumenter(
openTelemetry,
extractorConfigurer,
spanNameExtractorConfigurer,
spanNameExtractorTransformer,
additionalExtractors,
emitExperimentalHttpClientMetrics);

View File

@ -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<HttpClientAttributesExtractorBuilder<HttpRequest, HttpResponse<?>>>
extractorConfigurer,
Consumer<HttpSpanNameExtractorBuilder<HttpRequest>> spanNameExtractorConfigurer,
Function<SpanNameExtractor<HttpRequest>, ? extends SpanNameExtractor<? super HttpRequest>>
spanNameExtractorTransformer,
List<AttributesExtractor<? super HttpRequest, ? super HttpResponse<?>>> additionalExtractors,
boolean emitExperimentalHttpClientMetrics) {
@ -48,10 +52,12 @@ public final class JavaHttpClientInstrumenterFactory {
HttpSpanNameExtractorBuilder<HttpRequest> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(httpAttributesGetter);
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
SpanNameExtractor<? super HttpRequest> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
InstrumenterBuilder<HttpRequest, HttpResponse<?>> builder =
Instrumenter.<HttpRequest, HttpResponse<?>>builder(
openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalExtractors)

View File

@ -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,

View File

@ -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<HttpSpanNameExtractorBuilder<Request>> spanNameExtractorConfigurer =
builder -> {};
private Function<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
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<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
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,

View File

@ -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<HttpClientAttributesExtractorBuilder<Request, Response>> extractorConfigurer,
Consumer<HttpSpanNameExtractorBuilder<Request>> spanNameExtractorConfigurer,
Function<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
spanNameExtractorTransformer,
List<AttributesExtractor<? super Request, ? super Response>> additionalExtractors,
boolean emitExperimentalHttpClientMetrics) {
@ -46,10 +50,12 @@ public final class JettyClientInstrumenterFactory {
HttpSpanNameExtractorBuilder<Request> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(httpAttributesGetter);
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
SpanNameExtractor<? super Request> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
InstrumenterBuilder<Request, Response> builder =
Instrumenter.<Request, Response>builder(
openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalExtractors)

View File

@ -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<HttpClientAttributesExtractorBuilder<HttpRequestAndChannel, HttpResponse>>
extractorConfigurer,
Consumer<HttpSpanNameExtractorBuilder<HttpRequestAndChannel>> spanNameExtractorConfigurer,
Function<
SpanNameExtractor<HttpRequestAndChannel>,
? extends SpanNameExtractor<? super HttpRequestAndChannel>>
spanNameExtractorTransformer,
List<AttributesExtractor<HttpRequestAndChannel, HttpResponse>>
additionalHttpAttributeExtractors) {
NettyHttpClientAttributesGetter httpAttributesGetter = new NettyHttpClientAttributesGetter();
@ -72,10 +78,12 @@ public final class NettyClientInstrumenterFactory {
HttpSpanNameExtractorBuilder<HttpRequestAndChannel> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(httpAttributesGetter);
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
SpanNameExtractor<? super HttpRequestAndChannel> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
InstrumenterBuilder<HttpRequestAndChannel, HttpResponse> builder =
Instrumenter.<HttpRequestAndChannel, HttpResponse>builder(
openTelemetry, instrumentationName, httpSpanNameExtractorBuilder.build())
openTelemetry, instrumentationName, spanNameExtractor)
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(extractorBuilder.build())
.addAttributesExtractor(

View File

@ -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();

View File

@ -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();

View File

@ -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<HttpSpanNameExtractorBuilder<HttpRequestAndChannel>>
spanNameExtractorConfigurer = builder -> {};
private Function<
SpanNameExtractor<HttpRequestAndChannel>,
? extends SpanNameExtractor<? super HttpRequestAndChannel>>
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<HttpRequestAndChannel>,
? extends SpanNameExtractor<? super HttpRequestAndChannel>>
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);
}
}

View File

@ -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())),

View File

@ -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<HttpSpanNameExtractorBuilder<Request>> spanNameExtractorConfigurer =
builder -> {};
private Function<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
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<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
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());

View File

@ -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<HttpClientAttributesExtractorBuilder<Request, Response>> extractorConfigurer,
Consumer<HttpSpanNameExtractorBuilder<Request>> spanNameExtractorConfigurer,
Function<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
spanNameExtractorTransformer,
List<AttributesExtractor<Request, Response>> additionalAttributesExtractors,
boolean emitExperimentalHttpClientMetrics) {
@ -48,10 +52,12 @@ public final class OkHttpInstrumenterFactory {
HttpSpanNameExtractorBuilder<Request> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(httpAttributesGetter);
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
SpanNameExtractor<? super Request> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
InstrumenterBuilder<Request, Response> builder =
Instrumenter.<Request, Response>builder(
openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(extractorBuilder.build())
.addAttributesExtractors(additionalAttributesExtractors)

View File

@ -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<AttributesExtractor<? super JobExecutionContext, ? super Void>>
additionalExtractors = new ArrayList<>();
private boolean captureExperimentalSpanAttributes;
private Function<
SpanNameExtractor<JobExecutionContext>,
? extends SpanNameExtractor<? super JobExecutionContext>>
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<JobExecutionContext>,
? extends SpanNameExtractor<? super JobExecutionContext>>
spanNameExtractorTransformer) {
this.spanNameExtractorTransformer = spanNameExtractorTransformer;
return this;
}
/**
* Returns a new {@link QuartzTelemetry} with the settings of this {@link QuartzTelemetryBuilder}.
*/
public QuartzTelemetry build() {
SpanNameExtractor<? super JobExecutionContext> spanNameExtractor =
spanNameExtractorTransformer.apply(new QuartzSpanNameExtractor());
InstrumenterBuilder<JobExecutionContext, Void> instrumenter =
Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, new QuartzSpanNameExtractor());
Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor);
if (captureExperimentalSpanAttributes) {
instrumenter.addAttributesExtractor(

View File

@ -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<SpanNameExtractor<DbExecution>, ? extends SpanNameExtractor<? super DbExecution>>
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<SpanNameExtractor<DbExecution>, ? extends SpanNameExtractor<? super DbExecution>>
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));
}
}

View File

@ -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<DbExecution, Void> build(boolean statementSanitizationEnabled) {
public Instrumenter<DbExecution, Void> build(
Function<SpanNameExtractor<DbExecution>, ? extends SpanNameExtractor<? super DbExecution>>
spanNameExtractorTransformer,
boolean statementSanitizationEnabled) {
SpanNameExtractor<? super DbExecution> spanNameExtractor =
spanNameExtractorTransformer.apply(
DbClientSpanNameExtractor.create(R2dbcSqlAttributesGetter.INSTANCE));
return Instrumenter.<DbExecution, Void>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());
}
}

View File

@ -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<Request> httpServerSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(RatpackHttpAttributesGetter.INSTANCE);
private Function<SpanNameExtractor<RequestSpec>, ? extends SpanNameExtractor<? super RequestSpec>>
clientSpanNameExtractorTransformer = Function.identity();
private Function<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
serverSpanNameExtractorTransformer = Function.identity();
private final HttpServerRouteBuilder<Request> 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<SpanNameExtractor<RequestSpec>, ? extends SpanNameExtractor<? super RequestSpec>>
clientSpanNameExtractor) {
this.clientSpanNameExtractorTransformer = clientSpanNameExtractor;
return this;
}
/** Sets custom server {@link SpanNameExtractor} via transform function. */
@CanIgnoreReturnValue
public RatpackTelemetryBuilder setServerSpanNameExtractor(
Function<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
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<Request, Response> buildServerInstrumenter() {
RatpackHttpAttributesGetter httpAttributes = RatpackHttpAttributesGetter.INSTANCE;
SpanNameExtractor<? super Request> spanNameExtractor =
serverSpanNameExtractorTransformer.apply(httpServerSpanNameExtractorBuilder.build());
InstrumenterBuilder<Request, Response> builder =
Instrumenter.<Request, Response>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<RequestSpec, HttpResponse> httpClientInstrumenter() {
RatpackHttpClientAttributesGetter httpAttributes = RatpackHttpClientAttributesGetter.INSTANCE;
SpanNameExtractor<? super RequestSpec> spanNameExtractor =
clientSpanNameExtractorTransformer.apply(httpClientSpanNameExtractorBuilder.build());
InstrumenterBuilder<RequestSpec, HttpResponse> builder =
Instrumenter.<RequestSpec, HttpResponse>builder(
openTelemetry, INSTRUMENTATION_NAME, httpClientSpanNameExtractorBuilder.build())
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes))
.addAttributesExtractor(httpClientAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalHttpClientExtractors)

View File

@ -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<Request> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(RestletHttpAttributesGetter.INSTANCE);
private Function<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
spanNameExtractorTransformer = Function.identity();
private final HttpServerRouteBuilder<Request> 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<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
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<? super Request> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
InstrumenterBuilder<Request, Response> builder =
Instrumenter.<Request, Response>builder(
openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalExtractors)

View File

@ -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<Request> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(RestletHttpAttributesGetter.INSTANCE);
private Function<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
spanNameExtractorTransformer = Function.identity();
private final HttpServerRouteBuilder<Request> 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<SpanNameExtractor<Request>, ? extends SpanNameExtractor<? super Request>>
spanNameExtractorTransformer) {
this.spanNameExtractorTransformer = spanNameExtractorTransformer;
return this;
}
/**
* Returns a new {@link RestletTelemetry} with the settings of this {@link
* RestletTelemetryBuilder}.
*/
public RestletTelemetry build() {
SpanNameExtractor<? super Request> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
Instrumenter<Request, Response> serverInstrumenter =
RestletInstrumenterFactory.newServerInstrumenter(
openTelemetry,
httpAttributesExtractorBuilder.build(),
httpSpanNameExtractorBuilder.build(),
spanNameExtractor,
httpServerRouteBuilder.build(),
additionalExtractors,
emitExperimentalHttpServerMetrics);

View File

@ -30,7 +30,7 @@ public final class RestletInstrumenterFactory {
public static Instrumenter<Request, Response> newServerInstrumenter(
OpenTelemetry openTelemetry,
AttributesExtractor<Request, Response> httpServerAttributesExtractor,
SpanNameExtractor<Request> httpServerSpanNameExtractor,
SpanNameExtractor<? super Request> httpServerSpanNameExtractor,
ContextCustomizer<Request> httpServerRoute,
List<AttributesExtractor<Request, Response>> additionalExtractors,
boolean emitExperimentalHttpServerMetrics) {

View File

@ -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<HttpRequest> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(SpringWebHttpAttributesGetter.INSTANCE);
private boolean emitExperimentalHttpClientMetrics = false;
@Nullable
private Function<SpanNameExtractor<HttpRequest>, ? extends SpanNameExtractor<? super HttpRequest>>
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<HttpRequest> originalSpanNameExtractor = httpSpanNameExtractorBuilder.build();
SpanNameExtractor<? super HttpRequest> spanNameExtractor = originalSpanNameExtractor;
if (spanNameExtractorTransformer != null) {
spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor);
}
SpanNameExtractor<? super HttpRequest> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
InstrumenterBuilder<HttpRequest, ClientHttpResponse> builder =
Instrumenter.<HttpRequest, ClientHttpResponse>builder(

View File

@ -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,

View File

@ -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<ServerWebExchange> httpServerRouteBuilder =
HttpServerRoute.builder(WebfluxServerHttpAttributesGetter.INSTANCE);
private Function<
SpanNameExtractor<ClientRequest>, ? extends SpanNameExtractor<? super ClientRequest>>
clientSpanNameExtractorTransformer = Function.identity();
private Function<
SpanNameExtractor<ServerWebExchange>,
? extends SpanNameExtractor<? super ServerWebExchange>>
serverSpanNameExtractorTransformer = Function.identity();
private Consumer<HttpClientAttributesExtractorBuilder<ClientRequest, ClientResponse>>
clientExtractorConfigurer = builder -> {};
private Consumer<HttpSpanNameExtractorBuilder<ClientRequest>> clientSpanNameExtractorConfigurer =
@ -188,17 +198,37 @@ public final class SpringWebfluxTelemetryBuilder {
return this;
}
/** Sets custom client {@link SpanNameExtractor} via transform function. */
@CanIgnoreReturnValue
public SpringWebfluxTelemetryBuilder setClientSpanNameExtractor(
Function<SpanNameExtractor<ClientRequest>, ? extends SpanNameExtractor<? super ClientRequest>>
clientSpanNameExtractor) {
this.clientSpanNameExtractorTransformer = clientSpanNameExtractor;
return this;
}
/** Sets custom server {@link SpanNameExtractor} via transform function. */
@CanIgnoreReturnValue
public SpringWebfluxTelemetryBuilder setServerSpanNameExtractor(
Function<
SpanNameExtractor<ServerWebExchange>,
? extends SpanNameExtractor<? super ServerWebExchange>>
serverSpanNameExtractor) {
this.serverSpanNameExtractorTransformer = serverSpanNameExtractor;
return this;
}
/**
* Returns a new {@link SpringWebfluxTelemetry} with the settings of this {@link
* SpringWebfluxTelemetryBuilder}.
*/
public SpringWebfluxTelemetry build() {
Instrumenter<ClientRequest, ClientResponse> clientInstrumenter =
ClientInstrumenterFactory.create(
openTelemetry,
clientExtractorConfigurer,
clientSpanNameExtractorConfigurer,
clientSpanNameExtractorTransformer,
clientAdditionalExtractors,
emitExperimentalHttpClientTelemetry);
@ -211,10 +241,12 @@ public final class SpringWebfluxTelemetryBuilder {
private Instrumenter<ServerWebExchange, ServerWebExchange> buildServerInstrumenter() {
WebfluxServerHttpAttributesGetter getter = WebfluxServerHttpAttributesGetter.INSTANCE;
SpanNameExtractor<? super ServerWebExchange> spanNameExtractor =
serverSpanNameExtractorTransformer.apply(httpServerSpanNameExtractorBuilder.build());
InstrumenterBuilder<ServerWebExchange, ServerWebExchange> builder =
Instrumenter.<ServerWebExchange, ServerWebExchange>builder(
openTelemetry, INSTRUMENTATION_NAME, httpServerSpanNameExtractorBuilder.build())
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(getter))
.addAttributesExtractor(httpServerAttributesExtractorBuilder.build())
.addAttributesExtractors(serverAdditionalExtractors)

View File

@ -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<HttpClientAttributesExtractorBuilder<ClientRequest, ClientResponse>>
extractorConfigurer,
Consumer<HttpSpanNameExtractorBuilder<ClientRequest>> spanNameExtractorConfigurer,
Function<SpanNameExtractor<ClientRequest>, ? extends SpanNameExtractor<? super ClientRequest>>
spanNameExtractorTransformer,
List<AttributesExtractor<ClientRequest, ClientResponse>> additionalExtractors,
boolean emitExperimentalHttpClientTelemetry) {
@ -51,10 +55,12 @@ public final class ClientInstrumenterFactory {
HttpSpanNameExtractorBuilder<ClientRequest> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(httpAttributesGetter);
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
SpanNameExtractor<? super ClientRequest> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
InstrumenterBuilder<ClientRequest, ClientResponse> clientBuilder =
Instrumenter.<ClientRequest, ClientResponse>builder(
openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(extractorBuilder.build())
.addAttributesExtractors(additionalExtractors)

View File

@ -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<HttpServletRequest> httpServerRouteBuilder =
HttpServerRoute.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
@Nullable
private Function<
SpanNameExtractor<HttpServletRequest>,
? extends SpanNameExtractor<? super HttpServletRequest>>
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<HttpServletRequest> originalSpanNameExtractor =
httpSpanNameExtractorBuilder.build();
SpanNameExtractor<? super HttpServletRequest> spanNameExtractor = originalSpanNameExtractor;
if (spanNameExtractorTransformer != null) {
spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor);
}
SpanNameExtractor<? super HttpServletRequest> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
InstrumenterBuilder<HttpServletRequest, HttpServletResponse> builder =
Instrumenter.<HttpServletRequest, HttpServletResponse>builder(

View File

@ -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<HttpServletRequest> httpServerRouteBuilder =
HttpServerRoute.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
@Nullable
private Function<
SpanNameExtractor<HttpServletRequest>,
? extends SpanNameExtractor<? super HttpServletRequest>>
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<HttpServletRequest> originalSpanNameExtractor =
httpSpanNameExtractorBuilder.build();
SpanNameExtractor<? super HttpServletRequest> spanNameExtractor = originalSpanNameExtractor;
if (spanNameExtractorTransformer != null) {
spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor);
}
SpanNameExtractor<? super HttpServletRequest> spanNameExtractor =
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
InstrumenterBuilder<HttpServletRequest, HttpServletResponse> builder =
Instrumenter.<HttpServletRequest, HttpServletResponse>builder(