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:
Anuraag Agrawal 2021-05-10 16:33:48 +09:00 committed by GitHub
parent cd3dd581f9
commit 24998f5080
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 52 additions and 70 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -5,7 +5,7 @@ plugins {
apply from: "$rootDir/gradle/java.gradle"
def grpcVersion = '1.5.0'
def grpcVersion = '1.6.0'
protobuf {
protoc {

View File

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

View File

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

View File

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