diff --git a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/MethodHandlersInstrumentation.java b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/MethodHandlersInstrumentation.java index 6d1058e01a2..35cc6e901ba 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/MethodHandlersInstrumentation.java +++ b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/MethodHandlersInstrumentation.java @@ -43,7 +43,7 @@ public boolean isEnabled() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isConstructor().and(takesArguments(2)), - MethodHandlersInstrumentation.class.getName() + "$BuildAdvice"); + "datadog.trace.instrumentation.grpc.server.MethodHandlersInstrumentation$BuildAdvice"); } public static class BuildAdvice { @@ -52,9 +52,21 @@ public static class BuildAdvice { public static void onEnter(@Advice.Argument(0) Object serviceImpl) { try { Class serviceClass = serviceImpl.getClass(); - Class superclass = serviceClass.getSuperclass(); - if (superclass != null) { - for (Method method : superclass.getDeclaredMethods()) { + Class superClass = serviceClass.getSuperclass(); + while (superClass != null && !superClass.getSimpleName().endsWith("ImplBase")) { + superClass = superClass.getSuperclass(); + } + if (superClass != null) { + // bindService() would be the only method in this case and it's irrelevant + if (superClass.getDeclaredMethods().length == 1) { + for (Class i : serviceClass.getInterfaces()) { + if (i.getSimpleName().equals("AsyncService")) { + superClass = i; + break; + } + } + } + for (Method method : superClass.getDeclaredMethods()) { try { entry(serviceClass.getDeclaredMethod(method.getName(), method.getParameterTypes())); } catch (Throwable e) {