From 40f623c3c25c26c8f323bbb4f46d753a95d2d05a Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Sat, 16 Nov 2024 10:06:21 +0200 Subject: [PATCH 1/2] Fix latest dep tests --- .../SpringSchedulingCodeAttributesGetter.java | 35 +++++++++++++++++++ .../javaagent/build.gradle.kts | 1 + 2 files changed, 36 insertions(+) diff --git a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingCodeAttributesGetter.java b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingCodeAttributesGetter.java index b88e0c5ee2c8..e2f5bffa74e3 100644 --- a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingCodeAttributesGetter.java +++ b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingCodeAttributesGetter.java @@ -6,12 +6,46 @@ package io.opentelemetry.javaagent.instrumentation.spring.scheduling.v3_1; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesGetter; +import java.lang.reflect.Field; import org.springframework.scheduling.support.ScheduledMethodRunnable; public class SpringSchedulingCodeAttributesGetter implements CodeAttributesGetter { + private static final Class outcomeTrackingRunnableClass = getOutcomeTrackingRunnableClass(); + private static final Field outcomeTrackingRunnableField = getOutcomeTrackingRunnableField(outcomeTrackingRunnableClass); + + private static Class getOutcomeTrackingRunnableClass() { + try { + return Class.forName("org.springframework.scheduling.config.Task$OutcomeTrackingRunnable"); + } catch (ClassNotFoundException exception) { + return null; + } + } + + private static Field getOutcomeTrackingRunnableField(Class clazz) { + try { + Field field = clazz.getDeclaredField("runnable"); + field.setAccessible(true); + return field; + } catch (Exception exception) { + return null; + } + } + + private static Runnable unwrap(Runnable runnable) { + if (outcomeTrackingRunnableClass != null && outcomeTrackingRunnableField != null && outcomeTrackingRunnableClass.isAssignableFrom(runnable.getClass())) { + try { + // task may be wrapped multiple times so + return unwrap((Runnable) outcomeTrackingRunnableField.get(runnable)); + } catch (IllegalAccessException ignore) { + // should not happen because setAccessible was called + } + } + return runnable; + } @Override public Class getCodeClass(Runnable runnable) { + runnable = unwrap(runnable); if (runnable instanceof ScheduledMethodRunnable) { ScheduledMethodRunnable scheduledMethodRunnable = (ScheduledMethodRunnable) runnable; return scheduledMethodRunnable.getMethod().getDeclaringClass(); @@ -22,6 +56,7 @@ public Class getCodeClass(Runnable runnable) { @Override public String getMethodName(Runnable runnable) { + runnable = unwrap(runnable); if (runnable instanceof ScheduledMethodRunnable) { ScheduledMethodRunnable scheduledMethodRunnable = (ScheduledMethodRunnable) runnable; return scheduledMethodRunnable.getMethod().getName(); diff --git a/instrumentation/spring/spring-security-config-6.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-security-config-6.0/javaagent/build.gradle.kts index f30b3eaad1f3..d23da79c852c 100644 --- a/instrumentation/spring/spring-security-config-6.0/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-security-config-6.0/javaagent/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { library("io.projectreactor:reactor-core:3.5.0") testLibrary("org.springframework:spring-test:6.0.0") + testLibrary("org.springframework:spring-context:6.0.0") testLibrary("jakarta.servlet:jakarta.servlet-api:6.0.0") } From 4ae0c83ba3ed051916c348bbb6323975019abe1b Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Sat, 16 Nov 2024 10:47:55 +0200 Subject: [PATCH 2/2] spotless --- .../v3_1/SpringSchedulingCodeAttributesGetter.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingCodeAttributesGetter.java b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingCodeAttributesGetter.java index e2f5bffa74e3..30af42a0de38 100644 --- a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingCodeAttributesGetter.java +++ b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingCodeAttributesGetter.java @@ -11,7 +11,8 @@ public class SpringSchedulingCodeAttributesGetter implements CodeAttributesGetter { private static final Class outcomeTrackingRunnableClass = getOutcomeTrackingRunnableClass(); - private static final Field outcomeTrackingRunnableField = getOutcomeTrackingRunnableField(outcomeTrackingRunnableClass); + private static final Field outcomeTrackingRunnableField = + getOutcomeTrackingRunnableField(outcomeTrackingRunnableClass); private static Class getOutcomeTrackingRunnableClass() { try { @@ -32,7 +33,9 @@ private static Field getOutcomeTrackingRunnableField(Class clazz) { } private static Runnable unwrap(Runnable runnable) { - if (outcomeTrackingRunnableClass != null && outcomeTrackingRunnableField != null && outcomeTrackingRunnableClass.isAssignableFrom(runnable.getClass())) { + if (outcomeTrackingRunnableClass != null + && outcomeTrackingRunnableField != null + && outcomeTrackingRunnableClass.isAssignableFrom(runnable.getClass())) { try { // task may be wrapped multiple times so return unwrap((Runnable) outcomeTrackingRunnableField.get(runnable));