Use namespace for attributes put into user classes (#1739)
* Use namespace for attributes put into user classes * Add dependency to remove duplication
This commit is contained in:
parent
889bce0976
commit
a5a36bd203
|
@ -30,7 +30,9 @@ public abstract class HttpServerTracer<REQUEST, RESPONSE, CONNECTION, STORAGE> e
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(HttpServerTracer.class);
|
private static final Logger log = LoggerFactory.getLogger(HttpServerTracer.class);
|
||||||
|
|
||||||
public static final String CONTEXT_ATTRIBUTE = "io.opentelemetry.instrumentation.context";
|
// the class name is part of the attribute name, so that it will be shaded when used in javaagent
|
||||||
|
// instrumentation, and won't conflict with usage outside javaagent instrumentation
|
||||||
|
public static final String CONTEXT_ATTRIBUTE = HttpServerTracer.class.getName() + ".Context";
|
||||||
|
|
||||||
protected static final String USER_AGENT = "User-Agent";
|
protected static final String USER_AGENT = "User-Agent";
|
||||||
|
|
||||||
|
|
|
@ -27,11 +27,15 @@ import software.amazon.awssdk.core.interceptor.SdkExecutionAttribute;
|
||||||
/** AWS request execution interceptor. */
|
/** AWS request execution interceptor. */
|
||||||
final class TracingExecutionInterceptor implements ExecutionInterceptor {
|
final class TracingExecutionInterceptor implements ExecutionInterceptor {
|
||||||
|
|
||||||
|
// the class name is part of the attribute name, so that it will be shaded when used in javaagent
|
||||||
|
// instrumentation, and won't conflict with usage outside javaagent instrumentation
|
||||||
static final ExecutionAttribute<io.opentelemetry.context.Context> CONTEXT_ATTRIBUTE =
|
static final ExecutionAttribute<io.opentelemetry.context.Context> CONTEXT_ATTRIBUTE =
|
||||||
new ExecutionAttribute<>("io.opentelemetry.auto.Context");
|
new ExecutionAttribute<>(TracingExecutionInterceptor.class.getName() + ".Context");
|
||||||
|
|
||||||
|
// the class name is part of the attribute name, so that it will be shaded when used in javaagent
|
||||||
|
// instrumentation, and won't conflict with usage outside javaagent instrumentation
|
||||||
static final ExecutionAttribute<RequestType> REQUEST_TYPE_ATTRIBUTE =
|
static final ExecutionAttribute<RequestType> REQUEST_TYPE_ATTRIBUTE =
|
||||||
new ExecutionAttribute<>("io.opentelemetry.auto.aws.RequestType");
|
new ExecutionAttribute<>(TracingExecutionInterceptor.class.getName() + ".RequestType");
|
||||||
|
|
||||||
static final String COMPONENT_NAME = "java-aws-sdk";
|
static final String COMPONENT_NAME = "java-aws-sdk";
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,6 @@ import io.netty.util.AttributeKey;
|
||||||
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.javaagent.instrumentation.api.WeakMap;
|
import io.opentelemetry.javaagent.instrumentation.api.WeakMap;
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.client.HttpClientTracingHandler;
|
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.HttpServerTracingHandler;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
|
|
||||||
|
@ -26,17 +24,17 @@ public class AttributeKeys {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final AttributeKey<Context> PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY =
|
public static final AttributeKey<Context> CONNECT_CONTEXT_ATTRIBUTE_KEY =
|
||||||
attributeKey("io.opentelemetry.javaagent.instrumentation.netty.v4_0.parent.connect.context");
|
attributeKey(AttributeKeys.class.getName() + ".connect.context");
|
||||||
|
|
||||||
public static final AttributeKey<Context> SERVER_ATTRIBUTE_KEY =
|
public static final AttributeKey<Context> SERVER_ATTRIBUTE_KEY =
|
||||||
attributeKey(HttpServerTracingHandler.class.getName() + ".context");
|
attributeKey(AttributeKeys.class.getName() + ".context");
|
||||||
|
|
||||||
public static final AttributeKey<Span> CLIENT_ATTRIBUTE_KEY =
|
public static final AttributeKey<Span> CLIENT_ATTRIBUTE_KEY =
|
||||||
attributeKey(HttpClientTracingHandler.class.getName() + ".span");
|
attributeKey(AttributeKeys.class.getName() + ".span");
|
||||||
|
|
||||||
public static final AttributeKey<Context> CLIENT_PARENT_ATTRIBUTE_KEY =
|
public static final AttributeKey<Context> CLIENT_PARENT_ATTRIBUTE_KEY =
|
||||||
attributeKey(HttpClientTracingHandler.class.getName() + ".parent");
|
attributeKey(AttributeKeys.class.getName() + ".parent");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate an attribute key or reuse the one existing in the global app map. This implementation
|
* Generate an attribute key or reuse the one existing in the global app map. This implementation
|
||||||
|
|
|
@ -59,7 +59,7 @@ final class ChannelFutureListenerInstrumentation implements TypeInstrumentation
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
Context parentContext =
|
Context parentContext =
|
||||||
future.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
|
future.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
|
||||||
if (parentContext == null) {
|
if (parentContext == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,7 +124,7 @@ final class NettyChannelPipelineInstrumentation implements TypeInstrumentation {
|
||||||
public static void addParentSpan(@Advice.This ChannelPipeline pipeline) {
|
public static void addParentSpan(@Advice.This ChannelPipeline pipeline) {
|
||||||
Context context = Java8BytecodeBridge.currentContext();
|
Context context = Java8BytecodeBridge.currentContext();
|
||||||
Attribute<Context> attribute =
|
Attribute<Context> attribute =
|
||||||
pipeline.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY);
|
pipeline.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY);
|
||||||
attribute.compareAndSet(null, context);
|
attribute.compareAndSet(null, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ public class HttpClientRequestTracingHandler extends ChannelOutboundHandlerAdapt
|
||||||
// TODO pass Context into Tracer.startSpan() and then don't need this scoping
|
// TODO pass Context into Tracer.startSpan() and then don't need this scoping
|
||||||
Scope parentScope = null;
|
Scope parentScope = null;
|
||||||
Context parentContext =
|
Context parentContext =
|
||||||
ctx.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
|
ctx.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
|
||||||
if (parentContext != null) {
|
if (parentContext != null) {
|
||||||
parentScope = parentContext.makeCurrent();
|
parentScope = parentContext.makeCurrent();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,6 @@ import io.netty.util.AttributeKey;
|
||||||
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.javaagent.instrumentation.api.WeakMap;
|
import io.opentelemetry.javaagent.instrumentation.api.WeakMap;
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.HttpClientTracingHandler;
|
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.HttpServerTracingHandler;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
|
|
||||||
|
@ -26,23 +24,18 @@ public class AttributeKeys {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final AttributeKey<Context> PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY =
|
public static final AttributeKey<Context> CONNECT_CONTEXT_ATTRIBUTE_KEY =
|
||||||
attributeKey("io.opentelemetry.javaagent.instrumentation.netty.v4_1.parent.connect.context");
|
attributeKey(AttributeKeys.class.getName() + "connect.context");
|
||||||
|
|
||||||
/**
|
// this attribute key is also used by ratpack instrumentation
|
||||||
* This constant is copied over to
|
|
||||||
* io.opentelemetry.javaagent.instrumentation.ratpack.server.TracingHandler, so if this changes,
|
|
||||||
* that must also change.
|
|
||||||
*/
|
|
||||||
public static final AttributeKey<Context> SERVER_ATTRIBUTE_KEY =
|
public static final AttributeKey<Context> SERVER_ATTRIBUTE_KEY =
|
||||||
attributeKey(HttpServerTracingHandler.class.getName() + ".context");
|
attributeKey(AttributeKeys.class.getName() + ".context");
|
||||||
|
|
||||||
// TODO understand and change to context
|
|
||||||
public static final AttributeKey<Span> CLIENT_ATTRIBUTE_KEY =
|
public static final AttributeKey<Span> CLIENT_ATTRIBUTE_KEY =
|
||||||
attributeKey(HttpClientTracingHandler.class.getName() + ".span");
|
attributeKey(AttributeKeys.class.getName() + ".span");
|
||||||
|
|
||||||
public static final AttributeKey<Context> CLIENT_PARENT_ATTRIBUTE_KEY =
|
public static final AttributeKey<Context> CLIENT_PARENT_ATTRIBUTE_KEY =
|
||||||
attributeKey(HttpClientTracingHandler.class.getName() + ".parent");
|
attributeKey(AttributeKeys.class.getName() + ".parent");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate an attribute key or reuse the one existing in the global app map. This implementation
|
* Generate an attribute key or reuse the one existing in the global app map. This implementation
|
||||||
|
|
|
@ -59,7 +59,7 @@ final class ChannelFutureListenerInstrumentation implements TypeInstrumentation
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
Context parentContext =
|
Context parentContext =
|
||||||
future.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
|
future.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
|
||||||
if (parentContext == null) {
|
if (parentContext == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,7 +132,7 @@ final class NettyChannelPipelineInstrumentation implements TypeInstrumentation {
|
||||||
@Advice.OnMethodEnter
|
@Advice.OnMethodEnter
|
||||||
public static void addParentSpan(@Advice.This ChannelPipeline pipeline) {
|
public static void addParentSpan(@Advice.This ChannelPipeline pipeline) {
|
||||||
Attribute<Context> attribute =
|
Attribute<Context> attribute =
|
||||||
pipeline.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY);
|
pipeline.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY);
|
||||||
attribute.compareAndSet(null, Java8BytecodeBridge.currentContext());
|
attribute.compareAndSet(null, Java8BytecodeBridge.currentContext());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ public class HttpClientRequestTracingHandler extends ChannelOutboundHandlerAdapt
|
||||||
// TODO pass Context into Tracer.startSpan() and then don't need this scoping
|
// TODO pass Context into Tracer.startSpan() and then don't need this scoping
|
||||||
Scope parentScope = null;
|
Scope parentScope = null;
|
||||||
Context parentContext =
|
Context parentContext =
|
||||||
ctx.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
|
ctx.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
|
||||||
if (parentContext != null) {
|
if (parentContext != null) {
|
||||||
parentScope = parentContext.makeCurrent();
|
parentScope = parentContext.makeCurrent();
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,8 +12,9 @@ muzzle {
|
||||||
dependencies {
|
dependencies {
|
||||||
library group: 'io.ratpack', name: 'ratpack-core', version: '1.4.0'
|
library group: 'io.ratpack', name: 'ratpack-core', version: '1.4.0'
|
||||||
|
|
||||||
|
implementation project(':instrumentation:netty:netty-4.1')
|
||||||
|
|
||||||
testLibrary group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.4.0'
|
testLibrary group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.4.0'
|
||||||
testImplementation project(':instrumentation:netty:netty-4.1')
|
|
||||||
if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) {
|
if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) {
|
||||||
testImplementation group: 'com.sun.activation', name: 'jakarta.activation', version: '1.2.2'
|
testImplementation group: 'com.sun.activation', name: 'jakarta.activation', version: '1.2.2'
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,8 @@ public class RatpackInstrumentationModule extends InstrumentationModule {
|
||||||
packageName + ".BlockWrapper",
|
packageName + ".BlockWrapper",
|
||||||
packageName + ".RatpackTracer",
|
packageName + ".RatpackTracer",
|
||||||
packageName + ".TracingHandler",
|
packageName + ".TracingHandler",
|
||||||
|
"io.opentelemetry.javaagent.instrumentation.netty.v4_1.AttributeKeys",
|
||||||
|
"io.opentelemetry.javaagent.instrumentation.netty.v4_1.AttributeKeys$1"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,29 +8,20 @@ package io.opentelemetry.javaagent.instrumentation.ratpack;
|
||||||
import static io.opentelemetry.javaagent.instrumentation.ratpack.RatpackTracer.tracer;
|
import static io.opentelemetry.javaagent.instrumentation.ratpack.RatpackTracer.tracer;
|
||||||
|
|
||||||
import io.netty.util.Attribute;
|
import io.netty.util.Attribute;
|
||||||
import io.netty.util.AttributeKey;
|
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.api.trace.Span.Kind;
|
import io.opentelemetry.api.trace.Span.Kind;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
|
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.AttributeKeys;
|
||||||
import ratpack.handling.Context;
|
import ratpack.handling.Context;
|
||||||
import ratpack.handling.Handler;
|
import ratpack.handling.Handler;
|
||||||
|
|
||||||
public final class TracingHandler implements Handler {
|
public final class TracingHandler implements Handler {
|
||||||
public static final Handler INSTANCE = new TracingHandler();
|
public static final Handler INSTANCE = new TracingHandler();
|
||||||
|
|
||||||
/**
|
|
||||||
* This constant is copied over from
|
|
||||||
* io.opentelemetry.javaagent.instrumentation.netty.v4_1.AttributeKeys. The key string must be
|
|
||||||
* kept consistent.
|
|
||||||
*/
|
|
||||||
public static final AttributeKey<io.opentelemetry.context.Context> SERVER_ATTRIBUTE_KEY =
|
|
||||||
AttributeKey.valueOf(
|
|
||||||
"io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.HttpServerTracingHandler.context");
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle(Context ctx) {
|
public void handle(Context ctx) {
|
||||||
Attribute<io.opentelemetry.context.Context> spanAttribute =
|
Attribute<io.opentelemetry.context.Context> spanAttribute =
|
||||||
ctx.getDirectChannelAccess().getChannel().attr(SERVER_ATTRIBUTE_KEY);
|
ctx.getDirectChannelAccess().getChannel().attr(AttributeKeys.SERVER_ATTRIBUTE_KEY);
|
||||||
io.opentelemetry.context.Context serverSpanContext = spanAttribute.get();
|
io.opentelemetry.context.Context serverSpanContext = spanAttribute.get();
|
||||||
|
|
||||||
// Relying on executor instrumentation to assume the netty span is in context as the parent.
|
// Relying on executor instrumentation to assume the netty span is in context as the parent.
|
||||||
|
|
|
@ -103,17 +103,20 @@ public final class ReactorNettyInstrumentationModule extends InstrumentationModu
|
||||||
|
|
||||||
public static class MapConnect
|
public static class MapConnect
|
||||||
implements BiFunction<Mono<? extends Connection>, Bootstrap, Mono<? extends Connection>> {
|
implements BiFunction<Mono<? extends Connection>, Bootstrap, Mono<? extends Connection>> {
|
||||||
|
|
||||||
|
static final String CONTEXT_ATTRIBUTE = MapConnect.class.getName() + ".Context";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<? extends Connection> apply(Mono<? extends Connection> m, Bootstrap b) {
|
public Mono<? extends Connection> apply(Mono<? extends Connection> m, Bootstrap b) {
|
||||||
return m.subscriberContext(s -> s.put("otel_context", Context.current()));
|
return m.subscriberContext(s -> s.put(CONTEXT_ATTRIBUTE, Context.current()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class OnRequest implements BiConsumer<HttpClientRequest, Connection> {
|
public static class OnRequest implements BiConsumer<HttpClientRequest, Connection> {
|
||||||
@Override
|
@Override
|
||||||
public void accept(HttpClientRequest r, Connection c) {
|
public void accept(HttpClientRequest r, Connection c) {
|
||||||
Context context = r.currentContext().get("otel_context");
|
Context context = r.currentContext().get(MapConnect.CONTEXT_ATTRIBUTE);
|
||||||
c.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY).set(context);
|
c.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY).set(context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,7 @@ import reactor.util.context.Context;
|
||||||
|
|
||||||
public class AdviceUtils {
|
public class AdviceUtils {
|
||||||
|
|
||||||
public static final String CONTEXT_ATTRIBUTE =
|
public static final String CONTEXT_ATTRIBUTE = AdviceUtils.class.getName() + ".Context";
|
||||||
"io.opentelemetry.javaagent.instrumentation.springwebflux.Context";
|
|
||||||
|
|
||||||
public static String parseOperationName(Object handler) {
|
public static String parseOperationName(Object handler) {
|
||||||
String className = tracer().spanNameForClass(handler.getClass());
|
String className = tracer().spanNameForClass(handler.getClass());
|
||||||
|
|
Loading…
Reference in New Issue