Raise gRPC version floor to 1.6 and use new context bridge API (#2948)
* Raise gRPC version floor to 1.6 and use new context bridge API * Drift * Drift
This commit is contained in:
parent
cd3dd581f9
commit
24998f5080
|
@ -20,14 +20,15 @@ muzzle {
|
|||
pass {
|
||||
group = "io.grpc"
|
||||
module = "grpc-core"
|
||||
versions = "[1.5.0,)"
|
||||
versions = "[1.6.0,)"
|
||||
assertInverse = true
|
||||
}
|
||||
}
|
||||
|
||||
def grpcVersion = '1.5.0'
|
||||
def grpcVersion = '1.6.0'
|
||||
|
||||
dependencies {
|
||||
implementation project(':instrumentation:grpc-1.5:library')
|
||||
implementation project(':instrumentation:grpc-1.6:library')
|
||||
|
||||
library group: 'io.grpc', name: 'grpc-core', version: grpcVersion
|
||||
|
||||
|
@ -36,7 +37,7 @@ dependencies {
|
|||
testLibrary group: 'io.grpc', name: 'grpc-services', version: grpcVersion
|
||||
testLibrary group: 'io.grpc', name: 'grpc-stub', version: grpcVersion
|
||||
|
||||
testImplementation project(':instrumentation:grpc-1.5:testing')
|
||||
testImplementation project(':instrumentation:grpc-1.6:testing')
|
||||
}
|
||||
|
||||
test {
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_6;
|
||||
|
||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass;
|
||||
import static io.opentelemetry.javaagent.extension.matcher.ClassLoaderMatcher.hasClassesNamed;
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_6;
|
||||
|
||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_6;
|
||||
|
||||
import static java.util.Arrays.asList;
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_6;
|
||||
|
||||
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.safeHasSuperType;
|
||||
import static io.opentelemetry.javaagent.extension.matcher.ClassLoaderMatcher.hasClassesNamed;
|
|
@ -3,15 +3,15 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_6;
|
||||
|
||||
import io.grpc.ClientInterceptor;
|
||||
import io.grpc.Context;
|
||||
import io.grpc.ServerInterceptor;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.instrumentation.api.config.Config;
|
||||
import io.opentelemetry.instrumentation.grpc.v1_5.GrpcTracing;
|
||||
import io.opentelemetry.instrumentation.grpc.v1_5.internal.ContextStorageBridge;
|
||||
import io.opentelemetry.instrumentation.grpc.v1_6.GrpcTracing;
|
||||
import io.opentelemetry.instrumentation.grpc.v1_6.internal.ContextStorageBridge;
|
||||
|
||||
// Holds singleton references.
|
||||
public final class GrpcSingletons {
|
|
@ -3,11 +3,11 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_5
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_6
|
||||
|
||||
import io.grpc.ManagedChannelBuilder
|
||||
import io.grpc.ServerBuilder
|
||||
import io.opentelemetry.instrumentation.grpc.v1_5.AbstractGrpcStreamingTest
|
||||
import io.opentelemetry.instrumentation.grpc.v1_6.AbstractGrpcStreamingTest
|
||||
import io.opentelemetry.instrumentation.test.AgentTestTrait
|
||||
|
||||
class GrpcStreamingTest extends AbstractGrpcStreamingTest implements AgentTestTrait {
|
|
@ -3,11 +3,11 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_5
|
||||
package io.opentelemetry.javaagent.instrumentation.grpc.v1_6
|
||||
|
||||
import io.grpc.ManagedChannelBuilder
|
||||
import io.grpc.ServerBuilder
|
||||
import io.opentelemetry.instrumentation.grpc.v1_5.AbstractGrpcTest
|
||||
import io.opentelemetry.instrumentation.grpc.v1_6.AbstractGrpcTest
|
||||
import io.opentelemetry.instrumentation.test.AgentTestTrait
|
||||
|
||||
class GrpcTest extends AbstractGrpcTest implements AgentTestTrait {
|
|
@ -1,6 +1,6 @@
|
|||
apply from: "$rootDir/gradle/instrumentation-library.gradle"
|
||||
|
||||
def grpcVersion = '1.5.0'
|
||||
def grpcVersion = '1.6.0'
|
||||
|
||||
dependencies {
|
||||
library group: 'io.grpc', name: 'grpc-core', version: grpcVersion
|
||||
|
@ -11,5 +11,5 @@ dependencies {
|
|||
testLibrary group: 'io.grpc', name: 'grpc-stub', version: grpcVersion
|
||||
|
||||
testImplementation deps.assertj
|
||||
testImplementation project(':instrumentation:grpc-1.5:testing')
|
||||
testImplementation project(':instrumentation:grpc-1.6:testing')
|
||||
}
|
|
@ -6,7 +6,7 @@
|
|||
package io.grpc.override;
|
||||
|
||||
import io.grpc.Context;
|
||||
import io.opentelemetry.instrumentation.grpc.v1_5.internal.ContextStorageBridge;
|
||||
import io.opentelemetry.instrumentation.grpc.v1_6.internal.ContextStorageBridge;
|
||||
|
||||
/**
|
||||
* Override class for gRPC to pick up this class to replace the default {@link Context.Storage} with
|
||||
|
@ -17,8 +17,8 @@ public final class ContextStorageOverride extends Context.Storage {
|
|||
private static final Context.Storage delegate = new ContextStorageBridge();
|
||||
|
||||
@Override
|
||||
public void attach(Context toAttach) {
|
||||
delegate.attach(toAttach);
|
||||
public Context doAttach(Context toAttach) {
|
||||
return delegate.doAttach(toAttach);
|
||||
}
|
||||
|
||||
@Override
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6;
|
||||
|
||||
import static io.opentelemetry.api.trace.SpanKind.CLIENT;
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6;
|
||||
|
||||
import io.grpc.Metadata;
|
||||
import io.opentelemetry.context.propagation.TextMapGetter;
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6;
|
||||
|
||||
import io.grpc.Status.Code;
|
||||
import io.opentelemetry.api.common.AttributeKey;
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6;
|
||||
|
||||
import io.grpc.Metadata;
|
||||
import io.opentelemetry.context.propagation.TextMapSetter;
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6;
|
||||
|
||||
import static io.opentelemetry.api.trace.SpanKind.SERVER;
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6;
|
||||
|
||||
import io.grpc.ClientInterceptor;
|
||||
import io.grpc.ServerInterceptor;
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
|
|
@ -3,9 +3,9 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6;
|
||||
|
||||
import static io.opentelemetry.instrumentation.grpc.v1_5.GrpcInjectAdapter.SETTER;
|
||||
import static io.opentelemetry.instrumentation.grpc.v1_6.GrpcInjectAdapter.SETTER;
|
||||
|
||||
import io.grpc.CallOptions;
|
||||
import io.grpc.Channel;
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6;
|
||||
|
||||
import io.grpc.Contexts;
|
||||
import io.grpc.ForwardingServerCall;
|
|
@ -3,15 +3,11 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5.internal;
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6.internal;
|
||||
|
||||
import io.grpc.Context;
|
||||
import io.opentelemetry.context.ContextKey;
|
||||
import io.opentelemetry.context.Scope;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.Deque;
|
||||
import java.util.Map;
|
||||
import java.util.WeakHashMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
|
@ -27,30 +23,19 @@ public final class ContextStorageBridge extends Context.Storage {
|
|||
private static final ContextKey<Context> GRPC_CONTEXT = ContextKey.named("grpc-context");
|
||||
private static final Context.Key<io.opentelemetry.context.Context> OTEL_CONTEXT =
|
||||
Context.key("otel-context");
|
||||
|
||||
// Because the extension point is void, there is no way to return information about the backing
|
||||
// OpenTelemetry context when attaching gRPC context. So the only option is to have this
|
||||
// side-channel to keep track of scopes. Because the same context can be attached to multiple
|
||||
// threads, we must use a ThreadLocal here - on the bright side it means the map doesn't have to
|
||||
// be concurrent. This will add an additional threadlocal lookup when attaching / detaching gRPC
|
||||
// context, but not when accessing the current. In many applications, this means a small
|
||||
// difference
|
||||
// since those operations are rare, but in highly reactive applications where the overhead of
|
||||
// ThreadLocal was already a problem, this makes it worse.
|
||||
private static final ThreadLocal<WeakHashMap<Context, Deque<Scope>>> contextScopes =
|
||||
ThreadLocal.withInitial(WeakHashMap::new);
|
||||
private static final Context.Key<Scope> OTEL_SCOPE = Context.key("otel-scope");
|
||||
|
||||
@Override
|
||||
public void attach(Context toAttach) {
|
||||
public Context doAttach(Context toAttach) {
|
||||
io.opentelemetry.context.Context otelContext = io.opentelemetry.context.Context.current();
|
||||
Context current = otelContext.get(GRPC_CONTEXT);
|
||||
|
||||
if (current == null) {
|
||||
current = Context.ROOT;
|
||||
}
|
||||
|
||||
if (current == toAttach) {
|
||||
contextScopes
|
||||
.get()
|
||||
.computeIfAbsent(toAttach, unused -> new ArrayDeque<>())
|
||||
.addLast(Scope.noop());
|
||||
return;
|
||||
return current.withValue(OTEL_SCOPE, Scope.noop());
|
||||
}
|
||||
|
||||
io.opentelemetry.context.Context base = OTEL_CONTEXT.get(toAttach);
|
||||
|
@ -69,7 +54,7 @@ public final class ContextStorageBridge extends Context.Storage {
|
|||
}
|
||||
|
||||
Scope scope = newOtelContext.makeCurrent();
|
||||
contextScopes.get().computeIfAbsent(toAttach, unused -> new ArrayDeque<>()).addLast(scope);
|
||||
return current.withValue(OTEL_SCOPE, scope);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -85,9 +70,8 @@ public final class ContextStorageBridge extends Context.Storage {
|
|||
"Context was not attached when detaching",
|
||||
new Throwable().fillInStackTrace());
|
||||
}
|
||||
Map<Context, Deque<Scope>> contextStacks = contextScopes.get();
|
||||
Deque<Scope> stack = contextStacks.get(toDetach);
|
||||
Scope scope = stack.pollLast();
|
||||
|
||||
Scope scope = OTEL_SCOPE.get(toRestore);
|
||||
if (scope == null) {
|
||||
logger.log(
|
||||
Level.SEVERE,
|
||||
|
@ -96,9 +80,6 @@ public final class ContextStorageBridge extends Context.Storage {
|
|||
} else {
|
||||
scope.close();
|
||||
}
|
||||
if (stack.isEmpty()) {
|
||||
contextStacks.remove(toDetach);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6
|
||||
|
||||
import io.grpc.Status
|
||||
import io.opentelemetry.api.trace.StatusCode
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6
|
||||
|
||||
import io.grpc.ManagedChannelBuilder
|
||||
import io.grpc.ServerBuilder
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6
|
||||
|
||||
import io.grpc.ManagedChannelBuilder
|
||||
import io.grpc.ServerBuilder
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5;
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
|
@ -5,7 +5,7 @@ plugins {
|
|||
|
||||
apply from: "$rootDir/gradle/java.gradle"
|
||||
|
||||
def grpcVersion = '1.5.0'
|
||||
def grpcVersion = '1.6.0'
|
||||
|
||||
protobuf {
|
||||
protoc {
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6
|
||||
|
||||
import static io.opentelemetry.api.trace.SpanKind.CLIENT
|
||||
import static io.opentelemetry.api.trace.SpanKind.SERVER
|
|
@ -3,7 +3,7 @@
|
|||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.instrumentation.grpc.v1_5
|
||||
package io.opentelemetry.instrumentation.grpc.v1_6
|
||||
|
||||
import static io.opentelemetry.api.trace.SpanKind.CLIENT
|
||||
import static io.opentelemetry.api.trace.SpanKind.SERVER
|
|
@ -114,9 +114,9 @@ include ':instrumentation:geode-1.4:javaagent'
|
|||
include ':instrumentation:google-http-client-1.19:javaagent'
|
||||
include ':instrumentation:grails-3.0:javaagent'
|
||||
include ':instrumentation:grizzly-2.0:javaagent'
|
||||
include ':instrumentation:grpc-1.5:javaagent'
|
||||
include ':instrumentation:grpc-1.5:library'
|
||||
include ':instrumentation:grpc-1.5:testing'
|
||||
include ':instrumentation:grpc-1.6:javaagent'
|
||||
include ':instrumentation:grpc-1.6:library'
|
||||
include ':instrumentation:grpc-1.6:testing'
|
||||
include ':instrumentation:guava-10.0:javaagent'
|
||||
include ':instrumentation:guava-10.0:library'
|
||||
include ':instrumentation:gwt-2.0:javaagent'
|
||||
|
|
Loading…
Reference in New Issue