Use HTTP instead of non-known method in http span name (#9441)

Co-authored-by: Mateusz Rzeszutek <mrzeszutek@splunk.com>
This commit is contained in:
Lauri Tulmin 2023-09-13 20:14:30 +03:00 committed by GitHub
parent 2d505ebd08
commit d157b68efb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
59 changed files with 301 additions and 77 deletions

View File

@ -6,6 +6,8 @@
package io.opentelemetry.instrumentation.api.instrumenter.http; package io.opentelemetry.instrumentation.api.instrumenter.http;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
@ -17,18 +19,29 @@ import javax.annotation.Nullable;
public final class HttpSpanNameExtractor<REQUEST> implements SpanNameExtractor<REQUEST> { public final class HttpSpanNameExtractor<REQUEST> implements SpanNameExtractor<REQUEST> {
/** /**
* Returns a {@link SpanNameExtractor} which should be used for HTTP requests. HTTP attributes * Returns a {@link SpanNameExtractor} which should be used for HTTP requests with default
* will be examined to determine the name of the span. * configuration. HTTP attributes will be examined to determine the name of the span.
*/ */
public static <REQUEST> SpanNameExtractor<REQUEST> create( public static <REQUEST> SpanNameExtractor<REQUEST> create(
HttpCommonAttributesGetter<REQUEST, ?> getter) { HttpCommonAttributesGetter<REQUEST, ?> getter) {
return new HttpSpanNameExtractor<>(getter); return builder(getter).build();
}
/**
* Returns a new {@link HttpSpanNameExtractorBuilder} that can be used to configure the HTTP span
* name extractor.
*/
public static <REQUEST> HttpSpanNameExtractorBuilder<REQUEST> builder(
HttpCommonAttributesGetter<REQUEST, ?> getter) {
return new HttpSpanNameExtractorBuilder<>(getter);
} }
private final HttpCommonAttributesGetter<REQUEST, ?> getter; private final HttpCommonAttributesGetter<REQUEST, ?> getter;
private final Set<String> knownMethods;
private HttpSpanNameExtractor(HttpCommonAttributesGetter<REQUEST, ?> getter) { HttpSpanNameExtractor(HttpSpanNameExtractorBuilder<REQUEST> builder) {
this.getter = getter; this.getter = builder.httpAttributesGetter;
this.knownMethods = new HashSet<>(builder.knownMethods);
} }
@Override @Override
@ -36,6 +49,9 @@ public final class HttpSpanNameExtractor<REQUEST> implements SpanNameExtractor<R
String method = getter.getHttpRequestMethod(request); String method = getter.getHttpRequestMethod(request);
String route = extractRoute(request); String route = extractRoute(request);
if (method != null) { if (method != null) {
if (!knownMethods.contains(method)) {
method = "HTTP";
}
return route == null ? method : method + " " + route; return route == null ? method : method + " " + route;
} }
return "HTTP"; return "HTTP";

View File

@ -0,0 +1,52 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.api.instrumenter.http;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.internal.HttpConstants;
import java.util.HashSet;
import java.util.Set;
/** A builder of {@link HttpSpanNameExtractor}. */
public final class HttpSpanNameExtractorBuilder<REQUEST> {
final HttpCommonAttributesGetter<REQUEST, ?> httpAttributesGetter;
Set<String> knownMethods = HttpConstants.KNOWN_METHODS;
HttpSpanNameExtractorBuilder(HttpCommonAttributesGetter<REQUEST, ?> httpAttributesGetter) {
this.httpAttributesGetter = httpAttributesGetter;
}
/**
* Configures the extractor to recognize an alternative set of HTTP request methods.
*
* <p>By default, this extractor defines "known" methods as the ones listed in <a
* href="https://www.rfc-editor.org/rfc/rfc9110.html#name-methods">RFC9110</a> and the PATCH
* method defined in <a href="https://www.rfc-editor.org/rfc/rfc5789.html">RFC5789</a>. If an
* unknown method is encountered, the extractor will use the value {@value HttpConstants#_OTHER}
* instead of it and put the original value in an extra {@code http.request.method_original}
* attribute.
*
* <p>Note: calling this method <b>overrides</b> the default known method sets completely; it does
* not supplement it.
*
* @param knownMethods A set of recognized HTTP request methods.
*/
@CanIgnoreReturnValue
public HttpSpanNameExtractorBuilder<REQUEST> setKnownMethods(Set<String> knownMethods) {
this.knownMethods = new HashSet<>(knownMethods);
return this;
}
/**
* Returns a new {@link HttpSpanNameExtractor} with the settings of this {@link
* HttpSpanNameExtractorBuilder}.
*/
public SpanNameExtractor<REQUEST> build() {
return new HttpSpanNameExtractor<>(this);
}
}

View File

@ -32,7 +32,9 @@ public class AkkaHttpClientSingletons {
Instrumenter.<HttpRequest, HttpResponse>builder( Instrumenter.<HttpRequest, HttpResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
AkkaHttpUtil.instrumentationName(), AkkaHttpUtil.instrumentationName(),
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -29,7 +29,9 @@ public final class AkkaHttpServerSingletons {
Instrumenter.<HttpRequest, HttpResponse>builder( Instrumenter.<HttpRequest, HttpResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
AkkaHttpUtil.instrumentationName(), AkkaHttpUtil.instrumentationName(),
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpServerAttributesExtractor.builder(httpAttributesGetter) HttpServerAttributesExtractor.builder(httpAttributesGetter)

View File

@ -30,7 +30,9 @@ public final class ApacheHttpAsyncClientSingletons {
Instrumenter.<ApacheHttpClientRequest, HttpResponse>builder( Instrumenter.<ApacheHttpClientRequest, HttpResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -30,7 +30,9 @@ public final class ApacheHttpClientSingletons {
Instrumenter.<HttpMethod, HttpMethod>builder( Instrumenter.<HttpMethod, HttpMethod>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -30,7 +30,9 @@ public final class ApacheHttpClientSingletons {
Instrumenter.<ApacheHttpClientRequest, HttpResponse>builder( Instrumenter.<ApacheHttpClientRequest, HttpResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -16,6 +16,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttribut
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -34,6 +35,8 @@ public final class ApacheHttpClientTelemetryBuilder {
private final HttpClientAttributesExtractorBuilder<ApacheHttpClientRequest, HttpResponse> private final HttpClientAttributesExtractorBuilder<ApacheHttpClientRequest, HttpResponse>
httpAttributesExtractorBuilder = httpAttributesExtractorBuilder =
HttpClientAttributesExtractor.builder(ApacheHttpClientHttpAttributesGetter.INSTANCE); HttpClientAttributesExtractor.builder(ApacheHttpClientHttpAttributesGetter.INSTANCE);
private final HttpSpanNameExtractorBuilder<ApacheHttpClientRequest> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(ApacheHttpClientHttpAttributesGetter.INSTANCE);
private boolean emitExperimentalHttpClientMetrics = false; private boolean emitExperimentalHttpClientMetrics = false;
ApacheHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) { ApacheHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) {
@ -90,6 +93,7 @@ public final class ApacheHttpClientTelemetryBuilder {
@CanIgnoreReturnValue @CanIgnoreReturnValue
public ApacheHttpClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public ApacheHttpClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
httpAttributesExtractorBuilder.setKnownMethods(knownMethods); httpAttributesExtractorBuilder.setKnownMethods(knownMethods);
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods);
return this; return this;
} }
@ -116,9 +120,7 @@ public final class ApacheHttpClientTelemetryBuilder {
InstrumenterBuilder<ApacheHttpClientRequest, HttpResponse> builder = InstrumenterBuilder<ApacheHttpClientRequest, HttpResponse> builder =
Instrumenter.<ApacheHttpClientRequest, HttpResponse>builder( Instrumenter.<ApacheHttpClientRequest, HttpResponse>builder(
openTelemetry, openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter))
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(httpAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalExtractors) .addAttributesExtractors(additionalExtractors)

View File

@ -31,7 +31,9 @@ public final class ApacheHttpClientSingletons {
Instrumenter.<HttpRequest, HttpResponse>builder( Instrumenter.<HttpRequest, HttpResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -25,6 +25,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerExperime
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaHttpClientAttributesGetter; import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaHttpClientAttributesGetter;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
@ -56,6 +57,11 @@ public final class ArmeriaTelemetryBuilder {
httpServerAttributesExtractorBuilder = httpServerAttributesExtractorBuilder =
HttpServerAttributesExtractor.builder(ArmeriaHttpServerAttributesGetter.INSTANCE); HttpServerAttributesExtractor.builder(ArmeriaHttpServerAttributesGetter.INSTANCE);
private final HttpSpanNameExtractorBuilder<RequestContext> httpClientSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(ArmeriaHttpClientAttributesGetter.INSTANCE);
private final HttpSpanNameExtractorBuilder<RequestContext> httpServerSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(ArmeriaHttpServerAttributesGetter.INSTANCE);
private Function< private Function<
SpanStatusExtractor<RequestContext, RequestLog>, SpanStatusExtractor<RequestContext, RequestLog>,
? extends SpanStatusExtractor<? super RequestContext, ? super RequestLog>> ? extends SpanStatusExtractor<? super RequestContext, ? super RequestLog>>
@ -167,6 +173,8 @@ public final class ArmeriaTelemetryBuilder {
public ArmeriaTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public ArmeriaTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
httpClientAttributesExtractorBuilder.setKnownMethods(knownMethods); httpClientAttributesExtractorBuilder.setKnownMethods(knownMethods);
httpServerAttributesExtractorBuilder.setKnownMethods(knownMethods); httpServerAttributesExtractorBuilder.setKnownMethods(knownMethods);
httpClientSpanNameExtractorBuilder.setKnownMethods(knownMethods);
httpServerSpanNameExtractorBuilder.setKnownMethods(knownMethods);
return this; return this;
} }
@ -204,14 +212,10 @@ public final class ArmeriaTelemetryBuilder {
InstrumenterBuilder<ClientRequestContext, RequestLog> clientInstrumenterBuilder = InstrumenterBuilder<ClientRequestContext, RequestLog> clientInstrumenterBuilder =
Instrumenter.builder( Instrumenter.builder(
openTelemetry, openTelemetry, INSTRUMENTATION_NAME, httpClientSpanNameExtractorBuilder.build());
INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(clientAttributesGetter));
InstrumenterBuilder<ServiceRequestContext, RequestLog> serverInstrumenterBuilder = InstrumenterBuilder<ServiceRequestContext, RequestLog> serverInstrumenterBuilder =
Instrumenter.builder( Instrumenter.builder(
openTelemetry, openTelemetry, INSTRUMENTATION_NAME, httpServerSpanNameExtractorBuilder.build());
INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(serverAttributesGetter));
Stream.of(clientInstrumenterBuilder, serverInstrumenterBuilder) Stream.of(clientInstrumenterBuilder, serverInstrumenterBuilder)
.forEach(instrumenter -> instrumenter.addAttributesExtractors(additionalExtractors)); .forEach(instrumenter -> instrumenter.addAttributesExtractors(additionalExtractors));

View File

@ -31,7 +31,9 @@ public final class AsyncHttpClientSingletons {
Instrumenter.<Request, Response>builder( Instrumenter.<Request, Response>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -30,7 +30,9 @@ public final class AsyncHttpClientSingletons {
Instrumenter.<RequestContext, Response>builder( Instrumenter.<RequestContext, Response>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -31,7 +31,9 @@ public class GoogleHttpClientSingletons {
Instrumenter.<HttpRequest, HttpResponse>builder( Instrumenter.<HttpRequest, HttpResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -30,7 +30,9 @@ public final class GrizzlySingletons {
Instrumenter.<HttpRequestPacket, HttpResponsePacket>builder( Instrumenter.<HttpRequestPacket, HttpResponsePacket>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
"io.opentelemetry.grizzly-2.3", "io.opentelemetry.grizzly-2.3",
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpServerAttributesExtractor.builder(httpAttributesGetter) HttpServerAttributesExtractor.builder(httpAttributesGetter)

View File

@ -28,7 +28,9 @@ public final class HttpUrlConnectionSingletons {
Instrumenter.<HttpURLConnection, Integer>builder( Instrumenter.<HttpURLConnection, Integer>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
"io.opentelemetry.http-url-connection", "io.opentelemetry.http-url-connection",
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -33,6 +33,7 @@ public class JavaHttpClientSingletons {
.setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders())
.setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders())
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
singletonList( singletonList(
PeerServiceAttributesExtractor.create( PeerServiceAttributesExtractor.create(
JavaHttpClientAttributesGetter.INSTANCE, JavaHttpClientAttributesGetter.INSTANCE,

View File

@ -10,6 +10,7 @@ import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter; import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter;
import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientInstrumenterFactory; import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientInstrumenterFactory;
import java.net.http.HttpRequest; import java.net.http.HttpRequest;
@ -25,9 +26,10 @@ public final class JavaHttpClientTelemetryBuilder {
private final List<AttributesExtractor<? super HttpRequest, ? super HttpResponse<?>>> private final List<AttributesExtractor<? super HttpRequest, ? super HttpResponse<?>>>
additionalExtractors = new ArrayList<>(); additionalExtractors = new ArrayList<>();
private Consumer<HttpClientAttributesExtractorBuilder<HttpRequest, HttpResponse<?>>> private Consumer<HttpClientAttributesExtractorBuilder<HttpRequest, HttpResponse<?>>>
extractorConfigurer = builder -> {}; extractorConfigurer = builder -> {};
private Consumer<HttpSpanNameExtractorBuilder<HttpRequest>> spanNameExtractorConfigurer =
builder -> {};
private boolean emitExperimentalHttpClientMetrics = false; private boolean emitExperimentalHttpClientMetrics = false;
JavaHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) { JavaHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) {
@ -86,6 +88,8 @@ public final class JavaHttpClientTelemetryBuilder {
public JavaHttpClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public JavaHttpClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
extractorConfigurer = extractorConfigurer =
extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
spanNameExtractorConfigurer =
spanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
return this; return this;
} }
@ -107,6 +111,7 @@ public final class JavaHttpClientTelemetryBuilder {
JavaHttpClientInstrumenterFactory.createInstrumenter( JavaHttpClientInstrumenterFactory.createInstrumenter(
openTelemetry, openTelemetry,
extractorConfigurer, extractorConfigurer,
spanNameExtractorConfigurer,
additionalExtractors, additionalExtractors,
emitExperimentalHttpClientMetrics); emitExperimentalHttpClientMetrics);

View File

@ -15,6 +15,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttribut
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import java.net.http.HttpRequest; import java.net.http.HttpRequest;
import java.net.http.HttpResponse; import java.net.http.HttpResponse;
@ -32,6 +33,7 @@ public final class JavaHttpClientInstrumenterFactory {
OpenTelemetry openTelemetry, OpenTelemetry openTelemetry,
Consumer<HttpClientAttributesExtractorBuilder<HttpRequest, HttpResponse<?>>> Consumer<HttpClientAttributesExtractorBuilder<HttpRequest, HttpResponse<?>>>
extractorConfigurer, extractorConfigurer,
Consumer<HttpSpanNameExtractorBuilder<HttpRequest>> spanNameExtractorConfigurer,
List<AttributesExtractor<? super HttpRequest, ? super HttpResponse<?>>> additionalExtractors, List<AttributesExtractor<? super HttpRequest, ? super HttpResponse<?>>> additionalExtractors,
boolean emitExperimentalHttpClientMetrics) { boolean emitExperimentalHttpClientMetrics) {
@ -42,11 +44,13 @@ public final class JavaHttpClientInstrumenterFactory {
HttpClientAttributesExtractor.builder(httpAttributesGetter); HttpClientAttributesExtractor.builder(httpAttributesGetter);
extractorConfigurer.accept(httpAttributesExtractorBuilder); extractorConfigurer.accept(httpAttributesExtractorBuilder);
HttpSpanNameExtractorBuilder<HttpRequest> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(httpAttributesGetter);
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
InstrumenterBuilder<HttpRequest, HttpResponse<?>> builder = InstrumenterBuilder<HttpRequest, HttpResponse<?>> builder =
Instrumenter.<HttpRequest, HttpResponse<?>>builder( Instrumenter.<HttpRequest, HttpResponse<?>>builder(
openTelemetry, openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter))
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(httpAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalExtractors) .addAttributesExtractors(additionalExtractors)

View File

@ -26,6 +26,7 @@ public class JettyHttpClientSingletons {
.setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders())
.setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders())
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
singletonList( singletonList(
PeerServiceAttributesExtractor.create( PeerServiceAttributesExtractor.create(
JettyClientHttpAttributesGetter.INSTANCE, JettyClientHttpAttributesGetter.INSTANCE,

View File

@ -9,6 +9,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientInstrumenterFactory; import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientInstrumenterFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -27,6 +28,8 @@ public final class JettyClientTelemetryBuilder {
new ArrayList<>(); new ArrayList<>();
private Consumer<HttpClientAttributesExtractorBuilder<Request, Response>> extractorConfigurer = private Consumer<HttpClientAttributesExtractorBuilder<Request, Response>> extractorConfigurer =
builder -> {}; builder -> {};
private Consumer<HttpSpanNameExtractorBuilder<Request>> spanNameExtractorConfigurer =
builder -> {};
private boolean emitExperimentalHttpClientMetrics = false; private boolean emitExperimentalHttpClientMetrics = false;
private HttpClientTransport httpClientTransport; private HttpClientTransport httpClientTransport;
private SslContextFactory sslContextFactory; private SslContextFactory sslContextFactory;
@ -100,6 +103,8 @@ public final class JettyClientTelemetryBuilder {
public JettyClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public JettyClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
extractorConfigurer = extractorConfigurer =
extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
spanNameExtractorConfigurer =
spanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
return this; return this;
} }
@ -126,6 +131,7 @@ public final class JettyClientTelemetryBuilder {
JettyClientInstrumenterFactory.create( JettyClientInstrumenterFactory.create(
openTelemetry, openTelemetry,
extractorConfigurer, extractorConfigurer,
spanNameExtractorConfigurer,
additionalExtractors, additionalExtractors,
emitExperimentalHttpClientMetrics), emitExperimentalHttpClientMetrics),
sslContextFactory, sslContextFactory,

View File

@ -14,6 +14,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttribut
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -31,6 +32,7 @@ public final class JettyClientInstrumenterFactory {
public static Instrumenter<Request, Response> create( public static Instrumenter<Request, Response> create(
OpenTelemetry openTelemetry, OpenTelemetry openTelemetry,
Consumer<HttpClientAttributesExtractorBuilder<Request, Response>> extractorConfigurer, Consumer<HttpClientAttributesExtractorBuilder<Request, Response>> extractorConfigurer,
Consumer<HttpSpanNameExtractorBuilder<Request>> spanNameExtractorConfigurer,
List<AttributesExtractor<? super Request, ? super Response>> additionalExtractors, List<AttributesExtractor<? super Request, ? super Response>> additionalExtractors,
boolean emitExperimentalHttpClientMetrics) { boolean emitExperimentalHttpClientMetrics) {
@ -40,11 +42,13 @@ public final class JettyClientInstrumenterFactory {
HttpClientAttributesExtractor.builder(httpAttributesGetter); HttpClientAttributesExtractor.builder(httpAttributesGetter);
extractorConfigurer.accept(httpAttributesExtractorBuilder); extractorConfigurer.accept(httpAttributesExtractorBuilder);
HttpSpanNameExtractorBuilder<Request> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(httpAttributesGetter);
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
InstrumenterBuilder<Request, Response> builder = InstrumenterBuilder<Request, Response> builder =
Instrumenter.<Request, Response>builder( Instrumenter.<Request, Response>builder(
openTelemetry, openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter))
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(httpAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalExtractors) .addAttributesExtractors(additionalExtractors)

View File

@ -30,7 +30,9 @@ public final class JoddHttpSingletons {
Instrumenter.<HttpRequest, HttpResponse>builder( Instrumenter.<HttpRequest, HttpResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -38,6 +38,8 @@ class KtorServerTracing private constructor(
internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE) internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE)
internal val httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE)
internal var statusExtractor: internal var statusExtractor:
(SpanStatusExtractor<ApplicationRequest, ApplicationResponse>) -> SpanStatusExtractor<in ApplicationRequest, in ApplicationResponse> = { a -> a } (SpanStatusExtractor<ApplicationRequest, ApplicationResponse>) -> SpanStatusExtractor<in ApplicationRequest, in ApplicationResponse> = { a -> a }
@ -74,6 +76,7 @@ class KtorServerTracing private constructor(
fun setKnownMethods(knownMethods: Set<String>) { fun setKnownMethods(knownMethods: Set<String>) {
httpAttributesExtractorBuilder.setKnownMethods(knownMethods) httpAttributesExtractorBuilder.setKnownMethods(knownMethods)
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods)
} }
internal fun isOpenTelemetryInitialized(): Boolean = this::openTelemetry.isInitialized internal fun isOpenTelemetryInitialized(): Boolean = this::openTelemetry.isInitialized
@ -112,7 +115,7 @@ class KtorServerTracing private constructor(
val instrumenterBuilder = Instrumenter.builder<ApplicationRequest, ApplicationResponse>( val instrumenterBuilder = Instrumenter.builder<ApplicationRequest, ApplicationResponse>(
configuration.openTelemetry, configuration.openTelemetry,
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter), configuration.httpSpanNameExtractorBuilder.build()
) )
configuration.additionalExtractors.forEach { instrumenterBuilder.addAttributesExtractor(it) } configuration.additionalExtractors.forEach { instrumenterBuilder.addAttributesExtractor(it) }

View File

@ -23,6 +23,7 @@ class KtorClientTracingBuilder {
private var openTelemetry: OpenTelemetry? = null private var openTelemetry: OpenTelemetry? = null
private val additionalExtractors = mutableListOf<AttributesExtractor<in HttpRequestData, in HttpResponse>>() private val additionalExtractors = mutableListOf<AttributesExtractor<in HttpRequestData, in HttpResponse>>()
private val httpAttributesExtractorBuilder = HttpClientAttributesExtractor.builder(KtorHttpClientAttributesGetter) private val httpAttributesExtractorBuilder = HttpClientAttributesExtractor.builder(KtorHttpClientAttributesGetter)
private val httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(KtorHttpClientAttributesGetter)
private var emitExperimentalHttpClientMetrics = false private var emitExperimentalHttpClientMetrics = false
fun setOpenTelemetry(openTelemetry: OpenTelemetry) { fun setOpenTelemetry(openTelemetry: OpenTelemetry) {
@ -45,6 +46,7 @@ class KtorClientTracingBuilder {
fun setKnownMethods(knownMethods: Set<String>) { fun setKnownMethods(knownMethods: Set<String>) {
httpAttributesExtractorBuilder.setKnownMethods(knownMethods) httpAttributesExtractorBuilder.setKnownMethods(knownMethods)
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods)
} }
fun addAttributesExtractors(vararg extractors: AttributesExtractor<in HttpRequestData, in HttpResponse>) = fun addAttributesExtractors(vararg extractors: AttributesExtractor<in HttpRequestData, in HttpResponse>) =
@ -72,7 +74,7 @@ class KtorClientTracingBuilder {
val instrumenterBuilder = Instrumenter.builder<HttpRequestData, HttpResponse>( val instrumenterBuilder = Instrumenter.builder<HttpRequestData, HttpResponse>(
initializedOpenTelemetry, initializedOpenTelemetry,
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(KtorHttpClientAttributesGetter), httpSpanNameExtractorBuilder.build()
) )
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(KtorHttpClientAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(KtorHttpClientAttributesGetter))
.addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(httpAttributesExtractorBuilder.build())

View File

@ -39,6 +39,8 @@ class KtorServerTracing private constructor(
internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE) internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE)
internal val httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE)
internal var statusExtractor: internal var statusExtractor:
(SpanStatusExtractor<ApplicationRequest, ApplicationResponse>) -> SpanStatusExtractor<in ApplicationRequest, in ApplicationResponse> = { a -> a } (SpanStatusExtractor<ApplicationRequest, ApplicationResponse>) -> SpanStatusExtractor<in ApplicationRequest, in ApplicationResponse> = { a -> a }
@ -75,6 +77,7 @@ class KtorServerTracing private constructor(
fun setKnownMethods(knownMethods: Set<String>) { fun setKnownMethods(knownMethods: Set<String>) {
httpAttributesExtractorBuilder.setKnownMethods(knownMethods) httpAttributesExtractorBuilder.setKnownMethods(knownMethods)
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods)
} }
internal fun isOpenTelemetryInitialized(): Boolean = this::openTelemetry.isInitialized internal fun isOpenTelemetryInitialized(): Boolean = this::openTelemetry.isInitialized
@ -112,7 +115,7 @@ class KtorServerTracing private constructor(
val instrumenterBuilder = Instrumenter.builder<ApplicationRequest, ApplicationResponse>( val instrumenterBuilder = Instrumenter.builder<ApplicationRequest, ApplicationResponse>(
configuration.openTelemetry, configuration.openTelemetry,
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter), configuration.httpSpanNameExtractorBuilder.build()
) )
configuration.additionalExtractors.forEach { instrumenterBuilder.addAttributesExtractor(it) } configuration.additionalExtractors.forEach { instrumenterBuilder.addAttributesExtractor(it) }

View File

@ -29,7 +29,9 @@ public final class LibertyDispatcherSingletons {
Instrumenter.<LibertyRequest, LibertyResponse>builder( Instrumenter.<LibertyRequest, LibertyResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpServerAttributesExtractor.builder(httpAttributesGetter) HttpServerAttributesExtractor.builder(httpAttributesGetter)

View File

@ -36,7 +36,9 @@ public final class NettyClientSingletons {
Instrumenter.<HttpRequestAndChannel, HttpResponse>builder( Instrumenter.<HttpRequestAndChannel, HttpResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -31,7 +31,9 @@ final class NettyServerSingletons {
Instrumenter.<HttpRequestAndChannel, HttpResponse>builder( Instrumenter.<HttpRequestAndChannel, HttpResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
"io.opentelemetry.netty-3.8", "io.opentelemetry.netty-3.8",
HttpSpanNameExtractor.create(httpServerAttributesGetter)) HttpSpanNameExtractor.builder(httpServerAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpServerAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpServerAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpServerAttributesExtractor.builder(httpServerAttributesGetter) HttpServerAttributesExtractor.builder(httpServerAttributesGetter)

View File

@ -17,6 +17,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttribut
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.PeerServiceAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.net.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.netty.common.internal.NettyConnectionRequest; import io.opentelemetry.instrumentation.netty.common.internal.NettyConnectionRequest;
@ -56,6 +57,7 @@ public final class NettyClientInstrumenterFactory {
public Instrumenter<HttpRequestAndChannel, HttpResponse> createHttpInstrumenter( public Instrumenter<HttpRequestAndChannel, HttpResponse> createHttpInstrumenter(
Consumer<HttpClientAttributesExtractorBuilder<HttpRequestAndChannel, HttpResponse>> Consumer<HttpClientAttributesExtractorBuilder<HttpRequestAndChannel, HttpResponse>>
extractorConfigurer, extractorConfigurer,
Consumer<HttpSpanNameExtractorBuilder<HttpRequestAndChannel>> spanNameExtractorConfigurer,
List<AttributesExtractor<HttpRequestAndChannel, HttpResponse>> List<AttributesExtractor<HttpRequestAndChannel, HttpResponse>>
additionalHttpAttributeExtractors) { additionalHttpAttributeExtractors) {
NettyHttpClientAttributesGetter httpAttributesGetter = new NettyHttpClientAttributesGetter(); NettyHttpClientAttributesGetter httpAttributesGetter = new NettyHttpClientAttributesGetter();
@ -64,11 +66,13 @@ public final class NettyClientInstrumenterFactory {
HttpClientAttributesExtractor.builder(httpAttributesGetter); HttpClientAttributesExtractor.builder(httpAttributesGetter);
extractorConfigurer.accept(extractorBuilder); extractorConfigurer.accept(extractorBuilder);
HttpSpanNameExtractorBuilder<HttpRequestAndChannel> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(httpAttributesGetter);
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
InstrumenterBuilder<HttpRequestAndChannel, HttpResponse> builder = InstrumenterBuilder<HttpRequestAndChannel, HttpResponse> builder =
Instrumenter.<HttpRequestAndChannel, HttpResponse>builder( Instrumenter.<HttpRequestAndChannel, HttpResponse>builder(
openTelemetry, openTelemetry, instrumentationName, httpSpanNameExtractorBuilder.build())
instrumentationName,
HttpSpanNameExtractor.create(httpAttributesGetter))
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(extractorBuilder.build()) .addAttributesExtractor(extractorBuilder.build())
.addAttributesExtractor( .addAttributesExtractor(

View File

@ -15,6 +15,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerExperime
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import io.opentelemetry.instrumentation.netty.common.internal.NettyErrorHolder; import io.opentelemetry.instrumentation.netty.common.internal.NettyErrorHolder;
import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel; import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel;
@ -31,6 +32,7 @@ public final class NettyServerInstrumenterFactory {
String instrumentationName, String instrumentationName,
Consumer<HttpServerAttributesExtractorBuilder<HttpRequestAndChannel, HttpResponse>> Consumer<HttpServerAttributesExtractorBuilder<HttpRequestAndChannel, HttpResponse>>
extractorConfigurer, extractorConfigurer,
Consumer<HttpSpanNameExtractorBuilder<HttpRequestAndChannel>> spanNameExtractorConfigurer,
boolean emitExperimentalHttpServerMetrics) { boolean emitExperimentalHttpServerMetrics) {
NettyHttpServerAttributesGetter httpAttributesGetter = new NettyHttpServerAttributesGetter(); NettyHttpServerAttributesGetter httpAttributesGetter = new NettyHttpServerAttributesGetter();
@ -39,11 +41,13 @@ public final class NettyServerInstrumenterFactory {
HttpServerAttributesExtractor.builder(httpAttributesGetter); HttpServerAttributesExtractor.builder(httpAttributesGetter);
extractorConfigurer.accept(extractorBuilder); extractorConfigurer.accept(extractorBuilder);
HttpSpanNameExtractorBuilder<HttpRequestAndChannel> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(httpAttributesGetter);
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
InstrumenterBuilder<HttpRequestAndChannel, HttpResponse> builder = InstrumenterBuilder<HttpRequestAndChannel, HttpResponse> builder =
Instrumenter.<HttpRequestAndChannel, HttpResponse>builder( Instrumenter.<HttpRequestAndChannel, HttpResponse>builder(
openTelemetry, openTelemetry, instrumentationName, httpSpanNameExtractorBuilder.build())
instrumentationName,
HttpSpanNameExtractor.create(httpAttributesGetter))
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(extractorBuilder.build()) .addAttributesExtractor(extractorBuilder.build())
.addOperationMetrics(HttpServerMetrics.get()); .addOperationMetrics(HttpServerMetrics.get());

View File

@ -56,6 +56,7 @@ public final class NettyClientSingletons {
.setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders())
.setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders())
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
Collections.emptyList()); Collections.emptyList());
CONNECTION_INSTRUMENTER = factory.createConnectionInstrumenter(); CONNECTION_INSTRUMENTER = factory.createConnectionInstrumenter();
SSL_INSTRUMENTER = factory.createSslInstrumenter(); SSL_INSTRUMENTER = factory.createSslInstrumenter();

View File

@ -23,6 +23,7 @@ public final class NettyServerSingletons {
.setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders()) .setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders())
.setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders())
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
CommonConfig.get().shouldEmitExperimentalHttpServerMetrics()); CommonConfig.get().shouldEmitExperimentalHttpServerMetrics());
public static Instrumenter<HttpRequestAndChannel, HttpResponse> instrumenter() { public static Instrumenter<HttpRequestAndChannel, HttpResponse> instrumenter() {

View File

@ -56,6 +56,7 @@ public final class NettyClientSingletons {
.setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders())
.setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders())
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
Collections.emptyList()); Collections.emptyList());
CONNECTION_INSTRUMENTER = factory.createConnectionInstrumenter(); CONNECTION_INSTRUMENTER = factory.createConnectionInstrumenter();
SSL_INSTRUMENTER = factory.createSslInstrumenter(); SSL_INSTRUMENTER = factory.createSslInstrumenter();

View File

@ -23,6 +23,7 @@ public final class NettyServerSingletons {
.setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders()) .setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders())
.setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders())
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
CommonConfig.get().shouldEmitExperimentalHttpServerMetrics()); CommonConfig.get().shouldEmitExperimentalHttpServerMetrics());
public static Instrumenter<HttpRequestAndChannel, HttpResponse> instrumenter() { public static Instrumenter<HttpRequestAndChannel, HttpResponse> instrumenter() {

View File

@ -10,6 +10,7 @@ import io.netty.handler.codec.http.HttpResponse;
import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel; import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel;
import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyClientInstrumenterFactory; import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyClientInstrumenterFactory;
import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyConnectionInstrumentationFlag; import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyConnectionInstrumentationFlag;
@ -28,6 +29,8 @@ public final class NettyClientTelemetryBuilder {
private Consumer<HttpClientAttributesExtractorBuilder<HttpRequestAndChannel, HttpResponse>> private Consumer<HttpClientAttributesExtractorBuilder<HttpRequestAndChannel, HttpResponse>>
extractorConfigurer = builder -> {}; extractorConfigurer = builder -> {};
private Consumer<HttpSpanNameExtractorBuilder<HttpRequestAndChannel>>
spanNameExtractorConfigurer = builder -> {};
private boolean emitExperimentalHttpClientMetrics = false; private boolean emitExperimentalHttpClientMetrics = false;
NettyClientTelemetryBuilder(OpenTelemetry openTelemetry) { NettyClientTelemetryBuilder(OpenTelemetry openTelemetry) {
@ -90,6 +93,8 @@ public final class NettyClientTelemetryBuilder {
public NettyClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public NettyClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
extractorConfigurer = extractorConfigurer =
extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
spanNameExtractorConfigurer =
spanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
return this; return this;
} }
@ -116,6 +121,7 @@ public final class NettyClientTelemetryBuilder {
NettyConnectionInstrumentationFlag.DISABLED, NettyConnectionInstrumentationFlag.DISABLED,
Collections.emptyMap(), Collections.emptyMap(),
emitExperimentalHttpClientMetrics) emitExperimentalHttpClientMetrics)
.createHttpInstrumenter(extractorConfigurer, additionalAttributesExtractors)); .createHttpInstrumenter(
extractorConfigurer, spanNameExtractorConfigurer, additionalAttributesExtractors));
} }
} }

View File

@ -9,6 +9,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.netty.handler.codec.http.HttpResponse; import io.netty.handler.codec.http.HttpResponse;
import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel; import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel;
import io.opentelemetry.instrumentation.netty.v4.common.internal.server.NettyServerInstrumenterFactory; import io.opentelemetry.instrumentation.netty.v4.common.internal.server.NettyServerInstrumenterFactory;
import java.util.List; import java.util.List;
@ -22,6 +23,8 @@ public final class NettyServerTelemetryBuilder {
private Consumer<HttpServerAttributesExtractorBuilder<HttpRequestAndChannel, HttpResponse>> private Consumer<HttpServerAttributesExtractorBuilder<HttpRequestAndChannel, HttpResponse>>
extractorConfigurer = builder -> {}; extractorConfigurer = builder -> {};
private Consumer<HttpSpanNameExtractorBuilder<HttpRequestAndChannel>>
spanNameExtractorConfigurer = builder -> {};
private boolean emitExperimentalHttpServerMetrics = false; private boolean emitExperimentalHttpServerMetrics = false;
NettyServerTelemetryBuilder(OpenTelemetry openTelemetry) { NettyServerTelemetryBuilder(OpenTelemetry openTelemetry) {
@ -73,6 +76,8 @@ public final class NettyServerTelemetryBuilder {
public NettyServerTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public NettyServerTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
extractorConfigurer = extractorConfigurer =
extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
spanNameExtractorConfigurer =
spanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
return this; return this;
} }
@ -96,6 +101,7 @@ public final class NettyServerTelemetryBuilder {
openTelemetry, openTelemetry,
"io.opentelemetry.netty-4.1", "io.opentelemetry.netty-4.1",
extractorConfigurer, extractorConfigurer,
spanNameExtractorConfigurer,
emitExperimentalHttpServerMetrics)); emitExperimentalHttpServerMetrics));
} }
} }

View File

@ -37,7 +37,9 @@ public final class OkHttp2Singletons {
Instrumenter.<Request, Response>builder( Instrumenter.<Request, Response>builder(
openTelemetry, openTelemetry,
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -33,6 +33,7 @@ public final class OkHttp3Singletons {
.setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders())
.setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders())
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
singletonList( singletonList(
PeerServiceAttributesExtractor.create( PeerServiceAttributesExtractor.create(
OkHttpAttributesGetter.INSTANCE, CommonConfig.get().getPeerServiceMapping())), OkHttpAttributesGetter.INSTANCE, CommonConfig.get().getPeerServiceMapping())),

View File

@ -9,6 +9,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpInstrumenterFactory; import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpInstrumenterFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -25,6 +26,8 @@ public final class OkHttpTelemetryBuilder {
new ArrayList<>(); new ArrayList<>();
private Consumer<HttpClientAttributesExtractorBuilder<Request, Response>> extractorConfigurer = private Consumer<HttpClientAttributesExtractorBuilder<Request, Response>> extractorConfigurer =
builder -> {}; builder -> {};
private Consumer<HttpSpanNameExtractorBuilder<Request>> spanNameExtractorConfigurer =
builder -> {};
private boolean emitExperimentalHttpClientMetrics = false; private boolean emitExperimentalHttpClientMetrics = false;
OkHttpTelemetryBuilder(OpenTelemetry openTelemetry) { OkHttpTelemetryBuilder(OpenTelemetry openTelemetry) {
@ -83,6 +86,8 @@ public final class OkHttpTelemetryBuilder {
public OkHttpTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public OkHttpTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
extractorConfigurer = extractorConfigurer =
extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); extractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
spanNameExtractorConfigurer =
spanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
return this; return this;
} }
@ -107,6 +112,7 @@ public final class OkHttpTelemetryBuilder {
OkHttpInstrumenterFactory.create( OkHttpInstrumenterFactory.create(
openTelemetry, openTelemetry,
extractorConfigurer, extractorConfigurer,
spanNameExtractorConfigurer,
additionalExtractors, additionalExtractors,
emitExperimentalHttpClientMetrics), emitExperimentalHttpClientMetrics),
openTelemetry.getPropagators()); openTelemetry.getPropagators());

View File

@ -16,6 +16,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttribut
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -33,6 +34,7 @@ public final class OkHttpInstrumenterFactory {
public static Instrumenter<Request, Response> create( public static Instrumenter<Request, Response> create(
OpenTelemetry openTelemetry, OpenTelemetry openTelemetry,
Consumer<HttpClientAttributesExtractorBuilder<Request, Response>> extractorConfigurer, Consumer<HttpClientAttributesExtractorBuilder<Request, Response>> extractorConfigurer,
Consumer<HttpSpanNameExtractorBuilder<Request>> spanNameExtractorConfigurer,
List<AttributesExtractor<Request, Response>> additionalAttributesExtractors, List<AttributesExtractor<Request, Response>> additionalAttributesExtractors,
boolean emitExperimentalHttpClientMetrics) { boolean emitExperimentalHttpClientMetrics) {
@ -42,11 +44,13 @@ public final class OkHttpInstrumenterFactory {
HttpClientAttributesExtractor.builder(httpAttributesGetter); HttpClientAttributesExtractor.builder(httpAttributesGetter);
extractorConfigurer.accept(extractorBuilder); extractorConfigurer.accept(extractorBuilder);
HttpSpanNameExtractorBuilder<Request> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(httpAttributesGetter);
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
InstrumenterBuilder<Request, Response> builder = InstrumenterBuilder<Request, Response> builder =
Instrumenter.<Request, Response>builder( Instrumenter.<Request, Response>builder(
openTelemetry, openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter))
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(extractorBuilder.build()) .addAttributesExtractor(extractorBuilder.build())
.addAttributesExtractors(additionalAttributesExtractors) .addAttributesExtractors(additionalAttributesExtractors)

View File

@ -27,7 +27,9 @@ public final class PlayWsClientInstrumenterFactory {
Instrumenter.<Request, Response>builder( Instrumenter.<Request, Response>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
instrumentationName, instrumentationName,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -20,6 +20,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerExperime
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -45,6 +46,11 @@ public final class RatpackTelemetryBuilder {
httpServerAttributesExtractorBuilder = httpServerAttributesExtractorBuilder =
HttpServerAttributesExtractor.builder(RatpackHttpAttributesGetter.INSTANCE); HttpServerAttributesExtractor.builder(RatpackHttpAttributesGetter.INSTANCE);
private final HttpSpanNameExtractorBuilder<RequestSpec> httpClientSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(RatpackHttpClientAttributesGetter.INSTANCE);
private final HttpSpanNameExtractorBuilder<Request> httpServerSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(RatpackHttpAttributesGetter.INSTANCE);
private final List<AttributesExtractor<? super RequestSpec, ? super HttpResponse>> private final List<AttributesExtractor<? super RequestSpec, ? super HttpResponse>>
additionalHttpClientExtractors = new ArrayList<>(); additionalHttpClientExtractors = new ArrayList<>();
@ -135,6 +141,8 @@ public final class RatpackTelemetryBuilder {
public RatpackTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public RatpackTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
httpClientAttributesExtractorBuilder.setKnownMethods(knownMethods); httpClientAttributesExtractorBuilder.setKnownMethods(knownMethods);
httpServerAttributesExtractorBuilder.setKnownMethods(knownMethods); httpServerAttributesExtractorBuilder.setKnownMethods(knownMethods);
httpClientSpanNameExtractorBuilder.setKnownMethods(knownMethods);
httpServerSpanNameExtractorBuilder.setKnownMethods(knownMethods);
return this; return this;
} }
@ -174,7 +182,7 @@ public final class RatpackTelemetryBuilder {
InstrumenterBuilder<Request, Response> builder = InstrumenterBuilder<Request, Response> builder =
Instrumenter.<Request, Response>builder( Instrumenter.<Request, Response>builder(
openTelemetry, INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributes)) openTelemetry, INSTRUMENTATION_NAME, httpServerSpanNameExtractorBuilder.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes))
.addAttributesExtractor(httpServerAttributesExtractorBuilder.build()) .addAttributesExtractor(httpServerAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalExtractors) .addAttributesExtractors(additionalExtractors)
@ -191,7 +199,7 @@ public final class RatpackTelemetryBuilder {
InstrumenterBuilder<RequestSpec, HttpResponse> builder = InstrumenterBuilder<RequestSpec, HttpResponse> builder =
Instrumenter.<RequestSpec, HttpResponse>builder( Instrumenter.<RequestSpec, HttpResponse>builder(
openTelemetry, INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributes)) openTelemetry, INSTRUMENTATION_NAME, httpClientSpanNameExtractorBuilder.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes))
.addAttributesExtractor(httpClientAttributesExtractorBuilder.build()) .addAttributesExtractor(httpClientAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalHttpClientExtractors) .addAttributesExtractors(additionalHttpClientExtractors)

View File

@ -50,7 +50,9 @@ public final class ReactorNettySingletons {
Instrumenter.<HttpClientRequest, HttpClientResponse>builder( Instrumenter.<HttpClientRequest, HttpClientResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -16,6 +16,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerExperime
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -34,7 +35,8 @@ public final class RestletTelemetryBuilder {
private final HttpServerAttributesExtractorBuilder<Request, Response> private final HttpServerAttributesExtractorBuilder<Request, Response>
httpAttributesExtractorBuilder = httpAttributesExtractorBuilder =
HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE); HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE);
private final HttpSpanNameExtractorBuilder<Request> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(RestletHttpAttributesGetter.INSTANCE);
private boolean emitExperimentalHttpServerMetrics = false; private boolean emitExperimentalHttpServerMetrics = false;
RestletTelemetryBuilder(OpenTelemetry openTelemetry) { RestletTelemetryBuilder(OpenTelemetry openTelemetry) {
@ -90,6 +92,7 @@ public final class RestletTelemetryBuilder {
@CanIgnoreReturnValue @CanIgnoreReturnValue
public RestletTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public RestletTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
httpAttributesExtractorBuilder.setKnownMethods(knownMethods); httpAttributesExtractorBuilder.setKnownMethods(knownMethods);
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods);
return this; return this;
} }
@ -115,9 +118,7 @@ public final class RestletTelemetryBuilder {
InstrumenterBuilder<Request, Response> builder = InstrumenterBuilder<Request, Response> builder =
Instrumenter.<Request, Response>builder( Instrumenter.<Request, Response>builder(
openTelemetry, openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter))
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(httpAttributesExtractorBuilder.build())
.addAttributesExtractors(additionalExtractors) .addAttributesExtractors(additionalExtractors)

View File

@ -9,6 +9,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletHttpAttributesGetter; import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletHttpAttributesGetter;
import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumenterFactory; import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumenterFactory;
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
@ -27,6 +28,9 @@ public final class RestletSingletons {
.setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders())
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()) .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build(), .build(),
HttpSpanNameExtractor.builder(RestletHttpAttributesGetter.INSTANCE)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build(),
Collections.emptyList(), Collections.emptyList(),
CommonConfig.get().shouldEmitExperimentalHttpServerMetrics()); CommonConfig.get().shouldEmitExperimentalHttpServerMetrics());

View File

@ -11,6 +11,8 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletHttpAttributesGetter; import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletHttpAttributesGetter;
import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumenterFactory; import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumenterFactory;
import java.util.ArrayList; import java.util.ArrayList;
@ -28,7 +30,8 @@ public final class RestletTelemetryBuilder {
private final HttpServerAttributesExtractorBuilder<Request, Response> private final HttpServerAttributesExtractorBuilder<Request, Response>
httpAttributesExtractorBuilder = httpAttributesExtractorBuilder =
HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE); HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE);
private final HttpSpanNameExtractorBuilder<Request> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(RestletHttpAttributesGetter.INSTANCE);
private boolean emitExperimentalHttpServerMetrics = false; private boolean emitExperimentalHttpServerMetrics = false;
RestletTelemetryBuilder(OpenTelemetry openTelemetry) { RestletTelemetryBuilder(OpenTelemetry openTelemetry) {
@ -84,6 +87,7 @@ public final class RestletTelemetryBuilder {
@CanIgnoreReturnValue @CanIgnoreReturnValue
public RestletTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public RestletTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
httpAttributesExtractorBuilder.setKnownMethods(knownMethods); httpAttributesExtractorBuilder.setKnownMethods(knownMethods);
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods);
return this; return this;
} }
@ -109,6 +113,7 @@ public final class RestletTelemetryBuilder {
RestletInstrumenterFactory.newServerInstrumenter( RestletInstrumenterFactory.newServerInstrumenter(
openTelemetry, openTelemetry,
httpAttributesExtractorBuilder.build(), httpAttributesExtractorBuilder.build(),
httpSpanNameExtractorBuilder.build(),
additionalExtractors, additionalExtractors,
emitExperimentalHttpServerMetrics); emitExperimentalHttpServerMetrics);

View File

@ -9,10 +9,10 @@ import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerExperimentalMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import java.util.List; import java.util.List;
import org.restlet.Request; import org.restlet.Request;
@ -29,6 +29,7 @@ public final class RestletInstrumenterFactory {
public static Instrumenter<Request, Response> newServerInstrumenter( public static Instrumenter<Request, Response> newServerInstrumenter(
OpenTelemetry openTelemetry, OpenTelemetry openTelemetry,
AttributesExtractor<Request, Response> httpServerAttributesExtractor, AttributesExtractor<Request, Response> httpServerAttributesExtractor,
SpanNameExtractor<Request> httpServerSpanNameExtractor,
List<AttributesExtractor<Request, Response>> additionalExtractors, List<AttributesExtractor<Request, Response>> additionalExtractors,
boolean emitExperimentalHttpServerMetrics) { boolean emitExperimentalHttpServerMetrics) {
@ -36,9 +37,7 @@ public final class RestletInstrumenterFactory {
InstrumenterBuilder<Request, Response> builder = InstrumenterBuilder<Request, Response> builder =
Instrumenter.<Request, Response>builder( Instrumenter.<Request, Response>builder(
openTelemetry, openTelemetry, INSTRUMENTATION_NAME, httpServerSpanNameExtractor)
INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter))
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(httpServerAttributesExtractor) .addAttributesExtractor(httpServerAttributesExtractor)
.addAttributesExtractors(additionalExtractors) .addAttributesExtractors(additionalExtractors)

View File

@ -87,7 +87,9 @@ public final class ServletInstrumenterBuilder<REQUEST, RESPONSE> {
HttpServerAttributesGetter<ServletRequestContext<REQUEST>, ServletResponseContext<RESPONSE>> HttpServerAttributesGetter<ServletRequestContext<REQUEST>, ServletResponseContext<RESPONSE>>
httpAttributesGetter = new ServletHttpAttributesGetter<>(accessor); httpAttributesGetter = new ServletHttpAttributesGetter<>(accessor);
SpanNameExtractor<ServletRequestContext<REQUEST>> spanNameExtractor = SpanNameExtractor<ServletRequestContext<REQUEST>> spanNameExtractor =
HttpSpanNameExtractor.create(httpAttributesGetter); HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build();
return build(instrumentationName, accessor, spanNameExtractor, httpAttributesGetter); return build(instrumentationName, accessor, spanNameExtractor, httpAttributesGetter);
} }

View File

@ -16,6 +16,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttribut
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -35,6 +36,8 @@ public final class SpringWebTelemetryBuilder {
private final HttpClientAttributesExtractorBuilder<HttpRequest, ClientHttpResponse> private final HttpClientAttributesExtractorBuilder<HttpRequest, ClientHttpResponse>
httpAttributesExtractorBuilder = httpAttributesExtractorBuilder =
HttpClientAttributesExtractor.builder(SpringWebHttpAttributesGetter.INSTANCE); HttpClientAttributesExtractor.builder(SpringWebHttpAttributesGetter.INSTANCE);
private final HttpSpanNameExtractorBuilder<HttpRequest> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(SpringWebHttpAttributesGetter.INSTANCE);
private boolean emitExperimentalHttpClientMetrics = false; private boolean emitExperimentalHttpClientMetrics = false;
@Nullable @Nullable
@ -103,6 +106,7 @@ public final class SpringWebTelemetryBuilder {
@CanIgnoreReturnValue @CanIgnoreReturnValue
public SpringWebTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public SpringWebTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
httpAttributesExtractorBuilder.setKnownMethods(knownMethods); httpAttributesExtractorBuilder.setKnownMethods(knownMethods);
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods);
return this; return this;
} }
@ -126,8 +130,7 @@ public final class SpringWebTelemetryBuilder {
public SpringWebTelemetry build() { public SpringWebTelemetry build() {
SpringWebHttpAttributesGetter httpAttributeGetter = SpringWebHttpAttributesGetter.INSTANCE; SpringWebHttpAttributesGetter httpAttributeGetter = SpringWebHttpAttributesGetter.INSTANCE;
SpanNameExtractor<HttpRequest> originalSpanNameExtractor = SpanNameExtractor<HttpRequest> originalSpanNameExtractor = httpSpanNameExtractorBuilder.build();
HttpSpanNameExtractor.create(httpAttributeGetter);
SpanNameExtractor<? super HttpRequest> spanNameExtractor = originalSpanNameExtractor; SpanNameExtractor<? super HttpRequest> spanNameExtractor = originalSpanNameExtractor;
if (spanNameExtractorTransformer != null) { if (spanNameExtractorTransformer != null) {
spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor); spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor);

View File

@ -30,6 +30,7 @@ public final class WebClientHelper {
.setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders()) .setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders())
.setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders())
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()), .setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
singletonList( singletonList(
PeerServiceAttributesExtractor.create( PeerServiceAttributesExtractor.create(
WebClientHttpAttributesGetter.INSTANCE, WebClientHttpAttributesGetter.INSTANCE,

View File

@ -17,6 +17,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerExperime
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.ClientInstrumenterFactory; import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.ClientInstrumenterFactory;
import java.util.ArrayList; import java.util.ArrayList;
@ -41,9 +42,13 @@ public final class SpringWebfluxTelemetryBuilder {
private final HttpServerAttributesExtractorBuilder<ServerWebExchange, ServerWebExchange> private final HttpServerAttributesExtractorBuilder<ServerWebExchange, ServerWebExchange>
httpServerAttributesExtractorBuilder = httpServerAttributesExtractorBuilder =
HttpServerAttributesExtractor.builder(WebfluxServerHttpAttributesGetter.INSTANCE); HttpServerAttributesExtractor.builder(WebfluxServerHttpAttributesGetter.INSTANCE);
private final HttpSpanNameExtractorBuilder<ServerWebExchange> httpServerSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(WebfluxServerHttpAttributesGetter.INSTANCE);
private Consumer<HttpClientAttributesExtractorBuilder<ClientRequest, ClientResponse>> private Consumer<HttpClientAttributesExtractorBuilder<ClientRequest, ClientResponse>>
clientExtractorConfigurer = builder -> {}; clientExtractorConfigurer = builder -> {};
private Consumer<HttpSpanNameExtractorBuilder<ClientRequest>> clientSpanNameExtractorConfigurer =
builder -> {};
private boolean captureExperimentalSpanAttributes = false; private boolean captureExperimentalSpanAttributes = false;
private boolean emitExperimentalHttpClientMetrics = false; private boolean emitExperimentalHttpClientMetrics = false;
private boolean emitExperimentalHttpServerMetrics = false; private boolean emitExperimentalHttpServerMetrics = false;
@ -158,7 +163,10 @@ public final class SpringWebfluxTelemetryBuilder {
public SpringWebfluxTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public SpringWebfluxTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
clientExtractorConfigurer = clientExtractorConfigurer =
clientExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods)); clientExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
clientSpanNameExtractorConfigurer =
clientSpanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
httpServerAttributesExtractorBuilder.setKnownMethods(knownMethods); httpServerAttributesExtractorBuilder.setKnownMethods(knownMethods);
httpServerSpanNameExtractorBuilder.setKnownMethods(knownMethods);
return this; return this;
} }
@ -198,6 +206,7 @@ public final class SpringWebfluxTelemetryBuilder {
ClientInstrumenterFactory.create( ClientInstrumenterFactory.create(
openTelemetry, openTelemetry,
clientExtractorConfigurer, clientExtractorConfigurer,
clientSpanNameExtractorConfigurer,
clientAdditionalExtractors, clientAdditionalExtractors,
captureExperimentalSpanAttributes, captureExperimentalSpanAttributes,
emitExperimentalHttpClientMetrics); emitExperimentalHttpClientMetrics);
@ -214,7 +223,7 @@ public final class SpringWebfluxTelemetryBuilder {
InstrumenterBuilder<ServerWebExchange, ServerWebExchange> builder = InstrumenterBuilder<ServerWebExchange, ServerWebExchange> builder =
Instrumenter.<ServerWebExchange, ServerWebExchange>builder( Instrumenter.<ServerWebExchange, ServerWebExchange>builder(
openTelemetry, INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(getter)) openTelemetry, INSTRUMENTATION_NAME, httpServerSpanNameExtractorBuilder.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(getter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(getter))
.addAttributesExtractor(httpServerAttributesExtractorBuilder.build()) .addAttributesExtractor(httpServerAttributesExtractorBuilder.build())
.addAttributesExtractors(serverAdditionalExtractors) .addAttributesExtractors(serverAdditionalExtractors)

View File

@ -16,6 +16,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttribut
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -36,6 +37,7 @@ public final class ClientInstrumenterFactory {
OpenTelemetry openTelemetry, OpenTelemetry openTelemetry,
Consumer<HttpClientAttributesExtractorBuilder<ClientRequest, ClientResponse>> Consumer<HttpClientAttributesExtractorBuilder<ClientRequest, ClientResponse>>
extractorConfigurer, extractorConfigurer,
Consumer<HttpSpanNameExtractorBuilder<ClientRequest>> spanNameExtractorConfigurer,
List<AttributesExtractor<ClientRequest, ClientResponse>> additionalExtractors, List<AttributesExtractor<ClientRequest, ClientResponse>> additionalExtractors,
boolean captureExperimentalSpanAttributes, boolean captureExperimentalSpanAttributes,
boolean emitExperimentalHttpClientMetrics) { boolean emitExperimentalHttpClientMetrics) {
@ -46,11 +48,13 @@ public final class ClientInstrumenterFactory {
HttpClientAttributesExtractor.builder(httpAttributesGetter); HttpClientAttributesExtractor.builder(httpAttributesGetter);
extractorConfigurer.accept(extractorBuilder); extractorConfigurer.accept(extractorBuilder);
HttpSpanNameExtractorBuilder<ClientRequest> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(httpAttributesGetter);
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
InstrumenterBuilder<ClientRequest, ClientResponse> clientBuilder = InstrumenterBuilder<ClientRequest, ClientResponse> clientBuilder =
Instrumenter.<ClientRequest, ClientResponse>builder( Instrumenter.<ClientRequest, ClientResponse>builder(
openTelemetry, openTelemetry, INSTRUMENTATION_NAME, httpSpanNameExtractorBuilder.build())
INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter))
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor(extractorBuilder.build()) .addAttributesExtractor(extractorBuilder.build())
.addAttributesExtractors(additionalExtractors) .addAttributesExtractors(additionalExtractors)

View File

@ -17,6 +17,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerExperime
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -37,6 +38,8 @@ public final class SpringWebMvcTelemetryBuilder {
private final HttpServerAttributesExtractorBuilder<HttpServletRequest, HttpServletResponse> private final HttpServerAttributesExtractorBuilder<HttpServletRequest, HttpServletResponse>
httpAttributesExtractorBuilder = httpAttributesExtractorBuilder =
HttpServerAttributesExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE); HttpServerAttributesExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
private final HttpSpanNameExtractorBuilder<HttpServletRequest> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
@Nullable @Nullable
private Function< private Function<
@ -110,6 +113,7 @@ public final class SpringWebMvcTelemetryBuilder {
@CanIgnoreReturnValue @CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public SpringWebMvcTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
httpAttributesExtractorBuilder.setKnownMethods(knownMethods); httpAttributesExtractorBuilder.setKnownMethods(knownMethods);
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods);
return this; return this;
} }
@ -135,7 +139,7 @@ public final class SpringWebMvcTelemetryBuilder {
SpringWebMvcHttpAttributesGetter.INSTANCE; SpringWebMvcHttpAttributesGetter.INSTANCE;
SpanNameExtractor<HttpServletRequest> originalSpanNameExtractor = SpanNameExtractor<HttpServletRequest> originalSpanNameExtractor =
HttpSpanNameExtractor.create(httpAttributesGetter); httpSpanNameExtractorBuilder.build();
SpanNameExtractor<? super HttpServletRequest> spanNameExtractor = originalSpanNameExtractor; SpanNameExtractor<? super HttpServletRequest> spanNameExtractor = originalSpanNameExtractor;
if (spanNameExtractorTransformer != null) { if (spanNameExtractorTransformer != null) {
spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor); spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor);

View File

@ -17,6 +17,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerExperime
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractorBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@ -37,6 +38,8 @@ public final class SpringWebMvcTelemetryBuilder {
private final HttpServerAttributesExtractorBuilder<HttpServletRequest, HttpServletResponse> private final HttpServerAttributesExtractorBuilder<HttpServletRequest, HttpServletResponse>
httpAttributesExtractorBuilder = httpAttributesExtractorBuilder =
HttpServerAttributesExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE); HttpServerAttributesExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
private final HttpSpanNameExtractorBuilder<HttpServletRequest> httpSpanNameExtractorBuilder =
HttpSpanNameExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
@Nullable @Nullable
private Function< private Function<
@ -110,6 +113,7 @@ public final class SpringWebMvcTelemetryBuilder {
@CanIgnoreReturnValue @CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder setKnownMethods(Set<String> knownMethods) { public SpringWebMvcTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
httpAttributesExtractorBuilder.setKnownMethods(knownMethods); httpAttributesExtractorBuilder.setKnownMethods(knownMethods);
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods);
return this; return this;
} }
@ -135,7 +139,7 @@ public final class SpringWebMvcTelemetryBuilder {
SpringWebMvcHttpAttributesGetter.INSTANCE; SpringWebMvcHttpAttributesGetter.INSTANCE;
SpanNameExtractor<HttpServletRequest> originalSpanNameExtractor = SpanNameExtractor<HttpServletRequest> originalSpanNameExtractor =
HttpSpanNameExtractor.create(httpAttributesGetter); httpSpanNameExtractorBuilder.build();
SpanNameExtractor<? super HttpServletRequest> spanNameExtractor = originalSpanNameExtractor; SpanNameExtractor<? super HttpServletRequest> spanNameExtractor = originalSpanNameExtractor;
if (spanNameExtractorTransformer != null) { if (spanNameExtractorTransformer != null) {
spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor); spanNameExtractor = spanNameExtractorTransformer.apply(originalSpanNameExtractor);

View File

@ -33,7 +33,9 @@ public final class TomcatInstrumenterFactory {
Instrumenter.<Request, Response>builder( Instrumenter.<Request, Response>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
instrumentationName, instrumentationName,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.setErrorCauseExtractor(new ServletErrorCauseExtractor<>(accessor)) .setErrorCauseExtractor(new ServletErrorCauseExtractor<>(accessor))
.addAttributesExtractor( .addAttributesExtractor(

View File

@ -31,7 +31,9 @@ public final class UndertowSingletons {
Instrumenter.<HttpServerExchange, HttpServerExchange>builder( Instrumenter.<HttpServerExchange, HttpServerExchange>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
INSTRUMENTATION_NAME, INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpServerAttributesExtractor.builder(httpAttributesGetter) HttpServerAttributesExtractor.builder(httpAttributesGetter)

View File

@ -27,7 +27,9 @@ public final class VertxClientInstrumenterFactory {
Instrumenter.<HttpClientRequest, HttpClientResponse>builder( Instrumenter.<HttpClientRequest, HttpClientResponse>builder(
GlobalOpenTelemetry.get(), GlobalOpenTelemetry.get(),
instrumentationName, instrumentationName,
HttpSpanNameExtractor.create(httpAttributesGetter)) HttpSpanNameExtractor.builder(httpAttributesGetter)
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
.build())
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
.addAttributesExtractor( .addAttributesExtractor(
HttpClientAttributesExtractor.builder(httpAttributesGetter) HttpClientAttributesExtractor.builder(httpAttributesGetter)

View File

@ -374,7 +374,7 @@ abstract class HttpClientTest<REQUEST> extends InstrumentationSpecification {
} }
protected String expectedClientSpanName(URI uri, String method) { protected String expectedClientSpanName(URI uri, String method) {
return HttpConstants._OTHER == method ? "TEST" : method return HttpConstants._OTHER == method ? "HTTP" : method
} }
Integer responseCodeOnRedirectError() { Integer responseCodeOnRedirectError() {

View File

@ -36,7 +36,7 @@ public abstract class HttpClientTestOptions {
SemconvStabilityUtil.getAttributeKey(SemanticAttributes.USER_AGENT_ORIGINAL)))); SemconvStabilityUtil.getAttributeKey(SemanticAttributes.USER_AGENT_ORIGINAL))));
public static final BiFunction<URI, String, String> DEFAULT_EXPECTED_CLIENT_SPAN_NAME_MAPPER = public static final BiFunction<URI, String, String> DEFAULT_EXPECTED_CLIENT_SPAN_NAME_MAPPER =
(uri, method) -> HttpConstants._OTHER.equals(method) ? "TEST" : method; (uri, method) -> HttpConstants._OTHER.equals(method) ? "HTTP" : method;
public static final int FOUND_STATUS_CODE = HttpStatus.FOUND.code(); public static final int FOUND_STATUS_CODE = HttpStatus.FOUND.code();