diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5HttpAttributesGetter.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5HttpAttributesGetter.java deleted file mode 100644 index 67c6b78087fe..000000000000 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5HttpAttributesGetter.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.apachehttpclient.v5_2; - -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import javax.annotation.Nullable; -import org.apache.hc.core5.http.Header; -import org.apache.hc.core5.http.HttpResponse; -import org.apache.hc.core5.http.MessageHeaders; -import org.apache.hc.core5.http.ProtocolVersion; - -@Deprecated -enum ApacheHttpClient5HttpAttributesGetter - implements HttpClientAttributesGetter { - INSTANCE; - - @Override - public String getHttpRequestMethod(ApacheHttpClient5Request request) { - return request.getMethod(); - } - - @Override - @Nullable - public String getUrlFull(ApacheHttpClient5Request request) { - return request.getUrl(); - } - - @Override - public List getHttpRequestHeader(ApacheHttpClient5Request request, String name) { - return getHeader(request, name); - } - - @Override - public Integer getHttpResponseStatusCode( - ApacheHttpClient5Request request, HttpResponse response, @Nullable Throwable error) { - return response.getCode(); - } - - @Override - public List getHttpResponseHeader( - ApacheHttpClient5Request request, HttpResponse response, String name) { - return getHeader(response, name); - } - - private static List getHeader(MessageHeaders messageHeaders, String name) { - return headersToList(messageHeaders.getHeaders(name)); - } - - private static List getHeader(ApacheHttpClient5Request messageHeaders, String name) { - return headersToList(messageHeaders.getDelegate().getHeaders(name)); - } - - // minimize memory overhead by not using streams - private static List headersToList(Header[] headers) { - if (headers.length == 0) { - return Collections.emptyList(); - } - List headersList = new ArrayList<>(headers.length); - for (Header header : headers) { - headersList.add(header.getValue()); - } - return headersList; - } - - @Nullable - @Override - public String getNetworkProtocolName( - ApacheHttpClient5Request request, @Nullable HttpResponse response) { - ProtocolVersion protocolVersion = getVersion(request, response); - if (protocolVersion == null) { - return null; - } - return protocolVersion.getProtocol(); - } - - @Nullable - @Override - public String getNetworkProtocolVersion( - ApacheHttpClient5Request request, @Nullable HttpResponse response) { - ProtocolVersion protocolVersion = getVersion(request, response); - if (protocolVersion == null) { - return null; - } - if (protocolVersion.getMinor() == 0) { - return Integer.toString(protocolVersion.getMajor()); - } - return protocolVersion.getMajor() + "." + protocolVersion.getMinor(); - } - - @Override - @Nullable - public String getServerAddress(ApacheHttpClient5Request request) { - return request.getDelegate().getAuthority().getHostName(); - } - - @Override - public Integer getServerPort(ApacheHttpClient5Request request) { - return request.getDelegate().getAuthority().getPort(); - } - - private static ProtocolVersion getVersion( - ApacheHttpClient5Request request, @Nullable HttpResponse response) { - ProtocolVersion protocolVersion = request.getDelegate().getVersion(); - if (protocolVersion == null && response != null) { - protocolVersion = response.getVersion(); - } - return protocolVersion; - } -} diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Request.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Request.java deleted file mode 100644 index 5adca552c464..000000000000 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Request.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.apachehttpclient.v5_2; - -import static java.util.logging.Level.FINE; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.logging.Logger; -import javax.annotation.Nullable; -import org.apache.hc.core5.http.HttpHost; -import org.apache.hc.core5.http.HttpRequest; - -/** - * @deprecated Use {@link ApacheHttpClientRequest} instead. - */ -@Deprecated -public final class ApacheHttpClient5Request { - - private static final Logger logger = Logger.getLogger(ApacheHttpClient5Request.class.getName()); - - @Nullable private final URI uri; - private final HttpRequest delegate; - - ApacheHttpClient5Request(@Nullable HttpHost httpHost, HttpRequest httpRequest) { - URI calculatedUri = getUri(httpRequest); - if (calculatedUri != null && httpHost != null) { - uri = getCalculatedUri(httpHost, calculatedUri); - } else { - uri = calculatedUri; - } - delegate = httpRequest; - } - - /** Returns the actual {@link HttpRequest} being executed by the client. */ - public HttpRequest getDelegate() { - return delegate; - } - - String getMethod() { - return delegate.getMethod(); - } - - @Nullable - String getUrl() { - return uri != null ? uri.toString() : null; - } - - @Nullable - private static URI getUri(HttpRequest httpRequest) { - try { - // this can be relative or absolute - return new URI(httpRequest.getUri().toString()); - } catch (URISyntaxException e) { - logger.log(FINE, e.getMessage(), e); - return null; - } - } - - @Nullable - private static URI getCalculatedUri(HttpHost httpHost, URI uri) { - try { - return new URI( - httpHost.getSchemeName(), - uri.getUserInfo(), - httpHost.getHostName(), - httpHost.getPort(), - uri.getPath(), - uri.getQuery(), - uri.getFragment()); - } catch (URISyntaxException e) { - logger.log(FINE, e.getMessage(), e); - return null; - } - } -} diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Telemetry.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Telemetry.java deleted file mode 100644 index 3abcf6fef1c5..000000000000 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5Telemetry.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.apachehttpclient.v5_2; - -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.context.propagation.ContextPropagators; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import org.apache.hc.client5.http.impl.ChainElement; -import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; -import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; -import org.apache.hc.core5.http.HttpResponse; - -/** - * Entrypoint for instrumenting Apache HTTP Client. - * - * @deprecated Use {@link ApacheHttpClientTelemetry} instead. - */ -@Deprecated -public final class ApacheHttpClient5Telemetry { - - /** - * Returns a new {@link ApacheHttpClient5Telemetry} configured with the given {@link - * OpenTelemetry}. - */ - public static ApacheHttpClient5Telemetry create(OpenTelemetry openTelemetry) { - return builder(openTelemetry).build(); - } - - /** - * Returns a new {@link ApacheHttpClient5TelemetryBuilder} configured with the given {@link - * OpenTelemetry}. - */ - public static ApacheHttpClient5TelemetryBuilder builder(OpenTelemetry openTelemetry) { - return new ApacheHttpClient5TelemetryBuilder(openTelemetry); - } - - private final Instrumenter instrumenter; - private final ContextPropagators propagators; - - ApacheHttpClient5Telemetry( - Instrumenter instrumenter, - ContextPropagators propagators) { - this.instrumenter = instrumenter; - this.propagators = propagators; - } - - /** Returns a new {@link CloseableHttpClient} with tracing configured. */ - public CloseableHttpClient newHttpClient() { - return newHttpClientBuilder().build(); - } - - /** Returns a new {@link HttpClientBuilder} to create a client with tracing configured. */ - public HttpClientBuilder newHttpClientBuilder() { - return HttpClientBuilder.create() - .addExecInterceptorAfter( - ChainElement.PROTOCOL.name(), - "OtelExecChainHandler", - new OtelExecChainHandlerOld(instrumenter, propagators)); - } -} diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5TelemetryBuilder.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5TelemetryBuilder.java deleted file mode 100644 index 889f24600b91..000000000000 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClient5TelemetryBuilder.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.apachehttpclient.v5_2; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.apachehttpclient.v5_2.internal.Experimental; -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; -import java.util.List; -import java.util.Set; -import java.util.function.Function; -import org.apache.hc.core5.http.HttpResponse; - -/** - * A builder for {@link ApacheHttpClient5Telemetry}. - * - * @deprecated Use {@link ApacheHttpClientTelemetryBuilder} instead. - */ -@Deprecated -public final class ApacheHttpClient5TelemetryBuilder { - - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-httpclient-5.2"; - private final DefaultHttpClientInstrumenterBuilder - builder; - private final OpenTelemetry openTelemetry; - - ApacheHttpClient5TelemetryBuilder(OpenTelemetry openTelemetry) { - builder = - DefaultHttpClientInstrumenterBuilder.create( - INSTRUMENTATION_NAME, openTelemetry, ApacheHttpClient5HttpAttributesGetter.INSTANCE); - this.openTelemetry = openTelemetry; - } - - /** - * Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented - * items. The {@link AttributesExtractor} will be executed after all default extractors. - */ - @CanIgnoreReturnValue - public ApacheHttpClient5TelemetryBuilder addAttributeExtractor( - AttributesExtractor - attributesExtractor) { - builder.addAttributesExtractor(attributesExtractor); - return this; - } - - /** - * Configures the HTTP request headers that will be captured as span attributes. - * - * @param requestHeaders A list of HTTP header names. - */ - @CanIgnoreReturnValue - public ApacheHttpClient5TelemetryBuilder setCapturedRequestHeaders(List requestHeaders) { - builder.setCapturedRequestHeaders(requestHeaders); - return this; - } - - /** - * Configures the HTTP response headers that will be captured as span attributes. - * - * @param responseHeaders A list of HTTP header names. - */ - @CanIgnoreReturnValue - public ApacheHttpClient5TelemetryBuilder setCapturedResponseHeaders( - List responseHeaders) { - builder.setCapturedResponseHeaders(responseHeaders); - return this; - } - - /** - * Configures the instrumentation to recognize an alternative set of HTTP request methods. - * - *

By default, this instrumentation defines "known" methods as the ones listed in RFC9110 and the PATCH - * method defined in RFC5789. - * - *

Note: calling this method overrides the default known method sets completely; it does - * not supplement it. - * - * @param knownMethods A set of recognized HTTP request methods. - * @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set) - */ - @CanIgnoreReturnValue - public ApacheHttpClient5TelemetryBuilder setKnownMethods(Set knownMethods) { - builder.setKnownMethods(knownMethods); - return this; - } - - /** - * Configures the instrumentation to emit experimental HTTP client metrics. - * - * @param emitExperimentalHttpClientMetrics {@code true} if the experimental HTTP client metrics - * are to be emitted. - * @deprecated Use {@link - * Experimental#setEmitExperimentalTelemetry(ApacheHttpClientTelemetryBuilder, boolean)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ApacheHttpClient5TelemetryBuilder setEmitExperimentalHttpClientMetrics( - boolean emitExperimentalHttpClientMetrics) { - builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); - return this; - } - - /** Sets custom {@link SpanNameExtractor} via transform function. */ - @CanIgnoreReturnValue - public ApacheHttpClient5TelemetryBuilder setSpanNameExtractor( - Function< - SpanNameExtractor, - ? extends SpanNameExtractor> - spanNameExtractorTransformer) { - builder.setSpanNameExtractor(spanNameExtractorTransformer); - return this; - } - - /** - * Returns a new {@link ApacheHttpClient5Telemetry} configured with this {@link - * ApacheHttpClient5TelemetryBuilder}. - */ - public ApacheHttpClient5Telemetry build() { - return new ApacheHttpClient5Telemetry(builder.build(), openTelemetry.getPropagators()); - } -} diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/OtelExecChainHandlerOld.java b/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/OtelExecChainHandlerOld.java deleted file mode 100644 index a19a8b756773..000000000000 --- a/instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/OtelExecChainHandlerOld.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.apachehttpclient.v5_2; - -import io.opentelemetry.context.Context; -import io.opentelemetry.context.propagation.ContextPropagators; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount; -import java.io.IOException; -import org.apache.hc.client5.http.classic.ExecChain; -import org.apache.hc.client5.http.classic.ExecChain.Scope; -import org.apache.hc.client5.http.classic.ExecChainHandler; -import org.apache.hc.core5.http.ClassicHttpRequest; -import org.apache.hc.core5.http.ClassicHttpResponse; -import org.apache.hc.core5.http.HttpException; -import org.apache.hc.core5.http.HttpHost; -import org.apache.hc.core5.http.HttpResponse; - -@Deprecated -class OtelExecChainHandlerOld implements ExecChainHandler { - - private static final String REQUEST_PARENT_CONTEXT_ATTRIBUTE_ID = - OtelExecChainHandlerOld.class.getName() + ".context"; - - private final Instrumenter instrumenter; - private final ContextPropagators propagators; - - public OtelExecChainHandlerOld( - Instrumenter instrumenter, - ContextPropagators propagators) { - this.instrumenter = instrumenter; - this.propagators = propagators; - } - - @Override - public ClassicHttpResponse execute(ClassicHttpRequest request, Scope scope, ExecChain chain) - throws IOException, HttpException { - Context parentContext = - scope.clientContext.getAttribute(REQUEST_PARENT_CONTEXT_ATTRIBUTE_ID, Context.class); - request.setVersion(scope.clientContext.getProtocolVersion()); - if (parentContext == null) { - parentContext = HttpClientRequestResendCount.initialize(Context.current()); - scope.clientContext.setAttribute(REQUEST_PARENT_CONTEXT_ATTRIBUTE_ID, parentContext); - } - - ApacheHttpClient5Request instrumenterRequest = getApacheHttpClient5Request(request, scope); - - if (!instrumenter.shouldStart(parentContext, instrumenterRequest)) { - return chain.proceed(request, scope); - } - - Context context = instrumenter.start(parentContext, instrumenterRequest); - propagators.getTextMapPropagator().inject(context, request, HttpHeaderSetter.INSTANCE); - - return execute(request, instrumenterRequest, chain, scope, context); - } - - private ClassicHttpResponse execute( - ClassicHttpRequest request, - ApacheHttpClient5Request instrumenterRequest, - ExecChain chain, - Scope scope, - Context context) - throws IOException, HttpException { - ClassicHttpResponse response = null; - Throwable error = null; - try (io.opentelemetry.context.Scope ignored = context.makeCurrent()) { - response = chain.proceed(request, scope); - return response; - } catch (Exception e) { - error = e; - throw e; - } finally { - instrumenter.end(context, instrumenterRequest, response, error); - } - } - - private static ApacheHttpClient5Request getApacheHttpClient5Request( - ClassicHttpRequest request, Scope scope) { - HttpHost host = null; - if (scope.route.getTargetHost() != null) { - host = scope.route.getTargetHost(); - } else if (scope.clientContext.getHttpRoute().getTargetHost() != null) { - host = scope.clientContext.getHttpRoute().getTargetHost(); - } - if (host != null - && ((host.getSchemeName().equals("https") && host.getPort() == 443) - || (host.getSchemeName().equals("http") && host.getPort() == 80))) { - // port seems to be added to the host by route planning for standard ports even if not - // specified in the URL. There doesn't seem to be a way to differentiate between explicit - // and implicit port, but ignore in both cases to match the more common case. - host = new HttpHost(host.getSchemeName(), host.getHostName(), -1); - } - - return new ApacheHttpClient5Request(host, request); - } -} diff --git a/instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetry.java b/instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetry.java deleted file mode 100644 index 1d6cd136f859..000000000000 --- a/instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetry.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.armeria.v1_3; - -import com.linecorp.armeria.client.ClientRequestContext; -import com.linecorp.armeria.client.HttpClient; -import com.linecorp.armeria.common.logging.RequestLog; -import com.linecorp.armeria.server.HttpService; -import com.linecorp.armeria.server.ServiceRequestContext; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import java.util.function.Function; - -/** - * Entrypoint for instrumenting Armeria services or clients. - * - * @deprecated Use {@link ArmeriaClientTelemetry} and {@link ArmeriaServerTelemetry} instead. - */ -@Deprecated -public final class ArmeriaTelemetry { - - /** - * Returns a new {@link ArmeriaTelemetry} configured with the given {@link OpenTelemetry}. - * - * @deprecated Use {@link ArmeriaClientTelemetry#create(OpenTelemetry)} and {@link - * ArmeriaServerTelemetry#create(OpenTelemetry)} instead. - */ - @Deprecated - public static ArmeriaTelemetry create(OpenTelemetry openTelemetry) { - return builder(openTelemetry).build(); - } - - /** - * @deprecated Use {@link ArmeriaClientTelemetry#builder(OpenTelemetry)} and {@link - * ArmeriaServerTelemetry#builder(OpenTelemetry)} instead. - */ - @Deprecated - public static ArmeriaTelemetryBuilder builder(OpenTelemetry openTelemetry) { - return new ArmeriaTelemetryBuilder(openTelemetry); - } - - private final Instrumenter clientInstrumenter; - private final Instrumenter serverInstrumenter; - - ArmeriaTelemetry( - Instrumenter clientInstrumenter, - Instrumenter serverInstrumenter) { - this.clientInstrumenter = clientInstrumenter; - this.serverInstrumenter = serverInstrumenter; - } - - /** - * Returns a new {@link HttpClient} decorator for use with methods like {@link - * com.linecorp.armeria.client.ClientBuilder#decorator(Function)}. - * - * @deprecated Use {@link ArmeriaClientTelemetry#newDecorator()} instead. - */ - @Deprecated - public Function newClientDecorator() { - return client -> new OpenTelemetryClient(client, clientInstrumenter); - } - - /** - * Returns a new {@link HttpService} decorator for use with methods like {@link - * HttpService#decorate(Function)}. - * - * @deprecated Use {@link ArmeriaServerTelemetry#newDecorator()} instead. - */ - @Deprecated - public Function newServiceDecorator() { - return service -> new OpenTelemetryService(service, serverInstrumenter); - } -} diff --git a/instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java b/instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java deleted file mode 100644 index f79adf085e66..000000000000 --- a/instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.armeria.v1_3; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import com.linecorp.armeria.client.ClientRequestContext; -import com.linecorp.armeria.common.RequestContext; -import com.linecorp.armeria.common.logging.RequestLog; -import com.linecorp.armeria.server.ServiceRequestContext; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaInstrumenterBuilderFactory; -import io.opentelemetry.instrumentation.armeria.v1_3.internal.Experimental; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.function.Function; - -/** - * @deprecated Use {@link ArmeriaClientTelemetryBuilder} and {@link ArmeriaServerTelemetryBuilder} - * instead. - */ -@Deprecated -public final class ArmeriaTelemetryBuilder { - - private final DefaultHttpClientInstrumenterBuilder - clientBuilder; - private final DefaultHttpServerInstrumenterBuilder - serverBuilder; - - ArmeriaTelemetryBuilder(OpenTelemetry openTelemetry) { - clientBuilder = ArmeriaInstrumenterBuilderFactory.getClientBuilder(openTelemetry); - serverBuilder = ArmeriaInstrumenterBuilderFactory.getServerBuilder(openTelemetry); - } - - /** - * Sets the status extractor for both client and server spans. - * - * @deprecated Use {@link ArmeriaClientTelemetryBuilder#setStatusExtractor(Function)} and {@link - * ArmeriaServerTelemetryBuilder#setStatusExtractor(Function)} instead. - */ - @Deprecated - @SuppressWarnings({"unchecked", "rawtypes"}) - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setStatusExtractor( - Function< - SpanStatusExtractor, - ? extends SpanStatusExtractor> - statusExtractor) { - clientBuilder.setStatusExtractor((Function) statusExtractor); - serverBuilder.setStatusExtractor((Function) statusExtractor); - return this; - } - - /** - * Sets the status extractor for client spans. - * - * @deprecated Use {@link ArmeriaClientTelemetryBuilder#setStatusExtractor(Function)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setClientStatusExtractor( - Function< - SpanStatusExtractor, - ? extends SpanStatusExtractor> - statusExtractor) { - clientBuilder.setStatusExtractor(statusExtractor); - return this; - } - - /** - * Sets the status extractor for server spans. - * - * @deprecated Use {@link ArmeriaServerTelemetryBuilder#setStatusExtractor(Function)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setServerStatusExtractor( - Function< - SpanStatusExtractor, - ? extends SpanStatusExtractor> - statusExtractor) { - serverBuilder.setStatusExtractor(statusExtractor); - return this; - } - - /** - * Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented - * items. The {@link AttributesExtractor} will be executed after all default extractors. - * - * @deprecated Use {@link - * ArmeriaClientTelemetryBuilder#addAttributesExtractor(AttributesExtractor)} and {@link - * ArmeriaServerTelemetryBuilder#addAttributesExtractor(AttributesExtractor)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder addAttributeExtractor( - AttributesExtractor attributesExtractor) { - clientBuilder.addAttributesExtractor(attributesExtractor); - serverBuilder.addAttributesExtractor(attributesExtractor); - return this; - } - - /** - * Adds an extra client-only {@link AttributesExtractor} to invoke to set attributes to - * instrumented items. The {@link AttributesExtractor} will be executed after all default - * extractors. - * - * @deprecated Use {@link - * ArmeriaClientTelemetryBuilder#addAttributesExtractor(AttributesExtractor)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder addClientAttributeExtractor( - AttributesExtractor attributesExtractor) { - clientBuilder.addAttributesExtractor(attributesExtractor); - return this; - } - - /** - * Adds an extra server-only {@link AttributesExtractor} to invoke to set attributes to - * instrumented items. The {@link AttributesExtractor} will be executed after all default - * extractors. - * - * @deprecated Use {@link - * ArmeriaServerTelemetryBuilder#addAttributesExtractor(AttributesExtractor)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder addServerAttributeExtractor( - AttributesExtractor attributesExtractor) { - serverBuilder.addAttributesExtractor(attributesExtractor); - return this; - } - - /** - * Sets the {@code peer.service} attribute for http client spans. - * - * @deprecated Use {@link Experimental#setClientPeerService(ArmeriaClientTelemetryBuilder, - * String)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setPeerService(String peerService) { - clientBuilder.setPeerService(peerService); - return this; - } - - /** - * Configures the HTTP client request headers that will be captured as span attributes. - * - * @param requestHeaders A list of HTTP header names. - * @deprecated Use {@link ArmeriaClientTelemetryBuilder#setCapturedRequestHeaders(Collection)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setCapturedClientRequestHeaders(List requestHeaders) { - clientBuilder.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. - * @deprecated Use {@link ArmeriaClientTelemetryBuilder#setCapturedResponseHeaders(Collection)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setCapturedClientResponseHeaders(List responseHeaders) { - clientBuilder.setCapturedResponseHeaders(responseHeaders); - return this; - } - - /** - * Configures the HTTP server request headers that will be captured as span attributes. - * - * @param requestHeaders A list of HTTP header names. - * @deprecated Use {@link ArmeriaServerTelemetryBuilder#setCapturedRequestHeaders(Collection)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setCapturedServerRequestHeaders(List requestHeaders) { - serverBuilder.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. - * @deprecated Use {@link ArmeriaServerTelemetryBuilder#setCapturedResponseHeaders(Collection)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setCapturedServerResponseHeaders(List responseHeaders) { - serverBuilder.setCapturedResponseHeaders(responseHeaders); - return this; - } - - /** - * Configures the instrumentation to recognize an alternative set of HTTP request methods. - * - *

By default, this instrumentation defines "known" methods as the ones listed in RFC9110 and the PATCH - * method defined in RFC5789. - * - *

Note: calling this method overrides the default known method sets completely; it does - * not supplement it. - * - * @param knownMethods A set of recognized HTTP request methods. - * @see HttpClientAttributesExtractorBuilder#setKnownMethods(Collection) - * @see HttpServerAttributesExtractorBuilder#setKnownMethods(Collection) - * @deprecated Use {@link ArmeriaClientTelemetryBuilder#setKnownMethods(Collection)} and {@link - * ArmeriaServerTelemetryBuilder#setKnownMethods(Collection)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setKnownMethods(Set knownMethods) { - clientBuilder.setKnownMethods(knownMethods); - serverBuilder.setKnownMethods(knownMethods); - return this; - } - - /** - * Configures the instrumentation to emit experimental HTTP client metrics. - * - * @param emitExperimentalHttpClientMetrics {@code true} if the experimental HTTP client metrics - * are to be emitted. - * @deprecated Use {@link Experimental#setEmitExperimentalTelemetry(ArmeriaClientTelemetryBuilder, - * boolean)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setEmitExperimentalHttpClientMetrics( - boolean emitExperimentalHttpClientMetrics) { - clientBuilder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); - return this; - } - - /** - * Configures the instrumentation to emit experimental HTTP server metrics. - * - * @param emitExperimentalHttpServerMetrics {@code true} if the experimental HTTP server metrics - * are to be emitted. - * @deprecated Use {@link Experimental#setEmitExperimentalTelemetry(ArmeriaServerTelemetryBuilder, - * boolean)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setEmitExperimentalHttpServerMetrics( - boolean emitExperimentalHttpServerMetrics) { - serverBuilder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerMetrics); - return this; - } - - /** - * Sets custom client {@link SpanNameExtractor} via transform function. - * - * @deprecated Use {@link ArmeriaClientTelemetryBuilder#setSpanNameExtractor(Function)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setClientSpanNameExtractor( - Function< - SpanNameExtractor, - ? extends SpanNameExtractor> - clientSpanNameExtractor) { - clientBuilder.setSpanNameExtractor(clientSpanNameExtractor); - return this; - } - - /** - * Sets custom server {@link SpanNameExtractor} via transform function. - * - * @deprecated Use {@link ArmeriaServerTelemetryBuilder#setSpanNameExtractor(Function)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public ArmeriaTelemetryBuilder setServerSpanNameExtractor( - Function< - SpanNameExtractor, - ? extends SpanNameExtractor> - serverSpanNameExtractor) { - serverBuilder.setSpanNameExtractor(serverSpanNameExtractor); - return this; - } - - /** - * @deprecated Use {@link ArmeriaClientTelemetryBuilder#build()} and {@link - * ArmeriaServerTelemetryBuilder#build()} instead. - */ - @Deprecated - public ArmeriaTelemetry build() { - return new ArmeriaTelemetry(clientBuilder.build(), serverBuilder.build()); - } -} diff --git a/instrumentation/armeria/armeria-1.3/library/src/test/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpClientOldTest.java b/instrumentation/armeria/armeria-1.3/library/src/test/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpClientOldTest.java deleted file mode 100644 index 808288f1dbb1..000000000000 --- a/instrumentation/armeria/armeria-1.3/library/src/test/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpClientOldTest.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.armeria.v1_3; - -import com.linecorp.armeria.client.WebClientBuilder; -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; -import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import java.util.Collections; -import org.junit.jupiter.api.extension.RegisterExtension; - -@SuppressWarnings("deprecation") // testing deprecated API -class ArmeriaHttpClientOldTest extends AbstractArmeriaHttpClientTest { - - @RegisterExtension - static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forLibrary(); - - @Override - protected WebClientBuilder configureClient(WebClientBuilder clientBuilder) { - return clientBuilder.decorator( - ArmeriaTelemetry.builder(testing.getOpenTelemetry()) - .setCapturedClientRequestHeaders( - Collections.singletonList(AbstractHttpClientTest.TEST_REQUEST_HEADER)) - .setCapturedClientResponseHeaders( - Collections.singletonList(AbstractHttpClientTest.TEST_RESPONSE_HEADER)) - .build() - .newClientDecorator()); - } - - @Override - protected void configure(HttpClientTestOptions.Builder optionsBuilder) { - super.configure(optionsBuilder); - - // library instrumentation doesn't have a good way of suppressing nested CLIENT spans yet - optionsBuilder.disableTestWithClientParent(); - - // Agent users have automatic propagation through executor instrumentation, but library users - // should do manually using Armeria patterns. - optionsBuilder.disableTestCallbackWithParent(); - optionsBuilder.disableTestErrorWithCallback(); - } -} diff --git a/instrumentation/armeria/armeria-1.3/library/src/test/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerOldTest.java b/instrumentation/armeria/armeria-1.3/library/src/test/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerOldTest.java deleted file mode 100644 index cbfb829e3937..000000000000 --- a/instrumentation/armeria/armeria-1.3/library/src/test/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerOldTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.armeria.v1_3; - -import com.linecorp.armeria.server.ServerBuilder; -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; -import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; -import java.util.Collections; -import org.junit.jupiter.api.extension.RegisterExtension; - -@SuppressWarnings("deprecation") // testing deprecated API -class ArmeriaHttpServerOldTest extends AbstractArmeriaHttpServerTest { - - @RegisterExtension - static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forLibrary(); - - @Override - protected ServerBuilder configureServer(ServerBuilder sb) { - return sb.decorator( - ArmeriaTelemetry.builder(testing.getOpenTelemetry()) - .setCapturedServerRequestHeaders( - Collections.singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER)) - .setCapturedServerResponseHeaders( - Collections.singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER)) - .build() - .newServiceDecorator()); - } - - @Override - protected void configure(HttpServerTestOptions options) { - super.configure(options); - // library instrumentation does not create a span at all - options.disableTestNonStandardHttpMethod(); - } -} diff --git a/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt b/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt deleted file mode 100644 index 3101b8c385c5..000000000000 --- a/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v1_0 - -import io.ktor.application.* -import io.ktor.request.* -import io.ktor.response.* -import io.ktor.routing.* -import io.ktor.util.* -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.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder -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.SpanStatusBuilder -import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor -import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource -import kotlinx.coroutines.withContext - -@Deprecated("Use KtorServerTelemetry instead", ReplaceWith("KtorServerTelemetry")) -class KtorServerTracing private constructor( - private val instrumenter: Instrumenter, -) { - - class Configuration { - internal lateinit var builder: DefaultHttpServerInstrumenterBuilder - - internal var spanKindExtractor: - (SpanKindExtractor) -> SpanKindExtractor = { a -> a } - - fun setOpenTelemetry(openTelemetry: OpenTelemetry) { - this.builder = - DefaultHttpServerInstrumenterBuilder.create( - INSTRUMENTATION_NAME, - openTelemetry, - KtorHttpServerAttributesGetter.INSTANCE - ) - } - - fun setStatusExtractor( - extractor: (SpanStatusExtractor) -> SpanStatusExtractor - ) { - builder.setStatusExtractor { prevExtractor -> - SpanStatusExtractor { - spanStatusBuilder: SpanStatusBuilder, - request: ApplicationRequest, - response: ApplicationResponse?, - throwable: Throwable? - -> - extractor(prevExtractor).extract(spanStatusBuilder, request, response, throwable) - } - } - } - - fun setSpanKindExtractor(extractor: (SpanKindExtractor) -> SpanKindExtractor) { - this.spanKindExtractor = extractor - } - - fun addAttributeExtractor(extractor: AttributesExtractor) { - builder.addAttributesExtractor(extractor) - } - - fun setCapturedRequestHeaders(requestHeaders: List) { - builder.setCapturedRequestHeaders(requestHeaders) - } - - fun setCapturedResponseHeaders(responseHeaders: List) { - builder.setCapturedResponseHeaders(responseHeaders) - } - - fun setKnownMethods(knownMethods: Set) { - builder.setKnownMethods(knownMethods) - } - - internal fun isOpenTelemetryInitialized(): Boolean = this::builder.isInitialized - } - - private fun start(call: ApplicationCall): Context? { - val parentContext = Context.current() - if (!instrumenter.shouldStart(parentContext, call.request)) { - return null - } - - return instrumenter.start(parentContext, call.request) - } - - private fun end(context: Context, call: ApplicationCall, error: Throwable?) { - instrumenter.end(context, call.request, call.response, error) - } - - companion object Feature : ApplicationFeature { - private const val INSTRUMENTATION_NAME = "io.opentelemetry.ktor-1.0" - - private val contextKey = AttributeKey("OpenTelemetry") - private val errorKey = AttributeKey("OpenTelemetryException") - - override val key: AttributeKey = AttributeKey("OpenTelemetry") - - override fun install(pipeline: Application, configure: Configuration.() -> Unit): KtorServerTracing { - val configuration = Configuration().apply(configure) - - if (!configuration.isOpenTelemetryInitialized()) { - throw IllegalArgumentException("OpenTelemetry must be set") - } - - val instrumenter = InstrumenterUtil.buildUpstreamInstrumenter( - configuration.builder.instrumenterBuilder(), - ApplicationRequestGetter, - configuration.spanKindExtractor(SpanKindExtractor.alwaysServer()) - ) - - val feature = KtorServerTracing(instrumenter) - - val startPhase = PipelinePhase("OpenTelemetry") - pipeline.insertPhaseBefore(ApplicationCallPipeline.Monitoring, startPhase) - pipeline.intercept(startPhase) { - val context = feature.start(call) - - if (context != null) { - call.attributes.put(contextKey, context) - withContext(context.asContextElement()) { - try { - proceed() - } catch (err: Throwable) { - // Stash error for reporting later since need ktor to finish setting up the response - call.attributes.put(errorKey, err) - throw err - } - } - } else { - proceed() - } - } - - val postSendPhase = PipelinePhase("OpenTelemetryPostSend") - pipeline.sendPipeline.insertPhaseAfter(ApplicationSendPipeline.After, postSendPhase) - pipeline.sendPipeline.intercept(postSendPhase) { - val context = call.attributes.getOrNull(contextKey) - if (context != null) { - var error: Throwable? = call.attributes.getOrNull(errorKey) - try { - proceed() - } catch (t: Throwable) { - error = t - throw t - } finally { - feature.end(context, call, error) - } - } else { - proceed() - } - } - - pipeline.environment.monitor.subscribe(Routing.RoutingCallStarted) { call -> - val context = call.attributes.getOrNull(contextKey) - if (context != null) { - HttpServerRoute.update(context, HttpServerRouteSource.SERVER, { _, arg -> arg.route.parent.toString() }, call) - } - } - - return feature - } - } -} diff --git a/instrumentation/ktor/ktor-1.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorHttpServerOldTest.kt b/instrumentation/ktor/ktor-1.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorHttpServerOldTest.kt deleted file mode 100644 index 828052cdb078..000000000000 --- a/instrumentation/ktor/ktor-1.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorHttpServerOldTest.kt +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v1_0 - -import io.ktor.application.* -import io.ktor.http.* -import io.ktor.request.* -import io.ktor.response.* -import io.ktor.routing.* -import io.ktor.server.engine.* -import io.ktor.server.netty.* -import io.opentelemetry.api.trace.Span -import io.opentelemetry.api.trace.SpanKind -import io.opentelemetry.api.trace.StatusCode -import io.opentelemetry.context.Context -import io.opentelemetry.extension.kotlin.asContextElement -import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest -import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension -import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions -import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint -import io.opentelemetry.semconv.ServerAttributes -import kotlinx.coroutines.withContext -import org.junit.jupiter.api.extension.RegisterExtension -import java.util.concurrent.ExecutionException -import java.util.concurrent.TimeUnit - -class KtorHttpServerOldTest : AbstractHttpServerTest() { - - companion object { - @JvmStatic - @RegisterExtension - val testing = HttpServerInstrumentationExtension.forLibrary() - } - - override fun setupServer(): ApplicationEngine = embeddedServer(Netty, port = port) { - KtorOldTestUtil.installOpenTelemetry(this, testing.openTelemetry) - - routing { - get(ServerEndpoint.SUCCESS.path) { - controller(ServerEndpoint.SUCCESS) { - call.respondText(ServerEndpoint.SUCCESS.body, status = HttpStatusCode.fromValue(ServerEndpoint.SUCCESS.status)) - } - } - - get(ServerEndpoint.REDIRECT.path) { - controller(ServerEndpoint.REDIRECT) { - call.respondRedirect(ServerEndpoint.REDIRECT.body) - } - } - - get(ServerEndpoint.ERROR.path) { - controller(ServerEndpoint.ERROR) { - call.respondText(ServerEndpoint.ERROR.body, status = HttpStatusCode.fromValue(ServerEndpoint.ERROR.status)) - } - } - - get(ServerEndpoint.EXCEPTION.path) { - controller(ServerEndpoint.EXCEPTION) { - throw IllegalStateException(ServerEndpoint.EXCEPTION.body) - } - } - - get("/query") { - controller(ServerEndpoint.QUERY_PARAM) { - call.respondText("some=${call.request.queryParameters["some"]}", status = HttpStatusCode.fromValue(ServerEndpoint.QUERY_PARAM.status)) - } - } - - get("/path/{id}/param") { - controller(ServerEndpoint.PATH_PARAM) { - call.respondText( - call.parameters["id"] - ?: "", - status = HttpStatusCode.fromValue(ServerEndpoint.PATH_PARAM.status), - ) - } - } - - get("/child") { - controller(ServerEndpoint.INDEXED_CHILD) { - ServerEndpoint.INDEXED_CHILD.collectSpanAttributes { call.request.queryParameters[it] } - call.respondText(ServerEndpoint.INDEXED_CHILD.body, status = HttpStatusCode.fromValue(ServerEndpoint.INDEXED_CHILD.status)) - } - } - - get("/captureHeaders") { - controller(ServerEndpoint.CAPTURE_HEADERS) { - call.response.header("X-Test-Response", call.request.header("X-Test-Request") ?: "") - call.respondText(ServerEndpoint.CAPTURE_HEADERS.body, status = HttpStatusCode.fromValue(ServerEndpoint.CAPTURE_HEADERS.status)) - } - } - } - }.start() - - override fun stopServer(server: ApplicationEngine) { - server.stop(0, 10, TimeUnit.SECONDS) - } - - // Copy in HttpServerTest.controller but make it a suspending function - private suspend fun controller(endpoint: ServerEndpoint, wrapped: suspend () -> Unit) { - assert(Span.current().spanContext.isValid, { "Controller should have a parent span. " }) - if (endpoint == ServerEndpoint.NOT_FOUND) { - wrapped() - } - val span = testing.openTelemetry.getTracer("test").spanBuilder("controller").setSpanKind(SpanKind.INTERNAL).startSpan() - try { - withContext(Context.current().with(span).asContextElement()) { - wrapped() - } - span.end() - } catch (e: Exception) { - span.setStatus(StatusCode.ERROR) - span.recordException(if (e is ExecutionException) e.cause ?: e else e) - span.end() - throw e - } - } - - override fun configure(options: HttpServerTestOptions) { - options.setTestPathParam(true) - - options.setHttpAttributes { - HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES - ServerAttributes.SERVER_PORT - } - - options.setExpectedHttpRoute { endpoint, method -> - when (endpoint) { - ServerEndpoint.PATH_PARAM -> "/path/{id}/param" - else -> expectedHttpRoute(endpoint, method) - } - } - // ktor does not have a controller lifecycle so the server span ends immediately when the - // response is sent, which is before the controller span finishes. - options.setVerifyServerSpanEndTime(false) - - options.setResponseCodeOnNonStandardHttpMethod(404) - } -} diff --git a/instrumentation/ktor/ktor-1.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorOldTestUtil.kt b/instrumentation/ktor/ktor-1.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorOldTestUtil.kt deleted file mode 100644 index e9ff18ea1565..000000000000 --- a/instrumentation/ktor/ktor-1.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorOldTestUtil.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v1_0 - -import io.ktor.application.* -import io.opentelemetry.api.OpenTelemetry -import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest - -class KtorOldTestUtil { - companion object { - fun installOpenTelemetry(application: Application, openTelemetry: OpenTelemetry) { - application.install(KtorServerTracing) { - setOpenTelemetry(openTelemetry) - setCapturedRequestHeaders(listOf(AbstractHttpServerTest.TEST_REQUEST_HEADER)) - setCapturedResponseHeaders(listOf(AbstractHttpServerTest.TEST_RESPONSE_HEADER)) - } - } - } -} diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/client/AbstractKtorClientTracing.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/client/AbstractKtorClientTracing.kt deleted file mode 100644 index dc9cafba5b5f..000000000000 --- a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/client/AbstractKtorClientTracing.kt +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0.common.client - -import io.ktor.client.call.* -import io.ktor.client.request.* -import io.ktor.client.statement.* -import io.opentelemetry.context.Context -import io.opentelemetry.context.propagation.ContextPropagators -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter -import io.opentelemetry.instrumentation.ktor.v2_0.common.KtorHttpHeadersSetter - -@Deprecated("Use AbstractKtorClientTelemetry instead", ReplaceWith("AbstractKtorClientTelemetry")) -abstract class AbstractKtorClientTracing( - private val instrumenter: Instrumenter, - private val propagators: ContextPropagators, -) { - - internal fun createSpan(requestBuilder: HttpRequestBuilder): Context? { - val parentContext = Context.current() - val requestData = requestBuilder.build() - - return if (instrumenter.shouldStart(parentContext, requestData)) { - instrumenter.start(parentContext, requestData) - } else { - null - } - } - - internal fun populateRequestHeaders(requestBuilder: HttpRequestBuilder, context: Context) { - propagators.textMapPropagator.inject(context, requestBuilder, KtorHttpHeadersSetter) - } - - internal fun endSpan(context: Context, call: HttpClientCall, error: Throwable?) { - endSpan(context, HttpRequestBuilder().takeFrom(call.request), call.response, error) - } - - internal fun endSpan(context: Context, requestBuilder: HttpRequestBuilder, response: HttpResponse?, error: Throwable?) { - instrumenter.end(context, requestBuilder.build(), response, error) - } -} diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/client/AbstractKtorClientTracingBuilder.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/client/AbstractKtorClientTracingBuilder.kt deleted file mode 100644 index 4c4bb8ed4858..000000000000 --- a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/client/AbstractKtorClientTracingBuilder.kt +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0.common.client - -import io.ktor.client.request.* -import io.ktor.client.statement.* -import io.ktor.http.* -import io.opentelemetry.api.OpenTelemetry -import io.opentelemetry.api.common.AttributesBuilder -import io.opentelemetry.context.Context -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor -import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor -import io.opentelemetry.instrumentation.ktor.v2_0.common.KtorHttpClientAttributesGetter -import io.opentelemetry.instrumentation.ktor.v2_0.common.internal.KtorBuilderUtilOld -import java.util.function.Function - -@Deprecated("Use AbstractKtorClientTelemetryBuilder instead", ReplaceWith("AbstractKtorClientTelemetryBuilder")) -abstract class AbstractKtorClientTracingBuilder( - private val instrumentationName: String -) { - companion object { - init { - KtorBuilderUtilOld.clientBuilderExtractor = { it.clientBuilder } - } - } - - internal lateinit var openTelemetry: OpenTelemetry - protected lateinit var clientBuilder: DefaultHttpClientInstrumenterBuilder - - fun setOpenTelemetry(openTelemetry: OpenTelemetry) { - this.openTelemetry = openTelemetry - this.clientBuilder = DefaultHttpClientInstrumenterBuilder.create( - instrumentationName, - openTelemetry, - KtorHttpClientAttributesGetter - ) - } - - protected fun getOpenTelemetry(): OpenTelemetry = openTelemetry - - @Deprecated( - "Please use method `capturedRequestHeaders`", - ReplaceWith("capturedRequestHeaders(headers.asIterable())") - ) - fun setCapturedRequestHeaders(vararg headers: String) = capturedRequestHeaders(headers.asIterable()) - - @Deprecated( - "Please use method `capturedRequestHeaders`", - ReplaceWith("capturedRequestHeaders(headers)") - ) - fun setCapturedRequestHeaders(headers: List) = capturedRequestHeaders(headers) - - fun capturedRequestHeaders(vararg headers: String) = capturedRequestHeaders(headers.asIterable()) - - fun capturedRequestHeaders(headers: Iterable) { - clientBuilder.setCapturedRequestHeaders(headers.toList()) - } - - @Deprecated( - "Please use method `capturedResponseHeaders`", - ReplaceWith("capturedResponseHeaders(headers.asIterable())") - ) - fun setCapturedResponseHeaders(vararg headers: String) = capturedResponseHeaders(headers.asIterable()) - - @Deprecated( - "Please use method `capturedResponseHeaders`", - ReplaceWith("capturedResponseHeaders(headers)") - ) - fun setCapturedResponseHeaders(headers: List) = capturedResponseHeaders(headers) - - fun capturedResponseHeaders(vararg headers: String) = capturedResponseHeaders(headers.asIterable()) - - fun capturedResponseHeaders(headers: Iterable) { - clientBuilder.setCapturedResponseHeaders(headers.toList()) - } - - @Deprecated( - "Please use method `knownMethods`", - ReplaceWith("knownMethods(knownMethods)") - ) - fun setKnownMethods(knownMethods: Set) = knownMethods(knownMethods) - - fun knownMethods(vararg methods: String) = knownMethods(methods.asIterable()) - - fun knownMethods(vararg methods: HttpMethod) = knownMethods(methods.asIterable()) - - @JvmName("knownMethodsJvm") - fun knownMethods(methods: Iterable) = knownMethods(methods.map { it.value }) - - fun knownMethods(methods: Iterable) { - clientBuilder.setKnownMethods(methods.toSet()) - } - - @Deprecated("Please use method `attributeExtractor`") - fun addAttributesExtractors(vararg extractors: AttributesExtractor) = addAttributesExtractors(extractors.asList()) - - @Deprecated("Please use method `attributeExtractor`") - fun addAttributesExtractors(extractors: Iterable>) { - extractors.forEach { - attributeExtractor { - onStart { it.onStart(attributes, parentContext, request) } - onEnd { it.onEnd(attributes, parentContext, request, response, error) } - } - } - } - - fun attributeExtractor(extractorBuilder: ExtractorBuilder.() -> Unit = {}) { - val builder = ExtractorBuilder().apply(extractorBuilder).build() - this.clientBuilder.addAttributesExtractor( - object : AttributesExtractor { - override fun onStart(attributes: AttributesBuilder, parentContext: Context, request: HttpRequestData) { - builder.onStart(OnStartData(attributes, parentContext, request)) - } - - override fun onEnd(attributes: AttributesBuilder, context: Context, request: HttpRequestData, response: HttpResponse?, error: Throwable?) { - builder.onEnd(OnEndData(attributes, context, request, response, error)) - } - } - ) - } - - class ExtractorBuilder { - private var onStart: OnStartData.() -> Unit = {} - private var onEnd: OnEndData.() -> Unit = {} - - fun onStart(block: OnStartData.() -> Unit) { - onStart = block - } - - fun onEnd(block: OnEndData.() -> Unit) { - onEnd = block - } - - internal fun build(): Extractor = Extractor(onStart, onEnd) - } - - internal class Extractor(val onStart: OnStartData.() -> Unit, val onEnd: OnEndData.() -> Unit) - - data class OnStartData( - val attributes: AttributesBuilder, - val parentContext: Context, - val request: HttpRequestData - ) - - data class OnEndData( - val attributes: AttributesBuilder, - val parentContext: Context, - val request: HttpRequestData, - val response: HttpResponse?, - val error: Throwable? - ) - - /** - * Configures the instrumentation to emit experimental HTTP client metrics. - * - * @param emitExperimentalHttpClientMetrics `true` if the experimental HTTP client metrics are to be emitted. - */ - @Deprecated("Please use method `Experimental.emitExperimentalTelemetry`") - fun setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics: Boolean) { - if (emitExperimentalHttpClientMetrics) { - emitExperimentalHttpClientMetrics() - } - } - - @Deprecated("Please use method `Experimental.emitExperimentalTelemetry`") - fun emitExperimentalHttpClientMetrics() { - clientBuilder.setEmitExperimentalHttpClientMetrics(true) - } - - fun spanNameExtractor(spanNameExtractorTransformer: Function, out SpanNameExtractor>) { - clientBuilder.setSpanNameExtractor(spanNameExtractorTransformer) - } -} diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/internal/KtorBuilderUtilOld.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/internal/KtorBuilderUtilOld.kt deleted file mode 100644 index 9154c7f7cd60..000000000000 --- a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/internal/KtorBuilderUtilOld.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0.common.internal - -import io.ktor.client.request.* -import io.ktor.client.statement.* -import io.ktor.server.request.* -import io.ktor.server.response.* -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder -import io.opentelemetry.instrumentation.ktor.v2_0.common.client.AbstractKtorClientTracingBuilder -import io.opentelemetry.instrumentation.ktor.v2_0.common.server.AbstractKtorServerTracingBuilder - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -@Deprecated("Use KtorBuilderUtil instead", ReplaceWith("KtorBuilderUtil")) -object KtorBuilderUtilOld { - lateinit var clientBuilderExtractor: (AbstractKtorClientTracingBuilder) -> DefaultHttpClientInstrumenterBuilder - lateinit var serverBuilderExtractor: ( - AbstractKtorServerTracingBuilder - ) -> DefaultHttpServerInstrumenterBuilder -} diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/internal/KtorClientTracingUtil.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/internal/KtorClientTracingUtil.kt deleted file mode 100644 index 45e0f1d22559..000000000000 --- a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/internal/KtorClientTracingUtil.kt +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0.common.internal - -import io.ktor.client.* -import io.ktor.client.request.* -import io.ktor.client.statement.* -import io.ktor.util.* -import io.ktor.util.pipeline.* -import io.opentelemetry.context.Context -import io.opentelemetry.extension.kotlin.asContextElement -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount -import io.opentelemetry.instrumentation.ktor.v2_0.common.client.AbstractKtorClientTracing -import kotlinx.coroutines.InternalCoroutinesApi -import kotlinx.coroutines.job -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -@Deprecated("Use KtorClientTelemetryUtil instead", ReplaceWith("KtorClientTelemetryUtil")) -object KtorClientTracingUtil { - private val openTelemetryContextKey = AttributeKey("OpenTelemetry") - - fun install(plugin: AbstractKtorClientTracing, scope: HttpClient) { - installSpanCreation(plugin, scope) - installSpanEnd(plugin, scope) - } - - private fun installSpanCreation(plugin: AbstractKtorClientTracing, scope: HttpClient) { - val initializeRequestPhase = PipelinePhase("OpenTelemetryInitializeRequest") - scope.requestPipeline.insertPhaseAfter(HttpRequestPipeline.State, initializeRequestPhase) - - scope.requestPipeline.intercept(initializeRequestPhase) { - val openTelemetryContext = HttpClientRequestResendCount.initialize(Context.current()) - withContext(openTelemetryContext.asContextElement()) { proceed() } - } - - val createSpanPhase = PipelinePhase("OpenTelemetryCreateSpan") - scope.sendPipeline.insertPhaseAfter(HttpSendPipeline.State, createSpanPhase) - - scope.sendPipeline.intercept(createSpanPhase) { - val requestBuilder = context - val openTelemetryContext = plugin.createSpan(requestBuilder) - - if (openTelemetryContext != null) { - try { - requestBuilder.attributes.put(openTelemetryContextKey, openTelemetryContext) - plugin.populateRequestHeaders(requestBuilder, openTelemetryContext) - - withContext(openTelemetryContext.asContextElement()) { proceed() } - } catch (e: Throwable) { - plugin.endSpan(openTelemetryContext, requestBuilder, null, e) - throw e - } - } else { - proceed() - } - } - } - - @OptIn(InternalCoroutinesApi::class) - private fun installSpanEnd(plugin: AbstractKtorClientTracing, scope: HttpClient) { - val endSpanPhase = PipelinePhase("OpenTelemetryEndSpan") - scope.receivePipeline.insertPhaseBefore(HttpReceivePipeline.State, endSpanPhase) - - scope.receivePipeline.intercept(endSpanPhase) { - val openTelemetryContext = it.call.attributes.getOrNull(openTelemetryContextKey) - openTelemetryContext ?: return@intercept - - scope.launch { - val job = it.call.coroutineContext.job - job.join() - val cause = if (!job.isCancelled) { - null - } else { - kotlin.runCatching { job.getCancellationException() }.getOrNull() - } - - plugin.endSpan(openTelemetryContext, it.call, cause) - } - } - } -} diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/internal/KtorServerTracingUtil.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/internal/KtorServerTracingUtil.kt deleted file mode 100644 index c773189abd9e..000000000000 --- a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/internal/KtorServerTracingUtil.kt +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0.common.internal - -import io.ktor.server.application.* -import io.ktor.server.request.* -import io.ktor.server.response.* -import io.ktor.util.* -import io.ktor.util.pipeline.* -import io.opentelemetry.context.Context -import io.opentelemetry.extension.kotlin.asContextElement -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter -import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor -import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil -import io.opentelemetry.instrumentation.ktor.v2_0.common.ApplicationRequestGetter -import io.opentelemetry.instrumentation.ktor.v2_0.common.server.AbstractKtorServerTracingBuilder -import kotlinx.coroutines.withContext - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -@Deprecated("Use KtorServerTelemetryUtil instead", ReplaceWith("KtorServerTelemetryUtil")) -object KtorServerTracingUtil { - - fun configureTracing(builder: AbstractKtorServerTracingBuilder, application: Application) { - val contextKey = AttributeKey("OpenTelemetry") - val errorKey = AttributeKey("OpenTelemetryException") - - val instrumenter = instrumenter(builder) - val tracer = KtorServerTracer(instrumenter) - val startPhase = PipelinePhase("OpenTelemetry") - - application.insertPhaseBefore(ApplicationCallPipeline.Monitoring, startPhase) - application.intercept(startPhase) { - val context = tracer.start(call) - - if (context != null) { - call.attributes.put(contextKey, context) - withContext(context.asContextElement()) { - try { - proceed() - } catch (err: Throwable) { - // Stash error for reporting later since need ktor to finish setting up the response - call.attributes.put(errorKey, err) - throw err - } - } - } else { - proceed() - } - } - - val postSendPhase = PipelinePhase("OpenTelemetryPostSend") - application.sendPipeline.insertPhaseAfter(ApplicationSendPipeline.After, postSendPhase) - application.sendPipeline.intercept(postSendPhase) { - val context = call.attributes.getOrNull(contextKey) - if (context != null) { - var error: Throwable? = call.attributes.getOrNull(errorKey) - try { - proceed() - } catch (t: Throwable) { - error = t - throw t - } finally { - tracer.end(context, call, error) - } - } else { - proceed() - } - } - } - - private fun instrumenter(builder: AbstractKtorServerTracingBuilder): Instrumenter = InstrumenterUtil.buildUpstreamInstrumenter( - builder.serverBuilder.instrumenterBuilder(), - ApplicationRequestGetter, - builder.spanKindExtractor(SpanKindExtractor.alwaysServer()) - ) -} diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/server/AbstractKtorServerTracingBuilder.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/server/AbstractKtorServerTracingBuilder.kt deleted file mode 100644 index 9fec8fb5c78d..000000000000 --- a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/server/AbstractKtorServerTracingBuilder.kt +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0.common.server - -import io.ktor.http.* -import io.ktor.server.request.* -import io.ktor.server.response.* -import io.opentelemetry.api.OpenTelemetry -import io.opentelemetry.api.common.AttributesBuilder -import io.opentelemetry.api.trace.SpanKind -import io.opentelemetry.context.Context -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor -import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor -import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor -import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusBuilder -import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor -import io.opentelemetry.instrumentation.ktor.v2_0.common.KtorHttpServerAttributesGetter -import io.opentelemetry.instrumentation.ktor.v2_0.common.internal.KtorBuilderUtilOld -import java.util.function.Function - -@Deprecated("Use AbstractKtorServerTelemetryBuilder instead", ReplaceWith("AbstractKtorServerTelemetryBuilder")) -abstract class AbstractKtorServerTracingBuilder(private val instrumentationName: String) { - companion object { - init { - KtorBuilderUtilOld.serverBuilderExtractor = { it.serverBuilder } - } - } - - internal lateinit var serverBuilder: DefaultHttpServerInstrumenterBuilder - - internal var spanKindExtractor: - (SpanKindExtractor) -> SpanKindExtractor = { a -> a } - - fun setOpenTelemetry(openTelemetry: OpenTelemetry) { - this.serverBuilder = - DefaultHttpServerInstrumenterBuilder.create( - instrumentationName, - openTelemetry, - KtorHttpServerAttributesGetter.INSTANCE - ) - } - - @Deprecated("Please use method `spanStatusExtractor`") - fun setStatusExtractor( - extractor: (SpanStatusExtractor) -> SpanStatusExtractor - ) { - spanStatusExtractor { prevStatusExtractor -> - extractor(prevStatusExtractor).extract(spanStatusBuilder, request, response, error) - } - } - - fun spanStatusExtractor(extract: SpanStatusData.(SpanStatusExtractor) -> Unit) { - serverBuilder.setStatusExtractor { prevExtractor -> - SpanStatusExtractor { - spanStatusBuilder: SpanStatusBuilder, - request: ApplicationRequest, - response: ApplicationResponse?, - throwable: Throwable? - -> - extract( - SpanStatusData(spanStatusBuilder, request, response, throwable), - prevExtractor - ) - } - } - } - - data class SpanStatusData( - val spanStatusBuilder: SpanStatusBuilder, - val request: ApplicationRequest, - val response: ApplicationResponse?, - val error: Throwable? - ) - - @Deprecated("Please use method `spanKindExtractor`") - fun setSpanKindExtractor(extractor: (SpanKindExtractor) -> SpanKindExtractor) { - spanKindExtractor { prevSpanKindExtractor -> - extractor(prevSpanKindExtractor).extract(this) - } - } - - fun spanKindExtractor(extract: ApplicationRequest.(SpanKindExtractor) -> SpanKind) { - spanKindExtractor = { prevExtractor -> - SpanKindExtractor { request: ApplicationRequest -> - extract(request, prevExtractor) - } - } - } - - fun spanNameExtractor(spanNameExtractorTransformer: Function, out SpanNameExtractor>) { - serverBuilder.setSpanNameExtractor(spanNameExtractorTransformer) - } - - @Deprecated("Please use method `attributeExtractor`") - fun addAttributeExtractor(extractor: AttributesExtractor) { - attributeExtractor { - onStart { - extractor.onStart(attributes, parentContext, request) - } - onEnd { - extractor.onEnd(attributes, parentContext, request, response, error) - } - } - } - - fun attributeExtractor(extractorBuilder: ExtractorBuilder.() -> Unit = {}) { - val builder = ExtractorBuilder().apply(extractorBuilder).build() - serverBuilder.addAttributesExtractor( - object : AttributesExtractor { - override fun onStart(attributes: AttributesBuilder, parentContext: Context, request: ApplicationRequest) { - builder.onStart(OnStartData(attributes, parentContext, request)) - } - - override fun onEnd(attributes: AttributesBuilder, context: Context, request: ApplicationRequest, response: ApplicationResponse?, error: Throwable?) { - builder.onEnd(OnEndData(attributes, context, request, response, error)) - } - } - ) - } - - class ExtractorBuilder { - private var onStart: OnStartData.() -> Unit = {} - private var onEnd: OnEndData.() -> Unit = {} - - fun onStart(block: OnStartData.() -> Unit) { - onStart = block - } - - fun onEnd(block: OnEndData.() -> Unit) { - onEnd = block - } - - internal fun build(): Extractor = Extractor(onStart, onEnd) - } - - internal class Extractor(val onStart: OnStartData.() -> Unit, val onEnd: OnEndData.() -> Unit) - - data class OnStartData( - val attributes: AttributesBuilder, - val parentContext: Context, - val request: ApplicationRequest - ) - - data class OnEndData( - val attributes: AttributesBuilder, - val parentContext: Context, - val request: ApplicationRequest, - val response: ApplicationResponse?, - val error: Throwable? - ) - - @Deprecated( - "Please use method `capturedRequestHeaders`", - ReplaceWith("capturedRequestHeaders(headers)") - ) - fun setCapturedRequestHeaders(headers: List) = capturedRequestHeaders(headers) - - fun capturedRequestHeaders(vararg headers: String) = capturedRequestHeaders(headers.asIterable()) - - fun capturedRequestHeaders(headers: Iterable) { - serverBuilder.setCapturedRequestHeaders(headers.toList()) - } - - @Deprecated( - "Please use method `capturedResponseHeaders`", - ReplaceWith("capturedResponseHeaders(headers)") - ) - fun setCapturedResponseHeaders(headers: List) = capturedResponseHeaders(headers) - - fun capturedResponseHeaders(vararg headers: String) = capturedResponseHeaders(headers.asIterable()) - - fun capturedResponseHeaders(headers: Iterable) { - serverBuilder.setCapturedResponseHeaders(headers.toList()) - } - - @Deprecated( - "Please use method `knownMethods`", - ReplaceWith("knownMethods(knownMethods)") - ) - fun setKnownMethods(knownMethods: Set) = knownMethods(knownMethods) - - fun knownMethods(vararg methods: String) = knownMethods(methods.asIterable()) - - fun knownMethods(vararg methods: HttpMethod) = knownMethods(methods.asIterable()) - - @JvmName("knownMethodsJvm") - fun knownMethods(methods: Iterable) = knownMethods(methods.map { it.value }) - - fun knownMethods(methods: Iterable) { - methods.toSet().apply { - serverBuilder.setKnownMethods(this) - } - } - - /** - * {@link #setOpenTelemetry(OpenTelemetry)} sets the serverBuilder to a non-null value. - */ - fun isOpenTelemetryInitialized(): Boolean = this::serverBuilder.isInitialized -} diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracing.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracing.kt deleted file mode 100644 index d9dcf9796f67..000000000000 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracing.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0.client - -import io.ktor.client.* -import io.ktor.client.plugins.* -import io.ktor.client.request.* -import io.ktor.client.statement.* -import io.ktor.util.* -import io.opentelemetry.context.propagation.ContextPropagators -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter -import io.opentelemetry.instrumentation.ktor.v2_0.common.client.AbstractKtorClientTracing -import io.opentelemetry.instrumentation.ktor.v2_0.common.internal.KtorClientTracingUtil - -@Deprecated("Use KtorClientTelemetry instead", ReplaceWith("KtorClientTelemetry")) -class KtorClientTracing internal constructor( - instrumenter: Instrumenter, - propagators: ContextPropagators -) : AbstractKtorClientTracing(instrumenter, propagators) { - - companion object : HttpClientPlugin { - - override val key = AttributeKey("OpenTelemetry") - - override fun prepare(block: KtorClientTracingBuilder.() -> Unit) = KtorClientTracingBuilder().apply(block).build() - - override fun install(plugin: KtorClientTracing, scope: HttpClient) { - KtorClientTracingUtil.install(plugin, scope) - } - } -} diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracingBuilder.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracingBuilder.kt deleted file mode 100644 index 706852a3178a..000000000000 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracingBuilder.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0.client - -import io.opentelemetry.instrumentation.ktor.v2_0.InstrumentationProperties.INSTRUMENTATION_NAME -import io.opentelemetry.instrumentation.ktor.v2_0.common.client.AbstractKtorClientTracingBuilder - -@Deprecated("Use KtorClientTelemetryBuilder instead", ReplaceWith("KtorClientTelemetryBuilder")) -class KtorClientTracingBuilder : AbstractKtorClientTracingBuilder(INSTRUMENTATION_NAME) { - - internal fun build(): KtorClientTracing = KtorClientTracing( - instrumenter = clientBuilder.build(), - propagators = getOpenTelemetry().propagators, - ) -} diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracingBuilder.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracingBuilder.kt deleted file mode 100644 index c82c99fccb5e..000000000000 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracingBuilder.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0.server - -import io.ktor.server.application.* -import io.ktor.server.routing.* -import io.opentelemetry.context.Context -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource -import io.opentelemetry.instrumentation.ktor.v2_0.InstrumentationProperties.INSTRUMENTATION_NAME -import io.opentelemetry.instrumentation.ktor.v2_0.common.internal.KtorServerTracingUtil -import io.opentelemetry.instrumentation.ktor.v2_0.common.server.AbstractKtorServerTracingBuilder - -@Deprecated("Use KtorServerTelemetryBuilder instead", ReplaceWith("KtorServerTelemetryBuilder")) -class KtorServerTracingBuilder internal constructor( - instrumentationName: String -) : AbstractKtorServerTracingBuilder(instrumentationName) - -val KtorServerTracing = createRouteScopedPlugin("OpenTelemetry", { KtorServerTracingBuilder(INSTRUMENTATION_NAME) }) { - require(pluginConfig.isOpenTelemetryInitialized()) { "OpenTelemetry must be set" } - - KtorServerTracingUtil.configureTracing(pluginConfig, application) - - application.environment.monitor.subscribe(Routing.RoutingCallStarted) { call -> - HttpServerRoute.update(Context.current(), HttpServerRouteSource.SERVER, { _, arg -> arg.route.parent.toString() }, call) - } -} diff --git a/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorHttpClientOldTest.kt b/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorHttpClientOldTest.kt deleted file mode 100644 index be7dfca50080..000000000000 --- a/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorHttpClientOldTest.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0 - -import io.ktor.client.* -import io.opentelemetry.instrumentation.ktor.v2_0.client.KtorClientTracing -import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension -import org.junit.jupiter.api.extension.RegisterExtension - -class KtorHttpClientOldTest : AbstractKtorHttpClientTest() { - - companion object { - @JvmStatic - @RegisterExtension - private val TESTING = HttpClientInstrumentationExtension.forLibrary() - } - - override fun HttpClientConfig<*>.installTracing() { - install(KtorClientTracing) { - setOpenTelemetry(TESTING.openTelemetry) - capturedRequestHeaders(TEST_REQUEST_HEADER) - capturedResponseHeaders(TEST_RESPONSE_HEADER) - } - } -} diff --git a/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorHttpServerOldTest.kt b/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorHttpServerOldTest.kt deleted file mode 100644 index f2c747b61ae1..000000000000 --- a/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorHttpServerOldTest.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0 - -import io.ktor.server.application.* -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension -import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension -import org.junit.jupiter.api.extension.RegisterExtension - -class KtorHttpServerOldTest : AbstractKtorHttpServerTest() { - - companion object { - @JvmStatic - @RegisterExtension - val TESTING: InstrumentationExtension = HttpServerInstrumentationExtension.forLibrary() - } - - override fun getTesting(): InstrumentationExtension = TESTING - - override fun installOpenTelemetry(application: Application) { - KtorOldTestUtil.installOpenTelemetry(application, TESTING.openTelemetry) - } -} diff --git a/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorOldTestUtil.kt b/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorOldTestUtil.kt deleted file mode 100644 index 10cc11f52222..000000000000 --- a/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorOldTestUtil.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0 - -import io.ktor.server.application.* -import io.opentelemetry.api.OpenTelemetry -import io.opentelemetry.instrumentation.ktor.v2_0.server.KtorServerTracing -import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest - -class KtorOldTestUtil { - companion object { - fun installOpenTelemetry(application: Application, openTelemetry: OpenTelemetry) { - application.install(KtorServerTracing) { - setOpenTelemetry(openTelemetry) - capturedRequestHeaders(AbstractHttpServerTest.TEST_REQUEST_HEADER) - capturedResponseHeaders(AbstractHttpServerTest.TEST_RESPONSE_HEADER) - } - } - } -} diff --git a/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerSpanKindExtractorTest.kt b/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerSpanKindExtractorTest.kt index 645460ce7302..2474eab3ebb1 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerSpanKindExtractorTest.kt +++ b/instrumentation/ktor/ktor-2.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerSpanKindExtractorTest.kt @@ -13,7 +13,6 @@ import io.ktor.server.request.* import io.ktor.server.response.* import io.ktor.server.routing.* import io.opentelemetry.api.trace.SpanKind -import io.opentelemetry.instrumentation.ktor.v2_0.server.KtorServerTracing import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerUsingTest import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension @@ -57,7 +56,7 @@ class KtorServerSpanKindExtractorTest : AbstractHttpServerUsingTest, - propagators: ContextPropagators -) : AbstractKtorClientTracing(instrumenter, propagators) { - - companion object : HttpClientPlugin { - - override val key = AttributeKey("OpenTelemetry") - - override fun prepare(block: KtorClientTracingBuilder.() -> Unit) = KtorClientTracingBuilder().apply(block).build() - - override fun install(plugin: KtorClientTracing, scope: HttpClient) { - KtorClientTracingUtil.install(plugin, scope) - } - } -} diff --git a/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorClientTracingBuilder.kt b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorClientTracingBuilder.kt deleted file mode 100644 index b4787662b8e2..000000000000 --- a/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorClientTracingBuilder.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v3_0.client - -import io.opentelemetry.instrumentation.ktor.v2_0.common.client.AbstractKtorClientTracingBuilder -import io.opentelemetry.instrumentation.ktor.v3_0.InstrumentationProperties.INSTRUMENTATION_NAME - -@Deprecated("Use KtorClientTelemetryBuilder instead", ReplaceWith("KtorClientTelemetryBuilder")) -class KtorClientTracingBuilder : AbstractKtorClientTracingBuilder(INSTRUMENTATION_NAME) { - - internal fun build(): KtorClientTracing = KtorClientTracing( - instrumenter = clientBuilder.build(), - propagators = getOpenTelemetry().propagators, - ) -} diff --git a/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorServerTracingBuilder.kt b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorServerTracingBuilder.kt deleted file mode 100644 index e77e5487c866..000000000000 --- a/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorServerTracingBuilder.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v3_0.server - -import io.ktor.server.application.* -import io.ktor.server.routing.* -import io.opentelemetry.context.Context -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource -import io.opentelemetry.instrumentation.ktor.v2_0.common.internal.KtorServerTracingUtil -import io.opentelemetry.instrumentation.ktor.v2_0.common.server.AbstractKtorServerTracingBuilder -import io.opentelemetry.instrumentation.ktor.v3_0.InstrumentationProperties.INSTRUMENTATION_NAME - -@Deprecated("Use KtorServerTelemetryBuilder instead", ReplaceWith("KtorServerTelemetryBuilder")) -class KtorServerTracingBuilder internal constructor( - instrumentationName: String -) : AbstractKtorServerTracingBuilder(instrumentationName) - -val KtorServerTracing = createRouteScopedPlugin("OpenTelemetry", { KtorServerTracingBuilder(INSTRUMENTATION_NAME) }) { - require(pluginConfig.isOpenTelemetryInitialized()) { "OpenTelemetry must be set" } - - KtorServerTracingUtil.configureTracing(pluginConfig, application) - - application.monitor.subscribe(RoutingRoot.RoutingCallStarted) { call -> - HttpServerRoute.update(Context.current(), HttpServerRouteSource.SERVER, { _, arg -> arg.route.parent.toString() }, call) - } -} diff --git a/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/KtorHttpClientOldTest.kt b/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/KtorHttpClientOldTest.kt deleted file mode 100644 index 89b0d57bae03..000000000000 --- a/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/KtorHttpClientOldTest.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v3_0 - -import io.ktor.client.* -import io.opentelemetry.instrumentation.ktor.v3_0.client.KtorClientTracing -import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension -import org.junit.jupiter.api.extension.RegisterExtension - -class KtorHttpClientOldTest : AbstractKtorHttpClientTest() { - - companion object { - @JvmStatic - @RegisterExtension - private val TESTING = HttpClientInstrumentationExtension.forLibrary() - } - - override fun HttpClientConfig<*>.installTracing() { - install(KtorClientTracing) { - setOpenTelemetry(TESTING.openTelemetry) - capturedRequestHeaders(TEST_REQUEST_HEADER) - capturedResponseHeaders(TEST_RESPONSE_HEADER) - } - } -} diff --git a/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/KtorHttpServerOldTest.kt b/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/KtorHttpServerOldTest.kt deleted file mode 100644 index 023175df606b..000000000000 --- a/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/KtorHttpServerOldTest.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v3_0 - -import io.ktor.server.application.* -import io.opentelemetry.instrumentation.ktor.v3_0.server.KtorServerTracing -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension -import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension -import org.junit.jupiter.api.extension.RegisterExtension - -class KtorHttpServerOldTest : AbstractKtorHttpServerTest() { - - companion object { - @JvmStatic - @RegisterExtension - val TESTING: InstrumentationExtension = HttpServerInstrumentationExtension.forLibrary() - } - - override fun getTesting(): InstrumentationExtension = TESTING - - override fun installOpenTelemetry(application: Application) { - application.apply { - install(KtorServerTracing) { - setOpenTelemetry(TESTING.openTelemetry) - capturedRequestHeaders(TEST_REQUEST_HEADER) - capturedResponseHeaders(TEST_RESPONSE_HEADER) - } - } - } -} diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackTelemetry.java b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackTelemetry.java deleted file mode 100644 index f3ff0a4d82c0..000000000000 --- a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackTelemetry.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ratpack.v1_7; - -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryExecInitializer; -import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryExecInterceptor; -import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryHttpClient; -import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryServerHandler; -import ratpack.exec.ExecInitializer; -import ratpack.exec.ExecInterceptor; -import ratpack.handling.HandlerDecorator; -import ratpack.http.Request; -import ratpack.http.Response; -import ratpack.http.client.HttpClient; -import ratpack.http.client.HttpResponse; -import ratpack.http.client.RequestSpec; -import ratpack.registry.RegistrySpec; - -/** - * Entrypoint for instrumenting Ratpack server and http client. - * - *

To apply OpenTelemetry instrumentation to a server, configure the {@link RegistrySpec} using - * {@link #configureServerRegistry(RegistrySpec)}. - * - *

{@code
- * RatpackTelemetry telemetry = RatpackTelemetry.create(OpenTelemetrySdk.builder()
- *   ...
- *   .build());
- * RatpackServer.start(server -> {
- *   server.registryOf(telemetry::configureServerRegistry);
- *   server.handlers(chain -> ...);
- * });
- * }
- * - *

To apply OpenTelemetry instrumentation to a http client, wrap the {@link HttpClient} using - * {@link #instrumentHttpClient(HttpClient)}. - * - *

{@code
- * RatpackTelemetry telemetry = RatpackTelemetry.create(OpenTelemetrySdk.builder()
- *   ...
- *   .build());
- * HttpClient instrumentedHttpClient = telemetry.instrumentHttpClient(httpClient);
- * }
- * - * @deprecated Use {@link RatpackClientTelemetry} and {@link RatpackServerTelemetry} instead. - */ -@Deprecated -public final class RatpackTelemetry { - - /** - * Returns a new {@link RatpackTelemetry} configured with the given {@link OpenTelemetry}. - * - * @deprecated Use {@link RatpackClientTelemetry#create(OpenTelemetry)} and {@link - * RatpackServerTelemetry#create(OpenTelemetry)} instead. - */ - @Deprecated - public static RatpackTelemetry create(OpenTelemetry openTelemetry) { - return builder(openTelemetry).build(); - } - - /** - * Returns a new {@link RatpackTelemetryBuilder} configured with the given {@link OpenTelemetry}. - * - * @deprecated Use {@link RatpackClientTelemetry#builder(OpenTelemetry)} and {@link - * RatpackServerTelemetry#builder(OpenTelemetry)} instead. - */ - @Deprecated - public static RatpackTelemetryBuilder builder(OpenTelemetry openTelemetry) { - return new RatpackTelemetryBuilder(openTelemetry); - } - - private final OpenTelemetryServerHandler serverHandler; - private final OpenTelemetryHttpClient httpClientInstrumenter; - - RatpackTelemetry( - Instrumenter serverInstrumenter, - Instrumenter clientInstrumenter) { - serverHandler = new OpenTelemetryServerHandler(serverInstrumenter); - httpClientInstrumenter = new OpenTelemetryHttpClient(clientInstrumenter); - } - - /** - * Returns instance of {@link OpenTelemetryServerHandler} to support Ratpack Registry binding. - * - * @deprecated Use {@link RatpackServerTelemetry#getHandler()} instead. - */ - @Deprecated - public OpenTelemetryServerHandler getOpenTelemetryServerHandler() { - return serverHandler; - } - - /** - * Returns instance of {@link ExecInterceptor} to support Ratpack Registry binding. - * - * @deprecated Use {@link RatpackServerTelemetry#getExecInterceptor()} instead. - */ - @Deprecated - public ExecInterceptor getOpenTelemetryExecInterceptor() { - return OpenTelemetryExecInterceptor.INSTANCE; - } - - /** - * Returns instance of {@link ExecInitializer} to support Ratpack Registry binding. - * - * @deprecated Use {@link RatpackServerTelemetry#getExecInitializer()} instead. - */ - @Deprecated - public ExecInitializer getOpenTelemetryExecInitializer() { - return OpenTelemetryExecInitializer.INSTANCE; - } - - /** - * Configures the {@link RegistrySpec} with OpenTelemetry. - * - * @deprecated Use {@link RatpackServerTelemetry#configureRegistry(RegistrySpec)} instead. - */ - @Deprecated - public void configureServerRegistry(RegistrySpec registry) { - registry.add(HandlerDecorator.prepend(serverHandler)); - registry.add(OpenTelemetryExecInterceptor.INSTANCE); - registry.add(OpenTelemetryExecInitializer.INSTANCE); - } - - /** - * Returns instrumented instance of {@link HttpClient} with OpenTelemetry. - * - * @deprecated Use {@link RatpackClientTelemetry#instrument(HttpClient)} instead. - */ - @Deprecated - public HttpClient instrumentHttpClient(HttpClient httpClient) throws Exception { - return httpClientInstrumenter.instrument(httpClient); - } -} diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackTelemetryBuilder.java b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackTelemetryBuilder.java deleted file mode 100644 index 8239fbeeed33..000000000000 --- a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackTelemetryBuilder.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ratpack.v1_7; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.ratpack.v1_7.internal.Experimental; -import io.opentelemetry.instrumentation.ratpack.v1_7.internal.RatpackClientInstrumenterBuilderFactory; -import io.opentelemetry.instrumentation.ratpack.v1_7.internal.RatpackServerInstrumenterBuilderFactory; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.function.Function; -import ratpack.http.Request; -import ratpack.http.Response; -import ratpack.http.client.HttpResponse; -import ratpack.http.client.RequestSpec; - -/** - * A builder for {@link RatpackTelemetry}. - * - * @deprecated Use {@link RatpackClientTelemetryBuilder} and {@link RatpackServerTelemetryBuilder} - * instead. - */ -@Deprecated -public final class RatpackTelemetryBuilder { - - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.ratpack-1.7"; - - private final DefaultHttpClientInstrumenterBuilder clientBuilder; - private final DefaultHttpServerInstrumenterBuilder serverBuilder; - - RatpackTelemetryBuilder(OpenTelemetry openTelemetry) { - clientBuilder = - RatpackClientInstrumenterBuilderFactory.create(INSTRUMENTATION_NAME, openTelemetry); - serverBuilder = - RatpackServerInstrumenterBuilderFactory.create(INSTRUMENTATION_NAME, openTelemetry); - } - - /** - * Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented - * items. The {@link AttributesExtractor} will be executed after all default extractors. - * - * @deprecated Use {@link - * RatpackServerTelemetryBuilder#addAttributesExtractor(AttributesExtractor)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public RatpackTelemetryBuilder addAttributeExtractor( - AttributesExtractor attributesExtractor) { - serverBuilder.addAttributesExtractor(attributesExtractor); - return this; - } - - /** - * @deprecated Use {@link - * RatpackClientTelemetryBuilder#addAttributesExtractor(AttributesExtractor)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public RatpackTelemetryBuilder addClientAttributeExtractor( - AttributesExtractor attributesExtractor) { - clientBuilder.addAttributesExtractor(attributesExtractor); - return this; - } - - /** - * Configures the HTTP server request headers that will be captured as span attributes. - * - * @param requestHeaders A list of HTTP header names. - * @deprecated Use {@link RatpackServerTelemetryBuilder#setCapturedRequestHeaders(Collection)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public RatpackTelemetryBuilder setCapturedServerRequestHeaders(List requestHeaders) { - serverBuilder.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. - * @deprecated Use {@link RatpackServerTelemetryBuilder#setCapturedResponseHeaders(Collection)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public RatpackTelemetryBuilder setCapturedServerResponseHeaders(List responseHeaders) { - serverBuilder.setCapturedResponseHeaders(responseHeaders); - return this; - } - - /** - * Configures the HTTP client request headers that will be captured as span attributes. - * - * @param requestHeaders A list of HTTP header names. - * @deprecated Use {@link RatpackClientTelemetryBuilder#setCapturedRequestHeaders(Collection)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public RatpackTelemetryBuilder setCapturedClientRequestHeaders(List requestHeaders) { - clientBuilder.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. - * @deprecated Use {@link RatpackClientTelemetryBuilder#setCapturedResponseHeaders(Collection)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public RatpackTelemetryBuilder setCapturedClientResponseHeaders(List responseHeaders) { - clientBuilder.setCapturedResponseHeaders(responseHeaders); - return this; - } - - /** - * Configures the instrumentation to recognize an alternative set of HTTP request methods. - * - *

By default, this instrumentation defines "known" methods as the ones listed in RFC9110 and the PATCH - * method defined in RFC5789. - * - *

Note: calling this method overrides the default known method sets completely; it does - * not supplement it. - * - * @param knownMethods A set of recognized HTTP request methods. - * @see HttpClientAttributesExtractorBuilder#setKnownMethods(Collection) - * @see HttpServerAttributesExtractorBuilder#setKnownMethods(Collection) - * @deprecated Use {@link RatpackServerTelemetryBuilder#setKnownMethods(Collection)} and {@link - * RatpackClientTelemetryBuilder#setKnownMethods(Collection)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public RatpackTelemetryBuilder setKnownMethods(Set knownMethods) { - clientBuilder.setKnownMethods(knownMethods); - serverBuilder.setKnownMethods(knownMethods); - return this; - } - - /** - * Configures the instrumentation to emit experimental HTTP client metrics. - * - * @param emitExperimentalHttpClientMetrics {@code true} if the experimental HTTP client metrics - * are to be emitted. - * @deprecated Use {@link Experimental#setEmitExperimentalTelemetry(RatpackClientTelemetryBuilder, - * boolean)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public RatpackTelemetryBuilder setEmitExperimentalHttpClientMetrics( - boolean emitExperimentalHttpClientMetrics) { - clientBuilder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics); - return this; - } - - /** - * Configures the instrumentation to emit experimental HTTP server metrics. - * - * @param emitExperimentalHttpServerMetrics {@code true} if the experimental HTTP server metrics - * are to be emitted. - * @deprecated Use {@link Experimental#setEmitExperimentalTelemetry(RatpackServerTelemetryBuilder, - * boolean)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public RatpackTelemetryBuilder setEmitExperimentalHttpServerMetrics( - boolean emitExperimentalHttpServerMetrics) { - serverBuilder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerMetrics); - return this; - } - - /** - * Sets custom client {@link SpanNameExtractor} via transform function. - * - * @deprecated Use {@link RatpackClientTelemetryBuilder#setSpanNameExtractor(Function)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public RatpackTelemetryBuilder setClientSpanNameExtractor( - Function< - SpanNameExtractor, - ? extends SpanNameExtractor> - clientSpanNameExtractor) { - clientBuilder.setSpanNameExtractor(clientSpanNameExtractor); - return this; - } - - /** - * Sets custom server {@link SpanNameExtractor} via transform function. - * - * @deprecated Use {@link RatpackServerTelemetryBuilder#setSpanNameExtractor(Function)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public RatpackTelemetryBuilder setServerSpanNameExtractor( - Function, ? extends SpanNameExtractor> - serverSpanNameExtractor) { - serverBuilder.setSpanNameExtractor(serverSpanNameExtractor); - return this; - } - - /** - * Returns a new {@link RatpackTelemetry} with the configuration of this builder. - * - * @deprecated Use {@link RatpackClientTelemetryBuilder#build()} and {@link - * RatpackServerTelemetryBuilder#build()} instead. - */ - @Deprecated - public RatpackTelemetry build() { - return new RatpackTelemetry(serverBuilder.build(), clientBuilder.build()); - } -} diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/test/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackHttpClientOldTest.java b/instrumentation/ratpack/ratpack-1.7/library/src/test/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackHttpClientOldTest.java deleted file mode 100644 index dff44ee98fb8..000000000000 --- a/instrumentation/ratpack/ratpack-1.7/library/src/test/java/io/opentelemetry/instrumentation/ratpack/v1_7/RatpackHttpClientOldTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ratpack.v1_7; - -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; -import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; -import java.util.Collections; -import org.junit.jupiter.api.extension.RegisterExtension; -import ratpack.func.Action; -import ratpack.http.client.HttpClient; -import ratpack.http.client.HttpClientSpec; - -@SuppressWarnings("deprecation") // testing deprecated API -class RatpackHttpClientOldTest extends AbstractRatpackHttpClientTest { - - @RegisterExtension - static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forLibrary(); - - @Override - protected HttpClient buildHttpClient() throws Exception { - return RatpackTelemetry.builder(testing.getOpenTelemetry()) - .setCapturedClientRequestHeaders( - Collections.singletonList(AbstractHttpClientTest.TEST_REQUEST_HEADER)) - .setCapturedClientResponseHeaders( - Collections.singletonList(AbstractHttpClientTest.TEST_RESPONSE_HEADER)) - .build() - .instrumentHttpClient(HttpClient.of(Action.noop())); - } - - @Override - protected HttpClient buildHttpClient(Action action) throws Exception { - return RatpackClientTelemetry.create(testing.getOpenTelemetry()) - .instrument(HttpClient.of(action)); - } -} diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/test/java/io/opentelemetry/instrumentation/ratpack/v1_7/server/RatpackHttpServerOldTest.java b/instrumentation/ratpack/ratpack-1.7/library/src/test/java/io/opentelemetry/instrumentation/ratpack/v1_7/server/RatpackHttpServerOldTest.java deleted file mode 100644 index 3fda1eaa1efb..000000000000 --- a/instrumentation/ratpack/ratpack-1.7/library/src/test/java/io/opentelemetry/instrumentation/ratpack/v1_7/server/RatpackHttpServerOldTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ratpack.v1_7.server; - -import static java.util.Collections.singletonList; - -import io.opentelemetry.instrumentation.ratpack.server.AbstractRatpackHttpServerTest; -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; -import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; -import org.junit.jupiter.api.extension.RegisterExtension; -import ratpack.server.RatpackServerSpec; - -@SuppressWarnings("deprecation") // testing deprecated API -class RatpackHttpServerOldTest extends AbstractRatpackHttpServerTest { - - @RegisterExtension - public static final InstrumentationExtension testing = - HttpServerInstrumentationExtension.forLibrary(); - - @Override - protected void configure(RatpackServerSpec serverSpec) throws Exception { - io.opentelemetry.instrumentation.ratpack.v1_7.RatpackTelemetry telemetry = - io.opentelemetry.instrumentation.ratpack.v1_7.RatpackTelemetry.builder( - testing.getOpenTelemetry()) - .setCapturedServerRequestHeaders( - singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER)) - .setCapturedServerResponseHeaders( - singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER)) - .build(); - serverSpec.registryOf(telemetry::configureServerRegistry); - } - - @Override - protected void configure(HttpServerTestOptions options) { - super.configure(options); - - options.setHasHandlerSpan(endpoint -> false); - } -} diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/README.md b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/README.md index c02da7e3382a..86d1c6970147 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/README.md +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/README.md @@ -56,7 +56,8 @@ an outgoing HTTP request is cancelled. Here is how to set up client and server instrumentation respectively: ```java -import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxTelemetry; +import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxClientTelemetry; +import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxServerTelemetry; @Configuration public class WebClientConfig { diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxServerTelemetryBuilder.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxServerTelemetryBuilder.java index bf584bf20ce5..5e51ef4474d5 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxServerTelemetryBuilder.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxServerTelemetryBuilder.java @@ -106,7 +106,7 @@ public SpringWebfluxServerTelemetryBuilder setSpanNameExtractor( } /** - * Returns a new {@link SpringWebfluxTelemetry} with the settings of this {@link + * Returns a new {@link SpringWebfluxServerTelemetry} with the settings of this {@link * SpringWebfluxServerTelemetryBuilder}. */ public SpringWebfluxServerTelemetry build() { diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetry.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetry.java deleted file mode 100644 index eb534f4962c8..000000000000 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetry.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.spring.webflux.v5_3; - -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.context.propagation.ContextPropagators; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.reactor.v3_1.ContextPropagationOperator; -import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.WebClientTracingFilter; -import java.util.List; -import org.springframework.web.reactive.function.client.ClientRequest; -import org.springframework.web.reactive.function.client.ClientResponse; -import org.springframework.web.reactive.function.client.ExchangeFilterFunction; -import org.springframework.web.server.ServerWebExchange; -import org.springframework.web.server.WebFilter; - -/** - * Entrypoint for instrumenting Spring Webflux HTTP clients and services. - * - * @deprecated Use {@link SpringWebfluxClientTelemetry} and {@link SpringWebfluxServerTelemetry} - * instead. - */ -@Deprecated -public final class SpringWebfluxTelemetry { - - /** - * Returns a new {@link SpringWebfluxTelemetry} configured with the given {@link OpenTelemetry}. - * - * @deprecated Use {@link SpringWebfluxClientTelemetry#create(OpenTelemetry)} and {@link - * SpringWebfluxServerTelemetry#create(OpenTelemetry)} instead. - */ - @Deprecated - public static SpringWebfluxTelemetry create(OpenTelemetry openTelemetry) { - return builder(openTelemetry).build(); - } - - /** - * Returns a new {@link SpringWebfluxTelemetryBuilder} configured with the given {@link - * OpenTelemetry}. - * - * @deprecated Use {@link SpringWebfluxClientTelemetry#builder(OpenTelemetry)} and {@link - * SpringWebfluxServerTelemetry#builder(OpenTelemetry)} instead. - */ - @Deprecated - public static SpringWebfluxTelemetryBuilder builder(OpenTelemetry openTelemetry) { - return new SpringWebfluxTelemetryBuilder(openTelemetry); - } - - // We use ServerWebExchange (which holds both the request and response) - // because we need it to get the HTTP route while instrumenting. - private final Instrumenter serverInstrumenter; - private final Instrumenter clientInstrumenter; - private final ContextPropagators propagators; - - SpringWebfluxTelemetry( - Instrumenter clientInstrumenter, - Instrumenter serverInstrumenter, - ContextPropagators propagators) { - this.clientInstrumenter = clientInstrumenter; - this.serverInstrumenter = serverInstrumenter; - this.propagators = propagators; - } - - /** - * @deprecated Use {@link SpringWebfluxClientTelemetry#addFilter(List)} instead. - */ - @Deprecated - public void addClientTracingFilter(List exchangeFilterFunctions) { - for (ExchangeFilterFunction filterFunction : exchangeFilterFunctions) { - if (filterFunction instanceof WebClientTracingFilter) { - return; - } - } - exchangeFilterFunctions.add(new WebClientTracingFilter(clientInstrumenter, propagators)); - } - - /** - * @deprecated Use {@link SpringWebfluxServerTelemetry#createWebFilter()} instead. - */ - @Deprecated - public WebFilter createWebFilter() { - return new TelemetryProducingWebFilter(serverInstrumenter); - } - - /** - * @deprecated Use {@link SpringWebfluxServerTelemetry#createWebFilterAndRegisterReactorHook()} - * instead. - */ - @Deprecated - public WebFilter createWebFilterAndRegisterReactorHook() { - registerReactorHook(); - return this.createWebFilter(); - } - - private static void registerReactorHook() { - ContextPropagationOperator.builder().build().registerOnEachOperator(); - } -} diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetryBuilder.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetryBuilder.java deleted file mode 100644 index 3fa01131678c..000000000000 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetryBuilder.java +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.spring.webflux.v5_3; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder; -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.Experimental; -import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.WebClientHttpAttributesGetter; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.function.Function; -import org.springframework.web.reactive.function.client.ClientRequest; -import org.springframework.web.reactive.function.client.ClientResponse; -import org.springframework.web.server.ServerWebExchange; - -/** - * A builder of {@link SpringWebfluxTelemetry}. - * - * @deprecated Use {@link SpringWebfluxClientTelemetryBuilder} and {@link - * SpringWebfluxServerTelemetryBuilder} instead. - */ -@Deprecated -public final class SpringWebfluxTelemetryBuilder { - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-webflux-5.3"; - - private final DefaultHttpClientInstrumenterBuilder clientBuilder; - private final DefaultHttpServerInstrumenterBuilder - serverBuilder; - private final OpenTelemetry openTelemetry; - - SpringWebfluxTelemetryBuilder(OpenTelemetry openTelemetry) { - clientBuilder = - DefaultHttpClientInstrumenterBuilder.create( - INSTRUMENTATION_NAME, openTelemetry, WebClientHttpAttributesGetter.INSTANCE); - serverBuilder = - DefaultHttpServerInstrumenterBuilder.create( - INSTRUMENTATION_NAME, - openTelemetry, - WebfluxServerHttpAttributesGetter.INSTANCE, - WebfluxTextMapGetter.INSTANCE); - this.openTelemetry = openTelemetry; - } - - /** - * Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented - * items for WebClient. - * - * @deprecated Use {@link - * SpringWebfluxClientTelemetryBuilder#addAttributesExtractor(AttributesExtractor)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public SpringWebfluxTelemetryBuilder addClientAttributesExtractor( - AttributesExtractor attributesExtractor) { - clientBuilder.addAttributesExtractor(attributesExtractor); - return this; - } - - /** - * Configures the HTTP WebClient request headers that will be captured as span attributes. - * - * @param requestHeaders A list of HTTP header names. - * @deprecated Use {@link - * SpringWebfluxClientTelemetryBuilder#setCapturedRequestHeaders(Collection)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public SpringWebfluxTelemetryBuilder setCapturedClientRequestHeaders( - List requestHeaders) { - clientBuilder.setCapturedRequestHeaders(requestHeaders); - return this; - } - - /** - * Configures the HTTP WebClient response headers that will be captured as span attributes. - * - * @param responseHeaders A list of HTTP header names. - * @deprecated Use {@link - * SpringWebfluxClientTelemetryBuilder#setCapturedResponseHeaders(Collection)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public SpringWebfluxTelemetryBuilder setCapturedClientResponseHeaders( - List responseHeaders) { - clientBuilder.setCapturedResponseHeaders(responseHeaders); - return this; - } - - /** - * Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented - * items. - * - * @deprecated Use {@link - * SpringWebfluxServerTelemetryBuilder#addAttributesExtractor(AttributesExtractor)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public SpringWebfluxTelemetryBuilder addServerAttributesExtractor( - AttributesExtractor attributesExtractor) { - serverBuilder.addAttributesExtractor(attributesExtractor); - return this; - } - - /** - * Configures the HTTP request headers that will be captured as span attributes from server - * instrumentation. - * - * @param requestHeaders A list of HTTP header names. - * @deprecated Use {@link - * SpringWebfluxServerTelemetryBuilder#setCapturedRequestHeaders(Collection)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public SpringWebfluxTelemetryBuilder setCapturedServerRequestHeaders( - List requestHeaders) { - serverBuilder.setCapturedRequestHeaders(requestHeaders); - return this; - } - - /** - * Configures the HTTP response headers that will be captured as span attributes from server - * instrumentation. - * - * @param responseHeaders A list of HTTP header names. - * @deprecated Use {@link - * SpringWebfluxServerTelemetryBuilder#setCapturedResponseHeaders(Collection)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public SpringWebfluxTelemetryBuilder setCapturedServerResponseHeaders( - List responseHeaders) { - serverBuilder.setCapturedResponseHeaders(responseHeaders); - return this; - } - - /** - * Configures the instrumentation to recognize an alternative set of HTTP request methods. - * - *

By default, this instrumentation defines "known" methods as the ones listed in RFC9110 and the PATCH - * method defined in RFC5789. - * - *

Note: calling this method overrides the default known method sets completely; it does - * not supplement it. - * - * @param knownMethods A set of recognized HTTP request methods. - * @see HttpClientAttributesExtractorBuilder#setKnownMethods(Collection) - * @see HttpServerAttributesExtractorBuilder#setKnownMethods(Collection) - * @deprecated Use {@link SpringWebfluxClientTelemetryBuilder#setKnownMethods(Collection)} and - * {@link SpringWebfluxServerTelemetryBuilder#setKnownMethods(Collection)} instead. - */ - @Deprecated - @CanIgnoreReturnValue - public SpringWebfluxTelemetryBuilder setKnownMethods(Set knownMethods) { - clientBuilder.setKnownMethods(knownMethods); - serverBuilder.setKnownMethods(knownMethods); - return this; - } - - /** - * Configures the instrumentation to emit experimental HTTP client metrics. - * - * @param emitExperimentalHttpClientTelemetry {@code true} if the experimental HTTP client metrics - * are to be emitted. - * @deprecated Use {@link - * Experimental#setEmitExperimentalTelemetry(SpringWebfluxClientTelemetryBuilder, boolean)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public SpringWebfluxTelemetryBuilder setEmitExperimentalHttpClientTelemetry( - boolean emitExperimentalHttpClientTelemetry) { - clientBuilder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientTelemetry); - return this; - } - - /** - * Configures the instrumentation to emit experimental HTTP server metrics. - * - * @param emitExperimentalHttpServerTelemetry {@code true} if the experimental HTTP server metrics - * are to be emitted. - * @deprecated Use {@link - * Experimental#setEmitExperimentalTelemetry(SpringWebfluxServerTelemetryBuilder, boolean)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public SpringWebfluxTelemetryBuilder setEmitExperimentalHttpServerTelemetry( - boolean emitExperimentalHttpServerTelemetry) { - serverBuilder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerTelemetry); - return this; - } - - /** - * Sets custom client {@link SpanNameExtractor} via transform function. - * - * @deprecated Use {@link SpringWebfluxClientTelemetryBuilder#setSpanNameExtractor(Function)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public SpringWebfluxTelemetryBuilder setClientSpanNameExtractor( - Function< - SpanNameExtractor, - ? extends SpanNameExtractor> - clientSpanNameExtractor) { - clientBuilder.setSpanNameExtractor(clientSpanNameExtractor); - return this; - } - - /** - * Sets custom server {@link SpanNameExtractor} via transform function. - * - * @deprecated Use {@link SpringWebfluxServerTelemetryBuilder#setSpanNameExtractor(Function)} - * instead. - */ - @Deprecated - @CanIgnoreReturnValue - public SpringWebfluxTelemetryBuilder setServerSpanNameExtractor( - Function< - SpanNameExtractor, - ? extends SpanNameExtractor> - serverSpanNameExtractor) { - serverBuilder.setSpanNameExtractor(serverSpanNameExtractor); - return this; - } - - /** - * Returns a new {@link SpringWebfluxTelemetry} with the settings of this {@link - * SpringWebfluxTelemetryBuilder}. - * - * @deprecated Use {@link SpringWebfluxClientTelemetryBuilder#build()} and {@link - * SpringWebfluxServerTelemetryBuilder#build()} instead. - */ - @Deprecated - public SpringWebfluxTelemetry build() { - return new SpringWebfluxTelemetry( - clientBuilder.build(), serverBuilder.build(), openTelemetry.getPropagators()); - } -} diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/test/java/io/opentelemetry/instrumentation/spring/webflux/old/v5_3/SpringWebfluxClientInstrumentationOldTest.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/test/java/io/opentelemetry/instrumentation/spring/webflux/old/v5_3/SpringWebfluxClientInstrumentationOldTest.java deleted file mode 100644 index 3b346b42176d..000000000000 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/test/java/io/opentelemetry/instrumentation/spring/webflux/old/v5_3/SpringWebfluxClientInstrumentationOldTest.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.spring.webflux.old.v5_3; - -import io.opentelemetry.instrumentation.spring.webflux.client.AbstractSpringWebfluxClientInstrumentationTest; -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; -import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; -import java.util.Collections; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.springframework.web.reactive.function.client.WebClient; - -@SuppressWarnings("deprecation") // testing deprecated API -class SpringWebfluxClientInstrumentationOldTest - extends AbstractSpringWebfluxClientInstrumentationTest { - - @RegisterExtension - static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forLibrary(); - - @Override - protected WebClient.Builder instrument(WebClient.Builder builder) { - io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxTelemetry instrumentation = - io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxTelemetry.builder( - testing.getOpenTelemetry()) - .setCapturedClientRequestHeaders( - Collections.singletonList(AbstractHttpClientTest.TEST_REQUEST_HEADER)) - .setCapturedClientResponseHeaders( - Collections.singletonList(AbstractHttpClientTest.TEST_RESPONSE_HEADER)) - .build(); - return builder.filters(instrumentation::addClientTracingFilter); - } -} diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/test/java/io/opentelemetry/instrumentation/spring/webflux/old/v5_3/SpringWebfluxServerInstrumentationOldTest.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/test/java/io/opentelemetry/instrumentation/spring/webflux/old/v5_3/SpringWebfluxServerInstrumentationOldTest.java deleted file mode 100644 index c5fb0b745e83..000000000000 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/test/java/io/opentelemetry/instrumentation/spring/webflux/old/v5_3/SpringWebfluxServerInstrumentationOldTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.spring.webflux.old.v5_3; - -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; -import static org.assertj.core.api.Assertions.assertThat; - -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; -import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; -import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; -import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpRequest; -import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.springframework.context.ConfigurableApplicationContext; - -@SuppressWarnings("deprecation") // testing deprecated API -public final class SpringWebfluxServerInstrumentationOldTest - extends AbstractHttpServerTest { - - private static final String CONTEXT_PATH = "/test"; - - @RegisterExtension - static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forLibrary(); - - @Override - protected ConfigurableApplicationContext setupServer() { - return TestWebfluxSpringBootOldApp.start(port, CONTEXT_PATH); - } - - @Override - public void stopServer(ConfigurableApplicationContext applicationContext) { - applicationContext.close(); - } - - @Override - protected void configure(HttpServerTestOptions options) { - options.setContextPath(CONTEXT_PATH); - options.setTestPathParam(true); - options.setExpectedException(new RuntimeException(ServerEndpoint.EXCEPTION.getBody())); - - options.setExpectedHttpRoute( - (endpoint, method) -> { - if (endpoint == ServerEndpoint.PATH_PARAM) { - return CONTEXT_PATH + "/path/{id}/param"; - } - return expectedHttpRoute(endpoint, method); - }); - - options.disableTestNonStandardHttpMethod(); - } - - @Test - void noMono() { - ServerEndpoint endpoint = new ServerEndpoint("NO_MONO", "no-mono", 200, "success"); - String method = "GET"; - AggregatedHttpRequest request = request(endpoint, method); - AggregatedHttpResponse response = client.execute(request).aggregate().join(); - - assertThat(response.status().code()).isEqualTo(SUCCESS.getStatus()); - assertThat(response.contentUtf8()).isEqualTo(SUCCESS.getBody()); - - assertTheTraces(1, null, null, null, method, endpoint); - } -} diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/test/java/io/opentelemetry/instrumentation/spring/webflux/old/v5_3/TestWebfluxSpringBootOldApp.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/test/java/io/opentelemetry/instrumentation/spring/webflux/old/v5_3/TestWebfluxSpringBootOldApp.java deleted file mode 100644 index df8031e6d17c..000000000000 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/test/java/io/opentelemetry/instrumentation/spring/webflux/old/v5_3/TestWebfluxSpringBootOldApp.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.spring.webflux.old.v5_3; - -import static io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest.controller; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.PATH_PARAM; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; -import static java.util.Collections.singletonList; - -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; -import java.net.URI; -import java.util.Properties; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.server.WebFilter; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -@Deprecated -@SpringBootApplication -class TestWebfluxSpringBootOldApp { - - static ConfigurableApplicationContext start(int port, String contextPath) { - Properties props = new Properties(); - props.put("server.port", port); - props.put("spring.webflux.base-path", contextPath); - - SpringApplication app = new SpringApplication(TestWebfluxSpringBootOldApp.class); - app.setDefaultProperties(props); - return app.run(); - } - - @Bean - WebFilter telemetryFilter() { - return io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxTelemetry.builder( - GlobalOpenTelemetry.get()) - .setCapturedServerRequestHeaders(singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER)) - .setCapturedServerResponseHeaders( - singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER)) - .build() - .createWebFilterAndRegisterReactorHook(); - } - - @Controller - static class TestController { - - @RequestMapping("/success") - @ResponseBody - Flux success() { - return Flux.defer(() -> Flux.just(controller(SUCCESS, SUCCESS::getBody))); - } - - @RequestMapping("/no-mono") - @ResponseBody - String noMono() { - return controller(SUCCESS, SUCCESS::getBody); - } - - @RequestMapping("/query") - @ResponseBody - Mono query_param(@RequestParam("some") String param) { - return Mono.just(controller(QUERY_PARAM, () -> "some=" + param)); - } - - @RequestMapping("/redirect") - @ResponseBody - Mono redirect(ServerHttpResponse response) { - response.setStatusCode(HttpStatus.FOUND); - response.getHeaders().setLocation(URI.create("/redirected")); - return controller(REDIRECT, response::setComplete); - } - - @RequestMapping("/error-status") - Mono> error() { - return Mono.just( - controller( - ERROR, - () -> new ResponseEntity<>(ERROR.getBody(), HttpStatus.valueOf(ERROR.getStatus())))); - } - - @RequestMapping("/exception") - Flux> exception() throws Exception { - return Flux.just( - controller( - EXCEPTION, - () -> { - throw new RuntimeException(EXCEPTION.getBody()); - })); - } - - @RequestMapping("/captureHeaders") - Mono> capture_headers( - @RequestHeader("X-Test-Request") String testRequestHeader) { - return Mono.just( - controller( - CAPTURE_HEADERS, - () -> - ResponseEntity.ok() - .header("X-Test-Response", testRequestHeader) - .body(CAPTURE_HEADERS.getBody()))); - } - - @RequestMapping("/path/{id}/param") - @ResponseBody - Mono path_param(@PathVariable("id") int id) { - return Mono.just(controller(PATH_PARAM, () -> String.valueOf(id))); - } - - @RequestMapping("/child") - @ResponseBody - Mono indexed_child(@RequestParam("id") String id) { - return Mono.just( - controller( - INDEXED_CHILD, - () -> { - INDEXED_CHILD.collectSpanAttributes(name -> name.equals("id") ? id : null); - return INDEXED_CHILD.getBody(); - })); - } - } -}