Fix gRPC Context shading (#297)

This commit is contained in:
Trask Stalnaker 2020-03-31 15:30:42 -07:00 committed by GitHub
parent d80af336dd
commit 64b9585306
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 2 deletions

View File

@ -53,4 +53,11 @@ dependencies {
latestDepTestCompile group: 'io.grpc', name: 'grpc-netty', version: '+' latestDepTestCompile group: 'io.grpc', name: 'grpc-netty', version: '+'
latestDepTestCompile group: 'io.grpc', name: 'grpc-protobuf', version: '+' latestDepTestCompile group: 'io.grpc', name: 'grpc-protobuf', version: '+'
latestDepTestCompile group: 'io.grpc', name: 'grpc-stub', version: '+' latestDepTestCompile group: 'io.grpc', name: 'grpc-stub', version: '+'
// this instrumentation needs to be able to be able to reference the OpenTelemetry API's gRPC Context
// that is shaded in the bootstrap class loader (for sending telemetry to the agent),
// separately from the gRPC Context that is brought by gRPC
compileOnly project(path: ':opentelemetry-api-shaded-for-instrumenting', configuration: 'shadow')
testCompile project(path: ':opentelemetry-api-shaded-for-instrumenting', configuration: 'shadow')
} }

View File

@ -86,6 +86,11 @@ public class TracingClientInterceptor implements ClientInterceptor {
@Override @Override
public void start(final Listener<RespT> responseListener, final Metadata headers) { public void start(final Listener<RespT> responseListener, final Metadata headers) {
// this reference to io.grpc.Context will be shaded during the build
// see instrumentation.gradle: "relocate OpenTelemetry API dependency usage"
// (luckily the grpc instrumentation doesn't need to reference unshaded grpc Context, so we
// don't need to worry about distinguishing them like in the opentelemetry-api
// instrumentation)
final Context context = withSpan(span, Context.current()); final Context context = withSpan(span, Context.current());
OpenTelemetry.getPropagators().getHttpTextFormat().inject(context, headers, SETTER); OpenTelemetry.getPropagators().getHttpTextFormat().inject(context, headers, SETTER);
try (final Scope scope = currentContextWith(span)) { try (final Scope scope = currentContextWith(span)) {

View File

@ -94,9 +94,10 @@ shadowJar {
relocate "io.opentelemetry.metrics", "io.opentelemetry.auto.shaded.io.opentelemetry.metrics" relocate "io.opentelemetry.metrics", "io.opentelemetry.auto.shaded.io.opentelemetry.metrics"
relocate "io.opentelemetry.trace", "io.opentelemetry.auto.shaded.io.opentelemetry.trace" relocate "io.opentelemetry.trace", "io.opentelemetry.auto.shaded.io.opentelemetry.trace"
// relocate OpenTelemetry API dependency // relocate OpenTelemetry API dependency usage
relocate "io.grpc", "io.opentelemetry.auto.shaded.io.grpc" relocate "io.grpc.Context", "io.opentelemetry.auto.shaded.io.grpc.Context"
// this is for instrumentation on opentelemetry-api itself // this is for instrumentation on opentelemetry-api itself
relocate "unshaded.io.opentelemetry", "io.opentelemetry" relocate "unshaded.io.opentelemetry", "io.opentelemetry"
relocate "unshaded.io.grpc", "io.grpc"
} }