Refactor and rename `HttpClientResend` and `HttpRouteHolder` (#9280)
Co-authored-by: Trask Stalnaker <trask.stalnaker@gmail.com>
This commit is contained in:
parent
2ebf4134f9
commit
d7a34f90ba
|
|
@ -35,7 +35,7 @@ public final class HttpClientAttributesExtractorBuilder<REQUEST, RESPONSE> {
|
||||||
List<String> capturedRequestHeaders = emptyList();
|
List<String> capturedRequestHeaders = emptyList();
|
||||||
List<String> capturedResponseHeaders = emptyList();
|
List<String> capturedResponseHeaders = emptyList();
|
||||||
Set<String> knownMethods = HttpConstants.KNOWN_METHODS;
|
Set<String> knownMethods = HttpConstants.KNOWN_METHODS;
|
||||||
ToIntFunction<Context> resendCountIncrementer = HttpClientResend::getAndIncrement;
|
ToIntFunction<Context> resendCountIncrementer = HttpClientResendCount::getAndIncrement;
|
||||||
|
|
||||||
HttpClientAttributesExtractorBuilder(
|
HttpClientAttributesExtractorBuilder(
|
||||||
HttpClientAttributesGetter<REQUEST, RESPONSE> httpAttributesGetter,
|
HttpClientAttributesGetter<REQUEST, RESPONSE> httpAttributesGetter,
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,12 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
|
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
|
||||||
|
|
||||||
/** A helper that keeps track of the count of the HTTP request resend attempts. */
|
/** A helper that keeps track of the count of the HTTP request resend attempts. */
|
||||||
public final class HttpClientResend {
|
public final class HttpClientResendCount {
|
||||||
|
|
||||||
private static final ContextKey<HttpClientResend> KEY =
|
private static final ContextKey<HttpClientResendCount> KEY =
|
||||||
ContextKey.named("opentelemetry-http-client-resend-key");
|
ContextKey.named("opentelemetry-http-client-resend-key");
|
||||||
private static final AtomicIntegerFieldUpdater<HttpClientResend> resendsUpdater =
|
private static final AtomicIntegerFieldUpdater<HttpClientResendCount> resendsUpdater =
|
||||||
AtomicIntegerFieldUpdater.newUpdater(HttpClientResend.class, "resends");
|
AtomicIntegerFieldUpdater.newUpdater(HttpClientResendCount.class, "resends");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the HTTP request resend counter.
|
* Initializes the HTTP request resend counter.
|
||||||
|
|
@ -29,16 +29,20 @@ public final class HttpClientResend {
|
||||||
if (context.get(KEY) != null) {
|
if (context.get(KEY) != null) {
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
return context.with(KEY, new HttpClientResend());
|
return context.with(KEY, new HttpClientResendCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the count of the already made attempts to send an HTTP request; 0 if this is the first
|
||||||
|
* send attempt.
|
||||||
|
*/
|
||||||
public static int get(Context context) {
|
public static int get(Context context) {
|
||||||
HttpClientResend resend = context.get(KEY);
|
HttpClientResendCount resend = context.get(KEY);
|
||||||
return resend == null ? 0 : resend.resends;
|
return resend == null ? 0 : resend.resends;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int getAndIncrement(Context context) {
|
static int getAndIncrement(Context context) {
|
||||||
HttpClientResend resend = context.get(KEY);
|
HttpClientResendCount resend = context.get(KEY);
|
||||||
if (resend == null) {
|
if (resend == null) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -48,5 +52,5 @@ public final class HttpClientResend {
|
||||||
@SuppressWarnings("unused") // it actually is used by the resendsUpdater
|
@SuppressWarnings("unused") // it actually is used by the resendsUpdater
|
||||||
private volatile int resends = 0;
|
private volatile int resends = 0;
|
||||||
|
|
||||||
private HttpClientResend() {}
|
private HttpClientResendCount() {}
|
||||||
}
|
}
|
||||||
|
|
@ -5,17 +5,12 @@
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
/**
|
||||||
import javax.annotation.Nullable;
|
* An interface for getting the {@code http.route} attribute.
|
||||||
|
*
|
||||||
/** An interface for getting the {@code http.route} attribute. */
|
* @deprecated This class is deprecated and will be removed in the 2.0 release. Use {@link
|
||||||
|
* HttpServerRouteBiGetter} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface HttpRouteBiGetter<T, U> {
|
public interface HttpRouteBiGetter<T, U> extends HttpServerRouteBiGetter<T, U> {}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the {@code http.route} attribute extracted from {@code context}, {@code arg1} and
|
|
||||||
* {@code arg2}; or {@code null} if it was not found.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
String get(Context context, T arg1, U arg2);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -5,17 +5,12 @@
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
/**
|
||||||
import javax.annotation.Nullable;
|
* An interface for getting the {@code http.route} attribute.
|
||||||
|
*
|
||||||
/** An interface for getting the {@code http.route} attribute. */
|
* @deprecated This class is deprecated and will be removed in the 2.0 release. Use {@link
|
||||||
|
* HttpServerRouteGetter} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface HttpRouteGetter<T> {
|
public interface HttpRouteGetter<T> extends HttpServerRouteGetter<T> {}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the {@code http.route} attribute extracted from {@code context} and {@code arg}; or
|
|
||||||
* {@code null} if it was not found.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
String get(Context context, T arg);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,9 @@
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
||||||
|
|
||||||
import io.opentelemetry.api.trace.Span;
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer;
|
import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
|
|
||||||
import io.opentelemetry.instrumentation.api.internal.HttpRouteState;
|
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -22,7 +18,11 @@ import javax.annotation.Nullable;
|
||||||
* later, after the instrumented operation starts. This class provides several static methods that
|
* later, after the instrumented operation starts. This class provides several static methods that
|
||||||
* allow the instrumentation author to provide the matching HTTP route to the instrumentation when
|
* allow the instrumentation author to provide the matching HTTP route to the instrumentation when
|
||||||
* it is discovered.
|
* it is discovered.
|
||||||
|
*
|
||||||
|
* @deprecated This class is deprecated and will be removed in the 2.0 release. Use {@link
|
||||||
|
* HttpServerRoute} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public final class HttpRouteHolder {
|
public final class HttpRouteHolder {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -31,13 +31,7 @@ public final class HttpRouteHolder {
|
||||||
*/
|
*/
|
||||||
public static <REQUEST> ContextCustomizer<REQUEST> create(
|
public static <REQUEST> ContextCustomizer<REQUEST> create(
|
||||||
HttpServerAttributesGetter<REQUEST, ?> getter) {
|
HttpServerAttributesGetter<REQUEST, ?> getter) {
|
||||||
return (context, request, startAttributes) -> {
|
return HttpServerRoute.create(getter);
|
||||||
if (HttpRouteState.fromContextOrNull(context) != null) {
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
String method = getter.getHttpRequestMethod(request);
|
|
||||||
return context.with(HttpRouteState.create(method, null, 0));
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private HttpRouteHolder() {}
|
private HttpRouteHolder() {}
|
||||||
|
|
@ -57,7 +51,7 @@ public final class HttpRouteHolder {
|
||||||
*/
|
*/
|
||||||
public static void updateHttpRoute(
|
public static void updateHttpRoute(
|
||||||
Context context, HttpRouteSource source, @Nullable String httpRoute) {
|
Context context, HttpRouteSource source, @Nullable String httpRoute) {
|
||||||
updateHttpRoute(context, source, ConstantAdapter.INSTANCE, httpRoute);
|
HttpServerRoute.update(context, source.toHttpServerRouteSource(), httpRoute);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -75,7 +69,7 @@ public final class HttpRouteHolder {
|
||||||
*/
|
*/
|
||||||
public static <T> void updateHttpRoute(
|
public static <T> void updateHttpRoute(
|
||||||
Context context, HttpRouteSource source, HttpRouteGetter<T> httpRouteGetter, T arg1) {
|
Context context, HttpRouteSource source, HttpRouteGetter<T> httpRouteGetter, T arg1) {
|
||||||
updateHttpRoute(context, source, OneArgAdapter.getInstance(), arg1, httpRouteGetter);
|
HttpServerRoute.update(context, source.toHttpServerRouteSource(), httpRouteGetter, arg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -97,92 +91,6 @@ public final class HttpRouteHolder {
|
||||||
HttpRouteBiGetter<T, U> httpRouteGetter,
|
HttpRouteBiGetter<T, U> httpRouteGetter,
|
||||||
T arg1,
|
T arg1,
|
||||||
U arg2) {
|
U arg2) {
|
||||||
Span serverSpan = LocalRootSpan.fromContextOrNull(context);
|
HttpServerRoute.update(context, source.toHttpServerRouteSource(), httpRouteGetter, arg1, arg2);
|
||||||
// even if the server span is not sampled, we have to continue - we need to compute the
|
|
||||||
// http.route properly so that it can be captured by the server metrics
|
|
||||||
if (serverSpan == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
HttpRouteState httpRouteState = HttpRouteState.fromContextOrNull(context);
|
|
||||||
if (httpRouteState == null) {
|
|
||||||
// TODO: remove this branch?
|
|
||||||
String httpRoute = httpRouteGetter.get(context, arg1, arg2);
|
|
||||||
if (httpRoute != null && !httpRoute.isEmpty()) {
|
|
||||||
// update just the attribute - without http.method we can't compute a proper span name here
|
|
||||||
serverSpan.setAttribute(SemanticAttributes.HTTP_ROUTE, httpRoute);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// special case for servlet filters, even when we have a route from previous filter see whether
|
|
||||||
// the new route is better and if so use it instead
|
|
||||||
boolean onlyIfBetterRoute =
|
|
||||||
!source.useFirst && source.order == httpRouteState.getUpdatedBySourceOrder();
|
|
||||||
if (source.order > httpRouteState.getUpdatedBySourceOrder() || onlyIfBetterRoute) {
|
|
||||||
String route = httpRouteGetter.get(context, arg1, arg2);
|
|
||||||
if (route != null
|
|
||||||
&& !route.isEmpty()
|
|
||||||
&& (!onlyIfBetterRoute || isBetterRoute(httpRouteState, route))) {
|
|
||||||
|
|
||||||
// update just the span name - the attribute will be picked up by the
|
|
||||||
// HttpServerAttributesExtractor at the end of request processing
|
|
||||||
updateSpanName(serverSpan, httpRouteState, route);
|
|
||||||
|
|
||||||
httpRouteState.update(context, source.order, route);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is used when setting route from a servlet filter to pick the most descriptive (longest)
|
|
||||||
// route.
|
|
||||||
private static boolean isBetterRoute(HttpRouteState httpRouteState, String name) {
|
|
||||||
String route = httpRouteState.getRoute();
|
|
||||||
int routeLength = route == null ? 0 : route.length();
|
|
||||||
return name.length() > routeLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void updateSpanName(Span serverSpan, HttpRouteState httpRouteState, String route) {
|
|
||||||
String method = httpRouteState.getMethod();
|
|
||||||
// method should never really be null - but in case it for some reason is, we'll rely on the
|
|
||||||
// span name extractor behavior
|
|
||||||
if (method != null) {
|
|
||||||
serverSpan.updateName(method + " " + route);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the {@code http.route} attribute value that's stored in the {@code context}, or null if
|
|
||||||
* it was not set before.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
static String getRoute(Context context) {
|
|
||||||
HttpRouteState httpRouteState = HttpRouteState.fromContextOrNull(context);
|
|
||||||
return httpRouteState == null ? null : httpRouteState.getRoute();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class OneArgAdapter<T> implements HttpRouteBiGetter<T, HttpRouteGetter<T>> {
|
|
||||||
|
|
||||||
private static final OneArgAdapter<Object> INSTANCE = new OneArgAdapter<>();
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
static <T> OneArgAdapter<T> getInstance() {
|
|
||||||
return (OneArgAdapter<T>) INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Nullable
|
|
||||||
public String get(Context context, T arg, HttpRouteGetter<T> httpRouteGetter) {
|
|
||||||
return httpRouteGetter.get(context, arg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class ConstantAdapter implements HttpRouteGetter<String> {
|
|
||||||
|
|
||||||
private static final ConstantAdapter INSTANCE = new ConstantAdapter();
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public String get(Context context, String route) {
|
|
||||||
return route;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,13 @@
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
||||||
|
|
||||||
/** Represents the source that provided the {@code http.route} attribute. */
|
/**
|
||||||
|
* Represents the source that provided the {@code http.route} attribute.
|
||||||
|
*
|
||||||
|
* @deprecated This class is deprecated and will be removed in the 2.0 release. Use {@link
|
||||||
|
* HttpServerRouteSource} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public enum HttpRouteSource {
|
public enum HttpRouteSource {
|
||||||
// for servlet filters we try to find the best name which isn't necessarily from the first
|
// for servlet filters we try to find the best name which isn't necessarily from the first
|
||||||
// filter that is called
|
// filter that is called
|
||||||
|
|
@ -27,4 +33,18 @@ public enum HttpRouteSource {
|
||||||
this.order = order;
|
this.order = order;
|
||||||
this.useFirst = useFirst;
|
this.useFirst = useFirst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HttpServerRouteSource toHttpServerRouteSource() {
|
||||||
|
switch (this) {
|
||||||
|
case FILTER:
|
||||||
|
return HttpServerRouteSource.SERVER_FILTER;
|
||||||
|
case SERVLET:
|
||||||
|
return HttpServerRouteSource.SERVER;
|
||||||
|
case CONTROLLER:
|
||||||
|
return HttpServerRouteSource.CONTROLLER;
|
||||||
|
case NESTED_CONTROLLER:
|
||||||
|
return HttpServerRouteSource.NESTED_CONTROLLER;
|
||||||
|
}
|
||||||
|
throw new IllegalStateException("Unsupported value " + this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ public final class HttpServerAttributesExtractorBuilder<REQUEST, RESPONSE> {
|
||||||
List<String> capturedRequestHeaders = emptyList();
|
List<String> capturedRequestHeaders = emptyList();
|
||||||
List<String> capturedResponseHeaders = emptyList();
|
List<String> capturedResponseHeaders = emptyList();
|
||||||
Set<String> knownMethods = HttpConstants.KNOWN_METHODS;
|
Set<String> knownMethods = HttpConstants.KNOWN_METHODS;
|
||||||
Function<Context, String> httpRouteGetter = HttpRouteHolder::getRoute;
|
Function<Context, String> httpRouteGetter = HttpServerRoute::get;
|
||||||
|
|
||||||
HttpServerAttributesExtractorBuilder(
|
HttpServerAttributesExtractorBuilder(
|
||||||
HttpServerAttributesGetter<REQUEST, RESPONSE> httpAttributesGetter,
|
HttpServerAttributesGetter<REQUEST, RESPONSE> httpAttributesGetter,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,194 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
||||||
|
|
||||||
|
import io.opentelemetry.api.trace.Span;
|
||||||
|
import io.opentelemetry.context.Context;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
|
||||||
|
import io.opentelemetry.instrumentation.api.internal.HttpRouteState;
|
||||||
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper class that keeps track of the {@code http.route} attribute value during HTTP server
|
||||||
|
* request processing.
|
||||||
|
*
|
||||||
|
* <p>Usually the route is not accessible when the request processing starts; and needs to be set
|
||||||
|
* later, after the instrumented operation starts. This class provides several static methods that
|
||||||
|
* allow the instrumentation author to provide the matching HTTP route to the instrumentation when
|
||||||
|
* it is discovered.
|
||||||
|
*/
|
||||||
|
public final class HttpServerRoute {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a {@link ContextCustomizer} that initializes an {@link HttpServerRoute} in the {@link
|
||||||
|
* Context} returned from {@link Instrumenter#start(Context, Object)}.
|
||||||
|
*/
|
||||||
|
public static <REQUEST> ContextCustomizer<REQUEST> create(
|
||||||
|
HttpServerAttributesGetter<REQUEST, ?> getter) {
|
||||||
|
return (context, request, startAttributes) -> {
|
||||||
|
if (HttpRouteState.fromContextOrNull(context) != null) {
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
String method = getter.getHttpRequestMethod(request);
|
||||||
|
return context.with(HttpRouteState.create(method, null, 0));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private HttpServerRoute() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the {@code http.route} attribute in the received {@code context}.
|
||||||
|
*
|
||||||
|
* <p>If there is a server span in the context, and the context has been customized with a {@link
|
||||||
|
* HttpServerRoute}, then this method will update the route using the provided {@code httpRoute}
|
||||||
|
* if and only if the last {@link HttpServerRouteSource} to update the route using this method has
|
||||||
|
* strictly lower priority than the provided {@link HttpServerRouteSource}, and the passed value
|
||||||
|
* is non-null.
|
||||||
|
*
|
||||||
|
* <p>If there is a server span in the context, and the context has NOT been customized with a
|
||||||
|
* {@link HttpServerRoute}, then this method will update the route using the provided value if it
|
||||||
|
* is non-null.
|
||||||
|
*/
|
||||||
|
public static void update(
|
||||||
|
Context context, HttpServerRouteSource source, @Nullable String httpRoute) {
|
||||||
|
update(context, source, ConstantAdapter.INSTANCE, httpRoute);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the {@code http.route} attribute in the received {@code context}.
|
||||||
|
*
|
||||||
|
* <p>If there is a server span in the context, and the context has been customized with a {@link
|
||||||
|
* HttpServerRoute}, then this method will update the route using the provided {@link
|
||||||
|
* HttpServerRouteGetter} if and only if the last {@link HttpServerRouteSource} to update the
|
||||||
|
* route using this method has strictly lower priority than the provided {@link
|
||||||
|
* HttpServerRouteSource}, and the value returned from the {@link HttpServerRouteGetter} is
|
||||||
|
* non-null.
|
||||||
|
*
|
||||||
|
* <p>If there is a server span in the context, and the context has NOT been customized with a
|
||||||
|
* {@link HttpServerRoute}, then this method will update the route using the provided {@link
|
||||||
|
* HttpServerRouteGetter} if the value returned from it is non-null.
|
||||||
|
*/
|
||||||
|
public static <T> void update(
|
||||||
|
Context context,
|
||||||
|
HttpServerRouteSource source,
|
||||||
|
HttpServerRouteGetter<T> httpRouteGetter,
|
||||||
|
T arg1) {
|
||||||
|
update(context, source, OneArgAdapter.getInstance(), arg1, httpRouteGetter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the {@code http.route} attribute in the received {@code context}.
|
||||||
|
*
|
||||||
|
* <p>If there is a server span in the context, and the context has been customized with a {@link
|
||||||
|
* HttpServerRoute}, then this method will update the route using the provided {@link
|
||||||
|
* HttpServerRouteBiGetter} if and only if the last {@link HttpServerRouteSource} to update the
|
||||||
|
* route using this method has strictly lower priority than the provided {@link
|
||||||
|
* HttpServerRouteSource}, and the value returned from the {@link HttpServerRouteBiGetter} is
|
||||||
|
* non-null.
|
||||||
|
*
|
||||||
|
* <p>If there is a server span in the context, and the context has NOT been customized with a
|
||||||
|
* {@code ServerSpanName}, then this method will update the route using the provided {@link
|
||||||
|
* HttpServerRouteBiGetter} if the value returned from it is non-null.
|
||||||
|
*/
|
||||||
|
public static <T, U> void update(
|
||||||
|
Context context,
|
||||||
|
HttpServerRouteSource source,
|
||||||
|
HttpServerRouteBiGetter<T, U> httpRouteGetter,
|
||||||
|
T arg1,
|
||||||
|
U arg2) {
|
||||||
|
Span serverSpan = LocalRootSpan.fromContextOrNull(context);
|
||||||
|
// even if the server span is not sampled, we have to continue - we need to compute the
|
||||||
|
// http.route properly so that it can be captured by the server metrics
|
||||||
|
if (serverSpan == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
HttpRouteState httpRouteState = HttpRouteState.fromContextOrNull(context);
|
||||||
|
if (httpRouteState == null) {
|
||||||
|
// TODO: remove this branch?
|
||||||
|
String httpRoute = httpRouteGetter.get(context, arg1, arg2);
|
||||||
|
if (httpRoute != null && !httpRoute.isEmpty()) {
|
||||||
|
// update just the attribute - without http.method we can't compute a proper span name here
|
||||||
|
serverSpan.setAttribute(SemanticAttributes.HTTP_ROUTE, httpRoute);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// special case for servlet filters, even when we have a route from previous filter see whether
|
||||||
|
// the new route is better and if so use it instead
|
||||||
|
boolean onlyIfBetterRoute =
|
||||||
|
!source.useFirst && source.order == httpRouteState.getUpdatedBySourceOrder();
|
||||||
|
if (source.order > httpRouteState.getUpdatedBySourceOrder() || onlyIfBetterRoute) {
|
||||||
|
String route = httpRouteGetter.get(context, arg1, arg2);
|
||||||
|
if (route != null
|
||||||
|
&& !route.isEmpty()
|
||||||
|
&& (!onlyIfBetterRoute || isBetterRoute(httpRouteState, route))) {
|
||||||
|
|
||||||
|
// update just the span name - the attribute will be picked up by the
|
||||||
|
// HttpServerAttributesExtractor at the end of request processing
|
||||||
|
updateSpanName(serverSpan, httpRouteState, route);
|
||||||
|
|
||||||
|
httpRouteState.update(context, source.order, route);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is used when setting route from a servlet filter to pick the most descriptive (longest)
|
||||||
|
// route.
|
||||||
|
private static boolean isBetterRoute(HttpRouteState httpRouteState, String name) {
|
||||||
|
String route = httpRouteState.getRoute();
|
||||||
|
int routeLength = route == null ? 0 : route.length();
|
||||||
|
return name.length() > routeLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void updateSpanName(Span serverSpan, HttpRouteState httpRouteState, String route) {
|
||||||
|
String method = httpRouteState.getMethod();
|
||||||
|
// method should never really be null - but in case it for some reason is, we'll rely on the
|
||||||
|
// span name extractor behavior
|
||||||
|
if (method != null) {
|
||||||
|
serverSpan.updateName(method + " " + route);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@code http.route} attribute value that's stored in the {@code context}, or null if
|
||||||
|
* it was not set before.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
static String get(Context context) {
|
||||||
|
HttpRouteState httpRouteState = HttpRouteState.fromContextOrNull(context);
|
||||||
|
return httpRouteState == null ? null : httpRouteState.getRoute();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class OneArgAdapter<T>
|
||||||
|
implements HttpServerRouteBiGetter<T, HttpServerRouteGetter<T>> {
|
||||||
|
|
||||||
|
private static final OneArgAdapter<Object> INSTANCE = new OneArgAdapter<>();
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
static <T> OneArgAdapter<T> getInstance() {
|
||||||
|
return (OneArgAdapter<T>) INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Nullable
|
||||||
|
public String get(Context context, T arg, HttpServerRouteGetter<T> httpRouteGetter) {
|
||||||
|
return httpRouteGetter.get(context, arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class ConstantAdapter implements HttpServerRouteGetter<String> {
|
||||||
|
|
||||||
|
private static final ConstantAdapter INSTANCE = new ConstantAdapter();
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public String get(Context context, String route) {
|
||||||
|
return route;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
||||||
|
|
||||||
|
import io.opentelemetry.context.Context;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
/** An interface for getting the {@code http.route} attribute. */
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface HttpServerRouteBiGetter<T, U> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@code http.route} attribute extracted from {@code context}, {@code arg1} and
|
||||||
|
* {@code arg2}; or {@code null} if it was not found.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
String get(Context context, T arg1, U arg2);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
||||||
|
|
||||||
|
import io.opentelemetry.context.Context;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
/** An interface for getting the {@code http.route} attribute. */
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface HttpServerRouteGetter<T> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@code http.route} attribute extracted from {@code context} and {@code arg}; or
|
||||||
|
* {@code null} if it was not found.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
String get(Context context, T arg);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
||||||
|
|
||||||
|
/** Represents the source that provided the {@code http.route} attribute. */
|
||||||
|
public enum HttpServerRouteSource {
|
||||||
|
/**
|
||||||
|
* Represents a "filter" that may execute before the actual server handler. E.g. the Servlet API
|
||||||
|
* {@code Filter} interface. Since multiple filters may match the same request, the one with the
|
||||||
|
* longest (most detailed) route will be chosen.
|
||||||
|
*/
|
||||||
|
SERVER_FILTER(1, /* useFirst= */ false),
|
||||||
|
/** Represents the actual server handler. E.g. the Servlet API {@code Servlet} interface. */
|
||||||
|
SERVER(2),
|
||||||
|
/**
|
||||||
|
* Represents the controller, usually defined as part of some MVC framework. E.g. a Spring Web MVC
|
||||||
|
* controller method, or a JAX-RS annotated resource method.
|
||||||
|
*/
|
||||||
|
CONTROLLER(3),
|
||||||
|
/**
|
||||||
|
* Represents a nested controller, usually defined as part of some MVC framework. E.g. a JAX-RS
|
||||||
|
* annotated sub-resource method. Since multiple nested controllers may match the same request,
|
||||||
|
* the one with the longest (most detailed) route will be chosen.
|
||||||
|
*/
|
||||||
|
NESTED_CONTROLLER(4, false);
|
||||||
|
|
||||||
|
final int order;
|
||||||
|
final boolean useFirst;
|
||||||
|
|
||||||
|
HttpServerRouteSource(int order) {
|
||||||
|
this(order, /* useFirst= */ true);
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpServerRouteSource(int order, boolean useFirst) {
|
||||||
|
this.order = order;
|
||||||
|
this.useFirst = useFirst;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import io.opentelemetry.context.Context;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class HttpClientResendCountTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void resendCountShouldBeZeroWhenNotInitialized() {
|
||||||
|
assertThat(HttpClientResendCount.getAndIncrement(Context.root())).isEqualTo(0);
|
||||||
|
assertThat(HttpClientResendCount.getAndIncrement(Context.root())).isEqualTo(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void incrementResendCount() {
|
||||||
|
Context context = HttpClientResendCount.initialize(Context.root());
|
||||||
|
|
||||||
|
assertThat(HttpClientResendCount.getAndIncrement(context)).isEqualTo(0);
|
||||||
|
assertThat(HttpClientResendCount.getAndIncrement(context)).isEqualTo(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The OpenTelemetry Authors
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.api.instrumenter.http;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
class HttpClientResendTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void resendCountShouldBeZeroWhenNotInitialized() {
|
|
||||||
assertThat(HttpClientResend.getAndIncrement(Context.root())).isEqualTo(0);
|
|
||||||
assertThat(HttpClientResend.getAndIncrement(Context.root())).isEqualTo(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void incrementResendCount() {
|
|
||||||
Context context = HttpClientResend.initialize(Context.root());
|
|
||||||
|
|
||||||
assertThat(HttpClientResend.getAndIncrement(context)).isEqualTo(0);
|
|
||||||
assertThat(HttpClientResend.getAndIncrement(context)).isEqualTo(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -22,7 +22,7 @@ import org.mockito.Mock;
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
|
||||||
@ExtendWith(MockitoExtension.class)
|
@ExtendWith(MockitoExtension.class)
|
||||||
class HttpRouteHolderTest {
|
class HttpServerRouteTest {
|
||||||
|
|
||||||
@RegisterExtension static final OpenTelemetryExtension testing = OpenTelemetryExtension.create();
|
@RegisterExtension static final OpenTelemetryExtension testing = OpenTelemetryExtension.create();
|
||||||
|
|
||||||
|
|
@ -33,7 +33,7 @@ class HttpRouteHolderTest {
|
||||||
void setUp() {
|
void setUp() {
|
||||||
instrumenter =
|
instrumenter =
|
||||||
Instrumenter.<String, Void>builder(testing.getOpenTelemetry(), "test", s -> s)
|
Instrumenter.<String, Void>builder(testing.getOpenTelemetry(), "test", s -> s)
|
||||||
.addContextCustomizer(HttpRouteHolder.create(getter))
|
.addContextCustomizer(HttpServerRoute.create(getter))
|
||||||
.buildInstrumenter();
|
.buildInstrumenter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -44,13 +44,13 @@ class HttpRouteHolderTest {
|
||||||
parentSpan.end();
|
parentSpan.end();
|
||||||
|
|
||||||
Context context = instrumenter.start(Context.root().with(parentSpan), "test");
|
Context context = instrumenter.start(Context.root().with(parentSpan), "test");
|
||||||
assertNull(HttpRouteHolder.getRoute(context));
|
assertNull(HttpServerRoute.get(context));
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.SERVLET, "/get/:id");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER, "/get/:id");
|
||||||
|
|
||||||
instrumenter.end(context, "test", null, null);
|
instrumenter.end(context, "test", null, null);
|
||||||
|
|
||||||
assertNull(HttpRouteHolder.getRoute(context));
|
assertNull(HttpServerRoute.get(context));
|
||||||
assertThat(testing.getSpans())
|
assertThat(testing.getSpans())
|
||||||
.satisfiesExactly(
|
.satisfiesExactly(
|
||||||
span -> assertThat(span).hasName("parent"), span -> assertThat(span).hasName("test"));
|
span -> assertThat(span).hasName("parent"), span -> assertThat(span).hasName("test"));
|
||||||
|
|
@ -61,13 +61,13 @@ class HttpRouteHolderTest {
|
||||||
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
||||||
|
|
||||||
Context context = instrumenter.start(Context.root(), "test");
|
Context context = instrumenter.start(Context.root(), "test");
|
||||||
assertNull(HttpRouteHolder.getRoute(context));
|
assertNull(HttpServerRoute.get(context));
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.SERVLET, "/get/:id");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER, "/get/:id");
|
||||||
|
|
||||||
instrumenter.end(context, "test", null, null);
|
instrumenter.end(context, "test", null, null);
|
||||||
|
|
||||||
assertEquals("/get/:id", HttpRouteHolder.getRoute(context));
|
assertEquals("/get/:id", HttpServerRoute.get(context));
|
||||||
assertThat(testing.getSpans())
|
assertThat(testing.getSpans())
|
||||||
.satisfiesExactly(span -> assertThat(span).hasName("GET /get/:id"));
|
.satisfiesExactly(span -> assertThat(span).hasName("GET /get/:id"));
|
||||||
}
|
}
|
||||||
|
|
@ -77,14 +77,14 @@ class HttpRouteHolderTest {
|
||||||
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
||||||
|
|
||||||
Context context = instrumenter.start(Context.root(), "test");
|
Context context = instrumenter.start(Context.root(), "test");
|
||||||
assertNull(HttpRouteHolder.getRoute(context));
|
assertNull(HttpServerRoute.get(context));
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.SERVLET, "/route1");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER, "/route1");
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.SERVLET, "/route2");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER, "/route2");
|
||||||
|
|
||||||
instrumenter.end(context, "test", null, null);
|
instrumenter.end(context, "test", null, null);
|
||||||
|
|
||||||
assertEquals("/route1", HttpRouteHolder.getRoute(context));
|
assertEquals("/route1", HttpServerRoute.get(context));
|
||||||
assertThat(testing.getSpans())
|
assertThat(testing.getSpans())
|
||||||
.satisfiesExactly(span -> assertThat(span).hasName("GET /route1"));
|
.satisfiesExactly(span -> assertThat(span).hasName("GET /route1"));
|
||||||
}
|
}
|
||||||
|
|
@ -94,14 +94,14 @@ class HttpRouteHolderTest {
|
||||||
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
||||||
|
|
||||||
Context context = instrumenter.start(Context.root(), "test");
|
Context context = instrumenter.start(Context.root(), "test");
|
||||||
assertNull(HttpRouteHolder.getRoute(context));
|
assertNull(HttpServerRoute.get(context));
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.CONTROLLER, "/route1");
|
HttpServerRoute.update(context, HttpServerRouteSource.CONTROLLER, "/route1");
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.SERVLET, "/route2");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER, "/route2");
|
||||||
|
|
||||||
instrumenter.end(context, "test", null, null);
|
instrumenter.end(context, "test", null, null);
|
||||||
|
|
||||||
assertEquals("/route1", HttpRouteHolder.getRoute(context));
|
assertEquals("/route1", HttpServerRoute.get(context));
|
||||||
assertThat(testing.getSpans())
|
assertThat(testing.getSpans())
|
||||||
.satisfiesExactly(span -> assertThat(span).hasName("GET /route1"));
|
.satisfiesExactly(span -> assertThat(span).hasName("GET /route1"));
|
||||||
}
|
}
|
||||||
|
|
@ -111,14 +111,14 @@ class HttpRouteHolderTest {
|
||||||
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
||||||
|
|
||||||
Context context = instrumenter.start(Context.root(), "test");
|
Context context = instrumenter.start(Context.root(), "test");
|
||||||
assertNull(HttpRouteHolder.getRoute(context));
|
assertNull(HttpServerRoute.get(context));
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.SERVLET, "/route1");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER, "/route1");
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.CONTROLLER, "/route2");
|
HttpServerRoute.update(context, HttpServerRouteSource.CONTROLLER, "/route2");
|
||||||
|
|
||||||
instrumenter.end(context, "test", null, null);
|
instrumenter.end(context, "test", null, null);
|
||||||
|
|
||||||
assertEquals("/route2", HttpRouteHolder.getRoute(context));
|
assertEquals("/route2", HttpServerRoute.get(context));
|
||||||
assertThat(testing.getSpans())
|
assertThat(testing.getSpans())
|
||||||
.satisfiesExactly(span -> assertThat(span).hasName("GET /route2"));
|
.satisfiesExactly(span -> assertThat(span).hasName("GET /route2"));
|
||||||
}
|
}
|
||||||
|
|
@ -128,14 +128,14 @@ class HttpRouteHolderTest {
|
||||||
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
||||||
|
|
||||||
Context context = instrumenter.start(Context.root(), "test");
|
Context context = instrumenter.start(Context.root(), "test");
|
||||||
assertNull(HttpRouteHolder.getRoute(context));
|
assertNull(HttpServerRoute.get(context));
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.FILTER, "/a/route");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER_FILTER, "/a/route");
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.FILTER, "/a/much/better/route");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER_FILTER, "/a/much/better/route");
|
||||||
|
|
||||||
instrumenter.end(context, "test", null, null);
|
instrumenter.end(context, "test", null, null);
|
||||||
|
|
||||||
assertEquals("/a/much/better/route", HttpRouteHolder.getRoute(context));
|
assertEquals("/a/much/better/route", HttpServerRoute.get(context));
|
||||||
assertThat(testing.getSpans())
|
assertThat(testing.getSpans())
|
||||||
.satisfiesExactly(span -> assertThat(span).hasName("GET /a/much/better/route"));
|
.satisfiesExactly(span -> assertThat(span).hasName("GET /a/much/better/route"));
|
||||||
}
|
}
|
||||||
|
|
@ -145,14 +145,14 @@ class HttpRouteHolderTest {
|
||||||
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
when(getter.getHttpRequestMethod("test")).thenReturn("GET");
|
||||||
|
|
||||||
Context context = instrumenter.start(Context.root(), "test");
|
Context context = instrumenter.start(Context.root(), "test");
|
||||||
assertNull(HttpRouteHolder.getRoute(context));
|
assertNull(HttpServerRoute.get(context));
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.FILTER, "/a/pretty/good/route");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER_FILTER, "/a/pretty/good/route");
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.FILTER, "/a");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER_FILTER, "/a");
|
||||||
|
|
||||||
instrumenter.end(context, "test", null, null);
|
instrumenter.end(context, "test", null, null);
|
||||||
|
|
||||||
assertEquals("/a/pretty/good/route", HttpRouteHolder.getRoute(context));
|
assertEquals("/a/pretty/good/route", HttpServerRoute.get(context));
|
||||||
assertThat(testing.getSpans())
|
assertThat(testing.getSpans())
|
||||||
.satisfiesExactly(span -> assertThat(span).hasName("GET /a/pretty/good/route"));
|
.satisfiesExactly(span -> assertThat(span).hasName("GET /a/pretty/good/route"));
|
||||||
}
|
}
|
||||||
|
|
@ -162,13 +162,13 @@ class HttpRouteHolderTest {
|
||||||
when(getter.getHttpRequestMethod("test")).thenReturn(null);
|
when(getter.getHttpRequestMethod("test")).thenReturn(null);
|
||||||
|
|
||||||
Context context = instrumenter.start(Context.root(), "test");
|
Context context = instrumenter.start(Context.root(), "test");
|
||||||
assertNull(HttpRouteHolder.getRoute(context));
|
assertNull(HttpServerRoute.get(context));
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.SERVLET, "/get/:id");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER, "/get/:id");
|
||||||
|
|
||||||
instrumenter.end(context, "test", null, null);
|
instrumenter.end(context, "test", null, null);
|
||||||
|
|
||||||
assertEquals("/get/:id", HttpRouteHolder.getRoute(context));
|
assertEquals("/get/:id", HttpServerRoute.get(context));
|
||||||
assertThat(testing.getSpans()).satisfiesExactly(span -> assertThat(span).hasName("test"));
|
assertThat(testing.getSpans()).satisfiesExactly(span -> assertThat(span).hasName("test"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -9,9 +9,9 @@ import akka.http.scaladsl.model.HttpRequest;
|
||||||
import akka.http.scaladsl.model.HttpResponse;
|
import akka.http.scaladsl.model.HttpResponse;
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
||||||
|
|
@ -36,7 +36,7 @@ public final class AkkaHttpServerSingletons {
|
||||||
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
|
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
|
||||||
.build())
|
.build())
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
.buildServerInstrumenter(AkkaHttpServerHeaders.INSTANCE);
|
.buildServerInstrumenter(AkkaHttpServerHeaders.INSTANCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@ import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.api.trace.StatusCode;
|
import io.opentelemetry.api.trace.StatusCode;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.ErrorCauseExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.ErrorCauseExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
|
|
||||||
class ServerDecorator extends SimpleDecoratingHttpService {
|
class ServerDecorator extends SimpleDecoratingHttpService {
|
||||||
|
|
||||||
|
|
@ -34,8 +34,8 @@ class ServerDecorator extends SimpleDecoratingHttpService {
|
||||||
|
|
||||||
Context otelContext = Context.current();
|
Context otelContext = Context.current();
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
otelContext, HttpRouteSource.SERVLET, (context, name) -> name, matchedRoute);
|
otelContext, HttpServerRouteSource.SERVER, (context, name) -> name, matchedRoute);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return unwrap().serve(ctx, req);
|
return unwrap().serve(ctx, req);
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,10 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttribut
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientExperimentalMetrics;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaHttpClientAttributesGetter;
|
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaHttpClientAttributesGetter;
|
||||||
|
|
@ -214,7 +214,7 @@ public final class ArmeriaTelemetryBuilder {
|
||||||
HttpSpanStatusExtractor.create(serverAttributesGetter)))
|
HttpSpanStatusExtractor.create(serverAttributesGetter)))
|
||||||
.addAttributesExtractor(httpServerAttributesExtractorBuilder.build())
|
.addAttributesExtractor(httpServerAttributesExtractorBuilder.build())
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.addContextCustomizer(HttpRouteHolder.create(serverAttributesGetter));
|
.addContextCustomizer(HttpServerRoute.create(serverAttributesGetter));
|
||||||
|
|
||||||
if (peerService != null) {
|
if (peerService != null) {
|
||||||
clientInstrumenterBuilder.addAttributesExtractor(
|
clientInstrumenterBuilder.addAttributesExtractor(
|
||||||
|
|
|
||||||
|
|
@ -25,8 +25,8 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel.decorators;
|
||||||
|
|
||||||
import io.opentelemetry.api.common.AttributesBuilder;
|
import io.opentelemetry.api.common.AttributesBuilder;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.instrumentation.apachecamel.CamelDirection;
|
import io.opentelemetry.javaagent.instrumentation.apachecamel.CamelDirection;
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
|
|
@ -122,9 +122,9 @@ class HttpSpanDecorator extends BaseSpanDecorator {
|
||||||
if (!shouldAppendHttpRoute(camelDirection)) {
|
if (!shouldAppendHttpRoute(camelDirection)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
context,
|
context,
|
||||||
HttpRouteSource.CONTROLLER,
|
HttpServerRouteSource.CONTROLLER,
|
||||||
(c, exchange, endpoint) -> getPath(exchange, endpoint),
|
(c, exchange, endpoint) -> getPath(exchange, endpoint),
|
||||||
camelExchange,
|
camelExchange,
|
||||||
camelEndpoint);
|
camelEndpoint);
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.code.CodeSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
|
|
||||||
public final class FinatraSingletons {
|
public final class FinatraSingletons {
|
||||||
|
|
||||||
|
|
@ -34,8 +34,8 @@ public final class FinatraSingletons {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateServerSpanName(Context context, RouteInfo routeInfo) {
|
public static void updateServerSpanName(Context context, RouteInfo routeInfo) {
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
context, HttpRouteSource.CONTROLLER, (c, route) -> route.path(), routeInfo);
|
context, HttpServerRouteSource.CONTROLLER, (c, route) -> route.path(), routeInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
private FinatraSingletons() {}
|
private FinatraSingletons() {}
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,13 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.grails;
|
package io.opentelemetry.javaagent.instrumentation.grails;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
import org.grails.web.mapping.mvc.GrailsControllerUrlMappingInfo;
|
import org.grails.web.mapping.mvc.GrailsControllerUrlMappingInfo;
|
||||||
|
|
||||||
public class GrailsServerSpanNaming {
|
public class GrailsServerSpanNaming {
|
||||||
|
|
||||||
public static final HttpRouteGetter<GrailsControllerUrlMappingInfo> SERVER_SPAN_NAME =
|
public static final HttpServerRouteGetter<GrailsControllerUrlMappingInfo> SERVER_SPAN_NAME =
|
||||||
(context, info) -> {
|
(context, info) -> {
|
||||||
String action =
|
String action =
|
||||||
info.getActionName() != null
|
info.getActionName() != null
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.grails;
|
package io.opentelemetry.javaagent.instrumentation.grails;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
@ -13,7 +12,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
|
@ -48,9 +48,9 @@ public class UrlMappingsInfoHandlerAdapterInstrumentation implements TypeInstrum
|
||||||
if (handler instanceof GrailsControllerUrlMappingInfo) {
|
if (handler instanceof GrailsControllerUrlMappingInfo) {
|
||||||
Context parentContext = Java8BytecodeBridge.currentContext();
|
Context parentContext = Java8BytecodeBridge.currentContext();
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
parentContext,
|
parentContext,
|
||||||
CONTROLLER,
|
HttpServerRouteSource.CONTROLLER,
|
||||||
GrailsServerSpanNaming.SERVER_SPAN_NAME,
|
GrailsServerSpanNaming.SERVER_SPAN_NAME,
|
||||||
(GrailsControllerUrlMappingInfo) handler);
|
(GrailsControllerUrlMappingInfo) handler);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,9 @@ package io.opentelemetry.javaagent.instrumentation.grizzly;
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
||||||
|
|
@ -45,7 +45,7 @@ public final class GrizzlySingletons {
|
||||||
.init(context))
|
.init(context))
|
||||||
.addContextCustomizer(
|
.addContextCustomizer(
|
||||||
(context, httpRequestPacket, startAttributes) -> GrizzlyErrorHolder.init(context))
|
(context, httpRequestPacket, startAttributes) -> GrizzlyErrorHolder.init(context))
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
.buildServerInstrumenter(HttpRequestHeadersGetter.INSTANCE);
|
.buildServerInstrumenter(HttpRequestHeadersGetter.INSTANCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
||||||
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
|
|
@ -83,9 +83,9 @@ public class JaxrsAnnotationsInstrumentation implements TypeInstrumentation {
|
||||||
Context parentContext = Java8BytecodeBridge.currentContext();
|
Context parentContext = Java8BytecodeBridge.currentContext();
|
||||||
handlerData = new HandlerData(target.getClass(), method);
|
handlerData = new HandlerData(target.getClass(), method);
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
parentContext,
|
parentContext,
|
||||||
HttpRouteSource.CONTROLLER,
|
HttpServerRouteSource.CONTROLLER,
|
||||||
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
||||||
handlerData);
|
handlerData);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,13 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.jaxrs.v1_0;
|
package io.opentelemetry.javaagent.instrumentation.jaxrs.v1_0;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
|
|
||||||
public class JaxrsServerSpanNaming {
|
public class JaxrsServerSpanNaming {
|
||||||
|
|
||||||
public static final HttpRouteGetter<HandlerData> SERVER_SPAN_NAME =
|
public static final HttpServerRouteGetter<HandlerData> SERVER_SPAN_NAME =
|
||||||
(context, handlerData) -> {
|
(context, handlerData) -> {
|
||||||
String pathBasedSpanName = handlerData.getServerSpanName();
|
String pathBasedSpanName = handlerData.getServerSpanName();
|
||||||
// If path based name is empty skip prepending context path so that path based name would
|
// If path based name is empty skip prepending context path so that path based name would
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ import static io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0.JaxrsAnnotat
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
||||||
import io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsConstants;
|
import io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsConstants;
|
||||||
import io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsServerSpanNaming;
|
import io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsServerSpanNaming;
|
||||||
|
|
@ -64,9 +64,9 @@ public class DefaultRequestContextInstrumentation extends AbstractRequestContext
|
||||||
Context parentContext = Java8BytecodeBridge.currentContext();
|
Context parentContext = Java8BytecodeBridge.currentContext();
|
||||||
handlerData = new Jaxrs2HandlerData(filterClass, method);
|
handlerData = new Jaxrs2HandlerData(filterClass, method);
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
parentContext,
|
parentContext,
|
||||||
HttpRouteSource.CONTROLLER,
|
HttpServerRouteSource.CONTROLLER,
|
||||||
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
||||||
handlerData);
|
handlerData);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.instrumentation.api.util.VirtualField;
|
import io.opentelemetry.instrumentation.api.util.VirtualField;
|
||||||
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
||||||
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
||||||
|
|
@ -105,9 +105,9 @@ public class JaxrsAnnotationsInstrumentation implements TypeInstrumentation {
|
||||||
Context parentContext = Java8BytecodeBridge.currentContext();
|
Context parentContext = Java8BytecodeBridge.currentContext();
|
||||||
handlerData = new Jaxrs2HandlerData(target.getClass(), method);
|
handlerData = new Jaxrs2HandlerData(target.getClass(), method);
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
parentContext,
|
parentContext,
|
||||||
HttpRouteSource.CONTROLLER,
|
HttpServerRouteSource.CONTROLLER,
|
||||||
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
||||||
handlerData);
|
handlerData);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,9 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsPathUtil.normalizePath;
|
import static io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsPathUtil.normalizePath;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
|
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
|
||||||
|
|
@ -18,7 +18,7 @@ import org.apache.cxf.jaxrs.model.OperationResourceInfo;
|
||||||
import org.apache.cxf.jaxrs.model.URITemplate;
|
import org.apache.cxf.jaxrs.model.URITemplate;
|
||||||
import org.apache.cxf.message.Exchange;
|
import org.apache.cxf.message.Exchange;
|
||||||
|
|
||||||
public final class CxfSpanName implements HttpRouteGetter<String> {
|
public final class CxfSpanName implements HttpServerRouteGetter<String> {
|
||||||
|
|
||||||
public static final CxfSpanName INSTANCE = new CxfSpanName();
|
public static final CxfSpanName INSTANCE = new CxfSpanName();
|
||||||
|
|
||||||
|
|
@ -26,7 +26,7 @@ public final class CxfSpanName implements HttpRouteGetter<String> {
|
||||||
Context context = Context.current();
|
Context context = Context.current();
|
||||||
String jaxrsName = calculateJaxrsName(context, exchange);
|
String jaxrsName = calculateJaxrsName(context, exchange);
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.NESTED_CONTROLLER, this, jaxrsName);
|
HttpServerRoute.update(context, HttpServerRouteSource.NESTED_CONTROLLER, this, jaxrsName);
|
||||||
|
|
||||||
return JaxrsContextPath.init(context, jaxrsName);
|
return JaxrsContextPath.init(context, jaxrsName);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,9 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsPathUtil.normalizePath;
|
import static io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsPathUtil.normalizePath;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
@ -19,13 +19,13 @@ import javax.ws.rs.core.UriInfo;
|
||||||
import org.glassfish.jersey.server.ContainerRequest;
|
import org.glassfish.jersey.server.ContainerRequest;
|
||||||
import org.glassfish.jersey.server.ExtendedUriInfo;
|
import org.glassfish.jersey.server.ExtendedUriInfo;
|
||||||
|
|
||||||
public class JerseySpanName implements HttpRouteGetter<Request> {
|
public class JerseySpanName implements HttpServerRouteGetter<Request> {
|
||||||
|
|
||||||
public static final JerseySpanName INSTANCE = new JerseySpanName();
|
public static final JerseySpanName INSTANCE = new JerseySpanName();
|
||||||
|
|
||||||
public void updateServerSpanName(Request request) {
|
public void updateServerSpanName(Request request) {
|
||||||
Context context = Context.current();
|
Context context = Context.current();
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.NESTED_CONTROLLER, this, request);
|
HttpServerRoute.update(context, HttpServerRouteSource.NESTED_CONTROLLER, this, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -5,22 +5,21 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0;
|
package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.NESTED_CONTROLLER;
|
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public final class ResteasySpanName implements HttpRouteGetter<String> {
|
public final class ResteasySpanName implements HttpServerRouteGetter<String> {
|
||||||
|
|
||||||
public static final ResteasySpanName INSTANCE = new ResteasySpanName();
|
public static final ResteasySpanName INSTANCE = new ResteasySpanName();
|
||||||
|
|
||||||
public void updateServerSpanName(Context context, String name) {
|
public void updateServerSpanName(Context context, String name) {
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
HttpRouteHolder.updateHttpRoute(context, NESTED_CONTROLLER, this, name);
|
HttpServerRoute.update(context, HttpServerRouteSource.NESTED_CONTROLLER, this, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ import static io.opentelemetry.javaagent.instrumentation.jaxrs.v3_0.JaxrsAnnotat
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
||||||
import io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsConstants;
|
import io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsConstants;
|
||||||
import io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsServerSpanNaming;
|
import io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsServerSpanNaming;
|
||||||
|
|
@ -64,9 +64,9 @@ public class DefaultRequestContextInstrumentation extends AbstractRequestContext
|
||||||
Context parentContext = Java8BytecodeBridge.currentContext();
|
Context parentContext = Java8BytecodeBridge.currentContext();
|
||||||
handlerData = new Jaxrs3HandlerData(filterClass, method);
|
handlerData = new Jaxrs3HandlerData(filterClass, method);
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
parentContext,
|
parentContext,
|
||||||
HttpRouteSource.CONTROLLER,
|
HttpServerRouteSource.CONTROLLER,
|
||||||
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
||||||
handlerData);
|
handlerData);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.instrumentation.api.util.VirtualField;
|
import io.opentelemetry.instrumentation.api.util.VirtualField;
|
||||||
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
import io.opentelemetry.javaagent.bootstrap.CallDepth;
|
||||||
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
||||||
|
|
@ -105,9 +105,9 @@ public class JaxrsAnnotationsInstrumentation implements TypeInstrumentation {
|
||||||
Context parentContext = Java8BytecodeBridge.currentContext();
|
Context parentContext = Java8BytecodeBridge.currentContext();
|
||||||
handlerData = new Jaxrs3HandlerData(target.getClass(), method);
|
handlerData = new Jaxrs3HandlerData(target.getClass(), method);
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
parentContext,
|
parentContext,
|
||||||
HttpRouteSource.CONTROLLER,
|
HttpServerRouteSource.CONTROLLER,
|
||||||
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
||||||
handlerData);
|
handlerData);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,9 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs.v3_0;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsPathUtil.normalizePath;
|
import static io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsPathUtil.normalizePath;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
import jakarta.ws.rs.core.Request;
|
import jakarta.ws.rs.core.Request;
|
||||||
|
|
@ -19,13 +19,13 @@ import javax.annotation.Nullable;
|
||||||
import org.glassfish.jersey.server.ContainerRequest;
|
import org.glassfish.jersey.server.ContainerRequest;
|
||||||
import org.glassfish.jersey.server.ExtendedUriInfo;
|
import org.glassfish.jersey.server.ExtendedUriInfo;
|
||||||
|
|
||||||
public class JerseySpanName implements HttpRouteGetter<Request> {
|
public class JerseySpanName implements HttpServerRouteGetter<Request> {
|
||||||
|
|
||||||
public static final JerseySpanName INSTANCE = new JerseySpanName();
|
public static final JerseySpanName INSTANCE = new JerseySpanName();
|
||||||
|
|
||||||
public void updateServerSpanName(Request request) {
|
public void updateServerSpanName(Request request) {
|
||||||
Context context = Context.current();
|
Context context = Context.current();
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.NESTED_CONTROLLER, this, request);
|
HttpServerRoute.update(context, HttpServerRouteSource.NESTED_CONTROLLER, this, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -5,22 +5,21 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.jaxrs.v3_0;
|
package io.opentelemetry.javaagent.instrumentation.jaxrs.v3_0;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.NESTED_CONTROLLER;
|
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public final class ResteasySpanName implements HttpRouteGetter<String> {
|
public final class ResteasySpanName implements HttpServerRouteGetter<String> {
|
||||||
|
|
||||||
public static final ResteasySpanName INSTANCE = new ResteasySpanName();
|
public static final ResteasySpanName INSTANCE = new ResteasySpanName();
|
||||||
|
|
||||||
public void updateServerSpanName(Context context, String name) {
|
public void updateServerSpanName(Context context, String name) {
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
HttpRouteHolder.updateHttpRoute(context, NESTED_CONTROLLER, this, name);
|
HttpServerRoute.update(context, HttpServerRouteSource.NESTED_CONTROLLER, this, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,13 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.jaxrs;
|
package io.opentelemetry.javaagent.instrumentation.jaxrs;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
import io.opentelemetry.javaagent.bootstrap.jaxrs.JaxrsContextPath;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
|
|
||||||
public class JaxrsServerSpanNaming {
|
public class JaxrsServerSpanNaming {
|
||||||
|
|
||||||
public static final HttpRouteGetter<HandlerData> SERVER_SPAN_NAME =
|
public static final HttpServerRouteGetter<HandlerData> SERVER_SPAN_NAME =
|
||||||
(context, handlerData) -> {
|
(context, handlerData) -> {
|
||||||
String pathBasedSpanName = handlerData.getServerSpanName();
|
String pathBasedSpanName = handlerData.getServerSpanName();
|
||||||
// If path based name is empty skip prepending context path so that path based name would
|
// If path based name is empty skip prepending context path so that path based name would
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
|
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
||||||
|
|
||||||
public final class RequestContextHelper {
|
public final class RequestContextHelper {
|
||||||
|
|
@ -21,9 +21,9 @@ public final class RequestContextHelper {
|
||||||
Span serverSpan = LocalRootSpan.fromContextOrNull(parentContext);
|
Span serverSpan = LocalRootSpan.fromContextOrNull(parentContext);
|
||||||
Span currentSpan = Java8BytecodeBridge.spanFromContext(parentContext);
|
Span currentSpan = Java8BytecodeBridge.spanFromContext(parentContext);
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
parentContext,
|
parentContext,
|
||||||
HttpRouteSource.CONTROLLER,
|
HttpServerRouteSource.CONTROLLER,
|
||||||
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
JaxrsServerSpanNaming.SERVER_SPAN_NAME,
|
||||||
handlerData);
|
handlerData);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,10 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor
|
||||||
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil
|
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil
|
||||||
|
|
@ -121,7 +121,7 @@ class KtorServerTracing private constructor(
|
||||||
setSpanStatusExtractor(configuration.statusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)))
|
setSpanStatusExtractor(configuration.statusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)))
|
||||||
addAttributesExtractor(configuration.httpAttributesExtractorBuilder.build())
|
addAttributesExtractor(configuration.httpAttributesExtractorBuilder.build())
|
||||||
addOperationMetrics(HttpServerMetrics.get())
|
addOperationMetrics(HttpServerMetrics.get())
|
||||||
addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
}
|
}
|
||||||
|
|
||||||
val instrumenter = InstrumenterUtil.buildUpstreamInstrumenter(
|
val instrumenter = InstrumenterUtil.buildUpstreamInstrumenter(
|
||||||
|
|
@ -175,7 +175,7 @@ class KtorServerTracing private constructor(
|
||||||
pipeline.environment.monitor.subscribe(Routing.RoutingCallStarted) { call ->
|
pipeline.environment.monitor.subscribe(Routing.RoutingCallStarted) { call ->
|
||||||
val context = call.attributes.getOrNull(contextKey)
|
val context = call.attributes.getOrNull(contextKey)
|
||||||
if (context != null) {
|
if (context != null) {
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.SERVLET, { _, arg -> arg.route.parent.toString() }, call)
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER, { _, arg -> arg.route.parent.toString() }, call)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,10 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor
|
||||||
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil
|
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil
|
||||||
|
|
@ -121,7 +121,7 @@ class KtorServerTracing private constructor(
|
||||||
setSpanStatusExtractor(configuration.statusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)))
|
setSpanStatusExtractor(configuration.statusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)))
|
||||||
addAttributesExtractor(configuration.httpAttributesExtractorBuilder.build())
|
addAttributesExtractor(configuration.httpAttributesExtractorBuilder.build())
|
||||||
addOperationMetrics(HttpServerMetrics.get())
|
addOperationMetrics(HttpServerMetrics.get())
|
||||||
addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
}
|
}
|
||||||
|
|
||||||
val instrumenter = InstrumenterUtil.buildUpstreamInstrumenter(
|
val instrumenter = InstrumenterUtil.buildUpstreamInstrumenter(
|
||||||
|
|
@ -173,7 +173,7 @@ class KtorServerTracing private constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
pipeline.environment.monitor.subscribe(Routing.RoutingCallStarted) { call ->
|
pipeline.environment.monitor.subscribe(Routing.RoutingCallStarted) { call ->
|
||||||
HttpRouteHolder.updateHttpRoute(Context.current(), HttpRouteSource.SERVLET, { _, arg -> arg.route.parent.toString() }, call)
|
HttpServerRoute.update(Context.current(), HttpServerRouteSource.SERVER, { _, arg -> arg.route.parent.toString() }, call)
|
||||||
}
|
}
|
||||||
|
|
||||||
return feature
|
return feature
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,9 @@ package io.opentelemetry.javaagent.instrumentation.liberty.dispatcher;
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
||||||
|
|
@ -35,7 +35,7 @@ public final class LibertyDispatcherSingletons {
|
||||||
.setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders())
|
.setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders())
|
||||||
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
|
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
|
||||||
.build())
|
.build())
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.buildServerInstrumenter(LibertyDispatcherRequestGetter.INSTANCE);
|
.buildServerInstrumenter(LibertyDispatcherRequestGetter.INSTANCE);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,9 @@ package io.opentelemetry.javaagent.instrumentation.netty.v3_8.server;
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import io.opentelemetry.instrumentation.netty.common.internal.NettyErrorHolder;
|
import io.opentelemetry.instrumentation.netty.common.internal.NettyErrorHolder;
|
||||||
|
|
@ -40,7 +40,7 @@ final class NettyServerSingletons {
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.addContextCustomizer(
|
.addContextCustomizer(
|
||||||
(context, requestAndChannel, startAttributes) -> NettyErrorHolder.init(context))
|
(context, requestAndChannel, startAttributes) -> NettyErrorHolder.init(context))
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpServerAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(httpServerAttributesGetter))
|
||||||
.buildServerInstrumenter(NettyHeadersGetter.INSTANCE);
|
.buildServerInstrumenter(NettyHeadersGetter.INSTANCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,10 @@ package io.opentelemetry.instrumentation.netty.v4.common.internal.server;
|
||||||
import io.netty.handler.codec.http.HttpResponse;
|
import io.netty.handler.codec.http.HttpResponse;
|
||||||
import io.opentelemetry.api.OpenTelemetry;
|
import io.opentelemetry.api.OpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import io.opentelemetry.instrumentation.netty.common.internal.NettyErrorHolder;
|
import io.opentelemetry.instrumentation.netty.common.internal.NettyErrorHolder;
|
||||||
|
|
@ -42,7 +42,7 @@ public final class NettyServerInstrumenterFactory {
|
||||||
.addAttributesExtractor(extractorBuilder.build())
|
.addAttributesExtractor(extractorBuilder.build())
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.addContextCustomizer((context, request, attributes) -> NettyErrorHolder.init(context))
|
.addContextCustomizer((context, request, attributes) -> NettyErrorHolder.init(context))
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
.buildServerInstrumenter(HttpRequestHeadersGetter.INSTANCE);
|
.buildServerInstrumenter(HttpRequestHeadersGetter.INSTANCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientResend;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientResendCount;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.net.PeerServiceAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.net.PeerServiceAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.okhttp.v3_0.internal.ConnectionErrorSpanInterceptor;
|
import io.opentelemetry.instrumentation.okhttp.v3_0.internal.ConnectionErrorSpanInterceptor;
|
||||||
import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpAttributesGetter;
|
import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpAttributesGetter;
|
||||||
|
|
@ -40,7 +40,7 @@ public final class OkHttp3Singletons {
|
||||||
|
|
||||||
public static final Interceptor CONTEXT_INTERCEPTOR =
|
public static final Interceptor CONTEXT_INTERCEPTOR =
|
||||||
chain -> {
|
chain -> {
|
||||||
try (Scope ignored = HttpClientResend.initialize(Context.current()).makeCurrent()) {
|
try (Scope ignored = HttpClientResendCount.initialize(Context.current()).makeCurrent()) {
|
||||||
return chain.proceed(chain.request());
|
return chain.proceed(chain.request());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ package io.opentelemetry.instrumentation.okhttp.v3_0;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientResend;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientResendCount;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import okhttp3.Interceptor;
|
import okhttp3.Interceptor;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
|
|
@ -23,7 +23,7 @@ final class ContextInterceptor implements Interceptor {
|
||||||
parentContext = Context.current();
|
parentContext = Context.current();
|
||||||
}
|
}
|
||||||
// include the resend counter
|
// include the resend counter
|
||||||
Context context = HttpClientResend.initialize(parentContext);
|
Context context = HttpClientResendCount.initialize(parentContext);
|
||||||
try (Scope ignored = context.makeCurrent()) {
|
try (Scope ignored = context.makeCurrent()) {
|
||||||
return chain.proceed(request);
|
return chain.proceed(request);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ package io.opentelemetry.instrumentation.okhttp.v3_0.internal;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientResend;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientResendCount;
|
||||||
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil;
|
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
|
@ -42,7 +42,7 @@ public final class ConnectionErrorSpanInterceptor implements Interceptor {
|
||||||
throw t;
|
throw t;
|
||||||
} finally {
|
} finally {
|
||||||
// only create a span when there wasn't any HTTP request
|
// only create a span when there wasn't any HTTP request
|
||||||
if (HttpClientResend.get(parentContext) == 0) {
|
if (HttpClientResendCount.get(parentContext) == 0) {
|
||||||
if (instrumenter.shouldStart(parentContext, request)) {
|
if (instrumenter.shouldStart(parentContext, request)) {
|
||||||
InstrumenterUtil.startAndEnd(
|
InstrumenterUtil.startAndEnd(
|
||||||
instrumenter, parentContext, request, response, error, startTime, Instant.now());
|
instrumenter, parentContext, request, response, error, startTime, Instant.now());
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,8 @@ import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.api.trace.SpanKind;
|
import io.opentelemetry.api.trace.SpanKind;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
|
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.instrumentation.api.internal.SpanKey;
|
import io.opentelemetry.instrumentation.api.internal.SpanKey;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
||||||
|
|
@ -80,8 +80,8 @@ class ContextBridgeTest {
|
||||||
AgentSpanTesting.runWithHttpServerSpan(
|
AgentSpanTesting.runWithHttpServerSpan(
|
||||||
"server",
|
"server",
|
||||||
() ->
|
() ->
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
Context.current(), HttpRouteSource.SERVLET, "/test/controller/:id"));
|
Context.current(), HttpServerRouteSource.SERVER, "/test/controller/:id"));
|
||||||
|
|
||||||
testing.waitAndAssertTraces(
|
testing.waitAndAssertTraces(
|
||||||
trace ->
|
trace ->
|
||||||
|
|
@ -100,8 +100,8 @@ class ContextBridgeTest {
|
||||||
AgentSpanTesting.runWithHttpServerSpan(
|
AgentSpanTesting.runWithHttpServerSpan(
|
||||||
"server",
|
"server",
|
||||||
() ->
|
() ->
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
Context.current(), HttpRouteSource.CONTROLLER, "/test/controller/:id"));
|
Context.current(), HttpServerRouteSource.CONTROLLER, "/test/controller/:id"));
|
||||||
|
|
||||||
testing.waitAndAssertTraces(
|
testing.waitAndAssertTraces(
|
||||||
trace ->
|
trace ->
|
||||||
|
|
|
||||||
|
|
@ -11,9 +11,9 @@ import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.ContextKey;
|
import io.opentelemetry.context.ContextKey;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.instrumentation.api.internal.SpanKey;
|
import io.opentelemetry.instrumentation.api.internal.SpanKey;
|
||||||
|
|
||||||
public final class AgentSpanTestingInstrumenter {
|
public final class AgentSpanTestingInstrumenter {
|
||||||
|
|
@ -31,14 +31,14 @@ public final class AgentSpanTestingInstrumenter {
|
||||||
Instrumenter.<String, Void>builder(GlobalOpenTelemetry.get(), "test", request -> request)
|
Instrumenter.<String, Void>builder(GlobalOpenTelemetry.get(), "test", request -> request)
|
||||||
.addAttributesExtractor(
|
.addAttributesExtractor(
|
||||||
HttpServerAttributesExtractor.create(MockHttpServerAttributesGetter.INSTANCE))
|
HttpServerAttributesExtractor.create(MockHttpServerAttributesGetter.INSTANCE))
|
||||||
.addContextCustomizer(HttpRouteHolder.create(MockHttpServerAttributesGetter.INSTANCE))
|
.addContextCustomizer(HttpServerRoute.create(MockHttpServerAttributesGetter.INSTANCE))
|
||||||
.addContextCustomizer(
|
.addContextCustomizer(
|
||||||
(context, request, startAttributes) -> context.with(REQUEST_CONTEXT_KEY, request))
|
(context, request, startAttributes) -> context.with(REQUEST_CONTEXT_KEY, request))
|
||||||
.buildInstrumenter(SpanKindExtractor.alwaysServer());
|
.buildInstrumenter(SpanKindExtractor.alwaysServer());
|
||||||
|
|
||||||
public static Context startHttpServerSpan(String name) {
|
public static Context startHttpServerSpan(String name) {
|
||||||
Context context = HTTP_SERVER_INSTRUMENTER.start(Context.current(), name);
|
Context context = HTTP_SERVER_INSTRUMENTER.start(Context.current(), name);
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.SERVLET, "/test/server/*");
|
HttpServerRoute.update(context, HttpServerRouteSource.SERVER, "/test/server/*");
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import play.api.mvc.Request;
|
import play.api.mvc.Request;
|
||||||
import scala.Option;
|
import scala.Option;
|
||||||
|
|
||||||
|
|
@ -33,7 +33,7 @@ public final class Play24Singletons {
|
||||||
}
|
}
|
||||||
|
|
||||||
Span.fromContext(context).updateName(route);
|
Span.fromContext(context).updateName(route);
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.CONTROLLER, route);
|
HttpServerRoute.update(context, HttpServerRouteSource.CONTROLLER, route);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getRoute(Request<?> request) {
|
private static String getRoute(Request<?> request) {
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
@ -60,7 +60,7 @@ public final class Play26Singletons {
|
||||||
}
|
}
|
||||||
|
|
||||||
Span.fromContext(context).updateName(route);
|
Span.fromContext(context).updateName(route);
|
||||||
HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.CONTROLLER, route);
|
HttpServerRoute.update(context, HttpServerRouteSource.CONTROLLER, route);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getRoute(Request<?> request) {
|
private static String getRoute(Request<?> request) {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.quarkus.resteasy.reactive;
|
package io.opentelemetry.javaagent.instrumentation.quarkus.resteasy.reactive;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
|
||||||
import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext;
|
import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext;
|
||||||
|
|
||||||
public final class OtelRequestContext {
|
public final class OtelRequestContext {
|
||||||
|
|
@ -15,8 +14,7 @@ public final class OtelRequestContext {
|
||||||
public static OtelRequestContext start(ResteasyReactiveRequestContext requestContext) {
|
public static OtelRequestContext start(ResteasyReactiveRequestContext requestContext) {
|
||||||
OtelRequestContext context = new OtelRequestContext();
|
OtelRequestContext context = new OtelRequestContext();
|
||||||
contextThreadLocal.set(context);
|
contextThreadLocal.set(context);
|
||||||
ResteasyReactiveSpanName.INSTANCE.updateServerSpanName(
|
ResteasyReactiveSpanName.INSTANCE.updateServerSpanName(requestContext);
|
||||||
requestContext, HttpRouteSource.NESTED_CONTROLLER);
|
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -31,8 +29,7 @@ public final class OtelRequestContext {
|
||||||
context.firstInvoke = false;
|
context.firstInvoke = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ResteasyReactiveSpanName.INSTANCE.updateServerSpanName(
|
ResteasyReactiveSpanName.INSTANCE.updateServerSpanName(requestContext);
|
||||||
requestContext, HttpRouteSource.NESTED_CONTROLLER);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void close() {
|
public void close() {
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ package io.opentelemetry.javaagent.instrumentation.quarkus.resteasy.reactive;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsPathUtil.normalizePath;
|
import static io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsPathUtil.normalizePath;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.instrumentation.api.util.VirtualField;
|
import io.opentelemetry.instrumentation.api.util.VirtualField;
|
||||||
import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext;
|
import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext;
|
||||||
import org.jboss.resteasy.reactive.server.mapping.RuntimeResource;
|
import org.jboss.resteasy.reactive.server.mapping.RuntimeResource;
|
||||||
|
|
@ -22,10 +22,10 @@ final class ResteasyReactiveSpanName {
|
||||||
|
|
||||||
public static final ResteasyReactiveSpanName INSTANCE = new ResteasyReactiveSpanName();
|
public static final ResteasyReactiveSpanName INSTANCE = new ResteasyReactiveSpanName();
|
||||||
|
|
||||||
void updateServerSpanName(ResteasyReactiveRequestContext requestContext, HttpRouteSource source) {
|
void updateServerSpanName(ResteasyReactiveRequestContext requestContext) {
|
||||||
Context context = Context.current();
|
Context context = Context.current();
|
||||||
String jaxRsName = calculateJaxRsName(requestContext);
|
String jaxRsName = calculateJaxRsName(requestContext);
|
||||||
HttpRouteHolder.updateHttpRoute(context, source, jaxRsName);
|
HttpServerRoute.update(context, HttpServerRouteSource.NESTED_CONTROLLER, jaxRsName);
|
||||||
pathField.set(requestContext, jaxRsName);
|
pathField.set(requestContext, jaxRsName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,8 @@ import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.api.trace.StatusCode;
|
import io.opentelemetry.api.trace.StatusCode;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.ErrorCauseExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.ErrorCauseExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import ratpack.handling.Context;
|
import ratpack.handling.Context;
|
||||||
|
|
||||||
public final class RatpackSingletons {
|
public final class RatpackSingletons {
|
||||||
|
|
@ -41,8 +41,8 @@ public final class RatpackSingletons {
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the netty server span name; FILTER is probably the best match for ratpack Handlers
|
// update the netty server span name; FILTER is probably the best match for ratpack Handlers
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
otelContext, HttpRouteSource.FILTER, (context, name) -> name, matchedRoute);
|
otelContext, HttpServerRouteSource.SERVER_FILTER, (context, name) -> name, matchedRoute);
|
||||||
return matchedRoute;
|
return matchedRoute;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,11 @@
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.ratpack.v1_7;
|
package io.opentelemetry.instrumentation.ratpack.v1_7;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
|
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import ratpack.error.ServerErrorHandler;
|
import ratpack.error.ServerErrorHandler;
|
||||||
import ratpack.handling.Context;
|
import ratpack.handling.Context;
|
||||||
import ratpack.handling.Handler;
|
import ratpack.handling.Handler;
|
||||||
|
|
@ -39,7 +39,7 @@ public final class OpenTelemetryServerHandler implements Handler {
|
||||||
context.onClose(
|
context.onClose(
|
||||||
outcome -> {
|
outcome -> {
|
||||||
// Route not available in beginning of request so handle it manually here.
|
// Route not available in beginning of request so handle it manually here.
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
otelCtx, CONTROLLER, OpenTelemetryServerHandler::getRoute, context);
|
otelCtx, CONTROLLER, OpenTelemetryServerHandler::getRoute, context);
|
||||||
|
|
||||||
Throwable error =
|
Throwable error =
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,10 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -142,7 +142,7 @@ public final class RatpackTelemetryBuilder {
|
||||||
.addAttributesExtractor(httpServerAttributesExtractorBuilder.build())
|
.addAttributesExtractor(httpServerAttributesExtractorBuilder.build())
|
||||||
.addAttributesExtractors(additionalExtractors)
|
.addAttributesExtractors(additionalExtractors)
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributes))
|
.addContextCustomizer(HttpServerRoute.create(httpAttributes))
|
||||||
.buildServerInstrumenter(RatpackGetter.INSTANCE);
|
.buildServerInstrumenter(RatpackGetter.INSTANCE);
|
||||||
|
|
||||||
return new RatpackTelemetry(instrumenter, httpClientInstrumenter());
|
return new RatpackTelemetry(instrumenter, httpClientInstrumenter());
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.ReactorContextKeys.CONTEXTS_HOLDER_KEY;
|
import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.ReactorContextKeys.CONTEXTS_HOLDER_KEY;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientResend;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientResendCount;
|
||||||
import io.opentelemetry.instrumentation.netty.v4_1.NettyClientTelemetry;
|
import io.opentelemetry.instrumentation.netty.v4_1.NettyClientTelemetry;
|
||||||
import java.util.function.BiConsumer;
|
import java.util.function.BiConsumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
@ -118,7 +118,7 @@ public final class HttpResponseReceiverInstrumenter {
|
||||||
public void accept(HttpClientRequest request, Throwable error) {
|
public void accept(HttpClientRequest request, Throwable error) {
|
||||||
instrumentationContexts.endClientSpan(null, error);
|
instrumentationContexts.endClientSpan(null, error);
|
||||||
|
|
||||||
if (HttpClientResend.get(instrumentationContexts.getParentContext()) == 0) {
|
if (HttpClientResendCount.get(instrumentationContexts.getParentContext()) == 0) {
|
||||||
// request is an instance of FailedHttpClientRequest, which does not implement a correct
|
// request is an instance of FailedHttpClientRequest, which does not implement a correct
|
||||||
// resourceUrl() method -- we have to work around that
|
// resourceUrl() method -- we have to work around that
|
||||||
request = FailedRequestWithUrlMaker.create(config, request);
|
request = FailedRequestWithUrlMaker.create(config, request);
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.ReactorNettySingletons.instrumenter;
|
import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.ReactorNettySingletons.instrumenter;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientResend;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientResendCount;
|
||||||
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil;
|
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil;
|
||||||
import io.opentelemetry.instrumentation.api.internal.Timer;
|
import io.opentelemetry.instrumentation.api.internal.Timer;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
|
|
@ -27,7 +27,7 @@ final class InstrumentationContexts {
|
||||||
private final Queue<RequestAndContext> clientContexts = new LinkedBlockingQueue<>();
|
private final Queue<RequestAndContext> clientContexts = new LinkedBlockingQueue<>();
|
||||||
|
|
||||||
void initialize(Context parentContext) {
|
void initialize(Context parentContext) {
|
||||||
this.parentContext = HttpClientResend.initialize(parentContext);
|
this.parentContext = HttpClientResendCount.initialize(parentContext);
|
||||||
timer = Timer.start();
|
timer = Timer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.restlet.v1_1;
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.instrumentation.restlet.v1_1.RestletTelemetry;
|
import io.opentelemetry.instrumentation.restlet.v1_1.RestletTelemetry;
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
|
|
@ -28,7 +28,7 @@ public final class RestletSingletons {
|
||||||
return INSTRUMENTER;
|
return INSTRUMENTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpRouteGetter<String> serverSpanName() {
|
public static HttpServerRouteGetter<String> serverSpanName() {
|
||||||
return ServletContextPath::prepend;
|
return ServletContextPath::prepend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,14 +5,14 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.restlet.v1_1;
|
package io.opentelemetry.javaagent.instrumentation.restlet.v1_1;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
|
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.restlet.v1_1.RestletSingletons.serverSpanName;
|
import static io.opentelemetry.javaagent.instrumentation.restlet.v1_1.RestletSingletons.serverSpanName;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
|
|
@ -44,7 +44,7 @@ public class RouteInstrumentation implements TypeInstrumentation {
|
||||||
public static void getRouteInfo(@Advice.This Route route, @Advice.Argument(0) Request request) {
|
public static void getRouteInfo(@Advice.This Route route, @Advice.Argument(0) Request request) {
|
||||||
String pattern = route.getTemplate().getPattern();
|
String pattern = route.getTemplate().getPattern();
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(currentContext(), CONTROLLER, serverSpanName(), pattern);
|
HttpServerRoute.update(currentContext(), CONTROLLER, serverSpanName(), pattern);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.restlet.v1_1;
|
package io.opentelemetry.javaagent.instrumentation.restlet.v1_1;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
|
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.restlet.v1_1.RestletSingletons.instrumenter;
|
import static io.opentelemetry.javaagent.instrumentation.restlet.v1_1.RestletSingletons.instrumenter;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.restlet.v1_1.RestletSingletons.serverSpanName;
|
import static io.opentelemetry.javaagent.instrumentation.restlet.v1_1.RestletSingletons.serverSpanName;
|
||||||
|
|
@ -15,7 +15,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder;
|
import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
|
@ -77,7 +77,7 @@ public class ServerInstrumentation implements TypeInstrumentation {
|
||||||
scope.close();
|
scope.close();
|
||||||
|
|
||||||
if (Status.CLIENT_ERROR_NOT_FOUND.equals(response.getStatus())) {
|
if (Status.CLIENT_ERROR_NOT_FOUND.equals(response.getStatus())) {
|
||||||
HttpRouteHolder.updateHttpRoute(context, CONTROLLER, serverSpanName(), "/*");
|
HttpServerRoute.update(context, CONTROLLER, serverSpanName(), "/*");
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpServerResponseCustomizerHolder.getCustomizer()
|
HttpServerResponseCustomizerHolder.getCustomizer()
|
||||||
|
|
|
||||||
|
|
@ -9,10 +9,10 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
||||||
import io.opentelemetry.api.OpenTelemetry;
|
import io.opentelemetry.api.OpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -105,7 +105,7 @@ public final class RestletTelemetryBuilder {
|
||||||
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
|
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
|
||||||
.addAttributesExtractors(additionalExtractors)
|
.addAttributesExtractors(additionalExtractors)
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
.buildServerInstrumenter(RestletHeadersGetter.INSTANCE);
|
.buildServerInstrumenter(RestletHeadersGetter.INSTANCE);
|
||||||
|
|
||||||
return new RestletTelemetry(instrumenter);
|
return new RestletTelemetry(instrumenter);
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,12 @@
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.restlet.v1_1;
|
package io.opentelemetry.instrumentation.restlet.v1_1;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import org.restlet.Filter;
|
import org.restlet.Filter;
|
||||||
import org.restlet.data.Request;
|
import org.restlet.data.Request;
|
||||||
import org.restlet.data.Response;
|
import org.restlet.data.Response;
|
||||||
|
|
@ -38,7 +38,7 @@ final class TracingFilter extends Filter {
|
||||||
scope = context.makeCurrent();
|
scope = context.makeCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(context, CONTROLLER, (ctx, s) -> s, path);
|
HttpServerRoute.update(context, CONTROLLER, (ctx, s) -> s, path);
|
||||||
|
|
||||||
Throwable statusThrowable = null;
|
Throwable statusThrowable = null;
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ package io.opentelemetry.javaagent.instrumentation.restlet.v2_0;
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletHttpAttributesGetter;
|
import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletHttpAttributesGetter;
|
||||||
import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumenterFactory;
|
import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumenterFactory;
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
||||||
|
|
@ -33,7 +33,7 @@ public final class RestletSingletons {
|
||||||
return INSTRUMENTER;
|
return INSTRUMENTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpRouteGetter<String> serverSpanName() {
|
public static HttpServerRouteGetter<String> serverSpanName() {
|
||||||
return ServletContextPath::prepend;
|
return ServletContextPath::prepend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.restlet.v2_0;
|
package io.opentelemetry.javaagent.instrumentation.restlet.v2_0;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
|
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.restlet.v2_0.RestletSingletons.serverSpanName;
|
import static io.opentelemetry.javaagent.instrumentation.restlet.v2_0.RestletSingletons.serverSpanName;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
|
|
@ -13,7 +13,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
|
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
|
|
@ -46,7 +46,7 @@ public class RouteInstrumentation implements TypeInstrumentation {
|
||||||
@Advice.This TemplateRoute route, @Advice.Argument(0) Request request) {
|
@Advice.This TemplateRoute route, @Advice.Argument(0) Request request) {
|
||||||
String pattern = route.getTemplate().getPattern();
|
String pattern = route.getTemplate().getPattern();
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(currentContext(), CONTROLLER, serverSpanName(), pattern);
|
HttpServerRoute.update(currentContext(), CONTROLLER, serverSpanName(), pattern);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.restlet.v2_0;
|
package io.opentelemetry.javaagent.instrumentation.restlet.v2_0;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
|
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.restlet.v2_0.RestletSingletons.instrumenter;
|
import static io.opentelemetry.javaagent.instrumentation.restlet.v2_0.RestletSingletons.instrumenter;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.restlet.v2_0.RestletSingletons.serverSpanName;
|
import static io.opentelemetry.javaagent.instrumentation.restlet.v2_0.RestletSingletons.serverSpanName;
|
||||||
|
|
@ -15,7 +15,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder;
|
import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
|
@ -77,7 +77,7 @@ public class ServerInstrumentation implements TypeInstrumentation {
|
||||||
scope.close();
|
scope.close();
|
||||||
|
|
||||||
if (Status.CLIENT_ERROR_NOT_FOUND.equals(response.getStatus())) {
|
if (Status.CLIENT_ERROR_NOT_FOUND.equals(response.getStatus())) {
|
||||||
HttpRouteHolder.updateHttpRoute(context, CONTROLLER, serverSpanName(), "/*");
|
HttpServerRoute.update(context, CONTROLLER, serverSpanName(), "/*");
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpServerResponseCustomizerHolder.getCustomizer()
|
HttpServerResponseCustomizerHolder.getCustomizer()
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,12 @@
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.restlet.v2_0;
|
package io.opentelemetry.instrumentation.restlet.v2_0;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import org.restlet.Request;
|
import org.restlet.Request;
|
||||||
import org.restlet.Response;
|
import org.restlet.Response;
|
||||||
import org.restlet.resource.ResourceException;
|
import org.restlet.resource.ResourceException;
|
||||||
|
|
@ -39,7 +39,7 @@ final class TracingFilter extends Filter {
|
||||||
scope = context.makeCurrent();
|
scope = context.makeCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(context, CONTROLLER, (ctx, s) -> s, path);
|
HttpServerRoute.update(context, CONTROLLER, (ctx, s) -> s, path);
|
||||||
|
|
||||||
Throwable statusThrowable = null;
|
Throwable statusThrowable = null;
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ package io.opentelemetry.instrumentation.restlet.v2_0.internal;
|
||||||
import io.opentelemetry.api.OpenTelemetry;
|
import io.opentelemetry.api.OpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -37,7 +37,7 @@ public final class RestletInstrumenterFactory {
|
||||||
.addAttributesExtractor(httpServerAttributesExtractor)
|
.addAttributesExtractor(httpServerAttributesExtractor)
|
||||||
.addAttributesExtractors(additionalExtractors)
|
.addAttributesExtractors(additionalExtractors)
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
.buildServerInstrumenter(new RestletHeadersGetter());
|
.buildServerInstrumenter(new RestletHeadersGetter());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,15 +5,15 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.servlet;
|
package io.opentelemetry.javaagent.instrumentation.servlet;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.FILTER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.SERVER;
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.SERVLET;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.SERVER_FILTER;
|
||||||
|
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.api.trace.SpanContext;
|
import io.opentelemetry.api.trace.SpanContext;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
|
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge;
|
import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.MappingResolver;
|
import io.opentelemetry.javaagent.bootstrap.servlet.MappingResolver;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
|
|
@ -86,8 +86,8 @@ public abstract class BaseServletHelper<REQUEST, RESPONSE> {
|
||||||
Context context, REQUEST request, MappingResolver mappingResolver, boolean servlet) {
|
Context context, REQUEST request, MappingResolver mappingResolver, boolean servlet) {
|
||||||
Context result = addServletContextPath(context, request);
|
Context result = addServletContextPath(context, request);
|
||||||
if (mappingResolver != null) {
|
if (mappingResolver != null) {
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
result, servlet ? SERVLET : FILTER, spanNameProvider, mappingResolver, request);
|
result, servlet ? SERVER : SERVER_FILTER, spanNameProvider, mappingResolver, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,10 @@ import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesGetter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
||||||
|
|
@ -65,7 +65,7 @@ public final class ServletInstrumenterBuilder<REQUEST, RESPONSE> {
|
||||||
.build())
|
.build())
|
||||||
.addAttributesExtractor(additionalAttributesExtractor)
|
.addAttributesExtractor(additionalAttributesExtractor)
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter));
|
.addContextCustomizer(HttpServerRoute.create(httpAttributesGetter));
|
||||||
if (ServletRequestParametersExtractor.enabled()) {
|
if (ServletRequestParametersExtractor.enabled()) {
|
||||||
AttributesExtractor<ServletRequestContext<REQUEST>, ServletResponseContext<RESPONSE>>
|
AttributesExtractor<ServletRequestContext<REQUEST>, ServletResponseContext<RESPONSE>>
|
||||||
requestParametersExtractor = new ServletRequestParametersExtractor<>(accessor);
|
requestParametersExtractor = new ServletRequestParametersExtractor<>(accessor);
|
||||||
|
|
|
||||||
|
|
@ -6,14 +6,14 @@
|
||||||
package io.opentelemetry.javaagent.instrumentation.servlet;
|
package io.opentelemetry.javaagent.instrumentation.servlet;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteBiGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteBiGetter;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.MappingResolver;
|
import io.opentelemetry.javaagent.bootstrap.servlet.MappingResolver;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/** Helper class for constructing span name for given servlet/filter mapping and request. */
|
/** Helper class for constructing span name for given servlet/filter mapping and request. */
|
||||||
public class ServletSpanNameProvider<REQUEST>
|
public class ServletSpanNameProvider<REQUEST>
|
||||||
implements HttpRouteBiGetter<MappingResolver, REQUEST> {
|
implements HttpServerRouteBiGetter<MappingResolver, REQUEST> {
|
||||||
private final ServletAccessor<REQUEST, ?> servletAccessor;
|
private final ServletAccessor<REQUEST, ?> servletAccessor;
|
||||||
|
|
||||||
public ServletSpanNameProvider(ServletAccessor<REQUEST, ?> servletAccessor) {
|
public ServletSpanNameProvider(ServletAccessor<REQUEST, ?> servletAccessor) {
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
package io.opentelemetry.javaagent.instrumentation.sparkjava;
|
package io.opentelemetry.javaagent.instrumentation.sparkjava;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import spark.routematch.RouteMatch;
|
import spark.routematch.RouteMatch;
|
||||||
|
|
||||||
|
|
@ -16,8 +16,8 @@ public final class SparkRouteUpdater {
|
||||||
public static void updateHttpRoute(@Nullable RouteMatch routeMatch) {
|
public static void updateHttpRoute(@Nullable RouteMatch routeMatch) {
|
||||||
if (routeMatch != null) {
|
if (routeMatch != null) {
|
||||||
Context context = Context.current();
|
Context context = Context.current();
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
context, HttpRouteSource.CONTROLLER, (c, r) -> r.getMatchUri(), routeMatch);
|
context, HttpServerRouteSource.CONTROLLER, (c, r) -> r.getMatchUri(), routeMatch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
|
|
@ -69,8 +69,8 @@ public class HandlerAdapterInstrumentation implements TypeInstrumentation {
|
||||||
// using the last portion of the nested path.
|
// using the last portion of the nested path.
|
||||||
// HttpRouteSource.NESTED_CONTROLLER has useFirst false, and it will make http.route updated
|
// HttpRouteSource.NESTED_CONTROLLER has useFirst false, and it will make http.route updated
|
||||||
// twice: 1st using the last portion of the nested path, 2nd time using the full nested path.
|
// twice: 1st using the last portion of the nested path, 2nd time using the full nested path.
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
parentContext, HttpRouteSource.NESTED_CONTROLLER, httpRouteGetter(), exchange);
|
parentContext, HttpServerRouteSource.NESTED_CONTROLLER, httpRouteGetter(), exchange);
|
||||||
|
|
||||||
if (handler == null) {
|
if (handler == null) {
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server;
|
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
@ -29,7 +29,7 @@ public class RouteOnSuccess implements Consumer<HandlerFunction<?>> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void accept(HandlerFunction<?> handler) {
|
public void accept(HandlerFunction<?> handler) {
|
||||||
HttpRouteHolder.updateHttpRoute(Context.current(), HttpRouteSource.CONTROLLER, route);
|
HttpServerRoute.update(Context.current(), HttpServerRouteSource.CONTROLLER, route);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String parsePredicateString(RouterFunction<?> routerFunction) {
|
private static String parsePredicateString(RouterFunction<?> routerFunction) {
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server;
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig;
|
||||||
import io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.SpringWebfluxConfig;
|
import io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.SpringWebfluxConfig;
|
||||||
import org.springframework.web.reactive.HandlerMapping;
|
import org.springframework.web.reactive.HandlerMapping;
|
||||||
|
|
@ -39,7 +39,7 @@ public final class WebfluxSingletons {
|
||||||
return INSTRUMENTER;
|
return INSTRUMENTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpRouteGetter<ServerWebExchange> httpRouteGetter() {
|
public static HttpServerRouteGetter<ServerWebExchange> httpRouteGetter() {
|
||||||
return (context, exchange) -> {
|
return (context, exchange) -> {
|
||||||
Object bestPatternObj = exchange.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
|
Object bestPatternObj = exchange.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
|
||||||
if (bestPatternObj == null) {
|
if (bestPatternObj == null) {
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,10 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.ClientInstrumenterFactory;
|
import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.ClientInstrumenterFactory;
|
||||||
|
|
@ -197,7 +197,7 @@ public final class SpringWebfluxTelemetryBuilder {
|
||||||
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(serverAttributesGetter))
|
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(serverAttributesGetter))
|
||||||
.addAttributesExtractor(httpServerAttributesExtractorBuilder.build())
|
.addAttributesExtractor(httpServerAttributesExtractorBuilder.build())
|
||||||
.addAttributesExtractors(serverAdditionalExtractors)
|
.addAttributesExtractors(serverAdditionalExtractors)
|
||||||
.addContextCustomizer(HttpRouteHolder.create(serverAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(serverAttributesGetter))
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.buildServerInstrumenter(WebfluxTextMapGetter.INSTANCE);
|
.buildServerInstrumenter(WebfluxTextMapGetter.INSTANCE);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ package io.opentelemetry.instrumentation.spring.webflux.v5_3;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import org.reactivestreams.Subscription;
|
import org.reactivestreams.Subscription;
|
||||||
import org.springframework.core.Ordered;
|
import org.springframework.core.Ordered;
|
||||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||||
|
|
@ -131,10 +131,11 @@ final class TelemetryProducingWebFilter implements WebFilter, Ordered {
|
||||||
private void end(Context currentContext, Throwable t) {
|
private void end(Context currentContext, Throwable t) {
|
||||||
// Update HTTP route now, because during instrumenter.start()
|
// Update HTTP route now, because during instrumenter.start()
|
||||||
// the HTTP route isn't available from the exchange attributes, but is afterwards
|
// the HTTP route isn't available from the exchange attributes, but is afterwards
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
currentContext,
|
currentContext,
|
||||||
HttpRouteSource.CONTROLLER,
|
HttpServerRouteSource.CONTROLLER,
|
||||||
WebfluxServerHttpAttributesGetter.INSTANCE.getHttpRoute(exchange));
|
(context, exchange) -> WebfluxServerHttpAttributesGetter.INSTANCE.getHttpRoute(exchange),
|
||||||
|
exchange);
|
||||||
instrumenter.end(currentContext, exchange, exchange, t);
|
instrumenter.end(currentContext, exchange, exchange, t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.spring.webmvc.v3_1;
|
package io.opentelemetry.javaagent.instrumentation.spring.webmvc.v3_1;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
|
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
|
||||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
|
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.spring.webmvc.v3_1.SpringWebMvcSingletons.handlerInstrumenter;
|
import static io.opentelemetry.javaagent.instrumentation.spring.webmvc.v3_1.SpringWebMvcSingletons.handlerInstrumenter;
|
||||||
|
|
@ -18,7 +18,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
|
@ -74,7 +74,7 @@ public class HandlerAdapterInstrumentation implements TypeInstrumentation {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name the parent span based on the matching pattern
|
// Name the parent span based on the matching pattern
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
parentContext, CONTROLLER, SpringWebMvcServerSpanNaming.SERVER_SPAN_NAME, request);
|
parentContext, CONTROLLER, SpringWebMvcServerSpanNaming.SERVER_SPAN_NAME, request);
|
||||||
|
|
||||||
if (!handlerInstrumenter().shouldStart(parentContext, handler)) {
|
if (!handlerInstrumenter().shouldStart(parentContext, handler)) {
|
||||||
|
|
|
||||||
|
|
@ -5,14 +5,14 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.spring.webmvc.v3_1;
|
package io.opentelemetry.javaagent.instrumentation.spring.webmvc.v3_1;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import org.springframework.web.servlet.HandlerMapping;
|
import org.springframework.web.servlet.HandlerMapping;
|
||||||
|
|
||||||
public class SpringWebMvcServerSpanNaming {
|
public class SpringWebMvcServerSpanNaming {
|
||||||
|
|
||||||
public static final HttpRouteGetter<HttpServletRequest> SERVER_SPAN_NAME =
|
public static final HttpServerRouteGetter<HttpServletRequest> SERVER_SPAN_NAME =
|
||||||
(context, request) -> {
|
(context, request) -> {
|
||||||
Object bestMatchingPattern =
|
Object bestMatchingPattern =
|
||||||
request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
|
request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,11 @@
|
||||||
|
|
||||||
package org.springframework.web.servlet.v3_1;
|
package org.springframework.web.servlet.v3_1;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.javaagent.instrumentation.spring.webmvc.v3_1.SpringWebMvcServerSpanNaming;
|
import io.opentelemetry.javaagent.instrumentation.spring.webmvc.v3_1.SpringWebMvcServerSpanNaming;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.invoke.MethodHandle;
|
import java.lang.invoke.MethodHandle;
|
||||||
|
|
@ -37,7 +37,7 @@ public class OpenTelemetryHandlerMappingFilter implements Filter, Ordered {
|
||||||
private static final MethodHandle usesPathPatternsMh = getUsesPathPatternsMh();
|
private static final MethodHandle usesPathPatternsMh = getUsesPathPatternsMh();
|
||||||
private static final MethodHandle parseAndCacheMh = parseAndCacheMh();
|
private static final MethodHandle parseAndCacheMh = parseAndCacheMh();
|
||||||
|
|
||||||
private final HttpRouteGetter<HttpServletRequest> serverSpanName =
|
private final HttpServerRouteGetter<HttpServletRequest> serverSpanName =
|
||||||
(context, request) -> {
|
(context, request) -> {
|
||||||
Object previousValue = null;
|
Object previousValue = null;
|
||||||
if (this.parseRequestPath && PATH_ATTRIBUTE != null) {
|
if (this.parseRequestPath && PATH_ATTRIBUTE != null) {
|
||||||
|
|
@ -84,8 +84,7 @@ public class OpenTelemetryHandlerMappingFilter implements Filter, Ordered {
|
||||||
} finally {
|
} finally {
|
||||||
if (handlerMappings != null) {
|
if (handlerMappings != null) {
|
||||||
Context context = Context.current();
|
Context context = Context.current();
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(context, CONTROLLER, serverSpanName, (HttpServletRequest) request);
|
||||||
context, CONTROLLER, serverSpanName, (HttpServletRequest) request);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,10 @@ import io.opentelemetry.api.OpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -131,7 +131,7 @@ public final class SpringWebMvcTelemetryBuilder {
|
||||||
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
|
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
|
||||||
.addAttributesExtractors(additionalExtractors)
|
.addAttributesExtractors(additionalExtractors)
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
.buildServerInstrumenter(JavaxHttpServletRequestGetter.INSTANCE);
|
.buildServerInstrumenter(JavaxHttpServletRequestGetter.INSTANCE);
|
||||||
|
|
||||||
return new SpringWebMvcTelemetry(instrumenter);
|
return new SpringWebMvcTelemetry(instrumenter);
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,13 @@
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.spring.webmvc.v5_3;
|
package io.opentelemetry.instrumentation.spring.webmvc.v5_3;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import javax.servlet.FilterChain;
|
import javax.servlet.FilterChain;
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
|
|
@ -61,8 +61,7 @@ final class WebMvcTelemetryProducingFilter extends OncePerRequestFilter implemen
|
||||||
throw t;
|
throw t;
|
||||||
} finally {
|
} finally {
|
||||||
if (httpRouteSupport.hasMappings()) {
|
if (httpRouteSupport.hasMappings()) {
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(context, CONTROLLER, httpRouteSupport::getHttpRoute, request);
|
||||||
context, CONTROLLER, httpRouteSupport::getHttpRoute, request);
|
|
||||||
}
|
}
|
||||||
instrumenter.end(context, request, response, error);
|
instrumenter.end(context, request, response, error);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.spring.webmvc.v6_0;
|
package io.opentelemetry.javaagent.instrumentation.spring.webmvc.v6_0;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
|
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
|
||||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
|
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.spring.webmvc.v6_0.SpringWebMvcSingletons.handlerInstrumenter;
|
import static io.opentelemetry.javaagent.instrumentation.spring.webmvc.v6_0.SpringWebMvcSingletons.handlerInstrumenter;
|
||||||
|
|
@ -18,7 +18,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
|
@ -74,7 +74,7 @@ public class HandlerAdapterInstrumentation implements TypeInstrumentation {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name the parent span based on the matching pattern
|
// Name the parent span based on the matching pattern
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
parentContext, CONTROLLER, SpringWebMvcServerSpanNaming.SERVER_SPAN_NAME, request);
|
parentContext, CONTROLLER, SpringWebMvcServerSpanNaming.SERVER_SPAN_NAME, request);
|
||||||
|
|
||||||
if (!handlerInstrumenter().shouldStart(parentContext, handler)) {
|
if (!handlerInstrumenter().shouldStart(parentContext, handler)) {
|
||||||
|
|
|
||||||
|
|
@ -5,14 +5,14 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.spring.webmvc.v6_0;
|
package io.opentelemetry.javaagent.instrumentation.spring.webmvc.v6_0;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import org.springframework.web.servlet.HandlerMapping;
|
import org.springframework.web.servlet.HandlerMapping;
|
||||||
|
|
||||||
public class SpringWebMvcServerSpanNaming {
|
public class SpringWebMvcServerSpanNaming {
|
||||||
|
|
||||||
public static final HttpRouteGetter<HttpServletRequest> SERVER_SPAN_NAME =
|
public static final HttpServerRouteGetter<HttpServletRequest> SERVER_SPAN_NAME =
|
||||||
(context, request) -> {
|
(context, request) -> {
|
||||||
Object bestMatchingPattern =
|
Object bestMatchingPattern =
|
||||||
request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
|
request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,11 @@
|
||||||
|
|
||||||
package org.springframework.web.servlet.v6_0;
|
package org.springframework.web.servlet.v6_0;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.javaagent.instrumentation.spring.webmvc.v6_0.SpringWebMvcServerSpanNaming;
|
import io.opentelemetry.javaagent.instrumentation.spring.webmvc.v6_0.SpringWebMvcServerSpanNaming;
|
||||||
import jakarta.servlet.Filter;
|
import jakarta.servlet.Filter;
|
||||||
import jakarta.servlet.FilterChain;
|
import jakarta.servlet.FilterChain;
|
||||||
|
|
@ -33,7 +33,7 @@ import org.springframework.web.util.ServletRequestPathUtils;
|
||||||
|
|
||||||
public class OpenTelemetryHandlerMappingFilter implements Filter, Ordered {
|
public class OpenTelemetryHandlerMappingFilter implements Filter, Ordered {
|
||||||
|
|
||||||
private final HttpRouteGetter<HttpServletRequest> serverSpanName =
|
private final HttpServerRouteGetter<HttpServletRequest> serverSpanName =
|
||||||
(context, request) -> {
|
(context, request) -> {
|
||||||
RequestPath previousValue = null;
|
RequestPath previousValue = null;
|
||||||
if (this.parseRequestPath) {
|
if (this.parseRequestPath) {
|
||||||
|
|
@ -77,8 +77,7 @@ public class OpenTelemetryHandlerMappingFilter implements Filter, Ordered {
|
||||||
} finally {
|
} finally {
|
||||||
if (handlerMappings != null) {
|
if (handlerMappings != null) {
|
||||||
Context context = Context.current();
|
Context context = Context.current();
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(context, CONTROLLER, serverSpanName, (HttpServletRequest) request);
|
||||||
context, CONTROLLER, serverSpanName, (HttpServletRequest) request);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,10 @@ import io.opentelemetry.api.OpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
@ -131,7 +131,7 @@ public final class SpringWebMvcTelemetryBuilder {
|
||||||
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
|
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
|
||||||
.addAttributesExtractors(additionalExtractors)
|
.addAttributesExtractors(additionalExtractors)
|
||||||
.addOperationMetrics(HttpServerMetrics.get())
|
.addOperationMetrics(HttpServerMetrics.get())
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
.buildServerInstrumenter(JakartaHttpServletRequestGetter.INSTANCE);
|
.buildServerInstrumenter(JakartaHttpServletRequestGetter.INSTANCE);
|
||||||
|
|
||||||
return new SpringWebMvcTelemetry(instrumenter);
|
return new SpringWebMvcTelemetry(instrumenter);
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,13 @@
|
||||||
|
|
||||||
package io.opentelemetry.instrumentation.spring.webmvc.v6_0;
|
package io.opentelemetry.instrumentation.spring.webmvc.v6_0;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import jakarta.servlet.FilterChain;
|
import jakarta.servlet.FilterChain;
|
||||||
import jakarta.servlet.ServletException;
|
import jakarta.servlet.ServletException;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
@ -61,8 +61,7 @@ final class WebMvcTelemetryProducingFilter extends OncePerRequestFilter implemen
|
||||||
throw t;
|
throw t;
|
||||||
} finally {
|
} finally {
|
||||||
if (httpRouteSupport.hasMappings()) {
|
if (httpRouteSupport.hasMappings()) {
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(context, CONTROLLER, httpRouteSupport::getHttpRoute, request);
|
||||||
context, CONTROLLER, httpRouteSupport::getHttpRoute, request);
|
|
||||||
}
|
}
|
||||||
instrumenter.end(context, request, response, error);
|
instrumenter.end(context, request, response, error);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.struts2;
|
package io.opentelemetry.javaagent.instrumentation.struts2;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
|
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
|
||||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
|
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.struts2.StrutsSingletons.instrumenter;
|
import static io.opentelemetry.javaagent.instrumentation.struts2.StrutsSingletons.instrumenter;
|
||||||
|
|
@ -16,7 +16,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import com.opensymphony.xwork2.ActionInvocation;
|
import com.opensymphony.xwork2.ActionInvocation;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
|
@ -53,7 +53,7 @@ public class ActionInvocationInstrumentation implements TypeInstrumentation {
|
||||||
@Advice.Local("otelScope") Scope scope) {
|
@Advice.Local("otelScope") Scope scope) {
|
||||||
Context parentContext = Java8BytecodeBridge.currentContext();
|
Context parentContext = Java8BytecodeBridge.currentContext();
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
parentContext,
|
parentContext,
|
||||||
CONTROLLER,
|
CONTROLLER,
|
||||||
StrutsServerSpanNaming.SERVER_SPAN_NAME,
|
StrutsServerSpanNaming.SERVER_SPAN_NAME,
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,12 @@
|
||||||
package io.opentelemetry.javaagent.instrumentation.struts2;
|
package io.opentelemetry.javaagent.instrumentation.struts2;
|
||||||
|
|
||||||
import com.opensymphony.xwork2.ActionProxy;
|
import com.opensymphony.xwork2.ActionProxy;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
|
|
||||||
public class StrutsServerSpanNaming {
|
public class StrutsServerSpanNaming {
|
||||||
|
|
||||||
public static final HttpRouteGetter<ActionProxy> SERVER_SPAN_NAME =
|
public static final HttpServerRouteGetter<ActionProxy> SERVER_SPAN_NAME =
|
||||||
(context, actionProxy) -> {
|
(context, actionProxy) -> {
|
||||||
// We take name from the config, because it contains the path pattern from the
|
// We take name from the config, because it contains the path pattern from the
|
||||||
// configuration.
|
// configuration.
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.tapestry;
|
package io.opentelemetry.javaagent.instrumentation.tapestry;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
|
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
|
|
@ -13,7 +13,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
|
|
@ -58,7 +58,7 @@ public class InitializeActivePageNameInstrumentation implements TypeInstrumentat
|
||||||
|
|
||||||
@Advice.OnMethodEnter(suppress = Throwable.class)
|
@Advice.OnMethodEnter(suppress = Throwable.class)
|
||||||
public static void onEnter(@Advice.Argument(0) ComponentEventRequestParameters parameters) {
|
public static void onEnter(@Advice.Argument(0) ComponentEventRequestParameters parameters) {
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
currentContext(),
|
currentContext(),
|
||||||
CONTROLLER,
|
CONTROLLER,
|
||||||
TapestryServerSpanNaming.SERVER_SPAN_NAME,
|
TapestryServerSpanNaming.SERVER_SPAN_NAME,
|
||||||
|
|
@ -71,7 +71,7 @@ public class InitializeActivePageNameInstrumentation implements TypeInstrumentat
|
||||||
|
|
||||||
@Advice.OnMethodEnter(suppress = Throwable.class)
|
@Advice.OnMethodEnter(suppress = Throwable.class)
|
||||||
public static void onEnter(@Advice.Argument(0) PageRenderRequestParameters parameters) {
|
public static void onEnter(@Advice.Argument(0) PageRenderRequestParameters parameters) {
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
currentContext(),
|
currentContext(),
|
||||||
CONTROLLER,
|
CONTROLLER,
|
||||||
TapestryServerSpanNaming.SERVER_SPAN_NAME,
|
TapestryServerSpanNaming.SERVER_SPAN_NAME,
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,12 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.tapestry;
|
package io.opentelemetry.javaagent.instrumentation.tapestry;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
|
|
||||||
public class TapestryServerSpanNaming {
|
public class TapestryServerSpanNaming {
|
||||||
|
|
||||||
public static final HttpRouteGetter<String> SERVER_SPAN_NAME =
|
public static final HttpServerRouteGetter<String> SERVER_SPAN_NAME =
|
||||||
(context, pageName) -> {
|
(context, pageName) -> {
|
||||||
if (pageName == null) {
|
if (pageName == null) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,9 @@ package io.opentelemetry.javaagent.instrumentation.tomcat.common;
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
||||||
|
|
@ -39,7 +39,7 @@ public final class TomcatInstrumenterFactory {
|
||||||
.setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders())
|
.setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders())
|
||||||
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
|
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
|
||||||
.build())
|
.build())
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
.addContextCustomizer(
|
.addContextCustomizer(
|
||||||
(context, request, attributes) ->
|
(context, request, attributes) ->
|
||||||
new AppServerBridge.Builder()
|
new AppServerBridge.Builder()
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,9 @@ package io.opentelemetry.javaagent.instrumentation.undertow;
|
||||||
|
|
||||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
||||||
|
|
@ -37,7 +37,7 @@ public final class UndertowSingletons {
|
||||||
.setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders())
|
.setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders())
|
||||||
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
|
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods())
|
||||||
.build())
|
.build())
|
||||||
.addContextCustomizer(HttpRouteHolder.create(httpAttributesGetter))
|
.addContextCustomizer(HttpServerRoute.create(httpAttributesGetter))
|
||||||
.addContextCustomizer(
|
.addContextCustomizer(
|
||||||
(context, request, attributes) -> {
|
(context, request, attributes) -> {
|
||||||
// span is ended when counter reaches 0, we start from 2 which accounts for the
|
// span is ended when counter reaches 0, we start from 2 which accounts for the
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,8 @@ import com.vaadin.flow.component.UI;
|
||||||
import com.vaadin.flow.router.Location;
|
import com.vaadin.flow.router.Location;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
|
@ -42,10 +42,10 @@ public class VaadinHelper {
|
||||||
Context context, VaadinServiceRequest request, Throwable throwable) {
|
Context context, VaadinServiceRequest request, Throwable throwable) {
|
||||||
serviceInstrumenter.end(context, request, null, throwable);
|
serviceInstrumenter.end(context, request, null, throwable);
|
||||||
|
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
context,
|
context,
|
||||||
HttpRouteSource.CONTROLLER,
|
HttpServerRouteSource.CONTROLLER,
|
||||||
(c, req) -> getSpanNameForVaadinServiceContext(c, req),
|
VaadinHelper::getSpanNameForVaadinServiceContext,
|
||||||
request);
|
request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -107,9 +107,9 @@ public class VaadinHelper {
|
||||||
|
|
||||||
public void updateServerSpanName(Location location) {
|
public void updateServerSpanName(Location location) {
|
||||||
Context context = Context.current();
|
Context context = Context.current();
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
context,
|
context,
|
||||||
HttpRouteSource.NESTED_CONTROLLER,
|
HttpServerRouteSource.NESTED_CONTROLLER,
|
||||||
(c, loc) -> ServletContextPath.prepend(c, getSpanNameForLocation(loc)),
|
(c, loc) -> ServletContextPath.prepend(c, getSpanNameForLocation(loc)),
|
||||||
location);
|
location);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ package io.opentelemetry.javaagent.instrumentation.vertx;
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
|
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
|
||||||
import io.vertx.core.Handler;
|
import io.vertx.core.Handler;
|
||||||
import io.vertx.ext.web.RoutingContext;
|
import io.vertx.ext.web.RoutingContext;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
@ -29,8 +29,11 @@ public final class RoutingContextHandlerWrapper implements Handler<RoutingContex
|
||||||
@Override
|
@Override
|
||||||
public void handle(RoutingContext context) {
|
public void handle(RoutingContext context) {
|
||||||
Context otelContext = Context.current();
|
Context otelContext = Context.current();
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
otelContext, HttpRouteSource.CONTROLLER, RoutingContextHandlerWrapper::getRoute, context);
|
otelContext,
|
||||||
|
HttpServerRouteSource.CONTROLLER,
|
||||||
|
RoutingContextHandlerWrapper::getRoute,
|
||||||
|
context);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
handler.handle(context);
|
handler.handle(context);
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,11 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.wicket;
|
package io.opentelemetry.javaagent.instrumentation.wicket;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource.CONTROLLER;
|
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource.CONTROLLER;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
|
||||||
|
|
@ -39,7 +39,7 @@ public class RequestHandlerExecutorInstrumentation implements TypeInstrumentatio
|
||||||
@Advice.OnMethodEnter(suppress = Throwable.class)
|
@Advice.OnMethodEnter(suppress = Throwable.class)
|
||||||
public static void onExit(@Advice.Argument(0) IRequestHandler handler) {
|
public static void onExit(@Advice.Argument(0) IRequestHandler handler) {
|
||||||
if (handler instanceof IPageClassRequestHandler) {
|
if (handler instanceof IPageClassRequestHandler) {
|
||||||
HttpRouteHolder.updateHttpRoute(
|
HttpServerRoute.update(
|
||||||
Java8BytecodeBridge.currentContext(),
|
Java8BytecodeBridge.currentContext(),
|
||||||
CONTROLLER,
|
CONTROLLER,
|
||||||
WicketServerSpanNaming.SERVER_SPAN_NAME,
|
WicketServerSpanNaming.SERVER_SPAN_NAME,
|
||||||
|
|
|
||||||
|
|
@ -5,14 +5,14 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.wicket;
|
package io.opentelemetry.javaagent.instrumentation.wicket;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteGetter;
|
||||||
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
|
||||||
import org.apache.wicket.core.request.handler.IPageClassRequestHandler;
|
import org.apache.wicket.core.request.handler.IPageClassRequestHandler;
|
||||||
import org.apache.wicket.request.cycle.RequestCycle;
|
import org.apache.wicket.request.cycle.RequestCycle;
|
||||||
|
|
||||||
public final class WicketServerSpanNaming {
|
public final class WicketServerSpanNaming {
|
||||||
|
|
||||||
public static final HttpRouteGetter<IPageClassRequestHandler> SERVER_SPAN_NAME =
|
public static final HttpServerRouteGetter<IPageClassRequestHandler> SERVER_SPAN_NAME =
|
||||||
(context, handler) -> {
|
(context, handler) -> {
|
||||||
// using class name as page name
|
// using class name as page name
|
||||||
String pageName = handler.getPageClass().getName();
|
String pageName = handler.getPageClass().getName();
|
||||||
|
|
|
||||||
|
|
@ -18,9 +18,9 @@ import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
|
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesGetter;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesGetter;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.internal.SpanKey;
|
import io.opentelemetry.instrumentation.api.internal.SpanKey;
|
||||||
import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider;
|
import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider;
|
||||||
|
|
@ -51,7 +51,7 @@ final class TestInstrumenters {
|
||||||
// cover both semconv and span-kind strategies
|
// cover both semconv and span-kind strategies
|
||||||
.addAttributesExtractor(HttpServerAttributesExtractor.create(HttpServerGetter.INSTANCE))
|
.addAttributesExtractor(HttpServerAttributesExtractor.create(HttpServerGetter.INSTANCE))
|
||||||
.addAttributesExtractor(new SpanKeyAttributesExtractor(SpanKey.KIND_SERVER))
|
.addAttributesExtractor(new SpanKeyAttributesExtractor(SpanKey.KIND_SERVER))
|
||||||
.addContextCustomizer(HttpRouteHolder.create(HttpServerGetter.INSTANCE))
|
.addContextCustomizer(HttpServerRoute.create(HttpServerGetter.INSTANCE))
|
||||||
.buildInstrumenter(SpanKindExtractor.alwaysServer());
|
.buildInstrumenter(SpanKindExtractor.alwaysServer());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue