Limit netty exception capture to netty spans (#3809)

* Limit Netty exception capture to Netty span

* Rename constant

* Fix var name

* Apply to netty-4.0 also
This commit is contained in:
Trask Stalnaker 2021-08-10 20:58:37 -07:00 committed by GitHub
parent b2609d0f40
commit 1889c1adfb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 28 additions and 30 deletions

View File

@ -15,7 +15,6 @@ import io.netty.util.Attribute;
import io.opentelemetry.context.Context;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.client.NettyHttpClientTracer;
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.NettyHttpServerTracer;
import net.bytebuddy.asm.Advice;
@ -49,16 +48,18 @@ public class AbstractChannelHandlerContextInstrumentation implements TypeInstrum
public static void onEnter(
@Advice.This ChannelHandlerContext channelContext,
@Advice.Argument(0) Throwable throwable) {
if (throwable != null) {
Attribute<Context> clientContextAttr =
channelContext.channel().attr(AttributeKeys.CLIENT_CONTEXT);
Context context = clientContextAttr.get();
if (context != null) {
NettyHttpClientTracer.tracer().endExceptionally(context, throwable);
} else {
NettyHttpServerTracer.tracer()
.onException(Java8BytecodeBridge.currentContext(), throwable);
}
Attribute<Context> clientContextAttr =
channelContext.channel().attr(AttributeKeys.CLIENT_CONTEXT);
Context clientContext = clientContextAttr.get();
if (clientContext != null) {
NettyHttpClientTracer.tracer().endExceptionally(clientContext, throwable);
return;
}
Attribute<Context> serverContextAttr =
channelContext.channel().attr(AttributeKeys.SERVER_CONTEXT);
Context serverContext = serverContextAttr.get();
if (serverContext != null) {
NettyHttpServerTracer.tracer().onException(serverContext, throwable);
}
}
}

View File

@ -24,8 +24,8 @@ public class AttributeKeys {
attributeKey(AttributeKeys.class.getName() + ".write-context");
// this is the context that has the server span
public static final AttributeKey<Context> SERVER_SPAN =
attributeKey(AttributeKeys.class.getName() + ".server-span");
public static final AttributeKey<Context> SERVER_CONTEXT =
attributeKey(AttributeKeys.class.getName() + ".server-context");
public static final AttributeKey<Context> CLIENT_CONTEXT =
attributeKey(AttributeKeys.class.getName() + ".client-context");

View File

@ -43,12 +43,12 @@ public class NettyHttpServerTracer
@Override
protected void attachServerContext(Context context, Channel channel) {
channel.attr(AttributeKeys.SERVER_SPAN).set(context);
channel.attr(AttributeKeys.SERVER_CONTEXT).set(context);
}
@Override
public Context getServerContext(Channel channel) {
return channel.attr(AttributeKeys.SERVER_SPAN).get();
return channel.attr(AttributeKeys.SERVER_CONTEXT).get();
}
@Override

View File

@ -15,9 +15,7 @@ import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.netty.v4_1.AttributeKeys;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.NettyHttpClientTracer;
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.NettyHttpServerTracer;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
@ -46,15 +44,14 @@ public class AbstractChannelHandlerContextInstrumentation implements TypeInstrum
public static void onEnter(
@Advice.This ChannelHandlerContext channelContext,
@Advice.Argument(0) Throwable throwable) {
if (throwable != null) {
if (channelContext.channel().hasAttr(AttributeKeys.CLIENT_CONTEXT)) {
Attribute<Context> clientContextAttr =
channelContext.channel().attr(AttributeKeys.CLIENT_CONTEXT);
NettyHttpClientTracer.tracer().endExceptionally(clientContextAttr.get(), throwable);
} else {
NettyHttpServerTracer.tracer()
.onException(Java8BytecodeBridge.currentContext(), throwable);
}
if (channelContext.channel().hasAttr(AttributeKeys.CLIENT_CONTEXT)) {
Attribute<Context> clientContextAttr =
channelContext.channel().attr(AttributeKeys.CLIENT_CONTEXT);
NettyHttpClientTracer.tracer().endExceptionally(clientContextAttr.get(), throwable);
} else if (channelContext.channel().hasAttr(AttributeKeys.SERVER_CONTEXT)) {
Attribute<Context> serverContextAttr =
channelContext.channel().attr(AttributeKeys.SERVER_CONTEXT);
NettyHttpClientTracer.tracer().onException(serverContextAttr.get(), throwable);
}
}
}

View File

@ -43,12 +43,12 @@ public class NettyHttpServerTracer
@Override
protected void attachServerContext(Context context, Channel channel) {
channel.attr(AttributeKeys.SERVER_SPAN).set(context);
channel.attr(AttributeKeys.SERVER_CONTEXT).set(context);
}
@Override
public Context getServerContext(Channel channel) {
return channel.attr(AttributeKeys.SERVER_SPAN).get();
return channel.attr(AttributeKeys.SERVER_CONTEXT).get();
}
@Override

View File

@ -16,7 +16,7 @@ public final class AttributeKeys {
// this is the context that has the server span
//
// note: this attribute key is also used by ratpack instrumentation
public static final AttributeKey<Context> SERVER_SPAN =
public static final AttributeKey<Context> SERVER_CONTEXT =
AttributeKey.valueOf(AttributeKeys.class, "server-span");
public static final AttributeKey<Context> CLIENT_CONTEXT =

View File

@ -21,7 +21,7 @@ public final class TracingHandler implements Handler {
@Override
public void handle(Context ctx) {
Attribute<io.opentelemetry.context.Context> spanAttribute =
ctx.getDirectChannelAccess().getChannel().attr(AttributeKeys.SERVER_SPAN);
ctx.getDirectChannelAccess().getChannel().attr(AttributeKeys.SERVER_CONTEXT);
io.opentelemetry.context.Context serverSpanContext = spanAttribute.get();
// Must use context from channel, as executor instrumentation is not accurate - Ratpack