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' 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(); - } -}