From 4d1011a23c9522ec165db8ba2c9b4f12821ce4d3 Mon Sep 17 00:00:00 2001 From: Doug Hilpipre Date: Thu, 23 Oct 2025 06:47:33 -0500 Subject: [PATCH 1/2] moved to using interfaces --- spring-async/build.gradle | 7 +-- .../{web => }/async/NRCallableWrapper.java | 2 +- .../{web => }/async/NRRunnableWrapper.java | 2 +- .../spring/{web => }/async/Utils.java | 6 +-- ...istenableTaskExecutor_Instrumentation.java | 29 ++++++++++ .../AsyncTaskExecutor_Instrumentation.java | 37 +++++++++++++ .../core/task/SimpleAsyncTaskExecutor.java | 18 ------- .../task/TaskExecutor_Instrumentation.java | 18 +++++++ .../task/support/TaskExecutorAdapter.java | 54 ------------------- 9 files changed, 93 insertions(+), 80 deletions(-) rename spring-async/src/main/java/com/newrelic/instrumentation/spring/{web => }/async/NRCallableWrapper.java (93%) rename spring-async/src/main/java/com/newrelic/instrumentation/spring/{web => }/async/NRRunnableWrapper.java (93%) rename spring-async/src/main/java/com/newrelic/instrumentation/spring/{web => }/async/Utils.java (80%) create mode 100644 spring-async/src/main/java/org/springframework/core/task/AsyncListenableTaskExecutor_Instrumentation.java create mode 100644 spring-async/src/main/java/org/springframework/core/task/AsyncTaskExecutor_Instrumentation.java delete mode 100644 spring-async/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java create mode 100644 spring-async/src/main/java/org/springframework/core/task/TaskExecutor_Instrumentation.java delete mode 100644 spring-async/src/main/java/org/springframework/core/task/support/TaskExecutorAdapter.java diff --git a/spring-async/build.gradle b/spring-async/build.gradle index 977dde7..9411853 100644 --- a/spring-async/build.gradle +++ b/spring-async/build.gradle @@ -23,7 +23,8 @@ jar { } verifyInstrumentation { - passes 'org.springframework:spring-core:[5.0.0.RELEASE,)' - excludeRegex '.*M.*' - + passesOnly 'org.springframework:spring-core:[4.0.0.RELEASE,)' + excludeRegex '.*M.*' + excludeRegex '.*RC.*' + } diff --git a/spring-async/src/main/java/com/newrelic/instrumentation/spring/web/async/NRCallableWrapper.java b/spring-async/src/main/java/com/newrelic/instrumentation/spring/async/NRCallableWrapper.java similarity index 93% rename from spring-async/src/main/java/com/newrelic/instrumentation/spring/web/async/NRCallableWrapper.java rename to spring-async/src/main/java/com/newrelic/instrumentation/spring/async/NRCallableWrapper.java index 2c27fcf..a4f2b72 100644 --- a/spring-async/src/main/java/com/newrelic/instrumentation/spring/web/async/NRCallableWrapper.java +++ b/spring-async/src/main/java/com/newrelic/instrumentation/spring/async/NRCallableWrapper.java @@ -1,4 +1,4 @@ -package com.newrelic.instrumentation.spring.web.async; +package com.newrelic.instrumentation.spring.async; import java.util.concurrent.Callable; diff --git a/spring-async/src/main/java/com/newrelic/instrumentation/spring/web/async/NRRunnableWrapper.java b/spring-async/src/main/java/com/newrelic/instrumentation/spring/async/NRRunnableWrapper.java similarity index 93% rename from spring-async/src/main/java/com/newrelic/instrumentation/spring/web/async/NRRunnableWrapper.java rename to spring-async/src/main/java/com/newrelic/instrumentation/spring/async/NRRunnableWrapper.java index 4351a9e..9d89797 100644 --- a/spring-async/src/main/java/com/newrelic/instrumentation/spring/web/async/NRRunnableWrapper.java +++ b/spring-async/src/main/java/com/newrelic/instrumentation/spring/async/NRRunnableWrapper.java @@ -1,4 +1,4 @@ -package com.newrelic.instrumentation.spring.web.async; +package com.newrelic.instrumentation.spring.async; import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; diff --git a/spring-async/src/main/java/com/newrelic/instrumentation/spring/web/async/Utils.java b/spring-async/src/main/java/com/newrelic/instrumentation/spring/async/Utils.java similarity index 80% rename from spring-async/src/main/java/com/newrelic/instrumentation/spring/web/async/Utils.java rename to spring-async/src/main/java/com/newrelic/instrumentation/spring/async/Utils.java index a2d7755..43ca5c1 100644 --- a/spring-async/src/main/java/com/newrelic/instrumentation/spring/web/async/Utils.java +++ b/spring-async/src/main/java/com/newrelic/instrumentation/spring/async/Utils.java @@ -1,4 +1,4 @@ -package com.newrelic.instrumentation.spring.web.async; +package com.newrelic.instrumentation.spring.async; import java.util.concurrent.Callable; @@ -12,7 +12,7 @@ public static Runnable getWrappedRunnable(Runnable r) { if(r instanceof NRRunnableWrapper) return null; String packageName = r.getClass().getPackage().getName(); - if(packageName.startsWith("com.newrelic")) return null; + if(packageName.startsWith("com.newrelic") || packageName.startsWith("com.nr")) return null; Token token = NewRelic.getAgent().getTransaction().getToken(); if(token != null && token.isActive()) { @@ -29,7 +29,7 @@ public static Callable getWrappedCallable(Callable c) { if(c instanceof NRCallableWrapper) return null; String packageName = c.getClass().getPackage().getName(); - if(packageName.startsWith("com.newrelic")) return null; + if(packageName.startsWith("com.newrelic") || packageName.startsWith("com.nr")) return null; Token token = NewRelic.getAgent().getTransaction().getToken(); if(token != null && token.isActive()) { diff --git a/spring-async/src/main/java/org/springframework/core/task/AsyncListenableTaskExecutor_Instrumentation.java b/spring-async/src/main/java/org/springframework/core/task/AsyncListenableTaskExecutor_Instrumentation.java new file mode 100644 index 0000000..af69e72 --- /dev/null +++ b/spring-async/src/main/java/org/springframework/core/task/AsyncListenableTaskExecutor_Instrumentation.java @@ -0,0 +1,29 @@ +package org.springframework.core.task; + +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.newrelic.instrumentation.spring.async.Utils; +import org.springframework.util.concurrent.ListenableFuture; + +import java.util.concurrent.Callable; + +@Weave(originalName = "org.springframework.core.task.AsyncListenableTaskExecutor", type = MatchType.Interface) +public class AsyncListenableTaskExecutor_Instrumentation { + + public ListenableFuture submitListenable(Runnable task) { + Runnable wrapper = Utils.getWrappedRunnable(task); + if(wrapper != null) { + task = wrapper; + } + return Weaver.callOriginal(); + } + + public ListenableFuture submitListenable(Callable task) { + Callable wrapper = Utils.getWrappedCallable(task); + if(wrapper != null) { + task = wrapper; + } + return Weaver.callOriginal(); + } +} diff --git a/spring-async/src/main/java/org/springframework/core/task/AsyncTaskExecutor_Instrumentation.java b/spring-async/src/main/java/org/springframework/core/task/AsyncTaskExecutor_Instrumentation.java new file mode 100644 index 0000000..37d06e2 --- /dev/null +++ b/spring-async/src/main/java/org/springframework/core/task/AsyncTaskExecutor_Instrumentation.java @@ -0,0 +1,37 @@ +package org.springframework.core.task; + +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.newrelic.instrumentation.spring.async.Utils; + +import java.util.concurrent.Callable; +import java.util.concurrent.Future; + +@Weave(originalName = "org.springframework.core.task.AsyncTaskExecutor", type = MatchType.Interface) +public class AsyncTaskExecutor_Instrumentation { + + public void execute(Runnable task, long startTimeout) { + Runnable wrapper = Utils.getWrappedRunnable(task); + if(wrapper != null) { + task = wrapper; + } + Weaver.callOriginal(); + } + + public Future submit(Runnable task) { + Runnable wrapper = Utils.getWrappedRunnable(task); + if(wrapper != null) { + task = wrapper; + } + return Weaver.callOriginal(); + } + + public Future submit(Callable task) { + Callable wrapper = Utils.getWrappedCallable(task); + if(wrapper != null) { + task = wrapper; + } + return Weaver.callOriginal(); + } +} diff --git a/spring-async/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java b/spring-async/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java deleted file mode 100644 index 8eb5c5d..0000000 --- a/spring-async/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.springframework.core.task; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.spring.web.async.Utils; - -@Weave -public abstract class SimpleAsyncTaskExecutor { - - - protected void doExecute(Runnable task) { - Runnable wrapper = Utils.getWrappedRunnable(task); - if(wrapper != null) { - task = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/spring-async/src/main/java/org/springframework/core/task/TaskExecutor_Instrumentation.java b/spring-async/src/main/java/org/springframework/core/task/TaskExecutor_Instrumentation.java new file mode 100644 index 0000000..446008f --- /dev/null +++ b/spring-async/src/main/java/org/springframework/core/task/TaskExecutor_Instrumentation.java @@ -0,0 +1,18 @@ +package org.springframework.core.task; + +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.newrelic.instrumentation.spring.async.Utils; + +@Weave(originalName = "org.springframework.core.task.TaskExecutor", type = MatchType.Interface) +public class TaskExecutor_Instrumentation { + + public void execute(Runnable task) { + Runnable wrapper = Utils.getWrappedRunnable(task); + if(wrapper != null) { + task = wrapper; + } + Weaver.callOriginal(); + } +} diff --git a/spring-async/src/main/java/org/springframework/core/task/support/TaskExecutorAdapter.java b/spring-async/src/main/java/org/springframework/core/task/support/TaskExecutorAdapter.java deleted file mode 100644 index 1bdf5cd..0000000 --- a/spring-async/src/main/java/org/springframework/core/task/support/TaskExecutorAdapter.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.springframework.core.task.support; - -import java.util.concurrent.Callable; -import java.util.concurrent.Future; - -import org.springframework.util.concurrent.ListenableFuture; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.spring.web.async.Utils; - -@Weave -public abstract class TaskExecutorAdapter { - - public void execute(Runnable task) { - Runnable wrapper = Utils.getWrappedRunnable(task); - if(wrapper != null) { - task = wrapper; - } - Weaver.callOriginal(); - } - - public Future submit(Runnable task) { - Runnable wrapper = Utils.getWrappedRunnable(task); - if(wrapper != null) { - task = wrapper; - } - return Weaver.callOriginal(); - } - - public Future submit(Callable task) { - Callable wrapper = Utils.getWrappedCallable(task); - if(wrapper != null) { - task = wrapper; - } - return Weaver.callOriginal(); - } - - public ListenableFuture submitListenable(Runnable task) { - Runnable wrapper = Utils.getWrappedRunnable(task); - if(wrapper != null) { - task = wrapper; - } - return Weaver.callOriginal(); - } - - public ListenableFuture submitListenable(Callable task) { - Callable wrapper = Utils.getWrappedCallable(task); - if(wrapper != null) { - task = wrapper; - } - return Weaver.callOriginal(); - } -} From a02d31e280940122dbb6fc8a08e0b800c7da1559 Mon Sep 17 00:00:00 2001 From: Doug Hilpipre Date: Thu, 23 Oct 2025 06:47:49 -0500 Subject: [PATCH 2/2] moved to using interfaces --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 74dca20..c2926d2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,3 @@ -rootProject.name = 'java-instrumentation-template' +rootProject.name = 'spring-async-instrumentation' include 'spring-async' include 'spring-web-async'