diff --git a/instrumentation-api/src/jmh/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBenchmark.java b/instrumentation-api/src/jmh/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBenchmark.java index 88d0754772a5..6d06c45b219c 100644 --- a/instrumentation-api/src/jmh/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBenchmark.java +++ b/instrumentation-api/src/jmh/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBenchmark.java @@ -7,7 +7,6 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesGetter; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; @@ -43,9 +42,7 @@ public class InstrumenterBenchmark { "benchmark", HttpSpanNameExtractor.create(ConstantHttpAttributesGetter.INSTANCE)) .addAttributesExtractor( - HttpClientAttributesExtractor.builder(ConstantHttpAttributesGetter.INSTANCE) - .captureHttpHeaders(CapturedHttpHeaders.empty()) - .build()) + HttpClientAttributesExtractor.create(ConstantHttpAttributesGetter.INSTANCE)) .addAttributesExtractor( NetServerAttributesExtractor.create(new ConstantNetAttributesGetter())) .newInstrumenter(); diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/CapturedHttpHeaders.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/CapturedHttpHeaders.java index fc7b8c3185d6..6481c63b0bf0 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/CapturedHttpHeaders.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/CapturedHttpHeaders.java @@ -23,8 +23,16 @@ * attribute key. The HTTP response header values will be captured under the {@code * http.response.header.} attribute key. The {@code } part in the attribute key is the * normalized header name: lowercase, with dashes replaced by underscores. + * + * @deprecated This class should no longer be used directly. Use the {@link + * HttpClientAttributesExtractorBuilder#setCapturedRequestHeaders(List)}, {@link + * HttpClientAttributesExtractorBuilder#setCapturedResponseHeaders(List)}, {@link + * HttpServerAttributesExtractorBuilder#setCapturedRequestHeaders(List)} and {@link + * HttpServerAttributesExtractorBuilder#setCapturedResponseHeaders(List)} methods instead. */ +@Deprecated @AutoValue +@AutoValue.CopyAnnotations public abstract class CapturedHttpHeaders { private static final CapturedHttpHeaders EMPTY = create(emptyList(), emptyList()); diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractor.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractor.java index 564066e411ef..93deffd00c0f 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractor.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractor.java @@ -19,6 +19,7 @@ * return {@code null} from the protected attribute methods, but implement as many as possible for * best compliance with the OpenTelemetry specification. */ +@SuppressWarnings("deprecation") // suppress CapturedHttpHeaders deprecation public final class HttpClientAttributesExtractor extends HttpCommonAttributesExtractor< REQUEST, RESPONSE, HttpClientAttributesGetter> { diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractorBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractorBuilder.java index 3ca17a3b99b6..2afc3ce0f16c 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractorBuilder.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractorBuilder.java @@ -6,8 +6,10 @@ package io.opentelemetry.instrumentation.api.instrumenter.http; import io.opentelemetry.instrumentation.api.config.Config; +import java.util.List; /** A builder of {@link HttpClientAttributesExtractor}. */ +@SuppressWarnings("deprecation") // suppress CapturedHttpHeaders deprecation public final class HttpClientAttributesExtractorBuilder { final HttpClientAttributesGetter getter; @@ -22,13 +24,40 @@ public final class HttpClientAttributesExtractorBuilder { * * @param capturedHttpHeaders A configuration object specifying which HTTP request and response * headers should be captured as span attributes. + * @deprecated Use {@link #setCapturedRequestHeaders(List)} and {@link + * #setCapturedResponseHeaders(List)} instead. */ + @Deprecated public HttpClientAttributesExtractorBuilder captureHttpHeaders( CapturedHttpHeaders capturedHttpHeaders) { this.capturedHttpHeaders = capturedHttpHeaders; return this; } + /** + * Configures the HTTP request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public HttpClientAttributesExtractorBuilder setCapturedRequestHeaders( + List requestHeaders) { + this.capturedHttpHeaders = + CapturedHttpHeaders.create(requestHeaders, capturedHttpHeaders.responseHeaders()); + return this; + } + + /** + * Configures the HTTP response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public HttpClientAttributesExtractorBuilder setCapturedResponseHeaders( + List responseHeaders) { + this.capturedHttpHeaders = + CapturedHttpHeaders.create(capturedHttpHeaders.requestHeaders(), responseHeaders); + return this; + } + /** * Returns a new {@link HttpClientAttributesExtractor} with the settings of this {@link * HttpClientAttributesExtractorBuilder}. diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpCommonAttributesExtractor.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpCommonAttributesExtractor.java index 45a2da66842a..5d81c7e28289 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpCommonAttributesExtractor.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpCommonAttributesExtractor.java @@ -20,6 +20,7 @@ * href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md#common-attributes">HTTP * attributes that are common to client and server instrumentations. */ +@SuppressWarnings("deprecation") // suppress CapturedHttpHeaders deprecation abstract class HttpCommonAttributesExtractor< REQUEST, RESPONSE, GETTER extends HttpCommonAttributesGetter> implements AttributesExtractor { diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractor.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractor.java index 332cdc60ece6..d92e37e18663 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractor.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractor.java @@ -25,6 +25,7 @@ * return {@code null} from the protected attribute methods, but implement as many as possible for * best compliance with the OpenTelemetry specification. */ +@SuppressWarnings("deprecation") // suppress CapturedHttpHeaders deprecation public final class HttpServerAttributesExtractor extends HttpCommonAttributesExtractor< REQUEST, RESPONSE, HttpServerAttributesGetter> { diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorBuilder.java index eaae118b78c8..c7f6bba85fce 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorBuilder.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorBuilder.java @@ -6,8 +6,10 @@ package io.opentelemetry.instrumentation.api.instrumenter.http; import io.opentelemetry.instrumentation.api.config.Config; +import java.util.List; /** A builder of {@link HttpServerAttributesExtractor}. */ +@SuppressWarnings("deprecation") // suppress CapturedHttpHeaders deprecation public final class HttpServerAttributesExtractorBuilder { final HttpServerAttributesGetter getter; @@ -22,13 +24,40 @@ public final class HttpServerAttributesExtractorBuilder { * * @param capturedHttpHeaders A configuration object specifying which HTTP request and response * headers should be captured as span attributes. + * @deprecated Use {@link #setCapturedRequestHeaders(List)} and {@link + * #setCapturedResponseHeaders(List)} instead. */ + @Deprecated public HttpServerAttributesExtractorBuilder captureHttpHeaders( CapturedHttpHeaders capturedHttpHeaders) { this.capturedHttpHeaders = capturedHttpHeaders; return this; } + /** + * Configures the HTTP request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public HttpServerAttributesExtractorBuilder setCapturedRequestHeaders( + List requestHeaders) { + this.capturedHttpHeaders = + CapturedHttpHeaders.create(requestHeaders, capturedHttpHeaders.responseHeaders()); + return this; + } + + /** + * Configures the HTTP response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public HttpServerAttributesExtractorBuilder setCapturedResponseHeaders( + List responseHeaders) { + this.capturedHttpHeaders = + CapturedHttpHeaders.create(capturedHttpHeaders.requestHeaders(), responseHeaders); + return this; + } + /** * Returns a new {@link HttpServerAttributesExtractor} with the settings of this {@link * HttpServerAttributesExtractorBuilder}. diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractorTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractorTest.java index 6bdfe7f4b7f0..0e1a0b8456dc 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractorTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientAttributesExtractorTest.java @@ -105,10 +105,8 @@ void normal() { HttpClientAttributesExtractor, Map> extractor = HttpClientAttributesExtractor.builder(new TestHttpClientAttributesGetter()) - .captureHttpHeaders( - CapturedHttpHeaders.create( - singletonList("Custom-Request-Header"), - singletonList("Custom-Response-Header"))) + .setCapturedRequestHeaders(singletonList("Custom-Request-Header")) + .setCapturedResponseHeaders(singletonList("Custom-Response-Header")) .build(); AttributesBuilder attributes = Attributes.builder(); @@ -151,7 +149,8 @@ void invalidStatusCode() { HttpClientAttributesExtractor, Map> extractor = HttpClientAttributesExtractor.builder(new TestHttpClientAttributesGetter()) - .captureHttpHeaders(CapturedHttpHeaders.empty()) + .setCapturedRequestHeaders(emptyList()) + .setCapturedResponseHeaders(emptyList()) .build(); AttributesBuilder attributes = Attributes.builder(); diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorTest.java index 5c41ff307465..71646a62db72 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorTest.java @@ -22,6 +22,7 @@ import java.util.function.Function; import org.junit.jupiter.api.Test; +@SuppressWarnings("deprecation") // suppress CapturedHttpHeaders deprecation class HttpServerAttributesExtractorTest { static class TestHttpServerAttributesExtractor @@ -185,7 +186,8 @@ void extractClientIpFromX_Forwarded_For() { HttpServerAttributesExtractor, Map> extractor = HttpServerAttributesExtractor.builder(new TestHttpServerAttributesExtractor()) - .captureHttpHeaders(CapturedHttpHeaders.empty()) + .setCapturedRequestHeaders(emptyList()) + .setCapturedResponseHeaders(emptyList()) .build(); AttributesBuilder attributes = Attributes.builder(); @@ -205,7 +207,8 @@ void extractClientIpFromX_Forwarded_Proto() { HttpServerAttributesExtractor, Map> extractor = HttpServerAttributesExtractor.builder(new TestHttpServerAttributesExtractor()) - .captureHttpHeaders(CapturedHttpHeaders.empty()) + .setCapturedRequestHeaders(emptyList()) + .setCapturedResponseHeaders(emptyList()) .build(); AttributesBuilder attributes = Attributes.builder(); diff --git a/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientHttpAttributesGetter.java b/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientHttpAttributesGetter.java index ea6ae1fa0340..677739cd8fa9 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientHttpAttributesGetter.java +++ b/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientHttpAttributesGetter.java @@ -12,8 +12,9 @@ import javax.annotation.Nullable; import org.apache.http.HttpResponse; -final class ApacheHttpClientHttpAttributesGetter +enum ApacheHttpClientHttpAttributesGetter implements HttpClientAttributesGetter { + INSTANCE; @Override public String method(ApacheHttpClientRequest request) { diff --git a/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientTracingBuilder.java b/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientTracingBuilder.java index 3d6598e1ffea..642b81b7dff8 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientTracingBuilder.java +++ b/instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientTracingBuilder.java @@ -6,12 +6,11 @@ package io.opentelemetry.instrumentation.apachehttpclient.v4_3; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; @@ -28,7 +27,9 @@ public final class ApacheHttpClientTracingBuilder { private final List> additionalExtractors = new ArrayList<>(); - private CapturedHttpHeaders capturedHttpHeaders = CapturedHttpHeaders.client(Config.get()); + private final HttpClientAttributesExtractorBuilder + httpAttributesExtractorBuilder = + HttpClientAttributesExtractor.builder(ApacheHttpClientHttpAttributesGetter.INSTANCE); ApacheHttpClientTracingBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -49,12 +50,37 @@ public ApacheHttpClientTracingBuilder addAttributeExtractor( * Configure the instrumentation to capture chosen HTTP request and response headers as span * attributes. * - * @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured - * HTTP request and response names. + * @param capturedHttpHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the + * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedRequestHeaders(List)} and {@link + * #setCapturedResponseHeaders(List)} instead. */ + @Deprecated public ApacheHttpClientTracingBuilder captureHttpHeaders( - CapturedHttpHeaders capturedHttpHeaders) { - this.capturedHttpHeaders = capturedHttpHeaders; + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpHeaders) { + httpAttributesExtractorBuilder.captureHttpHeaders(capturedHttpHeaders); + return this; + } + + /** + * Configures the HTTP request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public ApacheHttpClientTracingBuilder setCapturedRequestHeaders(List requestHeaders) { + httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public ApacheHttpClientTracingBuilder setCapturedResponseHeaders(List responseHeaders) { + httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -64,7 +90,7 @@ public ApacheHttpClientTracingBuilder captureHttpHeaders( */ public ApacheHttpClientTracing build() { ApacheHttpClientHttpAttributesGetter httpAttributesGetter = - new ApacheHttpClientHttpAttributesGetter(); + ApacheHttpClientHttpAttributesGetter.INSTANCE; ApacheHttpClientNetAttributesGetter netAttributesGetter = new ApacheHttpClientNetAttributesGetter(); @@ -74,10 +100,7 @@ public ApacheHttpClientTracing build() { INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .captureHttpHeaders(capturedHttpHeaders) - .build()) + .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(NetClientAttributesExtractor.create(netAttributesGetter)) .addAttributesExtractors(additionalExtractors) // We manually inject because we need to inject internal requests for redirects. diff --git a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpClientAttributesGetter.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpClientAttributesGetter.java index ce5733201b78..dc93929faa7d 100644 --- a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpClientAttributesGetter.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpClientAttributesGetter.java @@ -15,8 +15,9 @@ import java.util.List; import javax.annotation.Nullable; -final class ArmeriaHttpClientAttributesGetter +enum ArmeriaHttpClientAttributesGetter implements HttpClientAttributesGetter { + INSTANCE; @Override public String method(RequestContext ctx) { diff --git a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerAttributesGetter.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerAttributesGetter.java index d4d74134954c..cfae5c0b0a64 100644 --- a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerAttributesGetter.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerAttributesGetter.java @@ -16,8 +16,9 @@ import java.util.List; import javax.annotation.Nullable; -final class ArmeriaHttpServerAttributesGetter +enum ArmeriaHttpServerAttributesGetter implements HttpServerAttributesGetter { + INSTANCE; @Override public String method(RequestContext ctx) { diff --git a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.java index d11ae9f81901..9f2f1fa1d744 100644 --- a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.java @@ -10,17 +10,17 @@ import com.linecorp.armeria.common.logging.RequestLog; import com.linecorp.armeria.server.ServiceRequestContext; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; @@ -39,12 +39,17 @@ public final class ArmeriaTracingBuilder { private final OpenTelemetry openTelemetry; @Nullable private String peerService; - private CapturedHttpHeaders capturedHttpClientHeaders = CapturedHttpHeaders.client(Config.get()); - private CapturedHttpHeaders capturedHttpServerHeaders = CapturedHttpHeaders.server(Config.get()); private final List> additionalExtractors = new ArrayList<>(); + private final HttpClientAttributesExtractorBuilder + httpClientAttributesExtractorBuilder = + HttpClientAttributesExtractor.builder(ArmeriaHttpClientAttributesGetter.INSTANCE); + private final HttpServerAttributesExtractorBuilder + httpServerAttributesExtractorBuilder = + HttpServerAttributesExtractor.builder(ArmeriaHttpServerAttributesGetter.INSTANCE); + private Function< SpanStatusExtractor, ? extends SpanStatusExtractor> @@ -74,20 +79,46 @@ public ArmeriaTracingBuilder addAttributeExtractor( } /** Sets the {@code peer.service} attribute for http client spans. */ - public void setPeerService(String peerService) { + public ArmeriaTracingBuilder setPeerService(String peerService) { this.peerService = peerService; + return this; } /** * Configure the HTTP client instrumentation to capture chosen HTTP request and response headers * as span attributes. * - * @param capturedHttpClientHeaders An instance of {@link CapturedHttpHeaders} containing the + * @param capturedHttpClientHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedClientRequestHeaders(List)} and {@link + * #setCapturedClientResponseHeaders(List)} instead. */ + @Deprecated public ArmeriaTracingBuilder captureHttpClientHeaders( - CapturedHttpHeaders capturedHttpClientHeaders) { - this.capturedHttpClientHeaders = capturedHttpClientHeaders; + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpClientHeaders) { + httpClientAttributesExtractorBuilder.captureHttpHeaders(capturedHttpClientHeaders); + return this; + } + + /** + * Configures the HTTP client request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public ArmeriaTracingBuilder setCapturedClientRequestHeaders(List requestHeaders) { + httpClientAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP client response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public ArmeriaTracingBuilder setCapturedClientResponseHeaders(List responseHeaders) { + httpClientAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -95,20 +126,45 @@ public ArmeriaTracingBuilder captureHttpClientHeaders( * Configure the HTTP server instrumentation to capture chosen HTTP request and response headers * as span attributes. * - * @param capturedHttpServerHeaders An instance of {@link CapturedHttpHeaders} containing the + * @param capturedHttpServerHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedServerRequestHeaders(List)} and {@link + * #setCapturedServerResponseHeaders(List)} instead. */ + @Deprecated public ArmeriaTracingBuilder captureHttpServerHeaders( - CapturedHttpHeaders capturedHttpServerHeaders) { - this.capturedHttpServerHeaders = capturedHttpServerHeaders; + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpServerHeaders) { + httpServerAttributesExtractorBuilder.captureHttpHeaders(capturedHttpServerHeaders); + return this; + } + + /** + * Configures the HTTP server request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public ArmeriaTracingBuilder setCapturedServerRequestHeaders(List requestHeaders) { + httpServerAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP server response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public ArmeriaTracingBuilder setCapturedServerResponseHeaders(List responseHeaders) { + httpServerAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); return this; } public ArmeriaTracing build() { ArmeriaHttpClientAttributesGetter clientAttributesGetter = - new ArmeriaHttpClientAttributesGetter(); + ArmeriaHttpClientAttributesGetter.INSTANCE; ArmeriaHttpServerAttributesGetter serverAttributesGetter = - new ArmeriaHttpServerAttributesGetter(); + ArmeriaHttpServerAttributesGetter.INSTANCE; InstrumenterBuilder clientInstrumenterBuilder = Instrumenter.builder( @@ -134,10 +190,7 @@ public ArmeriaTracing build() { statusExtractorTransformer.apply( HttpSpanStatusExtractor.create(clientAttributesGetter))) .addAttributesExtractor(netClientAttributesExtractor) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(clientAttributesGetter) - .captureHttpHeaders(capturedHttpClientHeaders) - .build()) + .addAttributesExtractor(httpClientAttributesExtractorBuilder.build()) .addRequestMetrics(HttpClientMetrics.get()); serverInstrumenterBuilder .setSpanStatusExtractor( @@ -145,10 +198,7 @@ public ArmeriaTracing build() { HttpSpanStatusExtractor.create(serverAttributesGetter))) .addAttributesExtractor( NetServerAttributesExtractor.create(new ArmeriaNetServerAttributesGetter())) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(serverAttributesGetter) - .captureHttpHeaders(capturedHttpServerHeaders) - .build()) + .addAttributesExtractor(httpServerAttributesExtractorBuilder.build()) .addRequestMetrics(HttpServerMetrics.get()) .addContextCustomizer(HttpRouteHolder.get()); diff --git a/instrumentation/armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerTest.groovy b/instrumentation/armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerTest.groovy index 8810fca675bb..e45a76dd81f0 100644 --- a/instrumentation/armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerTest.groovy +++ b/instrumentation/armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerTest.groovy @@ -7,12 +7,14 @@ package io.opentelemetry.instrumentation.armeria.v1_3 import com.linecorp.armeria.server.ServerBuilder import io.opentelemetry.instrumentation.test.LibraryTestTrait +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest class ArmeriaHttpServerTest extends AbstractArmeriaHttpServerTest implements LibraryTestTrait { @Override ServerBuilder configureServer(ServerBuilder sb) { return sb.decorator(ArmeriaTracing.builder(getOpenTelemetry()) - .captureHttpServerHeaders(capturedHttpHeadersForTesting()) + .setCapturedServerRequestHeaders([AbstractHttpServerTest.TEST_REQUEST_HEADER]) + .setCapturedServerResponseHeaders([AbstractHttpServerTest.TEST_RESPONSE_HEADER]) .build() .newServiceDecorator()) } diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTracingBuilder.java b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTracingBuilder.java index 59087699fc96..ff19c47d9475 100644 --- a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTracingBuilder.java +++ b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTracingBuilder.java @@ -7,8 +7,8 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientInstrumenterBuilder; +import java.util.List; import org.eclipse.jetty.client.HttpClientTransport; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.api.Response; @@ -49,11 +49,39 @@ public JettyClientTracingBuilder addAttributeExtractor( * Configure the instrumentation to capture chosen HTTP request and response headers as span * attributes. * - * @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured - * HTTP request and response names. + * @param capturedHttpHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the + * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedRequestHeaders(List)} and {@link + * #setCapturedResponseHeaders(List)} instead. */ - public JettyClientTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttpHeaders) { - instrumenterBuilder.captureHttpHeaders(capturedHttpHeaders); + @Deprecated + public JettyClientTracingBuilder captureHttpHeaders( + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpHeaders) { + instrumenterBuilder + .setCapturedRequestHeaders(capturedHttpHeaders.requestHeaders()) + .setCapturedResponseHeaders(capturedHttpHeaders.responseHeaders()); + return this; + } + + /** + * Configures the HTTP request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public JettyClientTracingBuilder setCapturedRequestHeaders(List requestHeaders) { + instrumenterBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public JettyClientTracingBuilder setCapturedResponseHeaders(List responseHeaders) { + instrumenterBuilder.setCapturedResponseHeaders(responseHeaders); return this; } diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientHttpAttributesGetter.java b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientHttpAttributesGetter.java index eaac97f96847..7174dbded9b2 100644 --- a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientHttpAttributesGetter.java +++ b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientHttpAttributesGetter.java @@ -20,8 +20,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class JettyClientHttpAttributesGetter - implements HttpClientAttributesGetter { +enum JettyClientHttpAttributesGetter implements HttpClientAttributesGetter { + INSTANCE; private static final Logger logger = LoggerFactory.getLogger(JettyClientHttpAttributesGetter.class); diff --git a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientInstrumenterBuilder.java b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientInstrumenterBuilder.java index 41e825ff9ba4..a795c008374f 100644 --- a/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientInstrumenterBuilder.java +++ b/instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientInstrumenterBuilder.java @@ -6,11 +6,10 @@ package io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; @@ -32,7 +31,9 @@ public final class JettyClientInstrumenterBuilder { private final List> additionalExtractors = new ArrayList<>(); - private CapturedHttpHeaders capturedHttpHeaders = CapturedHttpHeaders.client(Config.get()); + private final HttpClientAttributesExtractorBuilder + httpAttributesExtractorBuilder = + HttpClientAttributesExtractor.builder(JettyClientHttpAttributesGetter.INSTANCE); public JettyClientInstrumenterBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -44,14 +45,18 @@ public JettyClientInstrumenterBuilder addAttributeExtractor( return this; } - public JettyClientInstrumenterBuilder captureHttpHeaders( - CapturedHttpHeaders capturedHttpHeaders) { - this.capturedHttpHeaders = capturedHttpHeaders; + public JettyClientInstrumenterBuilder setCapturedRequestHeaders(List requestHeaders) { + httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + public JettyClientInstrumenterBuilder setCapturedResponseHeaders(List responseHeaders) { + httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); return this; } public Instrumenter build() { - JettyClientHttpAttributesGetter httpAttributesGetter = new JettyClientHttpAttributesGetter(); + JettyClientHttpAttributesGetter httpAttributesGetter = JettyClientHttpAttributesGetter.INSTANCE; JettyHttpClientNetAttributesGetter netAttributesGetter = new JettyHttpClientNetAttributesGetter(); @@ -60,10 +65,7 @@ public Instrumenter build() { INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .captureHttpHeaders(capturedHttpHeaders) - .build()) + .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(NetClientAttributesExtractor.create(netAttributesGetter)) .addAttributesExtractors(additionalExtractors) .addRequestMetrics(HttpClientMetrics.get()) diff --git a/instrumentation/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorHttpServerAttributesGetter.kt b/instrumentation/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorHttpServerAttributesGetter.kt index 4a44061f95d4..43c992429871 100644 --- a/instrumentation/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorHttpServerAttributesGetter.kt +++ b/instrumentation/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorHttpServerAttributesGetter.kt @@ -11,8 +11,9 @@ import io.ktor.response.* import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesGetter import io.opentelemetry.semconv.trace.attributes.SemanticAttributes -internal class KtorHttpServerAttributesGetter : +internal enum class KtorHttpServerAttributesGetter : HttpServerAttributesGetter { + INSTANCE; override fun method(request: ApplicationRequest): String { return request.httpMethod.value diff --git a/instrumentation/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt b/instrumentation/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt index 870e4003ba1d..d0761488edb0 100644 --- a/instrumentation/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt +++ b/instrumentation/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt @@ -14,11 +14,9 @@ import io.ktor.util.pipeline.* import io.opentelemetry.api.OpenTelemetry import io.opentelemetry.context.Context import io.opentelemetry.extension.kotlin.asContextElement -import io.opentelemetry.instrumentation.api.config.Config import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor @@ -35,10 +33,10 @@ class KtorServerTracing private constructor( class Configuration { internal lateinit var openTelemetry: OpenTelemetry - internal var capturedHttpHeaders = CapturedHttpHeaders.server(Config.get()) - internal val additionalExtractors = mutableListOf>() + internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE) + internal var statusExtractor: (SpanStatusExtractor) -> SpanStatusExtractor = { a -> a } @@ -54,8 +52,17 @@ class KtorServerTracing private constructor( additionalExtractors.add(extractor) } - fun captureHttpHeaders(capturedHttpHeaders: CapturedHttpHeaders) { - this.capturedHttpHeaders = capturedHttpHeaders + @Deprecated("Use the new setCapturedRequestHeaders() and setCapturedResponseHeaders() methods instead") + fun captureHttpHeaders(capturedHttpHeaders: io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders) { + httpAttributesExtractorBuilder.captureHttpHeaders(capturedHttpHeaders) + } + + fun setCapturedRequestHeaders(requestHeaders: List) { + httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders) + } + + fun setCapturedResponseHeaders(responseHeaders: List) { + httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders) } internal fun isOpenTelemetryInitialized(): Boolean = this::openTelemetry.isInitialized @@ -89,7 +96,7 @@ class KtorServerTracing private constructor( throw IllegalArgumentException("OpenTelemetry must be set") } - val httpAttributesGetter = KtorHttpServerAttributesGetter() + val httpAttributesGetter = KtorHttpServerAttributesGetter.INSTANCE val instrumenterBuilder = Instrumenter.builder( configuration.openTelemetry, @@ -102,7 +109,7 @@ class KtorServerTracing private constructor( with(instrumenterBuilder) { setSpanStatusExtractor(configuration.statusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))) addAttributesExtractor(NetServerAttributesExtractor.create(KtorNetServerAttributesGetter())) - addAttributesExtractor(HttpServerAttributesExtractor.builder(httpAttributesGetter).captureHttpHeaders(configuration.capturedHttpHeaders).build()) + addAttributesExtractor(configuration.httpAttributesExtractorBuilder.build()) addRequestMetrics(HttpServerMetrics.get()) addContextCustomizer(HttpRouteHolder.get()) } diff --git a/instrumentation/ktor-1.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorTestUtil.kt b/instrumentation/ktor-1.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorTestUtil.kt index acd5e60e223c..6daf7382ec40 100644 --- a/instrumentation/ktor-1.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorTestUtil.kt +++ b/instrumentation/ktor-1.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorTestUtil.kt @@ -7,14 +7,15 @@ package io.opentelemetry.instrumentation.ktor.v1_0 import io.ktor.application.* import io.opentelemetry.api.OpenTelemetry -import io.opentelemetry.instrumentation.test.base.HttpServerTest +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest class KtorTestUtil { companion object { fun installOpenTelemetry(application: Application, openTelemetry: OpenTelemetry) { application.install(KtorServerTracing) { setOpenTelemetry(openTelemetry) - captureHttpHeaders(HttpServerTest.capturedHttpHeadersForTesting()) + setCapturedRequestHeaders(listOf(AbstractHttpServerTest.TEST_REQUEST_HEADER)) + setCapturedResponseHeaders(listOf(AbstractHttpServerTest.TEST_RESPONSE_HEADER)) } } } diff --git a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpAttributesGetter.java b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpAttributesGetter.java index 0345aa5975e1..23ced7f7c07a 100644 --- a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpAttributesGetter.java +++ b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpAttributesGetter.java @@ -12,7 +12,8 @@ import okhttp3.Request; import okhttp3.Response; -final class OkHttpAttributesGetter implements HttpClientAttributesGetter { +enum OkHttpAttributesGetter implements HttpClientAttributesGetter { + INSTANCE; @Override public String method(Request request) { diff --git a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTracingBuilder.java b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTracingBuilder.java index 2c0a2dba32d2..5ec796387990 100644 --- a/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTracingBuilder.java +++ b/instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTracingBuilder.java @@ -8,11 +8,10 @@ import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; @@ -30,7 +29,9 @@ public final class OkHttpTracingBuilder { private final OpenTelemetry openTelemetry; private final List> additionalExtractors = new ArrayList<>(); - private CapturedHttpHeaders capturedHttpHeaders = CapturedHttpHeaders.client(Config.get()); + private final HttpClientAttributesExtractorBuilder + httpAttributesExtractorBuilder = + HttpClientAttributesExtractor.builder(OkHttpAttributesGetter.INSTANCE); OkHttpTracingBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -50,17 +51,43 @@ public OkHttpTracingBuilder addAttributesExtractor( * Configure the instrumentation to capture chosen HTTP request and response headers as span * attributes. * - * @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured - * HTTP request and response names. + * @param capturedHttpHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the + * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedRequestHeaders(List)} and {@link + * #setCapturedResponseHeaders(List)} instead. */ - public OkHttpTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttpHeaders) { - this.capturedHttpHeaders = capturedHttpHeaders; + @Deprecated + public OkHttpTracingBuilder captureHttpHeaders( + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpHeaders) { + httpAttributesExtractorBuilder.captureHttpHeaders(capturedHttpHeaders); + return this; + } + + /** + * Configures the HTTP request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public OkHttpTracingBuilder setCapturedRequestHeaders(List requestHeaders) { + httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public OkHttpTracingBuilder setCapturedResponseHeaders(List responseHeaders) { + httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); return this; } /** Returns a new {@link OkHttpTracing} with the settings of this {@link OkHttpTracingBuilder}. */ public OkHttpTracing build() { - OkHttpAttributesGetter httpAttributesGetter = new OkHttpAttributesGetter(); + OkHttpAttributesGetter httpAttributesGetter = OkHttpAttributesGetter.INSTANCE; OkHttpNetAttributesGetter attributesGetter = new OkHttpNetAttributesGetter(); Instrumenter instrumenter = @@ -69,10 +96,7 @@ public OkHttpTracing build() { INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .captureHttpHeaders(capturedHttpHeaders) - .build()) + .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(NetClientAttributesExtractor.create(attributesGetter)) .addAttributesExtractors(additionalExtractors) .addRequestMetrics(HttpClientMetrics.get()) diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackHttpAttributesGetter.java b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackHttpAttributesGetter.java index d21c6973bf84..232f1e02dce6 100644 --- a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackHttpAttributesGetter.java +++ b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackHttpAttributesGetter.java @@ -14,7 +14,8 @@ import ratpack.http.Response; import ratpack.server.PublicAddress; -final class RatpackHttpAttributesGetter implements HttpServerAttributesGetter { +enum RatpackHttpAttributesGetter implements HttpServerAttributesGetter { + INSTANCE; @Override public String method(Request request) { diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackHttpClientAttributesGetter.java b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackHttpClientAttributesGetter.java index a56d41584e2e..57694d5b6c8b 100644 --- a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackHttpClientAttributesGetter.java +++ b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackHttpClientAttributesGetter.java @@ -12,8 +12,9 @@ import ratpack.http.client.HttpResponse; import ratpack.http.client.RequestSpec; -final class RatpackHttpClientAttributesGetter +enum RatpackHttpClientAttributesGetter implements HttpClientAttributesGetter { + INSTANCE; @Nullable @Override @@ -21,7 +22,6 @@ public String url(RequestSpec requestSpec) { return requestSpec.getUri().toString(); } - @Nullable @Override public String flavor(RequestSpec requestSpec, @Nullable HttpResponse httpResponse) { return SemanticAttributes.HttpFlavorValues.HTTP_1_1; diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackTracingBuilder.java b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackTracingBuilder.java index 5d4907bdf5d3..953b5ec7f963 100644 --- a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackTracingBuilder.java +++ b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackTracingBuilder.java @@ -6,12 +6,12 @@ package io.opentelemetry.instrumentation.ratpack; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; @@ -35,8 +35,12 @@ public final class RatpackTracingBuilder { private final List> additionalExtractors = new ArrayList<>(); - private CapturedHttpHeaders capturedHttpClientHeaders = CapturedHttpHeaders.client(Config.get()); - private CapturedHttpHeaders capturedHttpServerHeaders = CapturedHttpHeaders.server(Config.get()); + private final HttpClientAttributesExtractorBuilder + httpClientAttributesExtractorBuilder = + HttpClientAttributesExtractor.builder(RatpackHttpClientAttributesGetter.INSTANCE); + private final HttpServerAttributesExtractorBuilder + httpServerAttributesExtractorBuilder = + HttpServerAttributesExtractor.builder(RatpackHttpAttributesGetter.INSTANCE); private final List> additionalHttpClientExtractors = new ArrayList<>(); @@ -65,55 +69,106 @@ public RatpackTracingBuilder addClientAttributeExtractor( * Configure the instrumentation to capture chosen HTTP request and response headers as span * attributes. * - * @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured - * HTTP request and response names. - * @deprecated Use {@link #captureHttpServerHeaders(CapturedHttpHeaders)} instead. + * @param capturedHttpHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the + * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedServerRequestHeaders(List)} and {@link + * #setCapturedServerResponseHeaders(List)} instead. */ @Deprecated - public RatpackTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttpHeaders) { - return captureHttpServerHeaders(capturedHttpServerHeaders); + public RatpackTracingBuilder captureHttpHeaders( + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpHeaders) { + return captureHttpServerHeaders(capturedHttpHeaders); } /** - * Configure the HTTP client instrumentation to capture chosen HTTP request and response headers + * Configure the HTTP server instrumentation to capture chosen HTTP request and response headers * as span attributes. * - * @param capturedHttpClientHeaders An instance of {@link CapturedHttpHeaders} containing the + * @param capturedHttpServerHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedServerRequestHeaders(List)} and {@link + * #setCapturedServerResponseHeaders(List)} instead. */ - public RatpackTracingBuilder captureHttpClientHeaders( - CapturedHttpHeaders capturedHttpClientHeaders) { - this.capturedHttpClientHeaders = capturedHttpClientHeaders; + @Deprecated + public RatpackTracingBuilder captureHttpServerHeaders( + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpServerHeaders) { + httpServerAttributesExtractorBuilder.captureHttpHeaders(capturedHttpServerHeaders); return this; } /** - * Configure the HTTP server instrumentation to capture chosen HTTP request and response headers + * Configures the HTTP server request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public RatpackTracingBuilder setCapturedServerRequestHeaders(List requestHeaders) { + httpServerAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP server response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public RatpackTracingBuilder setCapturedServerResponseHeaders(List responseHeaders) { + httpServerAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); + return this; + } + + /** + * Configure the HTTP client instrumentation to capture chosen HTTP request and response headers * as span attributes. * - * @param capturedHttpServerHeaders An instance of {@link CapturedHttpHeaders} containing the + * @param capturedHttpClientHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedClientRequestHeaders(List)} and {@link + * #setCapturedClientResponseHeaders(List)} instead. */ - public RatpackTracingBuilder captureHttpServerHeaders( - CapturedHttpHeaders capturedHttpServerHeaders) { - this.capturedHttpServerHeaders = capturedHttpServerHeaders; + @Deprecated + public RatpackTracingBuilder captureHttpClientHeaders( + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpClientHeaders) { + httpClientAttributesExtractorBuilder.captureHttpHeaders(capturedHttpClientHeaders); + return this; + } + + /** + * Configures the HTTP client request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public RatpackTracingBuilder setCapturedClientRequestHeaders(List requestHeaders) { + httpClientAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP client response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public RatpackTracingBuilder setCapturedClientResponseHeaders(List responseHeaders) { + httpClientAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); return this; } /** Returns a new {@link RatpackTracing} with the configuration of this builder. */ public RatpackTracing build() { RatpackNetAttributesGetter netAttributes = new RatpackNetAttributesGetter(); - RatpackHttpAttributesGetter httpAttributes = new RatpackHttpAttributesGetter(); + RatpackHttpAttributesGetter httpAttributes = RatpackHttpAttributesGetter.INSTANCE; Instrumenter instrumenter = Instrumenter.builder( openTelemetry, INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributes)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes)) .addAttributesExtractor(NetServerAttributesExtractor.create(netAttributes)) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributes) - .captureHttpHeaders(capturedHttpServerHeaders) - .build()) + .addAttributesExtractor(httpServerAttributesExtractorBuilder.build()) .addAttributesExtractors(additionalExtractors) .addRequestMetrics(HttpServerMetrics.get()) .newServerInstrumenter(RatpackGetter.INSTANCE); @@ -123,16 +178,13 @@ public RatpackTracing build() { private Instrumenter httpClientInstrumenter() { RatpackHttpNetAttributesGetter netAttributes = new RatpackHttpNetAttributesGetter(); - RatpackHttpClientAttributesGetter httpAttributes = new RatpackHttpClientAttributesGetter(); + RatpackHttpClientAttributesGetter httpAttributes = RatpackHttpClientAttributesGetter.INSTANCE; return Instrumenter.builder( openTelemetry, INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributes)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes)) .addAttributesExtractor(NetClientAttributesExtractor.create(netAttributes)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributes) - .captureHttpHeaders(capturedHttpClientHeaders) - .build()) + .addAttributesExtractor(httpClientAttributesExtractorBuilder.build()) .addAttributesExtractors(additionalHttpClientExtractors) .addRequestMetrics(HttpServerMetrics.get()) .newClientInstrumenter(RequestHeaderSetter.INSTANCE); diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackAsyncHttpServerTest.groovy b/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackAsyncHttpServerTest.groovy index 9c0995dc12b0..f5334cd4df97 100644 --- a/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackAsyncHttpServerTest.groovy +++ b/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackAsyncHttpServerTest.groovy @@ -7,6 +7,7 @@ package io.opentelemetry.instrumentation.ratpack.server import io.opentelemetry.instrumentation.ratpack.RatpackTracing import io.opentelemetry.instrumentation.test.LibraryTestTrait +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint import ratpack.server.RatpackServerSpec @@ -14,7 +15,8 @@ class RatpackAsyncHttpServerTest extends AbstractRatpackAsyncHttpServerTest impl @Override void configure(RatpackServerSpec serverSpec) { RatpackTracing tracing = RatpackTracing.builder(openTelemetry) - .captureHttpServerHeaders(capturedHttpHeadersForTesting()) + .setCapturedServerRequestHeaders([AbstractHttpServerTest.TEST_REQUEST_HEADER]) + .setCapturedServerResponseHeaders([AbstractHttpServerTest.TEST_RESPONSE_HEADER]) .build() serverSpec.registryOf { tracing.configureServerRegistry(it) diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackForkedHttpServerTest.groovy b/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackForkedHttpServerTest.groovy index 5b06101948e2..040bc5305dc1 100644 --- a/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackForkedHttpServerTest.groovy +++ b/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackForkedHttpServerTest.groovy @@ -7,6 +7,7 @@ package io.opentelemetry.instrumentation.ratpack.server import io.opentelemetry.instrumentation.ratpack.RatpackTracing import io.opentelemetry.instrumentation.test.LibraryTestTrait +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint import ratpack.server.RatpackServerSpec @@ -14,7 +15,8 @@ class RatpackForkedHttpServerTest extends AbstractRatpackForkedHttpServerTest im @Override void configure(RatpackServerSpec serverSpec) { RatpackTracing tracing = RatpackTracing.builder(openTelemetry) - .captureHttpServerHeaders(capturedHttpHeadersForTesting()) + .setCapturedServerRequestHeaders([AbstractHttpServerTest.TEST_REQUEST_HEADER]) + .setCapturedServerResponseHeaders([AbstractHttpServerTest.TEST_RESPONSE_HEADER]) .build() serverSpec.registryOf { tracing.configureServerRegistry(it) diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackHttpServerTest.groovy b/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackHttpServerTest.groovy index 3996e6cc9f10..7d7e70dbecaf 100644 --- a/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackHttpServerTest.groovy +++ b/instrumentation/ratpack/ratpack-1.7/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackHttpServerTest.groovy @@ -7,6 +7,7 @@ package io.opentelemetry.instrumentation.ratpack.server import io.opentelemetry.instrumentation.ratpack.RatpackTracing import io.opentelemetry.instrumentation.test.LibraryTestTrait +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint import ratpack.server.RatpackServerSpec @@ -14,7 +15,8 @@ class RatpackHttpServerTest extends AbstractRatpackHttpServerTest implements Lib @Override void configure(RatpackServerSpec serverSpec) { RatpackTracing tracing = RatpackTracing.builder(openTelemetry) - .captureHttpServerHeaders(capturedHttpHeadersForTesting()) + .setCapturedServerRequestHeaders([AbstractHttpServerTest.TEST_REQUEST_HEADER]) + .setCapturedServerResponseHeaders([AbstractHttpServerTest.TEST_RESPONSE_HEADER]) .build() serverSpec.registryOf { tracing.configureServerRegistry(it) diff --git a/instrumentation/restlet/restlet-1.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_0/RestletHttpAttributesGetter.java b/instrumentation/restlet/restlet-1.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_0/RestletHttpAttributesGetter.java index 748caa2da829..0cd5a6aef514 100644 --- a/instrumentation/restlet/restlet-1.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_0/RestletHttpAttributesGetter.java +++ b/instrumentation/restlet/restlet-1.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_0/RestletHttpAttributesGetter.java @@ -20,7 +20,8 @@ import org.restlet.data.Response; import org.restlet.util.Series; -final class RestletHttpAttributesGetter implements HttpServerAttributesGetter { +enum RestletHttpAttributesGetter implements HttpServerAttributesGetter { + INSTANCE; @Override public String method(Request request) { diff --git a/instrumentation/restlet/restlet-1.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_0/RestletTracingBuilder.java b/instrumentation/restlet/restlet-1.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_0/RestletTracingBuilder.java index f91278ab411d..e09fb744ecba 100644 --- a/instrumentation/restlet/restlet-1.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_0/RestletTracingBuilder.java +++ b/instrumentation/restlet/restlet-1.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_0/RestletTracingBuilder.java @@ -6,11 +6,10 @@ package io.opentelemetry.instrumentation.restlet.v1_0; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; @@ -28,7 +27,9 @@ public final class RestletTracingBuilder { private final OpenTelemetry openTelemetry; private final List> additionalExtractors = new ArrayList<>(); - private CapturedHttpHeaders capturedHttpHeaders = CapturedHttpHeaders.server(Config.get()); + private final HttpServerAttributesExtractorBuilder + httpAttributesExtractorBuilder = + HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE); RestletTracingBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -48,11 +49,37 @@ public RestletTracingBuilder addAttributesExtractor( * Configure the instrumentation to capture chosen HTTP request and response headers as span * attributes. * - * @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured - * HTTP request and response names. + * @param capturedHttpHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the + * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedRequestHeaders(List)} and {@link + * #setCapturedResponseHeaders(List)} instead. */ - public RestletTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttpHeaders) { - this.capturedHttpHeaders = capturedHttpHeaders; + @Deprecated + public RestletTracingBuilder captureHttpHeaders( + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpHeaders) { + httpAttributesExtractorBuilder.captureHttpHeaders(capturedHttpHeaders); + return this; + } + + /** + * Configures the HTTP request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public RestletTracingBuilder setCapturedRequestHeaders(List requestHeaders) { + httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public RestletTracingBuilder setCapturedResponseHeaders(List responseHeaders) { + httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -60,7 +87,7 @@ public RestletTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttp * Returns a new {@link RestletTracing} with the settings of this {@link RestletTracingBuilder}. */ public RestletTracing build() { - RestletHttpAttributesGetter httpAttributesGetter = new RestletHttpAttributesGetter(); + RestletHttpAttributesGetter httpAttributesGetter = RestletHttpAttributesGetter.INSTANCE; RestletNetAttributesGetter netAttributesGetter = new RestletNetAttributesGetter(); Instrumenter instrumenter = @@ -69,10 +96,7 @@ public RestletTracing build() { INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) - .captureHttpHeaders(capturedHttpHeaders) - .build()) + .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(NetServerAttributesExtractor.create(netAttributesGetter)) .addAttributesExtractors(additionalExtractors) .addRequestMetrics(HttpServerMetrics.get()) diff --git a/instrumentation/restlet/restlet-1.0/library/src/test/groovy/io/opententelemetry/instrumentation/restlet/v1_0/RestletServerTest.groovy b/instrumentation/restlet/restlet-1.0/library/src/test/groovy/io/opententelemetry/instrumentation/restlet/v1_0/RestletServerTest.groovy index 497260366796..d49e4624fbaa 100644 --- a/instrumentation/restlet/restlet-1.0/library/src/test/groovy/io/opententelemetry/instrumentation/restlet/v1_0/RestletServerTest.groovy +++ b/instrumentation/restlet/restlet-1.0/library/src/test/groovy/io/opententelemetry/instrumentation/restlet/v1_0/RestletServerTest.groovy @@ -9,6 +9,7 @@ import com.noelios.restlet.StatusFilter import io.opentelemetry.instrumentation.restlet.v1_0.AbstractRestletServerTest import io.opentelemetry.instrumentation.restlet.v1_0.RestletTracing import io.opentelemetry.instrumentation.test.LibraryTestTrait +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest import org.restlet.Restlet class RestletServerTest extends AbstractRestletServerTest implements LibraryTestTrait { @@ -16,7 +17,8 @@ class RestletServerTest extends AbstractRestletServerTest implements LibraryTest @Override Restlet wrapRestlet(Restlet restlet, String path) { RestletTracing tracing = RestletTracing.builder(openTelemetry) - .captureHttpHeaders(capturedHttpHeadersForTesting()) + .setCapturedRequestHeaders([AbstractHttpServerTest.TEST_REQUEST_HEADER]) + .setCapturedResponseHeaders([AbstractHttpServerTest.TEST_RESPONSE_HEADER]) .build() def tracingFilter = tracing.newFilter(path) diff --git a/instrumentation/restlet/restlet-1.0/library/src/test/groovy/io/opententelemetry/instrumentation/restlet/v1_0/spring/AbstractSpringServerLibraryTest.groovy b/instrumentation/restlet/restlet-1.0/library/src/test/groovy/io/opententelemetry/instrumentation/restlet/v1_0/spring/AbstractSpringServerLibraryTest.groovy index abb51f936315..3470d5e6d0b5 100644 --- a/instrumentation/restlet/restlet-1.0/library/src/test/groovy/io/opententelemetry/instrumentation/restlet/v1_0/spring/AbstractSpringServerLibraryTest.groovy +++ b/instrumentation/restlet/restlet-1.0/library/src/test/groovy/io/opententelemetry/instrumentation/restlet/v1_0/spring/AbstractSpringServerLibraryTest.groovy @@ -9,6 +9,7 @@ import com.noelios.restlet.StatusFilter import io.opentelemetry.instrumentation.restlet.v1_0.RestletTracing import io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest import io.opentelemetry.instrumentation.test.LibraryTestTrait +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest import org.restlet.Restlet import org.restlet.Route import org.restlet.Router @@ -19,7 +20,8 @@ abstract class AbstractSpringServerLibraryTest extends AbstractSpringServerTest Restlet wrapRestlet(Restlet restlet, String path) { RestletTracing tracing = RestletTracing.builder(openTelemetry) - .captureHttpHeaders(capturedHttpHeadersForTesting()) + .setCapturedRequestHeaders([AbstractHttpServerTest.TEST_REQUEST_HEADER]) + .setCapturedResponseHeaders([AbstractHttpServerTest.TEST_RESPONSE_HEADER]) .build() def tracingFilter = tracing.newFilter(path) diff --git a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTracingBuilder.java b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTracingBuilder.java index b11d7b5e16bb..28b0d547f20d 100644 --- a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTracingBuilder.java +++ b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTracingBuilder.java @@ -6,10 +6,11 @@ package io.opentelemetry.instrumentation.restlet.v2_0; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder; +import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletHttpAttributesGetter; import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumenterFactory; import java.util.ArrayList; import java.util.List; @@ -22,7 +23,9 @@ public final class RestletTracingBuilder { private final OpenTelemetry openTelemetry; private final List> additionalExtractors = new ArrayList<>(); - private CapturedHttpHeaders capturedHttpHeaders = CapturedHttpHeaders.server(Config.get()); + private final HttpServerAttributesExtractorBuilder + httpAttributesExtractorBuilder = + HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE); RestletTracingBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -42,11 +45,37 @@ public RestletTracingBuilder addAttributesExtractor( * Configure the instrumentation to capture chosen HTTP request and response headers as span * attributes. * - * @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured - * HTTP request and response names. + * @param capturedHttpHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the + * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedRequestHeaders(List)} and {@link + * #setCapturedResponseHeaders(List)} instead. */ - public RestletTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttpHeaders) { - this.capturedHttpHeaders = capturedHttpHeaders; + @Deprecated + public RestletTracingBuilder captureHttpHeaders( + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpHeaders) { + httpAttributesExtractorBuilder.captureHttpHeaders(capturedHttpHeaders); + return this; + } + + /** + * Configures the HTTP request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public RestletTracingBuilder setCapturedRequestHeaders(List requestHeaders) { + httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public RestletTracingBuilder setCapturedResponseHeaders(List responseHeaders) { + httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -54,10 +83,9 @@ public RestletTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttp * Returns a new {@link RestletTracing} with the settings of this {@link RestletTracingBuilder}. */ public RestletTracing build() { - Instrumenter serverInstrumenter = RestletInstrumenterFactory.newServerInstrumenter( - openTelemetry, capturedHttpHeaders, additionalExtractors); + openTelemetry, httpAttributesExtractorBuilder.build(), additionalExtractors); return new RestletTracing(serverInstrumenter); } diff --git a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletHttpAttributesGetter.java b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletHttpAttributesGetter.java index 1d3edfee76b0..2ce344a48eb7 100644 --- a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletHttpAttributesGetter.java +++ b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletHttpAttributesGetter.java @@ -18,7 +18,12 @@ import org.restlet.data.Reference; import org.restlet.util.Series; -final class RestletHttpAttributesGetter implements HttpServerAttributesGetter { +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public enum RestletHttpAttributesGetter implements HttpServerAttributesGetter { + INSTANCE; @Override public String method(Request request) { diff --git a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletInstrumenterFactory.java b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletInstrumenterFactory.java index a0efa3f7b39c..47cb7230d748 100644 --- a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletInstrumenterFactory.java +++ b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletInstrumenterFactory.java @@ -6,10 +6,8 @@ package io.opentelemetry.instrumentation.restlet.v2_0.internal; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; @@ -30,24 +28,23 @@ public class RestletInstrumenterFactory { public static Instrumenter newServerInstrumenter(OpenTelemetry openTelemetry) { return newServerInstrumenter( - openTelemetry, CapturedHttpHeaders.server(Config.get()), Collections.emptyList()); + openTelemetry, + HttpServerAttributesExtractor.create(RestletHttpAttributesGetter.INSTANCE), + Collections.emptyList()); } public static Instrumenter newServerInstrumenter( OpenTelemetry openTelemetry, - CapturedHttpHeaders capturedHttpHeaders, + HttpServerAttributesExtractor httpServerAttributesExtractor, List> additionalExtractors) { - RestletHttpAttributesGetter httpAttributesGetter = new RestletHttpAttributesGetter(); + RestletHttpAttributesGetter httpAttributesGetter = RestletHttpAttributesGetter.INSTANCE; RestletNetAttributesGetter netAttributesGetter = new RestletNetAttributesGetter(); return Instrumenter.builder( openTelemetry, INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) - .captureHttpHeaders(capturedHttpHeaders) - .build()) + .addAttributesExtractor(httpServerAttributesExtractor) .addAttributesExtractor(NetServerAttributesExtractor.create(netAttributesGetter)) .addAttributesExtractors(additionalExtractors) .addRequestMetrics(HttpServerMetrics.get()) diff --git a/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/RestletServerTest.groovy b/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/RestletServerTest.groovy index 1c4547ade22f..637d983b3b4b 100644 --- a/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/RestletServerTest.groovy +++ b/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/RestletServerTest.groovy @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.restlet.v2_0 import io.opentelemetry.instrumentation.test.LibraryTestTrait +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest import org.restlet.Restlet import org.restlet.engine.application.StatusFilter import org.restlet.service.StatusService @@ -16,7 +17,8 @@ class RestletServerTest extends AbstractRestletServerTest implements LibraryTest Restlet wrapRestlet(Restlet restlet, String path) { RestletTracing tracing = RestletTracing.builder(openTelemetry) - .captureHttpHeaders(capturedHttpHeadersForTesting()) + .setCapturedRequestHeaders([AbstractHttpServerTest.TEST_REQUEST_HEADER]) + .setCapturedResponseHeaders([AbstractHttpServerTest.TEST_RESPONSE_HEADER]) .build() def tracingFilter = tracing.newFilter(path) diff --git a/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerLibraryTest.groovy b/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerLibraryTest.groovy index 4fdf44eb3cb5..054b7813a886 100644 --- a/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerLibraryTest.groovy +++ b/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerLibraryTest.groovy @@ -7,6 +7,7 @@ package io.opentelemetry.instrumentation.restlet.v2_0.spring import io.opentelemetry.instrumentation.restlet.v2_0.RestletTracing import io.opentelemetry.instrumentation.test.LibraryTestTrait +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest import org.restlet.Request import org.restlet.Response import org.restlet.Restlet @@ -25,7 +26,8 @@ abstract class AbstractSpringServerLibraryTest extends AbstractSpringServerTest Restlet wrapRestlet(Restlet restlet, String path) { RestletTracing tracing = RestletTracing.builder(openTelemetry) - .captureHttpHeaders(capturedHttpHeadersForTesting()) + .setCapturedRequestHeaders([AbstractHttpServerTest.TEST_REQUEST_HEADER]) + .setCapturedResponseHeaders([AbstractHttpServerTest.TEST_RESPONSE_HEADER]) .build() def tracingFilter = tracing.newFilter(path) diff --git a/instrumentation/spring/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/SpringWebHttpAttributesGetter.java b/instrumentation/spring/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/SpringWebHttpAttributesGetter.java index 84f0d0d61bb3..b18574fd50dd 100644 --- a/instrumentation/spring/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/SpringWebHttpAttributesGetter.java +++ b/instrumentation/spring/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/SpringWebHttpAttributesGetter.java @@ -15,8 +15,9 @@ import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; -final class SpringWebHttpAttributesGetter +enum SpringWebHttpAttributesGetter implements HttpClientAttributesGetter { + INSTANCE; @Override public String method(HttpRequest httpRequest) { diff --git a/instrumentation/spring/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/SpringWebTracingBuilder.java b/instrumentation/spring/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/SpringWebTracingBuilder.java index 5315067f0136..0440e4e3b540 100644 --- a/instrumentation/spring/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/SpringWebTracingBuilder.java +++ b/instrumentation/spring/spring-web-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/web/SpringWebTracingBuilder.java @@ -6,11 +6,10 @@ package io.opentelemetry.instrumentation.spring.web; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; @@ -27,7 +26,9 @@ public final class SpringWebTracingBuilder { private final OpenTelemetry openTelemetry; private final List> additionalExtractors = new ArrayList<>(); - private CapturedHttpHeaders capturedHttpHeaders = CapturedHttpHeaders.client(Config.get()); + private final HttpClientAttributesExtractorBuilder + httpAttributesExtractorBuilder = + HttpClientAttributesExtractor.builder(SpringWebHttpAttributesGetter.INSTANCE); SpringWebTracingBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -47,11 +48,37 @@ public SpringWebTracingBuilder addAttributesExtractor( * Configure the instrumentation to capture chosen HTTP request and response headers as span * attributes. * - * @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured - * HTTP request and response names. + * @param capturedHttpHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the + * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedRequestHeaders(List)} and {@link + * #setCapturedResponseHeaders(List)} instead. */ - public SpringWebTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttpHeaders) { - this.capturedHttpHeaders = capturedHttpHeaders; + @Deprecated + public SpringWebTracingBuilder captureHttpHeaders( + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpHeaders) { + httpAttributesExtractorBuilder.captureHttpHeaders(capturedHttpHeaders); + return this; + } + + /** + * Configures the HTTP request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public SpringWebTracingBuilder setCapturedRequestHeaders(List requestHeaders) { + httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public SpringWebTracingBuilder setCapturedResponseHeaders(List responseHeaders) { + httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -60,7 +87,7 @@ public SpringWebTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHt * SpringWebTracingBuilder}. */ public SpringWebTracing build() { - SpringWebHttpAttributesGetter httpAttributeGetter = new SpringWebHttpAttributesGetter(); + SpringWebHttpAttributesGetter httpAttributeGetter = SpringWebHttpAttributesGetter.INSTANCE; SpringWebNetAttributesGetter netAttributesGetter = new SpringWebNetAttributesGetter(); Instrumenter instrumenter = @@ -69,10 +96,7 @@ public SpringWebTracing build() { INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributeGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributeGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributeGetter) - .captureHttpHeaders(capturedHttpHeaders) - .build()) + .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(NetClientAttributesExtractor.create(netAttributesGetter)) .addAttributesExtractors(additionalExtractors) .addRequestMetrics(HttpClientMetrics.get()) diff --git a/instrumentation/spring/spring-webflux-5.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/SpringWebfluxHttpAttributesGetter.java b/instrumentation/spring/spring-webflux-5.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/SpringWebfluxHttpAttributesGetter.java index dbc02062a567..6f673424b102 100644 --- a/instrumentation/spring/spring-webflux-5.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/SpringWebfluxHttpAttributesGetter.java +++ b/instrumentation/spring/spring-webflux-5.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/SpringWebfluxHttpAttributesGetter.java @@ -16,8 +16,9 @@ import org.springframework.web.reactive.function.client.ClientRequest; import org.springframework.web.reactive.function.client.ClientResponse; -final class SpringWebfluxHttpAttributesGetter +enum SpringWebfluxHttpAttributesGetter implements HttpClientAttributesGetter { + INSTANCE; private static final MethodHandle RAW_STATUS_CODE = findRawStatusCode(); diff --git a/instrumentation/spring/spring-webflux-5.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/SpringWebfluxTracingBuilder.java b/instrumentation/spring/spring-webflux-5.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/SpringWebfluxTracingBuilder.java index e383245e74f3..6605f4f96d14 100644 --- a/instrumentation/spring/spring-webflux-5.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/SpringWebfluxTracingBuilder.java +++ b/instrumentation/spring/spring-webflux-5.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/SpringWebfluxTracingBuilder.java @@ -8,13 +8,12 @@ import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; @@ -30,7 +29,9 @@ public final class SpringWebfluxTracingBuilder { private final OpenTelemetry openTelemetry; private final List> additionalExtractors = new ArrayList<>(); - private CapturedHttpHeaders capturedHttpHeaders = CapturedHttpHeaders.client(Config.get()); + private final HttpClientAttributesExtractorBuilder + httpAttributesExtractorBuilder = + HttpClientAttributesExtractor.builder(SpringWebfluxHttpAttributesGetter.INSTANCE); SpringWebfluxTracingBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -50,11 +51,37 @@ public SpringWebfluxTracingBuilder addAttributesExtractor( * Configure the instrumentation to capture chosen HTTP request and response headers as span * attributes. * - * @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured - * HTTP request and response names. + * @param capturedHttpHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the + * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedRequestHeaders(List)} and {@link + * #setCapturedResponseHeaders(List)} instead. */ - public SpringWebfluxTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttpHeaders) { - this.capturedHttpHeaders = capturedHttpHeaders; + @Deprecated + public SpringWebfluxTracingBuilder captureHttpHeaders( + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpHeaders) { + httpAttributesExtractorBuilder.captureHttpHeaders(capturedHttpHeaders); + return this; + } + + /** + * Configures the HTTP request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public SpringWebfluxTracingBuilder setCapturedRequestHeaders(List requestHeaders) { + httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public SpringWebfluxTracingBuilder setCapturedResponseHeaders(List responseHeaders) { + httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -64,7 +91,7 @@ public SpringWebfluxTracingBuilder captureHttpHeaders(CapturedHttpHeaders captur */ public SpringWebfluxTracing build() { SpringWebfluxHttpAttributesGetter httpAttributesGetter = - new SpringWebfluxHttpAttributesGetter(); + SpringWebfluxHttpAttributesGetter.INSTANCE; SpringWebfluxNetAttributesGetter attributesGetter = new SpringWebfluxNetAttributesGetter(); NetClientAttributesExtractor attributesExtractor = NetClientAttributesExtractor.create(attributesGetter); @@ -75,10 +102,7 @@ public SpringWebfluxTracing build() { "io.opentelemetry.spring-webflux-5.0", HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpClientAttributesExtractor.builder(httpAttributesGetter) - .captureHttpHeaders(capturedHttpHeaders) - .build()) + .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(attributesExtractor) .addAttributesExtractor(PeerServiceAttributesExtractor.create(attributesGetter)) .addAttributesExtractors(additionalExtractors) diff --git a/instrumentation/spring/spring-webmvc-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/SpringWebMvcHttpAttributesGetter.java b/instrumentation/spring/spring-webmvc-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/SpringWebMvcHttpAttributesGetter.java index b30e60d4f062..b13d852d9f81 100644 --- a/instrumentation/spring/spring-webmvc-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/SpringWebMvcHttpAttributesGetter.java +++ b/instrumentation/spring/spring-webmvc-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/SpringWebMvcHttpAttributesGetter.java @@ -15,8 +15,9 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -final class SpringWebMvcHttpAttributesGetter +enum SpringWebMvcHttpAttributesGetter implements HttpServerAttributesGetter { + INSTANCE; @Override @Nullable diff --git a/instrumentation/spring/spring-webmvc-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/SpringWebMvcTracingBuilder.java b/instrumentation/spring/spring-webmvc-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/SpringWebMvcTracingBuilder.java index b8a051751965..d55929d24ac8 100644 --- a/instrumentation/spring/spring-webmvc-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/SpringWebMvcTracingBuilder.java +++ b/instrumentation/spring/spring-webmvc-3.1/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/SpringWebMvcTracingBuilder.java @@ -6,12 +6,11 @@ package io.opentelemetry.instrumentation.spring.webmvc; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; @@ -29,7 +28,9 @@ public final class SpringWebMvcTracingBuilder { private final OpenTelemetry openTelemetry; private final List> additionalExtractors = new ArrayList<>(); - private CapturedHttpHeaders capturedHttpHeaders = CapturedHttpHeaders.server(Config.get()); + private final HttpServerAttributesExtractorBuilder + httpAttributesExtractorBuilder = + HttpServerAttributesExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE); SpringWebMvcTracingBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -49,11 +50,37 @@ public SpringWebMvcTracingBuilder addAttributesExtractor( * Configure the instrumentation to capture chosen HTTP request and response headers as span * attributes. * - * @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured - * HTTP request and response names. + * @param capturedHttpHeaders An instance of {@link + * io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders} containing the + * configured HTTP request and response names. + * @deprecated Use {@link #setCapturedRequestHeaders(List)} and {@link + * #setCapturedResponseHeaders(List)} instead. */ - public SpringWebMvcTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttpHeaders) { - this.capturedHttpHeaders = capturedHttpHeaders; + @Deprecated + public SpringWebMvcTracingBuilder captureHttpHeaders( + io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders + capturedHttpHeaders) { + this.httpAttributesExtractorBuilder.captureHttpHeaders(capturedHttpHeaders); + return this; + } + + /** + * Configures the HTTP request headers that will be captured as span attributes. + * + * @param requestHeaders A list of HTTP header names. + */ + public SpringWebMvcTracingBuilder setCapturedRequestHeaders(List requestHeaders) { + httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders); + return this; + } + + /** + * Configures the HTTP response headers that will be captured as span attributes. + * + * @param responseHeaders A list of HTTP header names. + */ + public SpringWebMvcTracingBuilder setCapturedResponseHeaders(List responseHeaders) { + httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -62,7 +89,8 @@ public SpringWebMvcTracingBuilder captureHttpHeaders(CapturedHttpHeaders capture * SpringWebMvcTracingBuilder}. */ public SpringWebMvcTracing build() { - SpringWebMvcHttpAttributesGetter httpAttributesGetter = new SpringWebMvcHttpAttributesGetter(); + SpringWebMvcHttpAttributesGetter httpAttributesGetter = + SpringWebMvcHttpAttributesGetter.INSTANCE; Instrumenter instrumenter = Instrumenter.builder( @@ -70,10 +98,7 @@ public SpringWebMvcTracing build() { INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) - .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) - .captureHttpHeaders(capturedHttpHeaders) - .build()) + .addAttributesExtractor(httpAttributesExtractorBuilder.build()) .addAttributesExtractor(new StatusCodeExtractor()) .addAttributesExtractor( NetServerAttributesExtractor.create(new SpringWebMvcNetAttributesGetter())) diff --git a/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy b/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy index a3d96da65a47..388a36b157cb 100644 --- a/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy +++ b/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy @@ -9,7 +9,6 @@ import io.opentelemetry.api.common.AttributeKey import io.opentelemetry.api.trace.Span import io.opentelemetry.api.trace.SpanId import io.opentelemetry.api.trace.SpanKind -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders import io.opentelemetry.instrumentation.test.InstrumentationSpecification import io.opentelemetry.instrumentation.test.asserts.TraceAssert import io.opentelemetry.instrumentation.testing.GlobalTraceUtil @@ -47,10 +46,6 @@ abstract class HttpServerTest extends InstrumentationSpecification imple cleanupServer() } - static CapturedHttpHeaders capturedHttpHeadersForTesting() { - return AbstractHttpServerTest.capturedHttpHeadersForTesting() - } - String expectedServerSpanName(ServerEndpoint endpoint, String method) { def route = expectedHttpRoute(endpoint) return route == null ? "HTTP $method" : route @@ -219,13 +214,13 @@ abstract class HttpServerTest extends InstrumentationSpecification imple // the main trace assertion method to groovy to be able to call these assertions. @Override void assertTheTraces( - int size, - String traceId, - String parentId, - String method, - ServerEndpoint endpoint, - String errorMessage, - AggregatedHttpResponse response) { + int size, + String traceId, + String parentId, + String method, + ServerEndpoint endpoint, + String errorMessage, + AggregatedHttpResponse response) { HttpServerTest.this.assertTheTraces(size, traceId, parentId, method, endpoint, errorMessage, response) } diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java index 0ab16587e2ba..b70ce7928e0f 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java @@ -16,7 +16,6 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; -import static java.util.Collections.singletonList; import static org.junit.jupiter.api.Assumptions.assumeTrue; import io.opentelemetry.api.GlobalOpenTelemetry; @@ -26,7 +25,6 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.context.propagation.TextMapSetter; -import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders; import io.opentelemetry.instrumentation.testing.InstrumentationTestRunner; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.testing.assertj.TraceAssert; @@ -68,8 +66,8 @@ public abstract class AbstractHttpServerTest { private static final Logger logger = LoggerFactory.getLogger(AbstractHttpServerTest.class); - private static final String TEST_REQUEST_HEADER = "X-Test-Request"; - private static final String TEST_RESPONSE_HEADER = "X-Test-Response"; + public static final String TEST_REQUEST_HEADER = "X-Test-Request"; + public static final String TEST_RESPONSE_HEADER = "X-Test-Response"; public static final String TEST_CLIENT_IP = "1.1.1.1"; public static final String TEST_USER_AGENT = "test-user-agent"; @@ -135,11 +133,6 @@ void verifyExtension() { } } - public static CapturedHttpHeaders capturedHttpHeadersForTesting() { - return CapturedHttpHeaders.create( - singletonList(TEST_REQUEST_HEADER), singletonList(TEST_RESPONSE_HEADER)); - } - String resolveAddress(ServerEndpoint uri) { String url = uri.resolvePath(address).toString(); // Force HTTP/1 via h1c so upgrade requests don't show up as traces