From 607894bd2b397d057247bdcdd8ebe7e69a61c832 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 16 May 2025 12:33:40 +0100 Subject: [PATCH] Widen lazy coroutine matcher to cover all definitions of onStart --- .../LazyCoroutineInstrumentation.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/dd-java-agent/instrumentation/kotlin-coroutines/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/LazyCoroutineInstrumentation.java b/dd-java-agent/instrumentation/kotlin-coroutines/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/LazyCoroutineInstrumentation.java index 26725997e68..a629a3fdcb4 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/LazyCoroutineInstrumentation.java +++ b/dd-java-agent/instrumentation/kotlin-coroutines/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/LazyCoroutineInstrumentation.java @@ -1,25 +1,34 @@ package datadog.trace.instrumentation.kotlin.coroutines; +import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.extendsClass; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.takesNoArguments; import datadog.trace.agent.tooling.Instrumenter; import kotlinx.coroutines.AbstractCoroutine; import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; /** Captures the Datadog context when lazy coroutines start. */ public class LazyCoroutineInstrumentation - implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + implements Instrumenter.ForTypeHierarchy, Instrumenter.HasMethodAdvice { @Override - public String instrumentedType() { - return "kotlinx.coroutines.LazyDeferredCoroutine"; + public String hierarchyMarkerType() { + return "kotlinx.coroutines.AbstractCoroutine"; + } + + @Override + public ElementMatcher hierarchyMatcher() { + return extendsClass(named(hierarchyMarkerType())); } @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( - isMethod().and(named("onStart")), + isMethod().and(named("onStart")).and(takesNoArguments()), LazyCoroutineInstrumentation.class.getName() + "$OnStartAdvice"); }