
io.opentelemetry.javaagent.instrumentation.grpc.v1_5.GrpcClientBuilderBuildInstrumentation Maven / Gradle / Ivy
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.grpc.v1_5;
import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed;
import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.declaresField;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.named;
import io.grpc.ClientInterceptor;
import io.opentelemetry.instrumentation.grpc.v1_5.client.TracingClientInterceptor;
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
import java.util.List;
import java.util.Map;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
public class GrpcClientBuilderBuildInstrumentation implements TypeInstrumentation {
@Override
public ElementMatcher classLoaderOptimization() {
return hasClassesNamed("io.grpc.ManagedChannelBuilder");
}
@Override
public ElementMatcher typeMatcher() {
return extendsClass(named("io.grpc.ManagedChannelBuilder"))
.and(declaresField(named("interceptors")));
}
@Override
public Map extends ElementMatcher super MethodDescription>, String> transformers() {
return singletonMap(
isMethod().and(named("build")),
GrpcClientBuilderBuildInstrumentation.class.getName() + "$AddInterceptorAdvice");
}
public static class AddInterceptorAdvice {
@Advice.OnMethodEnter(suppress = Throwable.class)
public static void addInterceptor(
@Advice.FieldValue("interceptors") List interceptors) {
boolean shouldRegister = true;
for (ClientInterceptor interceptor : interceptors) {
if (interceptor instanceof TracingClientInterceptor) {
shouldRegister = false;
break;
}
}
if (shouldRegister) {
interceptors.add(0, TracingClientInterceptor.newInterceptor());
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy