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

View File

@ -27,11 +27,15 @@ import software.amazon.awssdk.core.interceptor.SdkExecutionAttribute;
/** AWS request execution interceptor. */
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 =
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 =
new ExecutionAttribute<>("io.opentelemetry.auto.aws.RequestType");
new ExecutionAttribute<>(TracingExecutionInterceptor.class.getName() + ".RequestType");
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.context.Context;
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.ConcurrentMap;
@ -26,17 +24,17 @@ public class AttributeKeys {
}
};
public static final AttributeKey<Context> PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY =
attributeKey("io.opentelemetry.javaagent.instrumentation.netty.v4_0.parent.connect.context");
public static final AttributeKey<Context> CONNECT_CONTEXT_ATTRIBUTE_KEY =
attributeKey(AttributeKeys.class.getName() + ".connect.context");
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 =
attributeKey(HttpClientTracingHandler.class.getName() + ".span");
attributeKey(AttributeKeys.class.getName() + ".span");
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

View File

@ -59,7 +59,7 @@ final class ChannelFutureListenerInstrumentation implements TypeInstrumentation
return null;
}
Context parentContext =
future.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
future.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
if (parentContext == null) {
return null;
}

View File

@ -124,7 +124,7 @@ final class NettyChannelPipelineInstrumentation implements TypeInstrumentation {
public static void addParentSpan(@Advice.This ChannelPipeline pipeline) {
Context context = Java8BytecodeBridge.currentContext();
Attribute<Context> attribute =
pipeline.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY);
pipeline.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY);
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
Scope parentScope = null;
Context parentContext =
ctx.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
ctx.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
if (parentContext != null) {
parentScope = parentContext.makeCurrent();
}

View File

@ -9,8 +9,6 @@ import io.netty.util.AttributeKey;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
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.ConcurrentMap;
@ -26,23 +24,18 @@ public class AttributeKeys {
}
};
public static final AttributeKey<Context> PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY =
attributeKey("io.opentelemetry.javaagent.instrumentation.netty.v4_1.parent.connect.context");
public static final AttributeKey<Context> CONNECT_CONTEXT_ATTRIBUTE_KEY =
attributeKey(AttributeKeys.class.getName() + "connect.context");
/**
* This constant is copied over to
* io.opentelemetry.javaagent.instrumentation.ratpack.server.TracingHandler, so if this changes,
* that must also change.
*/
// this attribute key is also used by ratpack instrumentation
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 =
attributeKey(HttpClientTracingHandler.class.getName() + ".span");
attributeKey(AttributeKeys.class.getName() + ".span");
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

View File

@ -59,7 +59,7 @@ final class ChannelFutureListenerInstrumentation implements TypeInstrumentation
return null;
}
Context parentContext =
future.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
future.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
if (parentContext == null) {
return null;
}

View File

@ -132,7 +132,7 @@ final class NettyChannelPipelineInstrumentation implements TypeInstrumentation {
@Advice.OnMethodEnter
public static void addParentSpan(@Advice.This ChannelPipeline pipeline) {
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());
}
}

View File

@ -30,7 +30,7 @@ public class HttpClientRequestTracingHandler extends ChannelOutboundHandlerAdapt
// TODO pass Context into Tracer.startSpan() and then don't need this scoping
Scope parentScope = null;
Context parentContext =
ctx.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
ctx.channel().attr(AttributeKeys.CONNECT_CONTEXT_ATTRIBUTE_KEY).getAndRemove();
if (parentContext != null) {
parentScope = parentContext.makeCurrent();
}

View File

@ -12,8 +12,9 @@ muzzle {
dependencies {
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'
testImplementation project(':instrumentation:netty:netty-4.1')
if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) {
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 + ".RatpackTracer",
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 io.netty.util.Attribute;
import io.netty.util.AttributeKey;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Span.Kind;
import io.opentelemetry.context.Scope;
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.AttributeKeys;
import ratpack.handling.Context;
import ratpack.handling.Handler;
public final class TracingHandler implements Handler {
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
public void handle(Context ctx) {
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();
// 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
implements BiFunction<Mono<? extends Connection>, Bootstrap, Mono<? extends Connection>> {
static final String CONTEXT_ATTRIBUTE = MapConnect.class.getName() + ".Context";
@Override
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> {
@Override
public void accept(HttpClientRequest r, Connection c) {
Context context = r.currentContext().get("otel_context");
c.channel().attr(AttributeKeys.PARENT_CONNECT_CONTEXT_ATTRIBUTE_KEY).set(context);
Context context = r.currentContext().get(MapConnect.CONTEXT_ATTRIBUTE);
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 static final String CONTEXT_ATTRIBUTE =
"io.opentelemetry.javaagent.instrumentation.springwebflux.Context";
public static final String CONTEXT_ATTRIBUTE = AdviceUtils.class.getName() + ".Context";
public static String parseOperationName(Object handler) {
String className = tracer().spanNameForClass(handler.getClass());