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:
Trask Stalnaker 2020-11-24 12:07:10 -08:00 committed by GitHub
parent 889bce0976
commit a5a36bd203
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 39 additions and 46 deletions

View File

@ -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";

View File

@ -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";

View File

@ -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

View File

@ -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;
} }

View File

@ -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);
} }
} }

View File

@ -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();
} }

View File

@ -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

View File

@ -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;
} }

View File

@ -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());
} }
} }

View File

@ -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();
} }

View File

@ -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'
} }

View File

@ -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"
}; };
} }

View File

@ -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.

View File

@ -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);
} }
} }
} }

View File

@ -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());