From 040a8e1526e9ed5d9a9d37a2662ead7f3452f783 Mon Sep 17 00:00:00 2001 From: Doug Hilpipre Date: Mon, 29 Jan 2024 07:47:54 -0600 Subject: [PATCH 1/4] fixed further problems with distributed tracing headers --- camel-core-3.18/build.gradle | 1 - .../processors/CamelClassTransformer.java | 48 -- .../camel/processors/CamelCorePremain.java | 84 ---- .../processors/ExcludedClassMatcher.java | 42 -- .../processors/ProcessorClassMatcher.java | 36 -- .../ProcessorClassMethodMatcher.java | 31 -- .../apache/camel/Pattern_instrumentation.java | 23 +- .../AggregateProcessor_instrumentation.java | 7 +- .../apache/camel/CamelHeaders.java | 5 + ...amelInternalProcessor_instrumentation.java | 21 +- .../apache/camel/CamelMessageHeaders.java | 82 --- .../ChoiceProcessor_instrumentation.java | 24 +- .../MultiCastProcessor_instrumentation.java | 19 +- .../apache/camel/NRAsyncProcessorStart.java | 59 +++ .../apache/camel/NRAsyncProcessorWrapper.java | 86 ++-- .../apache/camel/NRProcessorStart.java | 37 ++ .../apache/camel/NRProcessorWrapper.java | 54 +- .../camel/Pipeline_instrumentation.java | 12 +- .../camel/SendProcessor_instrumentation.java | 4 - ...aredInternalProcessor_instrumentation.java | 34 +- .../Synchronization_instrumentation.java | 2 + .../nr/instrumentation/apache/camel/Util.java | 68 ++- .../wrappers/OutboundExchangeWrapper.java | 26 - .../camel/AsyncProcessor_instrumentation.java | 0 .../main/java/org/apache/camel/Channel.java | 61 +++ .../org/apache/camel/ConsumerTemplate.java | 62 +-- .../camel/Endpoint_instrumentation.java | 37 -- .../camel/component/bean/BeanProcessor.java | 14 - .../component/seda/SedaPollingConsumer.java | 75 +++ .../camel/component/seda/SedaProducer.java | 7 +- .../DefaultAsyncProcessorAwaitManager.java | 17 +- .../impl/engine/DefaultProducerTemplate.java | 20 +- .../processor/DelayProcessorSupport.java | 43 ++ .../org/apache/camel/spi/ProducerCache.java | 6 - .../apache/camel/support/DefaultConsumer.java | 17 +- .../apache/camel/support/DefaultProducer.java | 7 - .../support/EventDrivenPollingConsumer.java | 80 +-- .../apache/camel/support/ExchangeHelper.java | 44 -- .../support/ProcessorPollingConsumer.java | 73 ++- camel-core/build.gradle | 29 ++ .../java/org/apache/camel/AsyncProcessor.java | 44 ++ .../org/apache/camel/ConsumerTemplate.java | 120 +++++ .../org/apache/camel/PollingConsumer.java | 29 ++ .../main/java/org/apache/camel/Processor.java | 28 ++ .../org/apache/camel/ProducerTemplate.java | 475 ++++++++++++++++++ .../src/main/java/org/apache/camel/Util.java | 111 ++++ .../camel/spi/AsyncProcessorAwaitManager.java | 6 - .../camel/spi/SharedInternalProcessor.java | 56 +++ camel-kafka-3.14/build.gradle | 2 +- camel-netty-3.0/build.gradle | 2 +- .../camel/component/netty/NettyHelper.java | 17 +- .../camel/component/netty/NettyProducer.java | 35 +- .../netty/handlers/ClientChannelHandler.java | 57 ++- camel-netty-3.18/build.gradle | 2 +- .../camel/component/netty/NettyHelper.java | 3 +- .../camel/component/netty/NettyProducer.java | 10 - .../netty/handlers/ServerChannelHandler.java | 2 - camel-processor/build.gradle | 28 ++ .../java/org/apache/camel/AsyncProcessor.java | 44 ++ .../main/java/org/apache/camel/Processor.java | 28 ++ .../src/main/java/org/apache/camel/Util.java | 36 ++ settings.gradle | 1 + 62 files changed, 1703 insertions(+), 830 deletions(-) delete mode 100644 camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/CamelClassTransformer.java delete mode 100644 camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/CamelCorePremain.java delete mode 100644 camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ExcludedClassMatcher.java delete mode 100644 camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ProcessorClassMatcher.java delete mode 100644 camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ProcessorClassMethodMatcher.java delete mode 100644 camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelMessageHeaders.java create mode 100644 camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorStart.java create mode 100644 camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorStart.java delete mode 100644 camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java rename {camel-core-3.18 => camel-core-3.9}/src/main/java/org/apache/camel/AsyncProcessor_instrumentation.java (100%) create mode 100644 camel-core-3.9/src/main/java/org/apache/camel/Channel.java delete mode 100644 camel-core-3.9/src/main/java/org/apache/camel/Endpoint_instrumentation.java create mode 100644 camel-core-3.9/src/main/java/org/apache/camel/component/seda/SedaPollingConsumer.java create mode 100644 camel-core-3.9/src/main/java/org/apache/camel/processor/DelayProcessorSupport.java delete mode 100644 camel-core-3.9/src/main/java/org/apache/camel/support/ExchangeHelper.java create mode 100644 camel-core/build.gradle create mode 100644 camel-core/src/main/java/org/apache/camel/AsyncProcessor.java create mode 100644 camel-core/src/main/java/org/apache/camel/ConsumerTemplate.java create mode 100644 camel-core/src/main/java/org/apache/camel/PollingConsumer.java create mode 100644 camel-core/src/main/java/org/apache/camel/Processor.java create mode 100644 camel-core/src/main/java/org/apache/camel/ProducerTemplate.java create mode 100644 camel-core/src/main/java/org/apache/camel/Util.java rename {camel-core-3.9 => camel-core}/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java (63%) create mode 100644 camel-core/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java create mode 100644 camel-processor/build.gradle create mode 100644 camel-processor/src/main/java/org/apache/camel/AsyncProcessor.java create mode 100644 camel-processor/src/main/java/org/apache/camel/Processor.java create mode 100644 camel-processor/src/main/java/org/apache/camel/Util.java diff --git a/camel-core-3.18/build.gradle b/camel-core-3.18/build.gradle index 0451146..e9ef8a9 100644 --- a/camel-core-3.18/build.gradle +++ b/camel-core-3.18/build.gradle @@ -18,7 +18,6 @@ jar { attributes 'Implementation-Vendor': 'New Relic Labs' attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' attributes 'Implementation-Version': 1.0 - attributes 'Agent-Class': 'com.newrelic.instrumentation.labs.apache.camel.processors.CamelCorePremain' } } diff --git a/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/CamelClassTransformer.java b/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/CamelClassTransformer.java deleted file mode 100644 index f5fc29a..0000000 --- a/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/CamelClassTransformer.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.newrelic.instrumentation.labs.apache.camel.processors; - -import java.lang.instrument.IllegalClassFormatException; -import java.security.ProtectionDomain; -import java.util.logging.Level; - -import com.newrelic.agent.deps.org.objectweb.asm.commons.Method; -import com.newrelic.agent.instrumentation.classmatchers.ClassAndMethodMatcher; -import com.newrelic.agent.instrumentation.classmatchers.OptimizedClassMatcher.Match; -import com.newrelic.agent.instrumentation.classmatchers.OptimizedClassMatcherBuilder; -import com.newrelic.agent.instrumentation.context.ClassMatchVisitorFactory; -import com.newrelic.agent.instrumentation.context.ContextClassTransformer; -import com.newrelic.agent.instrumentation.context.InstrumentationContext; -import com.newrelic.agent.instrumentation.methodmatchers.MethodMatcher; -import com.newrelic.agent.instrumentation.tracing.TraceDetailsBuilder; -import com.newrelic.api.agent.NewRelic; - - -public class CamelClassTransformer implements ContextClassTransformer { - - private ClassMatchVisitorFactory matcher = null; - - public ClassMatchVisitorFactory getMatcher() { - return matcher; - } - - public CamelClassTransformer() { - matcher = OptimizedClassMatcherBuilder.newBuilder().addClassMethodMatcher(new ProcessorClassMethodMatcher()).build(); - } - - @Override - public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, - ProtectionDomain protectionDomain, byte[] classfileBuffer, InstrumentationContext context, Match match) - throws IllegalClassFormatException { - for (Method method : match.getMethods()) { - for (ClassAndMethodMatcher matcher : match.getClassMatches().keySet()) { - if (matcher.getMethodMatcher().matches(MethodMatcher.UNSPECIFIED_ACCESS, method.getName(), - method.getDescriptor(), match.getMethodAnnotations(method))) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Instrumenting the Processor class {0} and method {1}",className,method.getName()); - context.putTraceAnnotation(method, TraceDetailsBuilder.newBuilder().build()); - } - } - - } - return null; - } - -} diff --git a/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/CamelCorePremain.java b/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/CamelCorePremain.java deleted file mode 100644 index c7aa649..0000000 --- a/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/CamelCorePremain.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.newrelic.instrumentation.labs.apache.camel.processors; - -import java.lang.instrument.Instrumentation; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.logging.Level; - -import com.newrelic.agent.instrumentation.ClassTransformerService; -import com.newrelic.agent.instrumentation.context.InstrumentationContextManager; -import com.newrelic.agent.service.ServiceFactory; -import com.newrelic.api.agent.NewRelic; - -public class CamelCorePremain { - - private static ExecutorService executor = null; - - public static void premain(String s, Instrumentation inst) { - initialize(); - } - - public static void initialize() { - ClassTransformerService classTransformerService = ServiceFactory.getClassTransformerService(); - if(classTransformerService != null) { - InstrumentationContextManager contextMgr = classTransformerService.getContextManager(); - - if(contextMgr != null) { - CamelClassTransformer classTransformer = new CamelClassTransformer(); - NewRelic.getAgent().getLogger().log(Level.FINE, "Constructed CamelClassTransformer: {0}, matcher: {1}", classTransformer, classTransformer.getMatcher()); - contextMgr.addContextClassTransformer(classTransformer.getMatcher(), classTransformer); - } else { - NewRelic.getAgent().getLogger().log(Level.FINE, "Could not load matcher because ClassTransformerService is null"); - startExecutor(); - } - } else { - NewRelic.getAgent().getLogger().log(Level.FINE, "Could not load matcher because InstrumentationContextManager is null"); - startExecutor(); - } - - } - - private static void startExecutor() { - executor = Executors.newSingleThreadExecutor(); - RunCheck runCheck = new RunCheck(); - executor.submit(runCheck); - NewRelic.getAgent().getLogger().log(Level.FINE, "Submit RunCheck to executor"); - } - - private static void shutdownExecutor() { - if (executor != null) { - executor.shutdown(); - NewRelic.getAgent().getLogger().log(Level.FINE, "CamelPremain executor has shut down"); - } - } - - - private static class RunCheck implements Runnable { - - @Override - public void run() { - boolean done = false; - while(!done) { - ClassTransformerService classTransformerService = ServiceFactory.getClassTransformerService(); - if(classTransformerService != null) { - InstrumentationContextManager contextMgr = classTransformerService.getContextManager(); - - if(contextMgr != null) { - CamelClassTransformer classTransformer = new CamelClassTransformer(); - NewRelic.getAgent().getLogger().log(Level.FINE, "Constructed CamelClassTransformer: {0}, matcher: {1}", classTransformer, classTransformer.getMatcher()); - contextMgr.addContextClassTransformer(classTransformer.getMatcher(), classTransformer); - done = true; - } - } else { - try { - Thread.sleep(2000L); - } catch (InterruptedException e) { - } - } - } - shutdownExecutor(); - } - - } - -} diff --git a/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ExcludedClassMatcher.java b/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ExcludedClassMatcher.java deleted file mode 100644 index a9f6a20..0000000 --- a/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ExcludedClassMatcher.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.newrelic.instrumentation.labs.apache.camel.processors; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import com.newrelic.agent.deps.org.objectweb.asm.ClassReader; -import com.newrelic.agent.instrumentation.classmatchers.ClassMatcher; - -public class ExcludedClassMatcher extends ClassMatcher { - - private static final List excluded; - - static { - excluded = new ArrayList<>(); - excluded.add("com.nr.instrumentation.apache.camel.NRProcessorStart"); - excluded.add("com.nr.instrumentation.apache.camel.NRAsyncProcessorStart"); - excluded.add("com.nr.instrumentation.apache.camel.NRProcessorWrapper"); - excluded.add("com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper"); - excluded.add("org.apache.camel.impl.engine.SharedCamelInternalProcessor"); - excluded.add("org.apache.camel.impl.engine.CamelInternalProcessor"); - } - - @Override - public boolean isMatch(ClassLoader loader, ClassReader cr) { - - return !excluded.contains(cr.getClassName()); - } - - @Override - public boolean isMatch(Class clazz) { - return !excluded.contains(clazz.getName()); - } - - @Override - public Collection getClassNames() { - - return Collections.emptyList(); - } - -} diff --git a/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ProcessorClassMatcher.java b/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ProcessorClassMatcher.java deleted file mode 100644 index 3f9713f..0000000 --- a/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ProcessorClassMatcher.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.newrelic.instrumentation.labs.apache.camel.processors; - -import java.util.Collection; - -import com.newrelic.agent.deps.org.objectweb.asm.ClassReader; -import com.newrelic.agent.instrumentation.classmatchers.AndClassMatcher; -import com.newrelic.agent.instrumentation.classmatchers.ClassMatcher; -import com.newrelic.agent.instrumentation.classmatchers.InterfaceMatcher; - -public class ProcessorClassMatcher extends ClassMatcher { - - private AndClassMatcher matcher = null; - private static final String interfaceName = "org.apache.camel.Processor"; - - public ProcessorClassMatcher() { - ExcludedClassMatcher excluded = new ExcludedClassMatcher(); - InterfaceMatcher interfaceMatcher = new InterfaceMatcher(interfaceName); - matcher = new AndClassMatcher(excluded,interfaceMatcher); - } - - @Override - public boolean isMatch(ClassLoader loader, ClassReader cr) { - return matcher.isMatch(loader, cr); - } - - @Override - public boolean isMatch(Class clazz) { - return matcher.isMatch(clazz); - } - - @Override - public Collection getClassNames() { - return matcher.getClassNames(); - } - -} diff --git a/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ProcessorClassMethodMatcher.java b/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ProcessorClassMethodMatcher.java deleted file mode 100644 index d16b3d7..0000000 --- a/camel-core-3.18/src/main/java/com/newrelic/instrumentation/labs/apache/camel/processors/ProcessorClassMethodMatcher.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.newrelic.instrumentation.labs.apache.camel.processors; - -import com.newrelic.agent.instrumentation.classmatchers.ClassAndMethodMatcher; -import com.newrelic.agent.instrumentation.classmatchers.ClassMatcher; -import com.newrelic.agent.instrumentation.classmatchers.InterfaceMatcher; -import com.newrelic.agent.instrumentation.methodmatchers.MethodMatcher; -import com.newrelic.agent.instrumentation.methodmatchers.NameMethodMatcher; - -public class ProcessorClassMethodMatcher implements ClassAndMethodMatcher { - - private ProcessorClassMatcher classMatcher; - private NameMethodMatcher methodMatcher; - private static final String methodName = "process"; - - public ProcessorClassMethodMatcher() { - classMatcher = new ProcessorClassMatcher(); - methodMatcher = new NameMethodMatcher(methodName); - } - - @Override - public ClassMatcher getClassMatcher() { - return classMatcher; - } - - @Override - public MethodMatcher getMethodMatcher() { - return methodMatcher; - } - - -} diff --git a/camel-core-3.18/src/main/java/org/apache/camel/Pattern_instrumentation.java b/camel-core-3.18/src/main/java/org/apache/camel/Pattern_instrumentation.java index ee52e77..b726009 100644 --- a/camel-core-3.18/src/main/java/org/apache/camel/Pattern_instrumentation.java +++ b/camel-core-3.18/src/main/java/org/apache/camel/Pattern_instrumentation.java @@ -8,14 +8,17 @@ @WeaveWithAnnotation(type = MatchType.Interface, annotationClasses = {"org.apache.camel.Pattern"}) public abstract class Pattern_instrumentation { - @WeaveWithAnnotation(annotationClasses = {"org.apache.camel.Pattern"}) - @WeaveIntoAllMethods - @Trace - private static void instrumentation() { - StackTraceElement[] traces = Thread.currentThread().getStackTrace(); - StackTraceElement first = traces[1]; - String methodName = first.getMethodName(); - String classname = first.getClassName(); - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] { "Custom", "Camel", "Handler", classname, methodName }); - } + + @WeaveWithAnnotation(annotationClasses = {"org.apache.camel.Pattern"}) + @WeaveIntoAllMethods + @Trace + private static void instrumentation() { + + StackTraceElement[] traces = Thread.currentThread().getStackTrace(); + StackTraceElement first = traces[1]; + String methodName = first.getMethodName(); + String classname = first.getClassName(); + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Handler",classname,methodName); + } + } diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java index 221ea9f..a22ce61 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java @@ -9,14 +9,13 @@ import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @Weave(originalName="org.apache.camel.processor.aggregate.AggregateProcessor") public abstract class AggregateProcessor_instrumentation { - @Trace(dispatcher = true) + @Trace protected boolean doProcess(Exchange exchange, AsyncCallback callback) { Map attributes = new HashMap(); Util.recordExchange(attributes, exchange); @@ -26,11 +25,10 @@ protected boolean doProcess(Exchange exchange, AsyncCallback callback) { NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","AggregateProcessor","doProcess",routeID}); NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "CamelProcessor", new String[] {"AggregateProcessor",routeID}); } - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); return Weaver.callOriginal(); } - @Trace(dispatcher=true) + @Trace protected boolean doProcess(Exchange exchange, String key, AsyncCallback callback, boolean sync) { String routeID = exchange != null ? exchange.getFromRouteId() : null; if(routeID != null && !routeID.isEmpty()) { @@ -38,7 +36,6 @@ protected boolean doProcess(Exchange exchange, String key, AsyncCallback callbac NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","AggregateProcessor","doProcess",routeID}); NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "CamelProcessor", new String[] {"AggregateProcessor",routeID}); } - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); return Weaver.callOriginal(); } diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java index a4c4ec4..3f5b666 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java @@ -50,6 +50,11 @@ public String getHeader(String name) { @Override public Collection getHeaderNames() { Map props = exchange.getProperties(); + Message msg = exchange.getMessage(); + if(msg != null) { + Map msgHeaders = msg.getHeaders(); + props.putAll(msgHeaders); + } return props != null ? props.keySet() : Collections.emptyList(); } diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java index 3b8ea8d..1ef09fc 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java @@ -1,15 +1,13 @@ package com.nr.instrumentation.apache.camel; import java.util.HashMap; -import java.util.Map; import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; -import org.apache.camel.Message; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TracedMethod; +import com.newrelic.api.agent.TransactionNamePriority; import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; @@ -20,19 +18,16 @@ public abstract class CamelInternalProcessor_instrumentation { @Trace(dispatcher = true) public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); + HashMap attributes = new HashMap<>(); Util.recordExchange(attributes, exchange); - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - if(exchange != null && exchange.getFromRouteId() != null) { - traced.setMetricName("Custom","CamelInternalProcessor","process",exchange.getFromRouteId()); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + String routeId = exchange != null ? exchange.getFromRouteId() : null; + if(exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } - if(!attributes.isEmpty()) { - traced.addCustomAttributes(attributes); + if(routeId != null && !routeId.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "CamelInternalProcessor", "Camel",getClass().getSimpleName(),routeId); } - Message message = exchange.getMessage(); - - - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); return Weaver.callOriginal(); } } diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelMessageHeaders.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelMessageHeaders.java deleted file mode 100644 index cf3ed85..0000000 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/CamelMessageHeaders.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; - -import org.apache.camel.Message; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.Headers; -import com.newrelic.api.agent.NewRelic; - -public class CamelMessageHeaders implements Headers { - - private Message message = null; - - public CamelMessageHeaders(Message ex) { - message = ex; - } - - @Override - public void addHeader(String name, String value) { - message.setHeader(name, value); - } - - @Override - public boolean containsHeader(String name) { - return getHeaderNames().contains(name); - } - - @Override - public String getHeader(String name) { - Object value = message.getHeader(name); - if(value == null) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Message Header is null"); - return null; - } - if(value instanceof String) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Message Header is string: {0}", value.toString()); - return (String)value; - } - if(value instanceof byte[]) { - String v = new String((byte[])value); - NewRelic.getAgent().getLogger().log(Level.FINE, "Message Header is byte array: {0}", v); - return new String((byte[])value); - } - NewRelic.getAgent().getLogger().log(Level.FINE, "Message header is not a string, it is {0}", value.getClass()); - return value.toString(); - } - - @Override - public Collection getHeaderNames() { - Map props = message.getHeaders(); - - return props != null ? props.keySet() : Collections.emptyList(); - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public Collection getHeaders(String name) { - List list = new ArrayList<>(); - - String value = getHeader(name); - if(value != null && !value.isEmpty()) { - list.add(value); - } - return list; - } - - @Override - public void setHeader(String name, String value) { - message.setHeader(name, value); - } - -} diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java index 942f421..74bc307 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java @@ -1,40 +1,22 @@ package com.nr.instrumentation.apache.camel; -import java.util.HashMap; -import java.util.Map; - import org.apache.camel.AsyncCallback; -import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @Weave(originalName="org.apache.camel.processor.ChoiceProcessor") public abstract class ChoiceProcessor_instrumentation { - @Trace(dispatcher=true) + public abstract String getId(); + public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - String classname = getClass().getSimpleName(); - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, headers); - Endpoint endpoint = exchange.getFromEndpoint(); - if(endpoint != null) { - String endpointURI = endpoint.getEndpointBaseUri(); - if(endpointURI != null && !endpointURI.isEmpty()) { - Util.recordValue(attributes, "EndpointURI", endpointURI); - } - } - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + NewRelic.getAgent().getTracedMethod().addCustomAttribute("ChoiceProcessor-ID", getId()); String routeID = exchange != null ? exchange.getFromRouteId() : null; if(routeID != null && !routeID.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom",classname,"process",routeID}); NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "ChoiceProcessor", new String[] {"ChoiceProcessor",routeID}); } return Weaver.callOriginal(); diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java index 24a6a4e..f992695 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java @@ -3,12 +3,10 @@ import java.util.HashMap; import java.util.Map; -import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @@ -16,23 +14,16 @@ @Weave(type=MatchType.BaseClass,originalName="org.apache.camel.processor.MulticastProcessor") public abstract class MultiCastProcessor_instrumentation { - @Trace(dispatcher=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - - return Weaver.callOriginal(); - } - @Weave(originalName="org.apache.camel.processor.MulticastProcessor$MulticastTask", type = MatchType.BaseClass) protected static abstract class MulticastTask { - @Trace(dispatcher=true) + @Trace protected void doDone(Exchange exchange, boolean forceExhaust) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + Map attributes = new HashMap(); + Util.recordExchange(attributes, exchange); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","MulticastTask",getClass().getSimpleName(),"doDone"); Weaver.callOriginal(); } diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorStart.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorStart.java new file mode 100644 index 0000000..2c6261f --- /dev/null +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorStart.java @@ -0,0 +1,59 @@ +package com.nr.instrumentation.apache.camel; + +import java.util.concurrent.CompletableFuture; + +import org.apache.camel.AsyncCallback; +import org.apache.camel.AsyncProcessor; +import org.apache.camel.Exchange; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weaver; + +public class NRAsyncProcessorStart implements AsyncProcessor { + + private static boolean isTransformed = false; + + private AsyncProcessor delegate = null; + private String consumer = null; + + public NRAsyncProcessorStart(AsyncProcessor processor) { + delegate = processor; + if(!isTransformed) { + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + isTransformed = true; + } + } + + @Override + @Trace(dispatcher = true) + public void process(Exchange exchange) throws Exception { + if(consumer != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncConsumerStart",consumer,"process-sync"); + } + Weaver.callOriginal(); + } + + @Override + @Trace(dispatcher = true) + public boolean process(Exchange exchange, AsyncCallback callback) { + if(consumer != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncConsumerStart",consumer,"process-async"); + } + return delegate.process(exchange, callback); + } + + @Override + @Trace(dispatcher = true) + public CompletableFuture processAsync(Exchange exchange) { + if(consumer != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncConsumerStart",consumer,"processAsync"); + } + return delegate.processAsync(exchange); + } + + public void setConsumer(String s) { + consumer = s; + } +} diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java index 4396c20..b7e036b 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java @@ -1,76 +1,58 @@ package com.nr.instrumentation.apache.camel; -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.CompletableFuture; import org.apache.camel.AsyncCallback; import org.apache.camel.AsyncProcessor; import org.apache.camel.Exchange; -import org.apache.camel.Route; -import com.newrelic.api.agent.NewRelic; +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.Token; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; -public class NRAsyncProcessorWrapper extends NRProcessorWrapper implements AsyncProcessor { +public class NRAsyncProcessorWrapper implements AsyncProcessor { - public NRAsyncProcessorWrapper(AsyncProcessor p,Route r) { - super(p,r); + private AsyncProcessor delegate = null; + protected Token token = null; + protected static boolean isTransformed = false; + + + public NRAsyncProcessorWrapper(AsyncProcessor d, Token t) { + if(!isTransformed) { + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + isTransformed = true; + } + token = t; + delegate = d; } @Override - @Trace(dispatcher=true) + @Trace(async = true) public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - String[] names; - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process",routeId}; - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "Processor", "Process",routeId); - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - } - } else { - Object timerTaskValue = exchange.getProperty(Exchange.TIMER_NAME); - if(timerTaskValue != null) { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process","TimerTask",timerTaskValue.toString()}; - } - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - + if(token != null) { + token.linkAndExpire(); + token = null; } - NewRelic.getAgent().getTracedMethod().setMetricName(names); - return ((AsyncProcessor)delegate).process(exchange, callback); + return delegate.process(exchange,callback); } @Override - @Trace(dispatcher = true) + @Trace(async = true) public CompletableFuture processAsync(Exchange exchange) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - String[] names; - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process",routeId}; - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - } - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"processAsync"}; - + if(token != null) { + token.linkAndExpire(); + token = null; + } + return delegate.processAsync(exchange); + } + + @Trace(async = true) + public void process(Exchange exchange) throws Exception { + if(token != null) { + token.linkAndExpire(); + token = null; } - NewRelic.getAgent().getTracedMethod().setMetricName(names); - return ((AsyncProcessor)delegate).processAsync(exchange); + delegate.process(exchange); } } diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorStart.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorStart.java new file mode 100644 index 0000000..9b39acf --- /dev/null +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorStart.java @@ -0,0 +1,37 @@ +package com.nr.instrumentation.apache.camel; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +public class NRProcessorStart implements Processor { + + private static boolean isTransformed = false; + + private Processor delegate = null; + private String consumer = null; + + public NRProcessorStart(Processor processor) { + delegate = processor; + if(!isTransformed) { + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + isTransformed = false; + } + } + + @Override + @Trace(dispatcher = true) + public void process(Exchange exchange) throws Exception { + if(consumer != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","SyncConsumerStart",consumer,"process-sync"); + } + delegate.process(exchange); + } + + public void setConsumer(String consumer) { + this.consumer = consumer; + } +} diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java index 6a17a6f..0d39595 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java @@ -1,56 +1,42 @@ package com.nr.instrumentation.apache.camel; -import java.util.HashMap; -import java.util.Map; - +import org.apache.camel.DelegateProcessor; import org.apache.camel.Exchange; import org.apache.camel.Processor; -import org.apache.camel.Route; import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; -public class NRProcessorWrapper implements Processor { - - private static boolean isTransformed = false; - protected Route route = null; +public class NRProcessorWrapper implements DelegateProcessor { - protected Processor delegate = null; + protected Token token = null; + private Processor delegate = null; + protected static boolean isTransformed = false; + - public NRProcessorWrapper(Processor p,Route r) { - delegate = p; - route = r; + public NRProcessorWrapper(Processor d, Token t) { + token = t; + delegate = d; if(!isTransformed) { AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + isTransformed = true; } } @Override - @Trace(dispatcher=true) + @Trace(async = true) public void process(Exchange exchange) throws Exception { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Consumer","Processor",delegate.getClass().getSimpleName(),"process",routeId); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "Camel-Consumer", "Consumer","Route",routeId); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Consumer","Processor",delegate.getClass().getSimpleName(),"process"); - } - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Producer","Processor",delegate.getClass().getSimpleName(),"process"); - } - if(delegate != null) { - delegate.process(exchange); + if(token != null) { + token.linkAndExpire(); + token = null; } + delegate.process(exchange); + } + @Override + public Processor getProcessor() { + return delegate; } } diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java index 79fbac6..515404f 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java @@ -9,7 +9,6 @@ import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @@ -18,17 +17,9 @@ public abstract class Pipeline_instrumentation { private String id = Weaver.callOriginal(); - @Trace public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - if(id != null) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Pipeline","process",id); NewRelic.getAgent().getTracedMethod().addCustomAttribute("PipelineID", id); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Pipeline","process"); } return Weaver.callOriginal(); } @@ -38,13 +29,12 @@ private static class PipelineTask { private Exchange exchange = Weaver.callOriginal(); - @Trace(dispatcher=true) + @Trace public void run() { if(exchange != null) { Map attributes = new HashMap(); Util.recordExchange(attributes, exchange); NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); String fromRoute = exchange.getFromRouteId(); if(fromRoute == null) fromRoute = "UnknownFromRoute"; NewRelic.getAgent().getTracedMethod().setMetricName("Custom","PipelineTask","run",fromRoute); diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java index 811fe76..376baa4 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java @@ -9,8 +9,6 @@ import org.apache.camel.Exchange; import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @@ -22,9 +20,7 @@ public abstract class SendProcessor_instrumentation { protected AsyncProducer producer = Weaver.callOriginal(); - @Trace(dispatcher=true) public boolean process(Exchange exchange, AsyncCallback callback) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); Map attributes = new HashMap(); Util.recordExchange(attributes, exchange); Util.recordValue(attributes, "RouteID", routeId); diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java index 681a64d..060c499 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java @@ -1,7 +1,6 @@ package com.nr.instrumentation.apache.camel; import java.util.HashMap; -import java.util.Map; import org.apache.camel.AsyncCallback; import org.apache.camel.AsyncProcessor; @@ -10,20 +9,37 @@ import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; +import com.newrelic.api.agent.TransactionNamePriority; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @Weave(originalName="org.apache.camel.impl.engine.SharedCamelInternalProcessor") public class SharedInternalProcessor_instrumentation { - @Trace - public boolean process(Exchange exchange, AsyncCallback callback, AsyncProcessor processor, Processor resultProcessor) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - + @Trace(dispatcher = true) + public boolean process(Exchange exchange, AsyncCallback originalCallback, AsyncProcessor processor, Processor resultProcessor) { + String routeId = exchange != null ? exchange.getFromRouteId() : null; + if(routeId != null) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "SharedCamelInternalProcessor", "Camel","SharedCamelInternalProcessor",routeId); + } + if (processor != null) { + HashMap attributes = new HashMap<>(); + Util.recordExchange(attributes, exchange); + } return Weaver.callOriginal(); } + + @Trace(dispatcher = true) + public void process(Exchange exchange, AsyncProcessor processor, Processor resultProcessor) { + String routeId = exchange != null ? exchange.getFromRouteId() : null; + if(routeId != null) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "SharedCamelInternalProcessor", "Camel","SharedCamelInternalProcessor",routeId); + } + if (processor != null) { + HashMap attributes = new HashMap<>(); + Util.recordExchange(attributes, exchange); + } + Weaver.callOriginal(); + } + } diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java index 7fd8517..104c6f5 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java @@ -29,6 +29,7 @@ public Synchronization_instrumentation() { @Trace(async=true) public void onComplete(Exchange exchange) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Synchronization",getClass().getSimpleName(),"onComplete"); if(token != null) { token.linkAndExpire(); token = null; @@ -38,6 +39,7 @@ public void onComplete(Exchange exchange) { @Trace(async=true) public void onFailure(Exchange exchange) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Synchronization",getClass().getSimpleName(),"onFailure"); if(token != null) { token.linkAndExpire(); token = null; diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Util.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Util.java index 1e763ae..6d5f69b 100644 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Util.java +++ b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/Util.java @@ -7,10 +7,12 @@ import java.util.Map; import java.util.Set; +import org.apache.camel.AsyncProcessor; import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.ExtendedExchange; +import org.apache.camel.Processor; import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; @@ -19,7 +21,7 @@ public class Util { private static final List ignores; - + static { ignores = new ArrayList<>(); ignores.add("org.apache.camel.impl.engine.CamelInternalProcessor$AsyncAfterTask"); @@ -29,13 +31,13 @@ public class Util { public static boolean isTranscationActive() { return AgentBridge.getAgent().getTransaction().isStarted(); } - + public static NRRunnable getRunnable(Runnable runnable) { String classname = runnable.getClass().getName(); if(ignores.contains(classname)) return null; - + if(runnable instanceof NRRunnable) return (NRRunnable)runnable; - + Token token = NewRelic.getAgent().getTransaction().getToken(); if(token != null && token.isActive()) { return new NRRunnable(runnable, token); @@ -43,10 +45,10 @@ public static NRRunnable getRunnable(Runnable runnable) { token.expire(); token = null; } - + return null; } - + public static String getMethodName(Method m) { if(m == null) return "UnknownClass.UnknownMethod"; @@ -55,7 +57,7 @@ public static String getMethodName(Method m) { return classname + "." + methodName; } - + public static void recordExchange(Map attributes, Exchange exchange) { if(exchange != null) { recordValue(attributes, "ExchangeId", exchange.getExchangeId()); @@ -72,9 +74,10 @@ public static void recordExchange(Map attributes, Exchange excha ExtendedExchange extended = (ExtendedExchange)exchange; recordExtendedExchange(attributes, extended); } + NewRelic.getAgent().getTransaction().convertToWebTransaction(); } } - + private static void recordExtendedExchange(Map attributes, ExtendedExchange exchange) { if(exchange != null) { recordValue(attributes, "HistoryNodeId", exchange.getHistoryNodeId()); @@ -90,7 +93,7 @@ private static void recordExtendedExchange(Map attributes, Exten } } - + public static void recordValue(Map attributes, String key, Object value) { if(key != null && !key.isEmpty() && value != null) { attributes.put(key, value); @@ -107,4 +110,51 @@ public static void reportExchange(Exchange exchange) { } NewRelic.getAgent().getInsights().recordCustomEvent("Pipeline_Exchange", attributes); } + + public static NRAsyncProcessorWrapper getWrapper(AsyncProcessor processor) { + if(processor == null) return null; + // no need for wrapper + if((processor instanceof NRAsyncProcessorWrapper)) return null; + + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + return new NRAsyncProcessorWrapper(processor, t); + } else if(t != null) { + t.expire(); + t = null; + } + return null; + } + + public static NRProcessorWrapper getWrapper(Processor processor) { + if(processor == null) return null; + // no need for wrapper + if((processor instanceof NRAsyncProcessorWrapper)) return null; + + if((processor instanceof NRProcessorWrapper)) return null; + + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + return new NRProcessorWrapper(processor, t); + } else if(t != null) { + t.expire(); + t = null; + } + + return null; + } + + public static NRAsyncProcessorStart getStartingWrapper(AsyncProcessor asyncProcessor) { + if(asyncProcessor == null) return null; + if(asyncProcessor instanceof NRAsyncProcessorStart) return null; + + return new NRAsyncProcessorStart(asyncProcessor); + } + + public static NRProcessorStart getStartingWrapper(Processor processor) { + if(processor == null) return null; + if(processor instanceof NRProcessorStart) return null; + + return new NRProcessorStart(processor); + } } \ No newline at end of file diff --git a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java b/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java deleted file mode 100644 index 3f4d92d..0000000 --- a/camel-core-3.9/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.nr.instrumentation.apache.camel.wrappers; - -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.OutboundHeaders; - -public class OutboundExchangeWrapper implements OutboundHeaders { - - private Exchange exchange = null; - - public OutboundExchangeWrapper(Exchange e) { - exchange = e; - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public void setHeader(String name, String value) { - exchange.setProperty(name, value); - } - -} diff --git a/camel-core-3.18/src/main/java/org/apache/camel/AsyncProcessor_instrumentation.java b/camel-core-3.9/src/main/java/org/apache/camel/AsyncProcessor_instrumentation.java similarity index 100% rename from camel-core-3.18/src/main/java/org/apache/camel/AsyncProcessor_instrumentation.java rename to camel-core-3.9/src/main/java/org/apache/camel/AsyncProcessor_instrumentation.java diff --git a/camel-core-3.9/src/main/java/org/apache/camel/Channel.java b/camel-core-3.9/src/main/java/org/apache/camel/Channel.java new file mode 100644 index 0000000..d7e81bf --- /dev/null +++ b/camel-core-3.9/src/main/java/org/apache/camel/Channel.java @@ -0,0 +1,61 @@ +package org.apache.camel; + +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; +import com.nr.instrumentation.apache.camel.NRProcessorWrapper; +import com.nr.instrumentation.apache.camel.Util; + +@Weave(type = MatchType.Interface) +public abstract class Channel { + + public Processor getErrorHandler() { + Processor processor = Weaver.callOriginal(); + if(processor instanceof AsyncProcessor) { + NRAsyncProcessorWrapper wrapper = Util.getWrapper((AsyncProcessor)processor); + if(wrapper != null) { + processor = wrapper; + } + } else { + NRProcessorWrapper wrapper = Util.getWrapper(processor); + if(wrapper != null) { + processor = wrapper; + } + } + return processor; + } + + public Processor getOutput() { + Processor processor = Weaver.callOriginal(); + if(processor instanceof AsyncProcessor) { + NRAsyncProcessorWrapper wrapper = Util.getWrapper((AsyncProcessor)processor); + if(wrapper != null) { + processor = wrapper; + } + } else { + NRProcessorWrapper wrapper = Util.getWrapper(processor); + if(wrapper != null) { + processor = wrapper; + } + } + return processor; + } + + public Processor getNextProcessor() { + Processor processor = Weaver.callOriginal(); + if(processor instanceof AsyncProcessor) { + NRAsyncProcessorWrapper wrapper = Util.getWrapper((AsyncProcessor)processor); + if(wrapper != null) { + processor = wrapper; + } + } else { + NRProcessorWrapper wrapper = Util.getWrapper(processor); + if(wrapper != null) { + processor = wrapper; + } + } + return processor; + } + +} diff --git a/camel-core-3.9/src/main/java/org/apache/camel/ConsumerTemplate.java b/camel-core-3.9/src/main/java/org/apache/camel/ConsumerTemplate.java index ba6770a..8bd4f68 100644 --- a/camel-core-3.9/src/main/java/org/apache/camel/ConsumerTemplate.java +++ b/camel-core-3.9/src/main/java/org/apache/camel/ConsumerTemplate.java @@ -7,7 +7,7 @@ import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelMessageHeaders; +import com.nr.instrumentation.apache.camel.CamelHeaders; @Weave(type = MatchType.Interface) public abstract class ConsumerTemplate { @@ -16,10 +16,13 @@ public abstract class ConsumerTemplate { public Exchange receive(String endpointUri) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive"); Exchange exchange = Weaver.callOriginal(); - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + if(exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + } else { + NewRelic.getAgent().getTransaction().ignore(); + } return exchange; } @@ -27,11 +30,10 @@ public Exchange receive(String endpointUri) { public Exchange receive(String endpointUri, long timeout) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive"); Exchange exchange = Weaver.callOriginal(); if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } @@ -42,10 +44,11 @@ public Exchange receive(String endpointUri, long timeout) { public Exchange receive(Endpoint endpoint) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive"); Exchange exchange = Weaver.callOriginal(); - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + if (exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + } return exchange; } @@ -53,11 +56,10 @@ public Exchange receive(Endpoint endpoint) { public Exchange receive(Endpoint endpoint, long timeout) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive"); Exchange exchange = Weaver.callOriginal(); if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } @@ -68,11 +70,10 @@ public Exchange receive(Endpoint endpoint, long timeout) { public Exchange receiveNoWait(String endpointUri) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveNoWait"); Exchange exchange = Weaver.callOriginal(); if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } @@ -83,11 +84,10 @@ public Exchange receiveNoWait(String endpointUri) { public Exchange receiveNoWait(Endpoint endpoint) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveNoWait"); Exchange exchange = Weaver.callOriginal(); if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } @@ -98,7 +98,7 @@ public Exchange receiveNoWait(Endpoint endpoint) { public Object receiveBody(String endpointUri) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); return Weaver.callOriginal(); } @@ -106,7 +106,7 @@ public Object receiveBody(String endpointUri) { public Object receiveBody(Endpoint endpoint) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); return Weaver.callOriginal(); } @@ -114,7 +114,7 @@ public Object receiveBody(Endpoint endpoint) { public Object receiveBody(String endpointUri, long timeout){ TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); Object result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); @@ -126,7 +126,7 @@ public Object receiveBody(String endpointUri, long timeout){ public Object receiveBody(Endpoint endpoint, long timeout) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); Object result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); @@ -138,7 +138,7 @@ public Object receiveBody(Endpoint endpoint, long timeout) { public Object receiveBodyNoWait(String endpointUri) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait"); Object result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("NoObjectAvailable", true); @@ -150,7 +150,7 @@ public Object receiveBodyNoWait(String endpointUri) { public Object receiveBodyNoWait(Endpoint endpoint) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait"); Object result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("NoObjectAvailable", true); @@ -162,7 +162,7 @@ public Object receiveBodyNoWait(Endpoint endpoint) { public T receiveBody(String endpointUri, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); return Weaver.callOriginal(); } @@ -171,7 +171,7 @@ public T receiveBody(Endpoint endpoint, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); return Weaver.callOriginal(); } @@ -180,7 +180,7 @@ public T receiveBody(String endpointUri, long timeout, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); T result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); @@ -193,7 +193,7 @@ public T receiveBody(Endpoint endpoint, long timeout, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); T result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); @@ -206,7 +206,7 @@ public T receiveBodyNoWait(String endpointUri, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait"); T result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); @@ -219,7 +219,7 @@ public T receiveBodyNoWait(Endpoint endpoint, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait"); T result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); diff --git a/camel-core-3.9/src/main/java/org/apache/camel/Endpoint_instrumentation.java b/camel-core-3.9/src/main/java/org/apache/camel/Endpoint_instrumentation.java deleted file mode 100644 index 048711d..0000000 --- a/camel-core-3.9/src/main/java/org/apache/camel/Endpoint_instrumentation.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.apache.camel; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type=MatchType.Interface, originalName = "org.apache.camel.Endpoint") -public abstract class Endpoint_instrumentation { - - - public abstract String getEndpointUri(); - public abstract String getEndpointBaseUri(); - - - public Exchange createExchange() { - Exchange exchange = Weaver.callOriginal(); - if(Util.isTranscationActive()) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - return exchange; - } - - - public Exchange createExchange(ExchangePattern pattern) { - Exchange exchange = Weaver.callOriginal(); - if(Util.isTranscationActive()) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - return exchange; - } - -} diff --git a/camel-core-3.9/src/main/java/org/apache/camel/component/bean/BeanProcessor.java b/camel-core-3.9/src/main/java/org/apache/camel/component/bean/BeanProcessor.java index 60af46a..6e66d23 100644 --- a/camel-core-3.9/src/main/java/org/apache/camel/component/bean/BeanProcessor.java +++ b/camel-core-3.9/src/main/java/org/apache/camel/component/bean/BeanProcessor.java @@ -1,37 +1,23 @@ package org.apache.camel.component.bean; -import java.util.HashMap; -import java.util.Map; - import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; @Weave public abstract class BeanProcessor { public abstract String getMethod(); - @Trace(dispatcher=true) public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); String m = exchange.getIn().getHeader(Exchange.BEAN_METHOD_NAME, getMethod(), String.class); if(m != null) { NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","BeanProcessor","process",m}); NewRelic.getAgent().getTracedMethod().addCustomAttribute("Bean_Method", m); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","BeanProcessor","process"}); } - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); return Weaver.callOriginal(); } } diff --git a/camel-core-3.9/src/main/java/org/apache/camel/component/seda/SedaPollingConsumer.java b/camel-core-3.9/src/main/java/org/apache/camel/component/seda/SedaPollingConsumer.java new file mode 100644 index 0000000..6cd80cb --- /dev/null +++ b/camel-core-3.9/src/main/java/org/apache/camel/component/seda/SedaPollingConsumer.java @@ -0,0 +1,75 @@ +package org.apache.camel.component.seda; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.TransactionNamePriority; +import com.newrelic.api.agent.TransportType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.apache.camel.CamelHeaders; + +@Weave +public abstract class SedaPollingConsumer { + + public abstract SedaEndpoint getEndpoint(); + + @Trace(dispatcher = true) + public Exchange receive() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + Endpoint endPt = getEndpoint(); + if(endPt != null) { + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","SedaPollingConsumer",uri); + } + } + } else { + NewRelic.getAgent().getTransaction().ignore(); + } + return exchange; + } + + @Trace(dispatcher = true) + public Exchange receiveNoWait() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receiveNoWait"); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { + Endpoint endPt = getEndpoint(); + if(endPt != null) { + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","SedaPollingConsumer",uri); + } + } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + } else { + NewRelic.getAgent().getTransaction().ignore(); + } + return exchange; + } + + @Trace(dispatcher = true) + public Exchange receive(long timeout) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { + Endpoint endPt = getEndpoint(); + if(endPt != null) { + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","SedaPollingConsumer",uri); + } + } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + } else { + NewRelic.getAgent().getTransaction().ignore(); + } + return exchange; + } +} diff --git a/camel-core-3.9/src/main/java/org/apache/camel/component/seda/SedaProducer.java b/camel-core-3.9/src/main/java/org/apache/camel/component/seda/SedaProducer.java index 52573f4..39559b0 100644 --- a/camel-core-3.9/src/main/java/org/apache/camel/component/seda/SedaProducer.java +++ b/camel-core-3.9/src/main/java/org/apache/camel/component/seda/SedaProducer.java @@ -6,13 +6,16 @@ import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.nr.instrumentation.apache.camel.CamelHeaders; +import com.nr.instrumentation.apache.camel.Util; @Weave public abstract class SedaProducer { protected void addToQueue(Exchange exchange, boolean copy) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); + if(Util.isTranscationActive()) { + CamelHeaders headers = new CamelHeaders(exchange); + NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); + } Weaver.callOriginal(); } } diff --git a/camel-core-3.9/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java b/camel-core-3.9/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java index 117729c..e6222f8 100644 --- a/camel-core-3.9/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java +++ b/camel-core-3.9/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java @@ -5,17 +5,26 @@ import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; +import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; +import com.nr.instrumentation.apache.camel.Util; @Weave public abstract class DefaultAsyncProcessorAwaitManager { - @Trace(dispatcher = true) + @Trace public void process(AsyncProcessor processor, Exchange exchange) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + String routeId = exchange.getFromRouteId(); + if(routeId == null || routeId.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","DefaultAsyncProcessorAwaitManager","process",processor.getClass().getSimpleName()); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","DefaultAsyncProcessorAwaitManager","process",processor.getClass().getSimpleName(),routeId); + } + NRAsyncProcessorWrapper wrapper = Util.getWrapper(processor); + if(wrapper != null) { + processor = wrapper; + } Weaver.callOriginal(); } } diff --git a/camel-core-3.9/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java b/camel-core-3.9/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java index 9a5f3bd..23d06ea 100644 --- a/camel-core-3.9/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java +++ b/camel-core-3.9/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java @@ -14,9 +14,6 @@ import com.newrelic.api.agent.TransactionNamePriority; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.CamelMapHeaders; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; import com.nr.instrumentation.apache.camel.Util; @Weave @@ -27,8 +24,6 @@ protected CompletableFuture asyncSendExchange(Endpoint endpoint, Excha Map attributes = new HashMap(); Util.recordExchange(attributes, inExchange); NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - CamelHeaders headers = new CamelHeaders(inExchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); if(endpoint != null) { String uri = endpoint.getEndpointUri(); if(uri != null && !uri.isEmpty()) { @@ -36,9 +31,6 @@ protected CompletableFuture asyncSendExchange(Endpoint endpoint, Excha NewRelic.getAgent().getTracedMethod().addCustomAttribute("EndpointURI", uri); } } - if(resultProcessor != null && !(resultProcessor instanceof NRProcessorWrapper)) { - resultProcessor = new NRProcessorWrapper(resultProcessor, null); - } return Weaver.callOriginal(); } @@ -47,8 +39,7 @@ public Exchange send(Endpoint endpoint, Exchange exchange, Processor resultProce Map attributes = new HashMap(); Util.recordExchange(attributes, exchange); NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); + if(endpoint != null) { String uri = endpoint.getEndpointUri(); if(uri != null && !uri.isEmpty()) { @@ -56,16 +47,7 @@ public Exchange send(Endpoint endpoint, Exchange exchange, Processor resultProce NewRelic.getAgent().getTracedMethod().addCustomAttribute("EndpointURI", uri); } } - if(resultProcessor != null && !(resultProcessor instanceof NRProcessorWrapper)) { - resultProcessor = new NRProcessorWrapper(resultProcessor, null); - } return Weaver.callOriginal(); } - - protected Processor createBodyAndHeaders(Object body, Map headers) { - CamelMapHeaders nrHeaders = new CamelMapHeaders(headers); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(nrHeaders); - return Weaver.callOriginal(); - } } diff --git a/camel-core-3.9/src/main/java/org/apache/camel/processor/DelayProcessorSupport.java b/camel-core-3.9/src/main/java/org/apache/camel/processor/DelayProcessorSupport.java new file mode 100644 index 0000000..b497b30 --- /dev/null +++ b/camel-core-3.9/src/main/java/org/apache/camel/processor/DelayProcessorSupport.java @@ -0,0 +1,43 @@ +package org.apache.camel.processor; + +import org.apache.camel.AsyncCallback; +import org.apache.camel.Exchange; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave +public class DelayProcessorSupport { + + @Weave + private static final class ProcessCall { + + @NewField + private Token token = null; + + @SuppressWarnings("unused") + ProcessCall(Exchange exchange, AsyncCallback callback) { + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + token = t; + } else if(t != null) { + t.expire(); + t = null; + } + + } + + @Trace(async = true) + public void run() { + if(token != null) { + token.linkAndExpire(); + token = null; + } + Weaver.callOriginal(); + } + } +} diff --git a/camel-core-3.9/src/main/java/org/apache/camel/spi/ProducerCache.java b/camel-core-3.9/src/main/java/org/apache/camel/spi/ProducerCache.java index c3c0360..b23c72c 100644 --- a/camel-core-3.9/src/main/java/org/apache/camel/spi/ProducerCache.java +++ b/camel-core-3.9/src/main/java/org/apache/camel/spi/ProducerCache.java @@ -12,8 +12,6 @@ import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; import com.nr.instrumentation.apache.camel.Util; @Weave(type = MatchType.Interface) @@ -30,10 +28,6 @@ public Exchange send(Endpoint endpoint, Exchange exchange, Processor resultProce attributes.put("EndpointURI", baseURI); } traced.addCustomAttributes(attributes); - if(resultProcessor != null && !(resultProcessor instanceof NRProcessorWrapper)) { - resultProcessor = new NRProcessorWrapper(resultProcessor, null); - } - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(new CamelHeaders(exchange)); return Weaver.callOriginal(); } } diff --git a/camel-core-3.9/src/main/java/org/apache/camel/support/DefaultConsumer.java b/camel-core-3.9/src/main/java/org/apache/camel/support/DefaultConsumer.java index 4c6e411..748bab3 100644 --- a/camel-core-3.9/src/main/java/org/apache/camel/support/DefaultConsumer.java +++ b/camel-core-3.9/src/main/java/org/apache/camel/support/DefaultConsumer.java @@ -9,8 +9,9 @@ import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; +import com.nr.instrumentation.apache.camel.NRAsyncProcessorStart; +import com.nr.instrumentation.apache.camel.NRProcessorStart; +import com.nr.instrumentation.apache.camel.Util; @Weave(type=MatchType.BaseClass) public abstract class DefaultConsumer { @@ -23,16 +24,20 @@ public abstract class DefaultConsumer { public synchronized AsyncProcessor getAsyncProcessor() { AsyncProcessor asyncProcessor = Weaver.callOriginal(); - if(asyncProcessor != null && !(asyncProcessor instanceof NRAsyncProcessorWrapper)) { - return new NRAsyncProcessorWrapper(asyncProcessor,getRoute()); + NRAsyncProcessorStart wrapper = Util.getStartingWrapper(asyncProcessor); + if(wrapper != null) { + wrapper.setConsumer(getClass().getSimpleName()); + asyncProcessor = wrapper; } return asyncProcessor; } public Processor getProcessor() { Processor processor = Weaver.callOriginal(); - if(!(processor instanceof NRProcessorWrapper)) { - return new NRProcessorWrapper(processor,getRoute()); + NRProcessorStart wrapper = Util.getStartingWrapper(processor); + if(wrapper != null) { + wrapper.setConsumer(getClass().getSimpleName()); + processor = wrapper; } return processor; } diff --git a/camel-core-3.9/src/main/java/org/apache/camel/support/DefaultProducer.java b/camel-core-3.9/src/main/java/org/apache/camel/support/DefaultProducer.java index 993f03d..af4d618 100644 --- a/camel-core-3.9/src/main/java/org/apache/camel/support/DefaultProducer.java +++ b/camel-core-3.9/src/main/java/org/apache/camel/support/DefaultProducer.java @@ -2,22 +2,15 @@ import org.apache.camel.Exchange; -import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; @Weave(type=MatchType.BaseClass) public abstract class DefaultProducer { public Exchange createExchange() { Exchange exchange = Weaver.callOriginal(); - if(Util.isTranscationActive()) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } return exchange; } diff --git a/camel-core-3.9/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java b/camel-core-3.9/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java index 1968c42..90708d9 100644 --- a/camel-core-3.9/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java +++ b/camel-core-3.9/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java @@ -1,6 +1,6 @@ package org.apache.camel.support; -import java.util.HashMap; +import java.util.concurrent.BlockingQueue; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; @@ -9,76 +9,80 @@ import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.TransactionNamePriority; import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; -@Weave(type = MatchType.BaseClass) -public abstract class EventDrivenPollingConsumer { - - public abstract Endpoint getEndpoint(); +@Weave +public abstract class EventDrivenPollingConsumer extends PollingConsumerSupport { + + public EventDrivenPollingConsumer(Endpoint endpoint) { + super(endpoint); + } + public EventDrivenPollingConsumer(Endpoint endpoint, int queueSize) { + super(endpoint); + } + + public EventDrivenPollingConsumer(Endpoint endpoint, BlockingQueue queue) { + super(endpoint); + } + @Trace(dispatcher = true) public Exchange receive() { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Endpoint endPt = getEndpoint(); - if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "EventDrivenPollingConsumer",endpoint); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + Endpoint endPt = getEndpoint(); + if(endPt != null) { + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","EventDrivenPollingConsumer",uri); + } } + } else { + NewRelic.getAgent().getTransaction().ignore(); } - Exchange result = Weaver.callOriginal(); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - return result; + return exchange; } @Trace(dispatcher = true) public Exchange receiveNoWait() { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receiveNoWait"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { Endpoint endPt = getEndpoint(); if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "EventDrivenPollingConsumer",endpoint); + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","EventDrivenPollingConsumer",uri); } } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } - return result; + return exchange; } @Trace(dispatcher = true) public Exchange receive(long timeout) { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { Endpoint endPt = getEndpoint(); if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "EventDrivenPollingConsumer",endpoint); + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","EventDrivenPollingConsumer",uri); } } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } - return result; + return exchange; } + } diff --git a/camel-core-3.9/src/main/java/org/apache/camel/support/ExchangeHelper.java b/camel-core-3.9/src/main/java/org/apache/camel/support/ExchangeHelper.java deleted file mode 100644 index a2afa24..0000000 --- a/camel-core-3.9/src/main/java/org/apache/camel/support/ExchangeHelper.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.apache.camel.support; - -import org.apache.camel.CamelContext; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; - -@Weave -public class ExchangeHelper { - - public static Exchange copyExchangeAndSetCamelContext(Exchange exchange, CamelContext context, boolean handover) { - Exchange result = Weaver.callOriginal(); - - if(handover) { - CamelHeaders headers = new CamelHeaders(result); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - - return result; - } - - public static Exchange createCopy(Exchange exchange, boolean preserveExchangeId) { - Exchange result = Weaver.callOriginal(); - CamelHeaders headers = new CamelHeaders(result); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - return result; - } - - public static Exchange createCorrelatedCopy(Exchange exchange, boolean handover, boolean useSameMessageId) { - Exchange result = Weaver.callOriginal(); - - if (handover) { - CamelHeaders headers = new CamelHeaders(result); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - return result; - } - - - -} diff --git a/camel-core-3.9/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java b/camel-core-3.9/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java index 8a2d839..74c8a55 100644 --- a/camel-core-3.9/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java +++ b/camel-core-3.9/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java @@ -1,84 +1,79 @@ package org.apache.camel.support; -import java.util.HashMap; - import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.Processor; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.TransactionNamePriority; import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type = MatchType.BaseClass) -public abstract class ProcessorPollingConsumer { - public abstract Endpoint getEndpoint(); +@Weave +public abstract class ProcessorPollingConsumer extends PollingConsumerSupport { + public ProcessorPollingConsumer(Endpoint endpoint, Processor processor) { + super(endpoint); + } + @Trace(dispatcher = true) public Exchange receive() { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Endpoint endPt = getEndpoint(); - if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "ProcessorPollingConsumer",endpoint); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + Endpoint endPt = getEndpoint(); + if(endPt != null) { + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","ProcessorPollingConsumer",uri); + } } + } else { + NewRelic.getAgent().getTransaction().ignore(); } - Exchange result = Weaver.callOriginal(); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - return result; + return exchange; } @Trace(dispatcher = true) public Exchange receiveNoWait() { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receiveNoWait"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { Endpoint endPt = getEndpoint(); if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer","ProcessorPollingConsumer",endpoint); + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","ProcessorPollingConsumer",uri); } } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } - return result; + return exchange; } @Trace(dispatcher = true) public Exchange receive(long timeout) { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { Endpoint endPt = getEndpoint(); if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "ProcessorPollingConsumer",endpoint); + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","ProcessorPollingConsumer",uri); } } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } - return result; + return exchange; } + } diff --git a/camel-core/build.gradle b/camel-core/build.gradle new file mode 100644 index 0000000..268b522 --- /dev/null +++ b/camel-core/build.gradle @@ -0,0 +1,29 @@ + +// Build.gradle generated for instrumentation module camel-core + +apply plugin: 'java' + +dependencies { + implementation 'org.apache.camel:camel-core:3.18.0' + + // New Relic Labs Java Agent dependencies + implementation 'com.newrelic.agent.java:newrelic-agent:6.4.1' + implementation 'com.newrelic.agent.java:newrelic-api:6.4.1' + implementation fileTree(include: ['*.jar'], dir: '../libs') +} + +jar { + manifest { + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.camel-core' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' + attributes 'Implementation-Version': 1.0 + } +} + +verifyInstrumentation { + passes 'org.apache.camel:camel-core:[3.15.0,4.0.0)' + excludeRegex '.*M[1-9]' + excludeRegex '.*RC[1-9]' + +} \ No newline at end of file diff --git a/camel-core/src/main/java/org/apache/camel/AsyncProcessor.java b/camel-core/src/main/java/org/apache/camel/AsyncProcessor.java new file mode 100644 index 0000000..47faf97 --- /dev/null +++ b/camel-core/src/main/java/org/apache/camel/AsyncProcessor.java @@ -0,0 +1,44 @@ +package org.apache.camel; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave(type = MatchType.Interface) +public abstract class AsyncProcessor { + + @Trace(dispatcher = true) + public boolean process(Exchange exchange, AsyncCallback callback) { + Map attributes = new HashMap(); + Util.recordExchange(attributes, exchange); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + String routeID = exchange != null ? exchange.getFromRouteId() : null; + if(routeID != null && !routeID.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"process",routeID); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"process"); + } + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture processAsync(Exchange exchange) { + Map attributes = new HashMap(); + Util.recordExchange(attributes, exchange); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + String routeID = exchange != null ? exchange.getFromRouteId() : null; + if(routeID != null && !routeID.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"processAsync",routeID); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"processAsync"); + } + return Weaver.callOriginal(); + } + +} diff --git a/camel-core/src/main/java/org/apache/camel/ConsumerTemplate.java b/camel-core/src/main/java/org/apache/camel/ConsumerTemplate.java new file mode 100644 index 0000000..ed16904 --- /dev/null +++ b/camel-core/src/main/java/org/apache/camel/ConsumerTemplate.java @@ -0,0 +1,120 @@ +package org.apache.camel; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave(type = MatchType.Interface) +public abstract class ConsumerTemplate { + + @Trace(dispatcher = true) + public Exchange receive(String endpointUri) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive-endpointUri"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange receive(Endpoint endpoint) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive-endpoint"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange receive(String endpointUri, long timeout) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive-endpointUri-to"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange receive(Endpoint endpoint, long timeout) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive-endpoint-to"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange receiveNoWait(String endpointUri) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveNoWait-endpointUri"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange receiveNoWait(Endpoint endpoint) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveNoWait-endpoint"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object receiveBody(String endpointUri) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpointuri"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object receiveBody(Endpoint endpoint) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpoint"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object receiveBody(String endpointUri, long timeout) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpointuri-to"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object receiveBody(Endpoint endpoint, long timeout) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpoint-to"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object receiveBodyNoWait(String endpointUri) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait-endpointuri"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object receiveBodyNoWait(Endpoint endpoint) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait-endpoint"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T receiveBody(String endpointUri, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpointuri-type"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T receiveBody(Endpoint endpoint, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpoint-type"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T receiveBody(String endpointUri, long timeout, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpointuri-to-type"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T receiveBody(Endpoint endpoint, long timeout, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpoint-to-type"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T receiveBodyNoWait(String endpointUri, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait-endpointuri-type"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T receiveBodyNoWait(Endpoint endpoint, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait-endpoint-type"); + return Weaver.callOriginal(); + } + +} diff --git a/camel-core/src/main/java/org/apache/camel/PollingConsumer.java b/camel-core/src/main/java/org/apache/camel/PollingConsumer.java new file mode 100644 index 0000000..3450e7e --- /dev/null +++ b/camel-core/src/main/java/org/apache/camel/PollingConsumer.java @@ -0,0 +1,29 @@ +package org.apache.camel; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave(type = MatchType.Interface) +public abstract class PollingConsumer { + + @Trace(dispatcher = true) + public Exchange receive() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange receiveNoWait() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receiveNoWait"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange receive(long timeout) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive-to"); + return Weaver.callOriginal(); + } +} diff --git a/camel-core/src/main/java/org/apache/camel/Processor.java b/camel-core/src/main/java/org/apache/camel/Processor.java new file mode 100644 index 0000000..4c1c7ad --- /dev/null +++ b/camel-core/src/main/java/org/apache/camel/Processor.java @@ -0,0 +1,28 @@ +package org.apache.camel; + +import java.util.HashMap; +import java.util.Map; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave(type = MatchType.Interface) +public abstract class Processor { + + @Trace(dispatcher = true) + public void process(Exchange exchange) { + Map attributes = new HashMap(); + Util.recordExchange(attributes, exchange); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + String routeID = exchange != null ? exchange.getFromRouteId() : null; + if(routeID != null && !routeID.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Processor",getClass().getSimpleName(),"process",routeID); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Processor",getClass().getSimpleName(),"process"); + } + Weaver.callOriginal(); + } +} diff --git a/camel-core/src/main/java/org/apache/camel/ProducerTemplate.java b/camel-core/src/main/java/org/apache/camel/ProducerTemplate.java new file mode 100644 index 0000000..83ab787 --- /dev/null +++ b/camel-core/src/main/java/org/apache/camel/ProducerTemplate.java @@ -0,0 +1,475 @@ +package org.apache.camel; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import org.apache.camel.spi.Synchronization; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave(type = MatchType.Interface) +public class ProducerTemplate { + + @Trace(dispatcher = true) + public Exchange send(Exchange exchange) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-exchange"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange send(Processor processor) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-processor"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBody(Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBody"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBodyAndHeader(Object body, String header, Object headerValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeader"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBodyAndProperty(Object body, String property, Object propertyValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndProperty"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBodyAndHeaders(Object body, Map headers) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeaders"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange send(String endpointUri, Exchange exchange) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpointuri-ex"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange send(String endpointUri, Processor processor) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpointuri-pro"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange send(String endpointUri, ExchangePattern pattern, Processor processor) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpointuri-expat-pro"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange send(Endpoint endpoint, Exchange exchange) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpointuri-expat-pro"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange send(Endpoint endpoint, Processor processor) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpoint-pro"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange send(Endpoint endpoint, ExchangePattern pattern, Processor processor) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpoint-expat-pro"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange send(Endpoint endpoint, ExchangePattern pattern, Processor processor, Processor resultProcessor) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBody(Endpoint endpoint, Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBody"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBody(String endpointUri, Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBody"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object sendBody(Endpoint endpoint, ExchangePattern pattern, Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBody"); + return Weaver.callOriginal(); + } + + + @Trace(dispatcher = true) + public Object sendBody(String endpointUri, ExchangePattern pattern, Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBodyAndHeader(String endpointUri, Object body, String header, Object headerValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeader"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBodyAndHeader(Endpoint endpoint, Object body, String header, Object headerValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeader"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object sendBodyAndHeader(Endpoint endpoint, ExchangePattern pattern, Object body, String header, Object headerValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeader"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object sendBodyAndHeader(String endpoint, ExchangePattern pattern, Object body, String header, Object headerValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeader"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBodyAndProperty(String endpointUri, Object body, String property, Object propertyValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndProperty"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBodyAndProperty(Endpoint endpoint, Object body, String property, Object propertyValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndProperty"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object sendBodyAndProperty(Endpoint endpoint, ExchangePattern pattern, Object body, String property, Object propertyValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndProperty"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object sendBodyAndProperty( + String endpoint, ExchangePattern pattern, Object body, + String property, Object propertyValue) + { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndProperty"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBodyAndHeaders(String endpointUri, Object body, Map headers) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeaders"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void sendBodyAndHeaders(Endpoint endpoint, Object body, Map headers) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeaders"); + Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object sendBodyAndHeaders( + String endpointUri, ExchangePattern pattern, Object body, + Map headers) + { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeaders"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object sendBodyAndHeaders( + Endpoint endpoint, ExchangePattern pattern, Object body, + Map headers) + { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeaders"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange request(Endpoint endpoint, Processor processor) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"request"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Exchange request(String endpointUri, Processor processor) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"request"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object requestBody(Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T requestBody(Object body, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object requestBody(Endpoint endpoint, Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T requestBody(Endpoint endpoint, Object body, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object requestBody(String endpointUri, Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T requestBody(String endpointUri, Object body, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object requestBodyAndHeader(Object body, String header, Object headerValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeader"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object requestBodyAndHeader(Endpoint endpoint, Object body, String header, Object headerValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeader"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T requestBodyAndHeader(Endpoint endpoint, Object body, String header, Object headerValue, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeader"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object requestBodyAndHeader(String endpointUri, Object body, String header, Object headerValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeader"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T requestBodyAndHeader(String endpointUri, Object body, String header, Object headerValue, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeader"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object requestBodyAndHeaders(String endpointUri, Object body, Map headers) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeaders"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T requestBodyAndHeaders(String endpointUri, Object body, Map headers, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeaders"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object requestBodyAndHeaders(Endpoint endpoint, Object body, Map headers) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeaders"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public Object requestBodyAndHeaders(Object body, Map headers) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeaders"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public T requestBodyAndHeaders(Endpoint endpoint, Object body, Map headers, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeaders"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncSend(String endpointUri, Exchange exchange) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSend"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncSend(String endpointUri, Processor processor) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSend"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncSendBody(String endpointUri, Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSendBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBody(String endpointUri, Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBodyAndHeader(String endpointUri, Object body, String header, Object headerValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeader"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBodyAndHeaders(String endpointUri, Object body, Map headers) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeaders"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBody(String endpointUri, Object body, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBodyAndHeader( + String endpointUri, Object body, String header, Object headerValue, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeader"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBodyAndHeaders( + String endpointUri, Object body, Map headers, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeader"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncSend(Endpoint endpoint, Exchange exchange) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSend"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncSend(Endpoint endpoint, Processor processor) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSend"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncSendBody(Endpoint endpoint, Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSendBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBody(Endpoint endpoint, Object body) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBodyAndHeader(Endpoint endpoint, Object body, String header, Object headerValue) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeader"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBodyAndHeaders(Endpoint endpoint, Object body, Map headers){ + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeaders"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBody(Endpoint endpoint, Object body, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBody"); + return Weaver.callOriginal(); + } + + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBodyAndHeader( + Endpoint endpoint, Object body, String header, Object headerValue, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeader"); + return Weaver.callOriginal(); + } + + + @Trace(dispatcher = true) + public CompletableFuture asyncRequestBodyAndHeaders( + Endpoint endpoint, Object body, Map headers, Class type) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeaders"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncCallback(String endpointUri, Exchange exchange, Synchronization onCompletion) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallback"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncCallback(Endpoint endpoint, Exchange exchange, Synchronization onCompletion) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallback"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncCallback(String endpointUri, Processor processor, Synchronization onCompletion) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallback"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncCallback(Endpoint endpoint, Processor processor, Synchronization onCompletion) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallback"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncCallbackSendBody(String endpointUri, Object body, Synchronization onCompletion) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallbackSendBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncCallbackSendBody(Endpoint endpoint, Object body, Synchronization onCompletion) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallbackSendBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncCallbackRequestBody(String endpointUri, Object body, Synchronization onCompletion) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallbackRequestBody"); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public CompletableFuture asyncCallbackRequestBody(Endpoint endpoint, Object body, Synchronization onCompletion) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallbackRequestBody"); + return Weaver.callOriginal(); + } + +} diff --git a/camel-core/src/main/java/org/apache/camel/Util.java b/camel-core/src/main/java/org/apache/camel/Util.java new file mode 100644 index 0000000..d3ab6a9 --- /dev/null +++ b/camel-core/src/main/java/org/apache/camel/Util.java @@ -0,0 +1,111 @@ +package org.apache.camel; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.camel.CamelContext; +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.ExtendedExchange; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; + +public class Util { + + private static final List ignores; + + static { + ignores = new ArrayList<>(); + ignores.add("org.apache.camel.impl.engine.CamelInternalProcessor$AsyncAfterTask"); + } + + @SuppressWarnings("deprecation") + public static boolean isTranscationActive() { + return AgentBridge.getAgent().getTransaction().isStarted(); + } + +// public static NRRunnable getRunnable(Runnable runnable) { +// String classname = runnable.getClass().getName(); +// if(ignores.contains(classname)) return null; +// +// if(runnable instanceof NRRunnable) return (NRRunnable)runnable; +// +// Token token = NewRelic.getAgent().getTransaction().getToken(); +// if(token != null && token.isActive()) { +// return new NRRunnable(runnable, token); +// } else if(token != null) { +// token.expire(); +// token = null; +// } +// +// return null; +// } +// + public static String getMethodName(Method m) { + if(m == null) return "UnknownClass.UnknownMethod"; + + String classname = m.getDeclaringClass().getSimpleName(); + String methodName = m.getName(); + + return classname + "." + methodName; + } + + public static void recordExchange(Map attributes, Exchange exchange) { + if(exchange != null) { + recordValue(attributes, "ExchangeId", exchange.getExchangeId()); + CamelContext context = exchange.getContext(); + String ctxName = context != null ? context.getName() : null; + recordValue(attributes, "CamelContextName", ctxName); + recordValue(attributes, "CamelContextManagementName", context.getManagementName()); + Endpoint endpoint = exchange.getFromEndpoint(); + if(endpoint != null) { + recordValue(attributes, "From_EndPointURI", endpoint.getEndpointBaseUri()); + } + recordValue(attributes, "FromRouteId", exchange.getFromRouteId()); + if(exchange instanceof ExtendedExchange) { + ExtendedExchange extended = (ExtendedExchange)exchange; + recordExtendedExchange(attributes, extended); + } + } + } + + private static void recordExtendedExchange(Map attributes, ExtendedExchange exchange) { + if(exchange != null) { + recordValue(attributes, "HistoryNodeId", exchange.getHistoryNodeId()); + recordValue(attributes, "HistoryNodeLabel", exchange.getHistoryNodeLabel()); + recordValue(attributes, "HistoryNodeSource", exchange.getHistoryNodeSource()); + Map internalProps = exchange.getInternalProperties(); + if (internalProps != null) { + for (String key : internalProps.keySet()) { + Object value = internalProps.get(key); + recordValue(attributes, "InternalProperty-"+key, value); + } + } + recordValue(attributes, "HistoryNodeId", exchange.getInternalProperties()); + + } + } + + public static void recordValue(Map attributes, String key, Object value) { + if(key != null && !key.isEmpty() && value != null) { + attributes.put(key, value); + } + } + + public static void reportExchange(Exchange exchange) { + HashMap attributes = new HashMap<>(); + recordValue(attributes, "ExchangeId", exchange.getExchangeId()); + Map properties = exchange.getAllProperties(); + Set keys = properties.keySet(); + for(String key : keys) { + recordValue(attributes, key, properties.get(key)); + } + NewRelic.getAgent().getInsights().recordCustomEvent("Pipeline_Exchange", attributes); + } +} \ No newline at end of file diff --git a/camel-core-3.9/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java b/camel-core/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java similarity index 63% rename from camel-core-3.9/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java rename to camel-core/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java index 3038c8d..13d737d 100644 --- a/camel-core-3.9/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java +++ b/camel-core/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java @@ -5,22 +5,16 @@ import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; @Weave(type = MatchType.Interface) public abstract class AsyncProcessorAwaitManager { @Trace(dispatcher = true) public void process(AsyncProcessor processor, Exchange exchange) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessorAwaitManager",getClass().getSimpleName(),"process"); - NRAsyncProcessorWrapper wrapper = new NRAsyncProcessorWrapper(processor, null); - processor = wrapper; Weaver.callOriginal(); } } diff --git a/camel-core/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java b/camel-core/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java new file mode 100644 index 0000000..9fa6333 --- /dev/null +++ b/camel-core/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java @@ -0,0 +1,56 @@ +package org.apache.camel.spi; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.AsyncCallback; +import org.apache.camel.AsyncProcessor; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.Util; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.TracedMethod; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave(type = MatchType.Interface) +public abstract class SharedInternalProcessor { + + @Trace(dispatcher = true) + public boolean process(Exchange exchange, AsyncCallback originalCallback, AsyncProcessor processor, Processor resultProcessor) { + TracedMethod traced = NewRelic.getAgent().getTracedMethod(); + Map attributes = new HashMap(); + Util.recordExchange(attributes, exchange); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + String routeID = exchange != null ? exchange.getFromRouteId() : null; + if(routeID != null && !routeID.isEmpty()) { + traced.setMetricName("Custom","Camel","SharedInternalProcessor",getClass().getSimpleName(),"process1",routeID); + } else { + traced.setMetricName("Custom","Camel","SharedInternalProcessor",getClass().getSimpleName(),"process1"); + } + traced.addCustomAttribute("AsyncProcessor", processor.getClass().getSimpleName()); + traced.addCustomAttribute("ResultProcessor", resultProcessor.getClass().getSimpleName()); + return Weaver.callOriginal(); + } + + @Trace(dispatcher = true) + public void process(Exchange exchange, AsyncProcessor processor, Processor resultProcessor) { + TracedMethod traced = NewRelic.getAgent().getTracedMethod(); + Map attributes = new HashMap(); + Util.recordExchange(attributes, exchange); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + String routeID = exchange != null ? exchange.getFromRouteId() : null; + if(routeID != null && !routeID.isEmpty()) { + traced.setMetricName("Custom","Camel","SharedInternalProcessor",getClass().getSimpleName(),"process2",routeID); + } else { + traced.setMetricName("Custom","Camel","SharedInternalProcessor",getClass().getSimpleName(),"process2"); + } + traced.addCustomAttribute("AsyncProcessor", processor.getClass().getSimpleName()); + traced.addCustomAttribute("ResultProcessor", resultProcessor.getClass().getSimpleName()); + Weaver.callOriginal(); + } + +} diff --git a/camel-kafka-3.14/build.gradle b/camel-kafka-3.14/build.gradle index 5da0006..5cdcbae 100644 --- a/camel-kafka-3.14/build.gradle +++ b/camel-kafka-3.14/build.gradle @@ -24,5 +24,5 @@ jar { } verifyInstrumentation { - passes 'org.apache.camel:camel-kafka:[3.14.0,3.14.9]' + passes 'org.apache.camel:camel-kafka:[3.14.0,3.14.10]' } \ No newline at end of file diff --git a/camel-netty-3.0/build.gradle b/camel-netty-3.0/build.gradle index 1751653..f401192 100644 --- a/camel-netty-3.0/build.gradle +++ b/camel-netty-3.0/build.gradle @@ -22,5 +22,5 @@ jar { } verifyInstrumentation { - passes 'org.apache.camel:camel-netty:[3.0.0,3.18.0]' + passes 'org.apache.camel:camel-netty:(3.0.1,3.18.0)' } \ No newline at end of file diff --git a/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/NettyHelper.java b/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/NettyHelper.java index f2a3dfd..80f8983 100644 --- a/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/NettyHelper.java +++ b/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/NettyHelper.java @@ -1,18 +1,14 @@ package org.apache.camel.component.netty; -import java.net.InetSocketAddress; import java.net.SocketAddress; -import java.net.URI; import org.apache.camel.Exchange; import org.slf4j.Logger; -import com.newrelic.api.agent.GenericParameters; import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; +import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.labs.camel.netty.NewRelicChannelFutureListener; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; @@ -20,17 +16,12 @@ @Weave public class NettyHelper { - + @Trace public static void writeBodyAsync(Logger log, Channel channel, SocketAddress remoteAddress, Object body, Exchange exchange, ChannelFutureListener listener) { - InetSocketAddress address = (InetSocketAddress)remoteAddress; - - URI uri = URI.create("netty://"+address.getHostName()+":"+address.getPort()); - GenericParameters params = GenericParameters.library("Camel-Netty").uri(uri).procedure("send").build(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment("Camel/Netty/Producer"); - segment.reportAsExternal(params); - listener = new NewRelicChannelFutureListener(listener, segment); + NewRelic.getAgent().getTracedMethod().addCustomAttribute("Body-Class", body.getClass().getName()); + NewRelic.getAgent().getTracedMethod().addCustomAttribute("Channel-Type", channel.getClass().getName()); Weaver.callOriginal(); } } diff --git a/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/NettyProducer.java b/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/NettyProducer.java index 0ddffbf..d7d48f2 100644 --- a/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/NettyProducer.java +++ b/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/NettyProducer.java @@ -1,38 +1,54 @@ package org.apache.camel.component.netty; +import java.net.URI; + import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; +import com.newrelic.api.agent.GenericParameters; import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.Token; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.NewField; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.labs.camel.netty.ExchangeHeaders; import io.netty.channel.ChannelFuture; @Weave public abstract class NettyProducer { + private NettyConfiguration configuration = Weaver.callOriginal(); + @Trace(dispatcher = true) public boolean process(Exchange exchange, AsyncCallback callback) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new ExchangeHeaders(exchange)); - + if(configuration != null) { + String host = configuration.getHost(); + int port = configuration.getPort(); + URI uri = URI.create("tcp://"+host+":"+port); + GenericParameters params = GenericParameters.library("Camel-Netty").uri(uri).procedure("process").build(); + Segment segment = NewRelic.getAgent().getTransaction().startSegment("Camel/Netty/Send"); + segment.reportAsExternal(params); + exchange.setProperty("NRSEGMENT", segment); + } + return Weaver.callOriginal(); } - @Trace + @Trace(dispatcher = true) public void processWithConnectedChannel(Exchange exchange, BodyReleaseCallback callback, ChannelFuture channelFuture, Object body) { - + Object obj = exchange.getProperty("NRSEGMENT"); + if(obj != null && obj instanceof Segment) { + ((Segment)obj).end(); + } Weaver.callOriginal(); } + @Weave private static class ChannelConnectedListener { - + @NewField private Token token = null; @@ -45,8 +61,9 @@ private static class ChannelConnectedListener { t.expire(); t = null; } + } - + @Trace(async = true) public void operationComplete(ChannelFuture future) { if(token != null) { @@ -55,8 +72,10 @@ public void operationComplete(ChannelFuture future) { } Weaver.callOriginal(); } + } + @Weave private static final class BodyReleaseCallback { diff --git a/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/handlers/ClientChannelHandler.java b/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/handlers/ClientChannelHandler.java index 9afcbca..16be0d0 100644 --- a/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/handlers/ClientChannelHandler.java +++ b/camel-netty-3.0/src/main/java/org/apache/camel/component/netty/handlers/ClientChannelHandler.java @@ -1,36 +1,79 @@ package org.apache.camel.component.netty.handlers; import org.apache.camel.Exchange; +import org.apache.camel.Message; import org.apache.camel.component.netty.NettyCamelState; +import org.apache.camel.component.netty.NettyProducer; import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; import com.newrelic.api.agent.TransportType; +import com.newrelic.api.agent.weaver.NewField; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.labs.camel.netty.ExchangeHeaders; +import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelId; @Weave public abstract class ClientChannelHandler { + @NewField + private Token token = null; + + public ClientChannelHandler(NettyProducer producer) { + + } + @Trace(dispatcher = true) protected void channelRead0(ChannelHandlerContext ctx, Object msg) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "ClientChannelHandler", "Custom","ClientChannelHandler",msg.getClass().getSimpleName()); + String channelName = "UnknownChannel"; + Channel channel = ctx.channel(); + if(channel != null) { + ChannelId channelId = channel.id(); + if(channelId != null) { + channelName = channelId.asShortText(); + } + } + + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Netty","ClientChannelHandler","channelRead"); + NewRelic.getAgent().getTracedMethod().addCustomAttribute("MessageType", msg.getClass().getName()); + NewRelic.getAgent().getTracedMethod().addCustomAttribute("Channel",channelName); Weaver.callOriginal(); } @SuppressWarnings("unused") private NettyCamelState getState(ChannelHandlerContext ctx, Object msg) { NettyCamelState state = Weaver.callOriginal(); - Exchange exchange = state.getExchange(); - if(exchange != null) { - ExchangeHeaders headers = new ExchangeHeaders(exchange); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, headers); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); + if (state != null) { + Exchange exchange = state.getExchange(); + if (exchange != null) { + ExchangeHeaders headers = new ExchangeHeaders(exchange); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, headers); + } else { + NewRelic.getAgent().getTransaction().ignore(); + } + } else { + NewRelic.getAgent().getTransaction().ignore(); } return state; } + + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + NewRelic.noticeError(cause); + Weaver.callOriginal(); + } + + @Trace + protected Message getResponseMessage(Exchange exchange, ChannelHandlerContext ctx, Object message) throws Exception { + try { + return Weaver.callOriginal(); + } catch (Exception e) { + NewRelic.getAgent().getTransaction().ignore(); + throw e; + } + } } diff --git a/camel-netty-3.18/build.gradle b/camel-netty-3.18/build.gradle index 408b3a9..c4f2433 100644 --- a/camel-netty-3.18/build.gradle +++ b/camel-netty-3.18/build.gradle @@ -24,5 +24,5 @@ jar { } verifyInstrumentation { - passes 'org.apache.camel:camel-netty:[3.18.0,)' + passes 'org.apache.camel:camel-netty:[3.17.0,)' } \ No newline at end of file diff --git a/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/NettyHelper.java b/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/NettyHelper.java index a6f8a27..8724d7e 100644 --- a/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/NettyHelper.java +++ b/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/NettyHelper.java @@ -16,8 +16,7 @@ public class NettyHelper { @Trace - public static void writeBodyAsync( - Logger log, Channel channel, SocketAddress remoteAddress, Object body, + public static void writeBodyAsync(Logger log, Channel channel, SocketAddress remoteAddress, Object body, ChannelFutureListener listener) { NewRelic.getAgent().getTracedMethod().addCustomAttribute("Body-Class", body.getClass().getName()); NewRelic.getAgent().getTracedMethod().addCustomAttribute("Channel-Type", channel.getClass().getName()); diff --git a/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/NettyProducer.java b/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/NettyProducer.java index 92a05cb..d7d48f2 100644 --- a/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/NettyProducer.java +++ b/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/NettyProducer.java @@ -10,11 +10,9 @@ import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.Token; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.NewField; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.labs.camel.netty.ExchangeHeaders; import io.netty.channel.ChannelFuture; @@ -25,7 +23,6 @@ public abstract class NettyProducer { @Trace(dispatcher = true) public boolean process(Exchange exchange, AsyncCallback callback) { -// NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new ExchangeHeaders(exchange)); if(configuration != null) { String host = configuration.getHost(); int port = configuration.getPort(); @@ -49,13 +46,6 @@ public void processWithConnectedChannel(Exchange exchange, BodyReleaseCallback c } - @SuppressWarnings("unused") - private boolean processWithBody(final Exchange exchange, Object body, BodyReleaseCallback callback) { -// ExchangeHeaders headers = new ExchangeHeaders(exchange); -// NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - return Weaver.callOriginal(); - } - @Weave private static class ChannelConnectedListener { diff --git a/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java b/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java index 520b4f3..cf44585 100644 --- a/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java +++ b/camel-netty-3.18/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java @@ -62,8 +62,6 @@ private void processAsynchronously(Exchange exchange, ChannelHandlerContext ctx) HashMap attributes = new HashMap<>(); Util.recordExchange(attributes, exchange); NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); -// ExchangeHeaders headers = new ExchangeHeaders(exchange); -// NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); Weaver.callOriginal(); } diff --git a/camel-processor/build.gradle b/camel-processor/build.gradle new file mode 100644 index 0000000..4900f06 --- /dev/null +++ b/camel-processor/build.gradle @@ -0,0 +1,28 @@ + +// Build.gradle generated for instrumentation module camel-processor + +apply plugin: 'java' + +dependencies { + implementation 'org.apache.camel:camel-core:3.1.0' + + // New Relic Labs Java Agent dependencies + implementation 'com.newrelic.agent.java:newrelic-agent:6.4.1' + implementation 'com.newrelic.agent.java:newrelic-api:6.4.1' + implementation fileTree(include: ['*.jar'], dir: '../libs') +} + +jar { + manifest { + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.camel-processor' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' + attributes 'Implementation-Version': 1.0 + } +} + +verifyInstrumentation { + passes 'org.apache.camel:camel-core:[3.1.0,)' + excludeRegex '.*M[1-9]' + excludeRegex '.*RC[1-9]' +} diff --git a/camel-processor/src/main/java/org/apache/camel/AsyncProcessor.java b/camel-processor/src/main/java/org/apache/camel/AsyncProcessor.java new file mode 100644 index 0000000..20e6e3e --- /dev/null +++ b/camel-processor/src/main/java/org/apache/camel/AsyncProcessor.java @@ -0,0 +1,44 @@ +package org.apache.camel; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave(type = MatchType.Interface) +public abstract class AsyncProcessor { + + @Trace + public boolean process(Exchange exchange, AsyncCallback callback) { + Map attributes = new HashMap(); + Util.recordExchange(attributes, exchange); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + String routeID = exchange != null ? exchange.getFromRouteId() : null; + if(routeID != null && !routeID.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"process",routeID); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"process"); + } + return Weaver.callOriginal(); + } + + @Trace + public CompletableFuture processAsync(Exchange exchange) { + Map attributes = new HashMap(); + Util.recordExchange(attributes, exchange); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + String routeID = exchange != null ? exchange.getFromRouteId() : null; + if(routeID != null && !routeID.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"processAsync",routeID); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"processAsync"); + } + return Weaver.callOriginal(); + } + +} diff --git a/camel-processor/src/main/java/org/apache/camel/Processor.java b/camel-processor/src/main/java/org/apache/camel/Processor.java new file mode 100644 index 0000000..2754a98 --- /dev/null +++ b/camel-processor/src/main/java/org/apache/camel/Processor.java @@ -0,0 +1,28 @@ +package org.apache.camel; + +import java.util.HashMap; +import java.util.Map; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave(type = MatchType.Interface) +public abstract class Processor { + + @Trace + public void process(Exchange exchange) { + Map attributes = new HashMap(); + Util.recordExchange(attributes, exchange); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + String routeID = exchange != null ? exchange.getFromRouteId() : null; + if(routeID != null && !routeID.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Processor",getClass().getSimpleName(),"process",routeID); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Processor",getClass().getSimpleName(),"process"); + } + Weaver.callOriginal(); + } +} diff --git a/camel-processor/src/main/java/org/apache/camel/Util.java b/camel-processor/src/main/java/org/apache/camel/Util.java new file mode 100644 index 0000000..58f249d --- /dev/null +++ b/camel-processor/src/main/java/org/apache/camel/Util.java @@ -0,0 +1,36 @@ +package org.apache.camel; + +import java.util.HashMap; +import java.util.Map; + +import com.newrelic.api.agent.NewRelic; + +public class Util { + + public static void recordExchange(Map attributes, Exchange exchange) { + if(exchange != null) { + recordValue(attributes, "ExchangeId", exchange.getExchangeId()); + CamelContext context = exchange.getContext(); + String ctxName = context != null ? context.getName() : null; + recordValue(attributes, "CamelContextName", ctxName); + recordValue(attributes, "CamelContextManagementName", context.getManagementName()); + Endpoint endpoint = exchange.getFromEndpoint(); + if(endpoint != null) { + recordValue(attributes, "From_EndPointURI", endpoint.getEndpointBaseUri()); + } + recordValue(attributes, "FromRouteId", exchange.getFromRouteId()); + } + } + + public static void recordValue(Map attributes, String key, Object value) { + if(key != null && !key.isEmpty() && value != null) { + attributes.put(key, value); + } + } + + public static void reportExchange(Exchange exchange) { + HashMap attributes = new HashMap<>(); + recordValue(attributes, "ExchangeId", exchange.getExchangeId()); + NewRelic.getAgent().getInsights().recordCustomEvent("Pipeline_Exchange", attributes); + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index bb9df32..69a0abe 100644 --- a/settings.gradle +++ b/settings.gradle @@ -20,3 +20,4 @@ include 'camel-kafka-3.14' include 'camel-kafka-3.15' include 'camel-kafka-3.18.3' include 'camel-core-4.1.0' +include 'camel-processor' From 50e8d7e7c71b631ac66d58c8678897589818f372 Mon Sep 17 00:00:00 2001 From: Doug Hilpipre Date: Mon, 29 Jan 2024 07:49:01 -0600 Subject: [PATCH 2/4] fixed further problems with distributed tracing headers --- camel-core/build.gradle | 29 -- .../java/org/apache/camel/AsyncProcessor.java | 44 -- .../org/apache/camel/ConsumerTemplate.java | 120 ----- .../org/apache/camel/PollingConsumer.java | 29 -- .../main/java/org/apache/camel/Processor.java | 28 -- .../org/apache/camel/ProducerTemplate.java | 475 ------------------ .../src/main/java/org/apache/camel/Util.java | 111 ---- .../camel/spi/AsyncProcessorAwaitManager.java | 20 - .../camel/spi/SharedInternalProcessor.java | 56 --- 9 files changed, 912 deletions(-) delete mode 100644 camel-core/build.gradle delete mode 100644 camel-core/src/main/java/org/apache/camel/AsyncProcessor.java delete mode 100644 camel-core/src/main/java/org/apache/camel/ConsumerTemplate.java delete mode 100644 camel-core/src/main/java/org/apache/camel/PollingConsumer.java delete mode 100644 camel-core/src/main/java/org/apache/camel/Processor.java delete mode 100644 camel-core/src/main/java/org/apache/camel/ProducerTemplate.java delete mode 100644 camel-core/src/main/java/org/apache/camel/Util.java delete mode 100644 camel-core/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java delete mode 100644 camel-core/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java diff --git a/camel-core/build.gradle b/camel-core/build.gradle deleted file mode 100644 index 268b522..0000000 --- a/camel-core/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ - -// Build.gradle generated for instrumentation module camel-core - -apply plugin: 'java' - -dependencies { - implementation 'org.apache.camel:camel-core:3.18.0' - - // New Relic Labs Java Agent dependencies - implementation 'com.newrelic.agent.java:newrelic-agent:6.4.1' - implementation 'com.newrelic.agent.java:newrelic-api:6.4.1' - implementation fileTree(include: ['*.jar'], dir: '../libs') -} - -jar { - manifest { - attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.camel-core' - attributes 'Implementation-Vendor': 'New Relic Labs' - attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' - attributes 'Implementation-Version': 1.0 - } -} - -verifyInstrumentation { - passes 'org.apache.camel:camel-core:[3.15.0,4.0.0)' - excludeRegex '.*M[1-9]' - excludeRegex '.*RC[1-9]' - -} \ No newline at end of file diff --git a/camel-core/src/main/java/org/apache/camel/AsyncProcessor.java b/camel-core/src/main/java/org/apache/camel/AsyncProcessor.java deleted file mode 100644 index 47faf97..0000000 --- a/camel-core/src/main/java/org/apache/camel/AsyncProcessor.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.apache.camel; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type = MatchType.Interface) -public abstract class AsyncProcessor { - - @Trace(dispatcher = true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - String routeID = exchange != null ? exchange.getFromRouteId() : null; - if(routeID != null && !routeID.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"process",routeID); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"process"); - } - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture processAsync(Exchange exchange) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - String routeID = exchange != null ? exchange.getFromRouteId() : null; - if(routeID != null && !routeID.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"processAsync",routeID); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessor",getClass().getSimpleName(),"processAsync"); - } - return Weaver.callOriginal(); - } - -} diff --git a/camel-core/src/main/java/org/apache/camel/ConsumerTemplate.java b/camel-core/src/main/java/org/apache/camel/ConsumerTemplate.java deleted file mode 100644 index ed16904..0000000 --- a/camel-core/src/main/java/org/apache/camel/ConsumerTemplate.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.apache.camel; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type = MatchType.Interface) -public abstract class ConsumerTemplate { - - @Trace(dispatcher = true) - public Exchange receive(String endpointUri) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive-endpointUri"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange receive(Endpoint endpoint) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive-endpoint"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange receive(String endpointUri, long timeout) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive-endpointUri-to"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange receive(Endpoint endpoint, long timeout) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive-endpoint-to"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange receiveNoWait(String endpointUri) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveNoWait-endpointUri"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange receiveNoWait(Endpoint endpoint) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveNoWait-endpoint"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object receiveBody(String endpointUri) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpointuri"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object receiveBody(Endpoint endpoint) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpoint"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object receiveBody(String endpointUri, long timeout) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpointuri-to"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object receiveBody(Endpoint endpoint, long timeout) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpoint-to"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object receiveBodyNoWait(String endpointUri) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait-endpointuri"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object receiveBodyNoWait(Endpoint endpoint) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait-endpoint"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T receiveBody(String endpointUri, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpointuri-type"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T receiveBody(Endpoint endpoint, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpoint-type"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T receiveBody(String endpointUri, long timeout, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpointuri-to-type"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T receiveBody(Endpoint endpoint, long timeout, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody-endpoint-to-type"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T receiveBodyNoWait(String endpointUri, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait-endpointuri-type"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T receiveBodyNoWait(Endpoint endpoint, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait-endpoint-type"); - return Weaver.callOriginal(); - } - -} diff --git a/camel-core/src/main/java/org/apache/camel/PollingConsumer.java b/camel-core/src/main/java/org/apache/camel/PollingConsumer.java deleted file mode 100644 index 3450e7e..0000000 --- a/camel-core/src/main/java/org/apache/camel/PollingConsumer.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.apache.camel; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type = MatchType.Interface) -public abstract class PollingConsumer { - - @Trace(dispatcher = true) - public Exchange receive() { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange receiveNoWait() { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receiveNoWait"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange receive(long timeout) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive-to"); - return Weaver.callOriginal(); - } -} diff --git a/camel-core/src/main/java/org/apache/camel/Processor.java b/camel-core/src/main/java/org/apache/camel/Processor.java deleted file mode 100644 index 4c1c7ad..0000000 --- a/camel-core/src/main/java/org/apache/camel/Processor.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type = MatchType.Interface) -public abstract class Processor { - - @Trace(dispatcher = true) - public void process(Exchange exchange) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - String routeID = exchange != null ? exchange.getFromRouteId() : null; - if(routeID != null && !routeID.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Processor",getClass().getSimpleName(),"process",routeID); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Processor",getClass().getSimpleName(),"process"); - } - Weaver.callOriginal(); - } -} diff --git a/camel-core/src/main/java/org/apache/camel/ProducerTemplate.java b/camel-core/src/main/java/org/apache/camel/ProducerTemplate.java deleted file mode 100644 index 83ab787..0000000 --- a/camel-core/src/main/java/org/apache/camel/ProducerTemplate.java +++ /dev/null @@ -1,475 +0,0 @@ -package org.apache.camel; - -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.apache.camel.spi.Synchronization; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type = MatchType.Interface) -public class ProducerTemplate { - - @Trace(dispatcher = true) - public Exchange send(Exchange exchange) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-exchange"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange send(Processor processor) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-processor"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBody(Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBody"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBodyAndHeader(Object body, String header, Object headerValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeader"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBodyAndProperty(Object body, String property, Object propertyValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndProperty"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBodyAndHeaders(Object body, Map headers) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeaders"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange send(String endpointUri, Exchange exchange) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpointuri-ex"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange send(String endpointUri, Processor processor) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpointuri-pro"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange send(String endpointUri, ExchangePattern pattern, Processor processor) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpointuri-expat-pro"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange send(Endpoint endpoint, Exchange exchange) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpointuri-expat-pro"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange send(Endpoint endpoint, Processor processor) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpoint-pro"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange send(Endpoint endpoint, ExchangePattern pattern, Processor processor) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send-endpoint-expat-pro"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange send(Endpoint endpoint, ExchangePattern pattern, Processor processor, Processor resultProcessor) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"send"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBody(Endpoint endpoint, Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBody"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBody(String endpointUri, Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBody"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object sendBody(Endpoint endpoint, ExchangePattern pattern, Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBody"); - return Weaver.callOriginal(); - } - - - @Trace(dispatcher = true) - public Object sendBody(String endpointUri, ExchangePattern pattern, Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBodyAndHeader(String endpointUri, Object body, String header, Object headerValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeader"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBodyAndHeader(Endpoint endpoint, Object body, String header, Object headerValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeader"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object sendBodyAndHeader(Endpoint endpoint, ExchangePattern pattern, Object body, String header, Object headerValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeader"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object sendBodyAndHeader(String endpoint, ExchangePattern pattern, Object body, String header, Object headerValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeader"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBodyAndProperty(String endpointUri, Object body, String property, Object propertyValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndProperty"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBodyAndProperty(Endpoint endpoint, Object body, String property, Object propertyValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndProperty"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object sendBodyAndProperty(Endpoint endpoint, ExchangePattern pattern, Object body, String property, Object propertyValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndProperty"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object sendBodyAndProperty( - String endpoint, ExchangePattern pattern, Object body, - String property, Object propertyValue) - { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndProperty"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBodyAndHeaders(String endpointUri, Object body, Map headers) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeaders"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void sendBodyAndHeaders(Endpoint endpoint, Object body, Map headers) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeaders"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object sendBodyAndHeaders( - String endpointUri, ExchangePattern pattern, Object body, - Map headers) - { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeaders"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object sendBodyAndHeaders( - Endpoint endpoint, ExchangePattern pattern, Object body, - Map headers) - { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"sendBodyAndHeaders"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange request(Endpoint endpoint, Processor processor) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"request"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Exchange request(String endpointUri, Processor processor) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"request"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object requestBody(Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T requestBody(Object body, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object requestBody(Endpoint endpoint, Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T requestBody(Endpoint endpoint, Object body, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object requestBody(String endpointUri, Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T requestBody(String endpointUri, Object body, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object requestBodyAndHeader(Object body, String header, Object headerValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeader"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object requestBodyAndHeader(Endpoint endpoint, Object body, String header, Object headerValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeader"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T requestBodyAndHeader(Endpoint endpoint, Object body, String header, Object headerValue, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeader"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object requestBodyAndHeader(String endpointUri, Object body, String header, Object headerValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeader"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T requestBodyAndHeader(String endpointUri, Object body, String header, Object headerValue, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeader"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object requestBodyAndHeaders(String endpointUri, Object body, Map headers) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeaders"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T requestBodyAndHeaders(String endpointUri, Object body, Map headers, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeaders"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object requestBodyAndHeaders(Endpoint endpoint, Object body, Map headers) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeaders"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public Object requestBodyAndHeaders(Object body, Map headers) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeaders"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public T requestBodyAndHeaders(Endpoint endpoint, Object body, Map headers, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"requestBodyAndHeaders"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncSend(String endpointUri, Exchange exchange) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSend"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncSend(String endpointUri, Processor processor) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSend"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncSendBody(String endpointUri, Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSendBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBody(String endpointUri, Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBodyAndHeader(String endpointUri, Object body, String header, Object headerValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeader"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBodyAndHeaders(String endpointUri, Object body, Map headers) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeaders"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBody(String endpointUri, Object body, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBodyAndHeader( - String endpointUri, Object body, String header, Object headerValue, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeader"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBodyAndHeaders( - String endpointUri, Object body, Map headers, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeader"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncSend(Endpoint endpoint, Exchange exchange) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSend"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncSend(Endpoint endpoint, Processor processor) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSend"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncSendBody(Endpoint endpoint, Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncSendBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBody(Endpoint endpoint, Object body) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBodyAndHeader(Endpoint endpoint, Object body, String header, Object headerValue) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeader"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBodyAndHeaders(Endpoint endpoint, Object body, Map headers){ - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeaders"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBody(Endpoint endpoint, Object body, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBody"); - return Weaver.callOriginal(); - } - - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBodyAndHeader( - Endpoint endpoint, Object body, String header, Object headerValue, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeader"); - return Weaver.callOriginal(); - } - - - @Trace(dispatcher = true) - public CompletableFuture asyncRequestBodyAndHeaders( - Endpoint endpoint, Object body, Map headers, Class type) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncRequestBodyAndHeaders"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncCallback(String endpointUri, Exchange exchange, Synchronization onCompletion) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallback"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncCallback(Endpoint endpoint, Exchange exchange, Synchronization onCompletion) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallback"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncCallback(String endpointUri, Processor processor, Synchronization onCompletion) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallback"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncCallback(Endpoint endpoint, Processor processor, Synchronization onCompletion) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallback"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncCallbackSendBody(String endpointUri, Object body, Synchronization onCompletion) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallbackSendBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncCallbackSendBody(Endpoint endpoint, Object body, Synchronization onCompletion) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallbackSendBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncCallbackRequestBody(String endpointUri, Object body, Synchronization onCompletion) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallbackRequestBody"); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture asyncCallbackRequestBody(Endpoint endpoint, Object body, Synchronization onCompletion) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ProducerTemplate",getClass().getSimpleName(),"asyncCallbackRequestBody"); - return Weaver.callOriginal(); - } - -} diff --git a/camel-core/src/main/java/org/apache/camel/Util.java b/camel-core/src/main/java/org/apache/camel/Util.java deleted file mode 100644 index d3ab6a9..0000000 --- a/camel-core/src/main/java/org/apache/camel/Util.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.apache.camel; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.camel.CamelContext; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.ExtendedExchange; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; - -public class Util { - - private static final List ignores; - - static { - ignores = new ArrayList<>(); - ignores.add("org.apache.camel.impl.engine.CamelInternalProcessor$AsyncAfterTask"); - } - - @SuppressWarnings("deprecation") - public static boolean isTranscationActive() { - return AgentBridge.getAgent().getTransaction().isStarted(); - } - -// public static NRRunnable getRunnable(Runnable runnable) { -// String classname = runnable.getClass().getName(); -// if(ignores.contains(classname)) return null; -// -// if(runnable instanceof NRRunnable) return (NRRunnable)runnable; -// -// Token token = NewRelic.getAgent().getTransaction().getToken(); -// if(token != null && token.isActive()) { -// return new NRRunnable(runnable, token); -// } else if(token != null) { -// token.expire(); -// token = null; -// } -// -// return null; -// } -// - public static String getMethodName(Method m) { - if(m == null) return "UnknownClass.UnknownMethod"; - - String classname = m.getDeclaringClass().getSimpleName(); - String methodName = m.getName(); - - return classname + "." + methodName; - } - - public static void recordExchange(Map attributes, Exchange exchange) { - if(exchange != null) { - recordValue(attributes, "ExchangeId", exchange.getExchangeId()); - CamelContext context = exchange.getContext(); - String ctxName = context != null ? context.getName() : null; - recordValue(attributes, "CamelContextName", ctxName); - recordValue(attributes, "CamelContextManagementName", context.getManagementName()); - Endpoint endpoint = exchange.getFromEndpoint(); - if(endpoint != null) { - recordValue(attributes, "From_EndPointURI", endpoint.getEndpointBaseUri()); - } - recordValue(attributes, "FromRouteId", exchange.getFromRouteId()); - if(exchange instanceof ExtendedExchange) { - ExtendedExchange extended = (ExtendedExchange)exchange; - recordExtendedExchange(attributes, extended); - } - } - } - - private static void recordExtendedExchange(Map attributes, ExtendedExchange exchange) { - if(exchange != null) { - recordValue(attributes, "HistoryNodeId", exchange.getHistoryNodeId()); - recordValue(attributes, "HistoryNodeLabel", exchange.getHistoryNodeLabel()); - recordValue(attributes, "HistoryNodeSource", exchange.getHistoryNodeSource()); - Map internalProps = exchange.getInternalProperties(); - if (internalProps != null) { - for (String key : internalProps.keySet()) { - Object value = internalProps.get(key); - recordValue(attributes, "InternalProperty-"+key, value); - } - } - recordValue(attributes, "HistoryNodeId", exchange.getInternalProperties()); - - } - } - - public static void recordValue(Map attributes, String key, Object value) { - if(key != null && !key.isEmpty() && value != null) { - attributes.put(key, value); - } - } - - public static void reportExchange(Exchange exchange) { - HashMap attributes = new HashMap<>(); - recordValue(attributes, "ExchangeId", exchange.getExchangeId()); - Map properties = exchange.getAllProperties(); - Set keys = properties.keySet(); - for(String key : keys) { - recordValue(attributes, key, properties.get(key)); - } - NewRelic.getAgent().getInsights().recordCustomEvent("Pipeline_Exchange", attributes); - } -} \ No newline at end of file diff --git a/camel-core/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java b/camel-core/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java deleted file mode 100644 index 13d737d..0000000 --- a/camel-core/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.apache.camel.spi; - -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type = MatchType.Interface) -public abstract class AsyncProcessorAwaitManager { - - @Trace(dispatcher = true) - public void process(AsyncProcessor processor, Exchange exchange) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessorAwaitManager",getClass().getSimpleName(),"process"); - Weaver.callOriginal(); - } -} diff --git a/camel-core/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java b/camel-core/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java deleted file mode 100644 index 9fa6333..0000000 --- a/camel-core/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.apache.camel.spi; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Exchange; -import org.apache.camel.Processor; -import org.apache.camel.Util; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TracedMethod; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type = MatchType.Interface) -public abstract class SharedInternalProcessor { - - @Trace(dispatcher = true) - public boolean process(Exchange exchange, AsyncCallback originalCallback, AsyncProcessor processor, Processor resultProcessor) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - String routeID = exchange != null ? exchange.getFromRouteId() : null; - if(routeID != null && !routeID.isEmpty()) { - traced.setMetricName("Custom","Camel","SharedInternalProcessor",getClass().getSimpleName(),"process1",routeID); - } else { - traced.setMetricName("Custom","Camel","SharedInternalProcessor",getClass().getSimpleName(),"process1"); - } - traced.addCustomAttribute("AsyncProcessor", processor.getClass().getSimpleName()); - traced.addCustomAttribute("ResultProcessor", resultProcessor.getClass().getSimpleName()); - return Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public void process(Exchange exchange, AsyncProcessor processor, Processor resultProcessor) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - String routeID = exchange != null ? exchange.getFromRouteId() : null; - if(routeID != null && !routeID.isEmpty()) { - traced.setMetricName("Custom","Camel","SharedInternalProcessor",getClass().getSimpleName(),"process2",routeID); - } else { - traced.setMetricName("Custom","Camel","SharedInternalProcessor",getClass().getSimpleName(),"process2"); - } - traced.addCustomAttribute("AsyncProcessor", processor.getClass().getSimpleName()); - traced.addCustomAttribute("ResultProcessor", resultProcessor.getClass().getSimpleName()); - Weaver.callOriginal(); - } - -} From ecd8916606f4c42ab1349cc9f66e9fbb36b8629b Mon Sep 17 00:00:00 2001 From: Doug Hilpipre Date: Mon, 29 Jan 2024 10:08:05 -0600 Subject: [PATCH 3/4] migrated changes from 3.18 to 4.0.0 --- camel-core-3.18/build.gradle | 2 +- .../apache/camel/support/DefaultProducer.java | 17 -- camel-core-4.0.0/build.gradle | 2 +- .../AggregateProcessor_instrumentation.java | 7 +- .../apache/camel/CamelHeaders.java | 5 + ...amelInternalProcessor_instrumentation.java | 21 +- .../ChoiceProcessor_instrumentation.java | 24 +- .../MultiCastProcessor_instrumentation.java | 19 +- .../apache/camel/NRAsyncProcessorStart.java | 59 +++++ .../apache/camel/NRAsyncProcessorWrapper.java | 86 +++---- .../apache/camel/NRProcessorStart.java | 37 +++ .../apache/camel/NRProcessorWrapper.java | 54 ++-- .../camel/Pipeline_instrumentation.java | 12 +- .../camel/SendProcessor_instrumentation.java | 4 - ...aredInternalProcessor_instrumentation.java | 34 ++- .../Synchronization_instrumentation.java | 2 + .../nr/instrumentation/apache/camel/Util.java | 64 ++++- .../wrappers/OutboundExchangeWrapper.java | 26 -- .../main/java/org/apache/camel/Channel.java | 61 +++++ .../org/apache/camel/ConsumerTemplate.java | 62 ++--- .../camel/Endpoint_instrumentation.java | 37 --- .../camel/component/bean/BeanProcessor.java | 14 -- .../component/file/GenericFileConsumer.java | 3 +- .../component/seda/SedaPollingConsumer.java | 75 ++++++ .../camel/component/seda/SedaProducer.java | 7 +- .../DefaultAsyncProcessorAwaitManager.java | 17 +- .../impl/engine/DefaultProducerTemplate.java | 20 +- .../processor/DelayProcessorSupport.java | 43 ++++ .../org/apache/camel/resume/ResumableSet.java | 8 + .../camel/spi/AsyncProcessorAwaitManager.java | 26 -- .../org/apache/camel/spi/ProducerCache.java | 6 - .../camel/spi/SharedInternalProcessor.java | 33 --- .../apache/camel/support/DefaultConsumer.java | 17 +- .../apache/camel/support/DefaultProducer.java | 24 -- .../support/EventDrivenPollingConsumer.java | 80 +++--- .../apache/camel/support/ExchangeHelper.java | 44 ---- .../support/ProcessorPollingConsumer.java | 73 +++--- camel-core-4.1/build.gradle | 28 --- .../AggregateProcessor_instrumentation.java | 52 ---- ...amelInternalProcessor_instrumentation.java | 39 --- .../ChoiceProcessor_instrumentation.java | 57 ----- .../MultiCastProcessor_instrumentation.java | 43 ---- .../apache/camel/NRAsyncProcessorWrapper.java | 82 ------- .../apache/camel/NRProcessorWrapper.java | 58 ----- .../apache/camel/NRRunnable.java | 33 --- .../apache/camel/NRSynchronization.java | 42 ---- .../camel/Pipeline_instrumentation.java | 69 ------ .../camel/SendProcessor_instrumentation.java | 43 ---- ...aredInternalProcessor_instrumentation.java | 33 --- .../nr/instrumentation/apache/camel/Util.java | 83 ------- .../wrappers/InboundExchangeWrapper.java | 24 -- .../camel/wrappers/InboundMessageWrapper.java | 24 -- .../wrappers/OutboundExchangeWrapper.java | 26 -- .../java/org/apache/camel/Endpoint.java | 54 ---- .../bean/AbstractCamelInvocationHandler.java | 33 --- .../camel/component/bean/BeanProcessor.java | 40 --- .../component/bean/MethodInvocation.java | 24 -- .../controlbus/ControlBusProducer.java | 42 ---- .../camel/component/seda/SedaProducer.java | 30 --- .../impl/engine/DefaultProducerTemplate.java | 81 ------ .../apache/camel/support/DefaultConsumer.java | 36 --- .../apache/camel/support/DefaultProducer.java | 34 --- .../apache/camel/support/ExchangeHelper.java | 67 ----- .../support/component/ApiMethodHelper.java | 18 -- .../AggregateProcessor_instrumentation.java | 45 ---- .../apache/camel/CamelHeaders.java | 81 ------ ...amelInternalProcessor_instrumentation.java | 38 --- .../apache/camel/CamelMapHeaders.java | 61 ----- .../apache/camel/CamelMessageHeaders.java | 82 ------- .../ChoiceProcessor_instrumentation.java | 43 ---- .../camel/InvokeOnHeader_instrumentation.java | 41 ---- .../MultiCastProcessor_instrumentation.java | 41 ---- .../apache/camel/NRAsyncProcessorWrapper.java | 76 ------ .../apache/camel/NRBiConsumer.java | 27 -- .../apache/camel/NRProcessorWrapper.java | 56 ----- .../apache/camel/NRRunnable.java | 35 --- .../camel/Pipeline_instrumentation.java | 57 ----- .../camel/SendProcessor_instrumentation.java | 44 ---- ...aredInternalProcessor_instrumentation.java | 29 --- .../Synchronization_instrumentation.java | 48 ---- .../nr/instrumentation/apache/camel/Util.java | 111 --------- .../camel/wrappers/ExchangeHeaders.java | 63 ----- .../apache/camel/wrappers/MessageHeaders.java | 63 ----- .../wrappers/OutboundExchangeWrapper.java | 26 -- .../org/apache/camel/ConsumerTemplate.java | 231 ------------------ .../camel/Endpoint_instrumentation.java | 37 --- .../apache/camel/Handler_instrumentation.java | 23 -- .../apache/camel/Pattern_instrumentation.java | 24 -- .../apache/camel/Produce_instrumentation.java | 22 -- .../bean/AbstractCamelInvocationHandler.java | 33 --- .../camel/component/bean/BeanProcessor.java | 37 --- .../component/bean/MethodInvocation.java | 24 -- .../controlbus/ControlBusProducer.java | 42 ---- .../component/file/GenericFileConsumer.java | 51 ---- .../camel/component/seda/SedaProducer.java | 18 -- .../DefaultAsyncProcessorAwaitManager.java | 21 -- .../impl/engine/DefaultProducerTemplate.java | 71 ------ .../errorhandler/RedeliveryErrorHandler.java | 69 ------ .../camel/spi/AsyncProcessorAwaitManager.java | 26 -- .../org/apache/camel/spi/CamelLogger.java | 52 ---- .../org/apache/camel/spi/ProducerCache.java | 39 --- .../apache/camel/spi/ReactiveExecutor.java | 42 ---- .../camel/spi/SharedInternalProcessor.java | 33 --- .../camel/support/DefaultAsyncProducer.java | 57 ----- .../apache/camel/support/DefaultConsumer.java | 58 ----- .../apache/camel/support/DefaultProducer.java | 24 -- .../support/EventDrivenPollingConsumer.java | 84 ------- .../apache/camel/support/ExchangeHelper.java | 40 --- .../support/ProcessorPollingConsumer.java | 84 ------- .../support/component/ApiMethodHelper.java | 18 -- 110 files changed, 584 insertions(+), 4063 deletions(-) delete mode 100644 camel-core-3.18/src/main/java/org/apache/camel/support/DefaultProducer.java create mode 100644 camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorStart.java create mode 100644 camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorStart.java delete mode 100644 camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java create mode 100644 camel-core-4.0.0/src/main/java/org/apache/camel/Channel.java delete mode 100644 camel-core-4.0.0/src/main/java/org/apache/camel/Endpoint_instrumentation.java create mode 100644 camel-core-4.0.0/src/main/java/org/apache/camel/component/seda/SedaPollingConsumer.java create mode 100644 camel-core-4.0.0/src/main/java/org/apache/camel/processor/DelayProcessorSupport.java create mode 100644 camel-core-4.0.0/src/main/java/org/apache/camel/resume/ResumableSet.java delete mode 100644 camel-core-4.0.0/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java delete mode 100644 camel-core-4.0.0/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java delete mode 100644 camel-core-4.0.0/src/main/java/org/apache/camel/support/DefaultProducer.java delete mode 100644 camel-core-4.0.0/src/main/java/org/apache/camel/support/ExchangeHelper.java delete mode 100644 camel-core-4.1/build.gradle delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRRunnable.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRSynchronization.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/Util.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/InboundExchangeWrapper.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/InboundMessageWrapper.java delete mode 100644 camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java delete mode 100644 camel-core-4.1/java/org/apache/camel/Endpoint.java delete mode 100644 camel-core-4.1/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java delete mode 100644 camel-core-4.1/java/org/apache/camel/component/bean/BeanProcessor.java delete mode 100644 camel-core-4.1/java/org/apache/camel/component/bean/MethodInvocation.java delete mode 100644 camel-core-4.1/java/org/apache/camel/component/controlbus/ControlBusProducer.java delete mode 100644 camel-core-4.1/java/org/apache/camel/component/seda/SedaProducer.java delete mode 100644 camel-core-4.1/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java delete mode 100644 camel-core-4.1/java/org/apache/camel/support/DefaultConsumer.java delete mode 100644 camel-core-4.1/java/org/apache/camel/support/DefaultProducer.java delete mode 100644 camel-core-4.1/java/org/apache/camel/support/ExchangeHelper.java delete mode 100644 camel-core-4.1/java/org/apache/camel/support/component/ApiMethodHelper.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelMapHeaders.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelMessageHeaders.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/InvokeOnHeader_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRBiConsumer.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRRunnable.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Util.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/ExchangeHeaders.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/MessageHeaders.java delete mode 100644 camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/ConsumerTemplate.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/Endpoint_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/Handler_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/Pattern_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/Produce_instrumentation.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/component/bean/BeanProcessor.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/component/bean/MethodInvocation.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/component/seda/SedaProducer.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/spi/CamelLogger.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/spi/ProducerCache.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/spi/ReactiveExecutor.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/support/DefaultAsyncProducer.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/support/DefaultConsumer.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/support/DefaultProducer.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/support/ExchangeHelper.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java delete mode 100644 camel-core-4.1/src/main/java/org/apache/camel/support/component/ApiMethodHelper.java diff --git a/camel-core-3.18/build.gradle b/camel-core-3.18/build.gradle index e9ef8a9..a5f71d2 100644 --- a/camel-core-3.18/build.gradle +++ b/camel-core-3.18/build.gradle @@ -22,7 +22,7 @@ jar { } verifyInstrumentation { - passes 'org.apache.camel:camel-core:[3.18.0,4.0.0)' + passes 'org.apache.camel:camel-core:[3.18.0,4.0.0]' excludeRegex '.*M[1-9]' excludeRegex '.*RC[1-9]' } diff --git a/camel-core-3.18/src/main/java/org/apache/camel/support/DefaultProducer.java b/camel-core-3.18/src/main/java/org/apache/camel/support/DefaultProducer.java deleted file mode 100644 index af4d618..0000000 --- a/camel-core-3.18/src/main/java/org/apache/camel/support/DefaultProducer.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.apache.camel.support; - -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type=MatchType.BaseClass) -public abstract class DefaultProducer { - - public Exchange createExchange() { - Exchange exchange = Weaver.callOriginal(); - return exchange; - } - -} diff --git a/camel-core-4.0.0/build.gradle b/camel-core-4.0.0/build.gradle index cf9fa85..c8078f5 100644 --- a/camel-core-4.0.0/build.gradle +++ b/camel-core-4.0.0/build.gradle @@ -22,7 +22,7 @@ jar { } verifyInstrumentation { - passes 'org.apache.camel:camel-core:[4.0.0,4.1.0)' + passes 'org.apache.camel:camel-core:[4.0.0,)' excludeRegex '.*M[1-9]' excludeRegex '.*RC[1-9]' } diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java index 221ea9f..a22ce61 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java @@ -9,14 +9,13 @@ import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @Weave(originalName="org.apache.camel.processor.aggregate.AggregateProcessor") public abstract class AggregateProcessor_instrumentation { - @Trace(dispatcher = true) + @Trace protected boolean doProcess(Exchange exchange, AsyncCallback callback) { Map attributes = new HashMap(); Util.recordExchange(attributes, exchange); @@ -26,11 +25,10 @@ protected boolean doProcess(Exchange exchange, AsyncCallback callback) { NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","AggregateProcessor","doProcess",routeID}); NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "CamelProcessor", new String[] {"AggregateProcessor",routeID}); } - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); return Weaver.callOriginal(); } - @Trace(dispatcher=true) + @Trace protected boolean doProcess(Exchange exchange, String key, AsyncCallback callback, boolean sync) { String routeID = exchange != null ? exchange.getFromRouteId() : null; if(routeID != null && !routeID.isEmpty()) { @@ -38,7 +36,6 @@ protected boolean doProcess(Exchange exchange, String key, AsyncCallback callbac NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","AggregateProcessor","doProcess",routeID}); NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "CamelProcessor", new String[] {"AggregateProcessor",routeID}); } - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); return Weaver.callOriginal(); } diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java index a4c4ec4..3f5b666 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java @@ -50,6 +50,11 @@ public String getHeader(String name) { @Override public Collection getHeaderNames() { Map props = exchange.getProperties(); + Message msg = exchange.getMessage(); + if(msg != null) { + Map msgHeaders = msg.getHeaders(); + props.putAll(msgHeaders); + } return props != null ? props.keySet() : Collections.emptyList(); } diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java index 3b8ea8d..1ef09fc 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java @@ -1,15 +1,13 @@ package com.nr.instrumentation.apache.camel; import java.util.HashMap; -import java.util.Map; import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; -import org.apache.camel.Message; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TracedMethod; +import com.newrelic.api.agent.TransactionNamePriority; import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; @@ -20,19 +18,16 @@ public abstract class CamelInternalProcessor_instrumentation { @Trace(dispatcher = true) public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); + HashMap attributes = new HashMap<>(); Util.recordExchange(attributes, exchange); - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - if(exchange != null && exchange.getFromRouteId() != null) { - traced.setMetricName("Custom","CamelInternalProcessor","process",exchange.getFromRouteId()); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + String routeId = exchange != null ? exchange.getFromRouteId() : null; + if(exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } - if(!attributes.isEmpty()) { - traced.addCustomAttributes(attributes); + if(routeId != null && !routeId.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "CamelInternalProcessor", "Camel",getClass().getSimpleName(),routeId); } - Message message = exchange.getMessage(); - - - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); return Weaver.callOriginal(); } } diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java index 942f421..74bc307 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java @@ -1,40 +1,22 @@ package com.nr.instrumentation.apache.camel; -import java.util.HashMap; -import java.util.Map; - import org.apache.camel.AsyncCallback; -import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @Weave(originalName="org.apache.camel.processor.ChoiceProcessor") public abstract class ChoiceProcessor_instrumentation { - @Trace(dispatcher=true) + public abstract String getId(); + public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - String classname = getClass().getSimpleName(); - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, headers); - Endpoint endpoint = exchange.getFromEndpoint(); - if(endpoint != null) { - String endpointURI = endpoint.getEndpointBaseUri(); - if(endpointURI != null && !endpointURI.isEmpty()) { - Util.recordValue(attributes, "EndpointURI", endpointURI); - } - } - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + NewRelic.getAgent().getTracedMethod().addCustomAttribute("ChoiceProcessor-ID", getId()); String routeID = exchange != null ? exchange.getFromRouteId() : null; if(routeID != null && !routeID.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom",classname,"process",routeID}); NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "ChoiceProcessor", new String[] {"ChoiceProcessor",routeID}); } return Weaver.callOriginal(); diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java index 24a6a4e..f992695 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java @@ -3,12 +3,10 @@ import java.util.HashMap; import java.util.Map; -import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @@ -16,23 +14,16 @@ @Weave(type=MatchType.BaseClass,originalName="org.apache.camel.processor.MulticastProcessor") public abstract class MultiCastProcessor_instrumentation { - @Trace(dispatcher=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - - return Weaver.callOriginal(); - } - @Weave(originalName="org.apache.camel.processor.MulticastProcessor$MulticastTask", type = MatchType.BaseClass) protected static abstract class MulticastTask { - @Trace(dispatcher=true) + @Trace protected void doDone(Exchange exchange, boolean forceExhaust) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + Map attributes = new HashMap(); + Util.recordExchange(attributes, exchange); + NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","MulticastTask",getClass().getSimpleName(),"doDone"); Weaver.callOriginal(); } diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorStart.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorStart.java new file mode 100644 index 0000000..2c6261f --- /dev/null +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorStart.java @@ -0,0 +1,59 @@ +package com.nr.instrumentation.apache.camel; + +import java.util.concurrent.CompletableFuture; + +import org.apache.camel.AsyncCallback; +import org.apache.camel.AsyncProcessor; +import org.apache.camel.Exchange; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weaver; + +public class NRAsyncProcessorStart implements AsyncProcessor { + + private static boolean isTransformed = false; + + private AsyncProcessor delegate = null; + private String consumer = null; + + public NRAsyncProcessorStart(AsyncProcessor processor) { + delegate = processor; + if(!isTransformed) { + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + isTransformed = true; + } + } + + @Override + @Trace(dispatcher = true) + public void process(Exchange exchange) throws Exception { + if(consumer != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncConsumerStart",consumer,"process-sync"); + } + Weaver.callOriginal(); + } + + @Override + @Trace(dispatcher = true) + public boolean process(Exchange exchange, AsyncCallback callback) { + if(consumer != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncConsumerStart",consumer,"process-async"); + } + return delegate.process(exchange, callback); + } + + @Override + @Trace(dispatcher = true) + public CompletableFuture processAsync(Exchange exchange) { + if(consumer != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncConsumerStart",consumer,"processAsync"); + } + return delegate.processAsync(exchange); + } + + public void setConsumer(String s) { + consumer = s; + } +} diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java index 4396c20..b7e036b 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java @@ -1,76 +1,58 @@ package com.nr.instrumentation.apache.camel; -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.CompletableFuture; import org.apache.camel.AsyncCallback; import org.apache.camel.AsyncProcessor; import org.apache.camel.Exchange; -import org.apache.camel.Route; -import com.newrelic.api.agent.NewRelic; +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.Token; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; -public class NRAsyncProcessorWrapper extends NRProcessorWrapper implements AsyncProcessor { +public class NRAsyncProcessorWrapper implements AsyncProcessor { - public NRAsyncProcessorWrapper(AsyncProcessor p,Route r) { - super(p,r); + private AsyncProcessor delegate = null; + protected Token token = null; + protected static boolean isTransformed = false; + + + public NRAsyncProcessorWrapper(AsyncProcessor d, Token t) { + if(!isTransformed) { + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + isTransformed = true; + } + token = t; + delegate = d; } @Override - @Trace(dispatcher=true) + @Trace(async = true) public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - String[] names; - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process",routeId}; - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "Processor", "Process",routeId); - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - } - } else { - Object timerTaskValue = exchange.getProperty(Exchange.TIMER_NAME); - if(timerTaskValue != null) { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process","TimerTask",timerTaskValue.toString()}; - } - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - + if(token != null) { + token.linkAndExpire(); + token = null; } - NewRelic.getAgent().getTracedMethod().setMetricName(names); - return ((AsyncProcessor)delegate).process(exchange, callback); + return delegate.process(exchange,callback); } @Override - @Trace(dispatcher = true) + @Trace(async = true) public CompletableFuture processAsync(Exchange exchange) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - String[] names; - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process",routeId}; - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - } - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"processAsync"}; - + if(token != null) { + token.linkAndExpire(); + token = null; + } + return delegate.processAsync(exchange); + } + + @Trace(async = true) + public void process(Exchange exchange) throws Exception { + if(token != null) { + token.linkAndExpire(); + token = null; } - NewRelic.getAgent().getTracedMethod().setMetricName(names); - return ((AsyncProcessor)delegate).processAsync(exchange); + delegate.process(exchange); } } diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorStart.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorStart.java new file mode 100644 index 0000000..9b39acf --- /dev/null +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorStart.java @@ -0,0 +1,37 @@ +package com.nr.instrumentation.apache.camel; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +public class NRProcessorStart implements Processor { + + private static boolean isTransformed = false; + + private Processor delegate = null; + private String consumer = null; + + public NRProcessorStart(Processor processor) { + delegate = processor; + if(!isTransformed) { + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + isTransformed = false; + } + } + + @Override + @Trace(dispatcher = true) + public void process(Exchange exchange) throws Exception { + if(consumer != null) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","SyncConsumerStart",consumer,"process-sync"); + } + delegate.process(exchange); + } + + public void setConsumer(String consumer) { + this.consumer = consumer; + } +} diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java index 6a17a6f..0d39595 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java @@ -1,56 +1,42 @@ package com.nr.instrumentation.apache.camel; -import java.util.HashMap; -import java.util.Map; - +import org.apache.camel.DelegateProcessor; import org.apache.camel.Exchange; import org.apache.camel.Processor; -import org.apache.camel.Route; import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; -public class NRProcessorWrapper implements Processor { - - private static boolean isTransformed = false; - protected Route route = null; +public class NRProcessorWrapper implements DelegateProcessor { - protected Processor delegate = null; + protected Token token = null; + private Processor delegate = null; + protected static boolean isTransformed = false; + - public NRProcessorWrapper(Processor p,Route r) { - delegate = p; - route = r; + public NRProcessorWrapper(Processor d, Token t) { + token = t; + delegate = d; if(!isTransformed) { AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + isTransformed = true; } } @Override - @Trace(dispatcher=true) + @Trace(async = true) public void process(Exchange exchange) throws Exception { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Consumer","Processor",delegate.getClass().getSimpleName(),"process",routeId); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "Camel-Consumer", "Consumer","Route",routeId); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Consumer","Processor",delegate.getClass().getSimpleName(),"process"); - } - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Producer","Processor",delegate.getClass().getSimpleName(),"process"); - } - if(delegate != null) { - delegate.process(exchange); + if(token != null) { + token.linkAndExpire(); + token = null; } + delegate.process(exchange); + } + @Override + public Processor getProcessor() { + return delegate; } } diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java index 79fbac6..515404f 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java @@ -9,7 +9,6 @@ import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @@ -18,17 +17,9 @@ public abstract class Pipeline_instrumentation { private String id = Weaver.callOriginal(); - @Trace public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - if(id != null) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Pipeline","process",id); NewRelic.getAgent().getTracedMethod().addCustomAttribute("PipelineID", id); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Pipeline","process"); } return Weaver.callOriginal(); } @@ -38,13 +29,12 @@ private static class PipelineTask { private Exchange exchange = Weaver.callOriginal(); - @Trace(dispatcher=true) + @Trace public void run() { if(exchange != null) { Map attributes = new HashMap(); Util.recordExchange(attributes, exchange); NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); String fromRoute = exchange.getFromRouteId(); if(fromRoute == null) fromRoute = "UnknownFromRoute"; NewRelic.getAgent().getTracedMethod().setMetricName("Custom","PipelineTask","run",fromRoute); diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java index 5ec5011..8710b0d 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java @@ -9,8 +9,6 @@ import org.apache.camel.Exchange; import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @@ -22,9 +20,7 @@ public abstract class SendProcessor_instrumentation { protected AsyncProducer producer = Weaver.callOriginal(); - @Trace(dispatcher=true) public boolean process(Exchange exchange, AsyncCallback callback) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); Map attributes = new HashMap(); Util.recordExchange(attributes, exchange); Util.recordValue(attributes, "RouteID", routeId); diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java index 681a64d..060c499 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java @@ -1,7 +1,6 @@ package com.nr.instrumentation.apache.camel; import java.util.HashMap; -import java.util.Map; import org.apache.camel.AsyncCallback; import org.apache.camel.AsyncProcessor; @@ -10,20 +9,37 @@ import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; +import com.newrelic.api.agent.TransactionNamePriority; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; @Weave(originalName="org.apache.camel.impl.engine.SharedCamelInternalProcessor") public class SharedInternalProcessor_instrumentation { - @Trace - public boolean process(Exchange exchange, AsyncCallback callback, AsyncProcessor processor, Processor resultProcessor) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - + @Trace(dispatcher = true) + public boolean process(Exchange exchange, AsyncCallback originalCallback, AsyncProcessor processor, Processor resultProcessor) { + String routeId = exchange != null ? exchange.getFromRouteId() : null; + if(routeId != null) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "SharedCamelInternalProcessor", "Camel","SharedCamelInternalProcessor",routeId); + } + if (processor != null) { + HashMap attributes = new HashMap<>(); + Util.recordExchange(attributes, exchange); + } return Weaver.callOriginal(); } + + @Trace(dispatcher = true) + public void process(Exchange exchange, AsyncProcessor processor, Processor resultProcessor) { + String routeId = exchange != null ? exchange.getFromRouteId() : null; + if(routeId != null) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "SharedCamelInternalProcessor", "Camel","SharedCamelInternalProcessor",routeId); + } + if (processor != null) { + HashMap attributes = new HashMap<>(); + Util.recordExchange(attributes, exchange); + } + Weaver.callOriginal(); + } + } diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java index 7fd8517..104c6f5 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java @@ -29,6 +29,7 @@ public Synchronization_instrumentation() { @Trace(async=true) public void onComplete(Exchange exchange) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Synchronization",getClass().getSimpleName(),"onComplete"); if(token != null) { token.linkAndExpire(); token = null; @@ -38,6 +39,7 @@ public void onComplete(Exchange exchange) { @Trace(async=true) public void onFailure(Exchange exchange) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Synchronization",getClass().getSimpleName(),"onFailure"); if(token != null) { token.linkAndExpire(); token = null; diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Util.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Util.java index 4883ea4..613241d 100644 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Util.java +++ b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/Util.java @@ -7,10 +7,12 @@ import java.util.Map; import java.util.Set; +import org.apache.camel.AsyncProcessor; import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.ExchangeExtension; +import org.apache.camel.Processor; import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; @@ -19,7 +21,7 @@ public class Util { private static final List ignores; - + static { ignores = new ArrayList<>(); ignores.add("org.apache.camel.impl.engine.CamelInternalProcessor$AsyncAfterTask"); @@ -29,13 +31,13 @@ public class Util { public static boolean isTranscationActive() { return AgentBridge.getAgent().getTransaction().isStarted(); } - + public static NRRunnable getRunnable(Runnable runnable) { String classname = runnable.getClass().getName(); if(ignores.contains(classname)) return null; - + if(runnable instanceof NRRunnable) return (NRRunnable)runnable; - + Token token = NewRelic.getAgent().getTransaction().getToken(); if(token != null && token.isActive()) { return new NRRunnable(runnable, token); @@ -43,10 +45,10 @@ public static NRRunnable getRunnable(Runnable runnable) { token.expire(); token = null; } - + return null; } - + public static String getMethodName(Method m) { if(m == null) return "UnknownClass.UnknownMethod"; @@ -74,7 +76,7 @@ public static void recordExchange(Map attributes, Exchange excha } } } - + private static void recordExtendedExchange(Map attributes, ExchangeExtension exchange) { if(exchange != null) { recordValue(attributes, "HistoryNodeId", exchange.getHistoryNodeId()); @@ -91,7 +93,7 @@ private static void recordExtendedExchange(Map attributes, Excha } } - + public static void recordValue(Map attributes, String key, Object value) { if(key != null && !key.isEmpty() && value != null) { attributes.put(key, value); @@ -108,4 +110,50 @@ public static void reportExchange(Exchange exchange) { } NewRelic.getAgent().getInsights().recordCustomEvent("Pipeline_Exchange", attributes); } + public static NRAsyncProcessorWrapper getWrapper(AsyncProcessor processor) { + if(processor == null) return null; + // no need for wrapper + if((processor instanceof NRAsyncProcessorWrapper)) return null; + + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + return new NRAsyncProcessorWrapper(processor, t); + } else if(t != null) { + t.expire(); + t = null; + } + return null; + } + + public static NRProcessorWrapper getWrapper(Processor processor) { + if(processor == null) return null; + // no need for wrapper + if((processor instanceof NRAsyncProcessorWrapper)) return null; + + if((processor instanceof NRProcessorWrapper)) return null; + + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + return new NRProcessorWrapper(processor, t); + } else if(t != null) { + t.expire(); + t = null; + } + + return null; + } + + public static NRAsyncProcessorStart getStartingWrapper(AsyncProcessor asyncProcessor) { + if(asyncProcessor == null) return null; + if(asyncProcessor instanceof NRAsyncProcessorStart) return null; + + return new NRAsyncProcessorStart(asyncProcessor); + } + + public static NRProcessorStart getStartingWrapper(Processor processor) { + if(processor == null) return null; + if(processor instanceof NRProcessorStart) return null; + + return new NRProcessorStart(processor); + } } \ No newline at end of file diff --git a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java b/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java deleted file mode 100644 index 3f4d92d..0000000 --- a/camel-core-4.0.0/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.nr.instrumentation.apache.camel.wrappers; - -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.OutboundHeaders; - -public class OutboundExchangeWrapper implements OutboundHeaders { - - private Exchange exchange = null; - - public OutboundExchangeWrapper(Exchange e) { - exchange = e; - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public void setHeader(String name, String value) { - exchange.setProperty(name, value); - } - -} diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/Channel.java b/camel-core-4.0.0/src/main/java/org/apache/camel/Channel.java new file mode 100644 index 0000000..d7e81bf --- /dev/null +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/Channel.java @@ -0,0 +1,61 @@ +package org.apache.camel; + +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; +import com.nr.instrumentation.apache.camel.NRProcessorWrapper; +import com.nr.instrumentation.apache.camel.Util; + +@Weave(type = MatchType.Interface) +public abstract class Channel { + + public Processor getErrorHandler() { + Processor processor = Weaver.callOriginal(); + if(processor instanceof AsyncProcessor) { + NRAsyncProcessorWrapper wrapper = Util.getWrapper((AsyncProcessor)processor); + if(wrapper != null) { + processor = wrapper; + } + } else { + NRProcessorWrapper wrapper = Util.getWrapper(processor); + if(wrapper != null) { + processor = wrapper; + } + } + return processor; + } + + public Processor getOutput() { + Processor processor = Weaver.callOriginal(); + if(processor instanceof AsyncProcessor) { + NRAsyncProcessorWrapper wrapper = Util.getWrapper((AsyncProcessor)processor); + if(wrapper != null) { + processor = wrapper; + } + } else { + NRProcessorWrapper wrapper = Util.getWrapper(processor); + if(wrapper != null) { + processor = wrapper; + } + } + return processor; + } + + public Processor getNextProcessor() { + Processor processor = Weaver.callOriginal(); + if(processor instanceof AsyncProcessor) { + NRAsyncProcessorWrapper wrapper = Util.getWrapper((AsyncProcessor)processor); + if(wrapper != null) { + processor = wrapper; + } + } else { + NRProcessorWrapper wrapper = Util.getWrapper(processor); + if(wrapper != null) { + processor = wrapper; + } + } + return processor; + } + +} diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/ConsumerTemplate.java b/camel-core-4.0.0/src/main/java/org/apache/camel/ConsumerTemplate.java index ba6770a..8bd4f68 100644 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/ConsumerTemplate.java +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/ConsumerTemplate.java @@ -7,7 +7,7 @@ import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelMessageHeaders; +import com.nr.instrumentation.apache.camel.CamelHeaders; @Weave(type = MatchType.Interface) public abstract class ConsumerTemplate { @@ -16,10 +16,13 @@ public abstract class ConsumerTemplate { public Exchange receive(String endpointUri) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive"); Exchange exchange = Weaver.callOriginal(); - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + if(exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + } else { + NewRelic.getAgent().getTransaction().ignore(); + } return exchange; } @@ -27,11 +30,10 @@ public Exchange receive(String endpointUri) { public Exchange receive(String endpointUri, long timeout) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive"); Exchange exchange = Weaver.callOriginal(); if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } @@ -42,10 +44,11 @@ public Exchange receive(String endpointUri, long timeout) { public Exchange receive(Endpoint endpoint) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive"); Exchange exchange = Weaver.callOriginal(); - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + if (exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + } return exchange; } @@ -53,11 +56,10 @@ public Exchange receive(Endpoint endpoint) { public Exchange receive(Endpoint endpoint, long timeout) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receive"); Exchange exchange = Weaver.callOriginal(); if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } @@ -68,11 +70,10 @@ public Exchange receive(Endpoint endpoint, long timeout) { public Exchange receiveNoWait(String endpointUri) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveNoWait"); Exchange exchange = Weaver.callOriginal(); if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } @@ -83,11 +84,10 @@ public Exchange receiveNoWait(String endpointUri) { public Exchange receiveNoWait(Endpoint endpoint) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveNoWait"); Exchange exchange = Weaver.callOriginal(); if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } @@ -98,7 +98,7 @@ public Exchange receiveNoWait(Endpoint endpoint) { public Object receiveBody(String endpointUri) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); return Weaver.callOriginal(); } @@ -106,7 +106,7 @@ public Object receiveBody(String endpointUri) { public Object receiveBody(Endpoint endpoint) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); return Weaver.callOriginal(); } @@ -114,7 +114,7 @@ public Object receiveBody(Endpoint endpoint) { public Object receiveBody(String endpointUri, long timeout){ TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); Object result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); @@ -126,7 +126,7 @@ public Object receiveBody(String endpointUri, long timeout){ public Object receiveBody(Endpoint endpoint, long timeout) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); Object result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); @@ -138,7 +138,7 @@ public Object receiveBody(Endpoint endpoint, long timeout) { public Object receiveBodyNoWait(String endpointUri) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait"); Object result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("NoObjectAvailable", true); @@ -150,7 +150,7 @@ public Object receiveBodyNoWait(String endpointUri) { public Object receiveBodyNoWait(Endpoint endpoint) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait"); Object result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("NoObjectAvailable", true); @@ -162,7 +162,7 @@ public Object receiveBodyNoWait(Endpoint endpoint) { public T receiveBody(String endpointUri, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); return Weaver.callOriginal(); } @@ -171,7 +171,7 @@ public T receiveBody(Endpoint endpoint, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); return Weaver.callOriginal(); } @@ -180,7 +180,7 @@ public T receiveBody(String endpointUri, long timeout, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); T result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); @@ -193,7 +193,7 @@ public T receiveBody(Endpoint endpoint, long timeout, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBody"); T result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); @@ -206,7 +206,7 @@ public T receiveBodyNoWait(String endpointUri, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpointUri); traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait"); T result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); @@ -219,7 +219,7 @@ public T receiveBodyNoWait(Endpoint endpoint, Class type) { TracedMethod traced = NewRelic.getAgent().getTracedMethod(); traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); + traced.setMetricName("Custom","Camel","ConsumerTemplate",getClass().getSimpleName(),"receiveBodyNoWait"); T result = Weaver.callOriginal(); if(result == null) { traced.addCustomAttribute("TimedOut", true); diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/Endpoint_instrumentation.java b/camel-core-4.0.0/src/main/java/org/apache/camel/Endpoint_instrumentation.java deleted file mode 100644 index 048711d..0000000 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/Endpoint_instrumentation.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.apache.camel; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type=MatchType.Interface, originalName = "org.apache.camel.Endpoint") -public abstract class Endpoint_instrumentation { - - - public abstract String getEndpointUri(); - public abstract String getEndpointBaseUri(); - - - public Exchange createExchange() { - Exchange exchange = Weaver.callOriginal(); - if(Util.isTranscationActive()) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - return exchange; - } - - - public Exchange createExchange(ExchangePattern pattern) { - Exchange exchange = Weaver.callOriginal(); - if(Util.isTranscationActive()) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - return exchange; - } - -} diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/component/bean/BeanProcessor.java b/camel-core-4.0.0/src/main/java/org/apache/camel/component/bean/BeanProcessor.java index 60af46a..6e66d23 100644 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/component/bean/BeanProcessor.java +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/component/bean/BeanProcessor.java @@ -1,37 +1,23 @@ package org.apache.camel.component.bean; -import java.util.HashMap; -import java.util.Map; - import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; @Weave public abstract class BeanProcessor { public abstract String getMethod(); - @Trace(dispatcher=true) public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); String m = exchange.getIn().getHeader(Exchange.BEAN_METHOD_NAME, getMethod(), String.class); if(m != null) { NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","BeanProcessor","process",m}); NewRelic.getAgent().getTracedMethod().addCustomAttribute("Bean_Method", m); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","BeanProcessor","process"}); } - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); return Weaver.callOriginal(); } } diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java b/camel-core-4.0.0/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java index 4e7351e..6c87345 100644 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java @@ -20,8 +20,7 @@ public abstract class GenericFileConsumer extends ScheduledBatchPollingConsum protected GenericFileEndpoint endpoint = Weaver.callOriginal(); - protected GenericFileConsumer(GenericFileEndpoint endpoint, Processor processor, - GenericFileOperations operations, GenericFileProcessStrategy processStrategy) { + protected GenericFileConsumer(GenericFileEndpoint endpoint, Processor processor, GenericFileOperations operations, GenericFileProcessStrategy processStrategy) { super( endpoint, processor); } diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/component/seda/SedaPollingConsumer.java b/camel-core-4.0.0/src/main/java/org/apache/camel/component/seda/SedaPollingConsumer.java new file mode 100644 index 0000000..6cd80cb --- /dev/null +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/component/seda/SedaPollingConsumer.java @@ -0,0 +1,75 @@ +package org.apache.camel.component.seda; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.TransactionNamePriority; +import com.newrelic.api.agent.TransportType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.apache.camel.CamelHeaders; + +@Weave +public abstract class SedaPollingConsumer { + + public abstract SedaEndpoint getEndpoint(); + + @Trace(dispatcher = true) + public Exchange receive() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + Endpoint endPt = getEndpoint(); + if(endPt != null) { + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","SedaPollingConsumer",uri); + } + } + } else { + NewRelic.getAgent().getTransaction().ignore(); + } + return exchange; + } + + @Trace(dispatcher = true) + public Exchange receiveNoWait() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receiveNoWait"); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { + Endpoint endPt = getEndpoint(); + if(endPt != null) { + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","SedaPollingConsumer",uri); + } + } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + } else { + NewRelic.getAgent().getTransaction().ignore(); + } + return exchange; + } + + @Trace(dispatcher = true) + public Exchange receive(long timeout) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { + Endpoint endPt = getEndpoint(); + if(endPt != null) { + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","SedaPollingConsumer",uri); + } + } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + } else { + NewRelic.getAgent().getTransaction().ignore(); + } + return exchange; + } +} diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/component/seda/SedaProducer.java b/camel-core-4.0.0/src/main/java/org/apache/camel/component/seda/SedaProducer.java index 52573f4..39559b0 100644 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/component/seda/SedaProducer.java +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/component/seda/SedaProducer.java @@ -6,13 +6,16 @@ import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.nr.instrumentation.apache.camel.CamelHeaders; +import com.nr.instrumentation.apache.camel.Util; @Weave public abstract class SedaProducer { protected void addToQueue(Exchange exchange, boolean copy) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); + if(Util.isTranscationActive()) { + CamelHeaders headers = new CamelHeaders(exchange); + NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); + } Weaver.callOriginal(); } } diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java b/camel-core-4.0.0/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java index 117729c..e6222f8 100644 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java @@ -5,17 +5,26 @@ import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; +import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; +import com.nr.instrumentation.apache.camel.Util; @Weave public abstract class DefaultAsyncProcessorAwaitManager { - @Trace(dispatcher = true) + @Trace public void process(AsyncProcessor processor, Exchange exchange) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + String routeId = exchange.getFromRouteId(); + if(routeId == null || routeId.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","DefaultAsyncProcessorAwaitManager","process",processor.getClass().getSimpleName()); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","DefaultAsyncProcessorAwaitManager","process",processor.getClass().getSimpleName(),routeId); + } + NRAsyncProcessorWrapper wrapper = Util.getWrapper(processor); + if(wrapper != null) { + processor = wrapper; + } Weaver.callOriginal(); } } diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java b/camel-core-4.0.0/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java index 9a5f3bd..23d06ea 100644 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java @@ -14,9 +14,6 @@ import com.newrelic.api.agent.TransactionNamePriority; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.CamelMapHeaders; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; import com.nr.instrumentation.apache.camel.Util; @Weave @@ -27,8 +24,6 @@ protected CompletableFuture asyncSendExchange(Endpoint endpoint, Excha Map attributes = new HashMap(); Util.recordExchange(attributes, inExchange); NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - CamelHeaders headers = new CamelHeaders(inExchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); if(endpoint != null) { String uri = endpoint.getEndpointUri(); if(uri != null && !uri.isEmpty()) { @@ -36,9 +31,6 @@ protected CompletableFuture asyncSendExchange(Endpoint endpoint, Excha NewRelic.getAgent().getTracedMethod().addCustomAttribute("EndpointURI", uri); } } - if(resultProcessor != null && !(resultProcessor instanceof NRProcessorWrapper)) { - resultProcessor = new NRProcessorWrapper(resultProcessor, null); - } return Weaver.callOriginal(); } @@ -47,8 +39,7 @@ public Exchange send(Endpoint endpoint, Exchange exchange, Processor resultProce Map attributes = new HashMap(); Util.recordExchange(attributes, exchange); NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); + if(endpoint != null) { String uri = endpoint.getEndpointUri(); if(uri != null && !uri.isEmpty()) { @@ -56,16 +47,7 @@ public Exchange send(Endpoint endpoint, Exchange exchange, Processor resultProce NewRelic.getAgent().getTracedMethod().addCustomAttribute("EndpointURI", uri); } } - if(resultProcessor != null && !(resultProcessor instanceof NRProcessorWrapper)) { - resultProcessor = new NRProcessorWrapper(resultProcessor, null); - } return Weaver.callOriginal(); } - - protected Processor createBodyAndHeaders(Object body, Map headers) { - CamelMapHeaders nrHeaders = new CamelMapHeaders(headers); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(nrHeaders); - return Weaver.callOriginal(); - } } diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/processor/DelayProcessorSupport.java b/camel-core-4.0.0/src/main/java/org/apache/camel/processor/DelayProcessorSupport.java new file mode 100644 index 0000000..b497b30 --- /dev/null +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/processor/DelayProcessorSupport.java @@ -0,0 +1,43 @@ +package org.apache.camel.processor; + +import org.apache.camel.AsyncCallback; +import org.apache.camel.Exchange; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@Weave +public class DelayProcessorSupport { + + @Weave + private static final class ProcessCall { + + @NewField + private Token token = null; + + @SuppressWarnings("unused") + ProcessCall(Exchange exchange, AsyncCallback callback) { + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + token = t; + } else if(t != null) { + t.expire(); + t = null; + } + + } + + @Trace(async = true) + public void run() { + if(token != null) { + token.linkAndExpire(); + token = null; + } + Weaver.callOriginal(); + } + } +} diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/resume/ResumableSet.java b/camel-core-4.0.0/src/main/java/org/apache/camel/resume/ResumableSet.java new file mode 100644 index 0000000..97e6abf --- /dev/null +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/resume/ResumableSet.java @@ -0,0 +1,8 @@ +package org.apache.camel.resume; + +import com.newrelic.api.agent.weaver.SkipIfPresent; + +@SkipIfPresent +public class ResumableSet { + +} diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java b/camel-core-4.0.0/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java deleted file mode 100644 index 3038c8d..0000000 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.apache.camel.spi; - -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; - -@Weave(type = MatchType.Interface) -public abstract class AsyncProcessorAwaitManager { - - @Trace(dispatcher = true) - public void process(AsyncProcessor processor, Exchange exchange) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessorAwaitManager",getClass().getSimpleName(),"process"); - NRAsyncProcessorWrapper wrapper = new NRAsyncProcessorWrapper(processor, null); - processor = wrapper; - Weaver.callOriginal(); - } -} diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/spi/ProducerCache.java b/camel-core-4.0.0/src/main/java/org/apache/camel/spi/ProducerCache.java index c3c0360..b23c72c 100644 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/spi/ProducerCache.java +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/spi/ProducerCache.java @@ -12,8 +12,6 @@ import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; import com.nr.instrumentation.apache.camel.Util; @Weave(type = MatchType.Interface) @@ -30,10 +28,6 @@ public Exchange send(Endpoint endpoint, Exchange exchange, Processor resultProce attributes.put("EndpointURI", baseURI); } traced.addCustomAttributes(attributes); - if(resultProcessor != null && !(resultProcessor instanceof NRProcessorWrapper)) { - resultProcessor = new NRProcessorWrapper(resultProcessor, null); - } - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(new CamelHeaders(exchange)); return Weaver.callOriginal(); } } diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java b/camel-core-4.0.0/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java deleted file mode 100644 index 4786bfe..0000000 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.apache.camel.spi; - -import java.util.HashMap; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Exchange; -import org.apache.camel.Processor; - -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type = MatchType.Interface) -public abstract class SharedInternalProcessor { - - @Trace(dispatcher = true) - public boolean process(Exchange exchange, AsyncCallback originalCallback, AsyncProcessor processor, Processor resultProcessor) { - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, exchange); - NRAsyncProcessorWrapper wrapper = new NRAsyncProcessorWrapper(processor, null); - processor = wrapper; - if(resultProcessor != null) { - NRProcessorWrapper pWrapper = new NRProcessorWrapper(resultProcessor, null); - resultProcessor = pWrapper; - } - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/support/DefaultConsumer.java b/camel-core-4.0.0/src/main/java/org/apache/camel/support/DefaultConsumer.java index 4c6e411..748bab3 100644 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/support/DefaultConsumer.java +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/support/DefaultConsumer.java @@ -9,8 +9,9 @@ import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; +import com.nr.instrumentation.apache.camel.NRAsyncProcessorStart; +import com.nr.instrumentation.apache.camel.NRProcessorStart; +import com.nr.instrumentation.apache.camel.Util; @Weave(type=MatchType.BaseClass) public abstract class DefaultConsumer { @@ -23,16 +24,20 @@ public abstract class DefaultConsumer { public synchronized AsyncProcessor getAsyncProcessor() { AsyncProcessor asyncProcessor = Weaver.callOriginal(); - if(asyncProcessor != null && !(asyncProcessor instanceof NRAsyncProcessorWrapper)) { - return new NRAsyncProcessorWrapper(asyncProcessor,getRoute()); + NRAsyncProcessorStart wrapper = Util.getStartingWrapper(asyncProcessor); + if(wrapper != null) { + wrapper.setConsumer(getClass().getSimpleName()); + asyncProcessor = wrapper; } return asyncProcessor; } public Processor getProcessor() { Processor processor = Weaver.callOriginal(); - if(!(processor instanceof NRProcessorWrapper)) { - return new NRProcessorWrapper(processor,getRoute()); + NRProcessorStart wrapper = Util.getStartingWrapper(processor); + if(wrapper != null) { + wrapper.setConsumer(getClass().getSimpleName()); + processor = wrapper; } return processor; } diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/support/DefaultProducer.java b/camel-core-4.0.0/src/main/java/org/apache/camel/support/DefaultProducer.java deleted file mode 100644 index 993f03d..0000000 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/support/DefaultProducer.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.apache.camel.support; - -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type=MatchType.BaseClass) -public abstract class DefaultProducer { - - public Exchange createExchange() { - Exchange exchange = Weaver.callOriginal(); - if(Util.isTranscationActive()) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - return exchange; - } - -} diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java b/camel-core-4.0.0/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java index 1968c42..90708d9 100644 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java @@ -1,6 +1,6 @@ package org.apache.camel.support; -import java.util.HashMap; +import java.util.concurrent.BlockingQueue; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; @@ -9,76 +9,80 @@ import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.TransactionNamePriority; import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; -@Weave(type = MatchType.BaseClass) -public abstract class EventDrivenPollingConsumer { - - public abstract Endpoint getEndpoint(); +@Weave +public abstract class EventDrivenPollingConsumer extends PollingConsumerSupport { + + public EventDrivenPollingConsumer(Endpoint endpoint) { + super(endpoint); + } + public EventDrivenPollingConsumer(Endpoint endpoint, int queueSize) { + super(endpoint); + } + + public EventDrivenPollingConsumer(Endpoint endpoint, BlockingQueue queue) { + super(endpoint); + } + @Trace(dispatcher = true) public Exchange receive() { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Endpoint endPt = getEndpoint(); - if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "EventDrivenPollingConsumer",endpoint); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + Endpoint endPt = getEndpoint(); + if(endPt != null) { + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","EventDrivenPollingConsumer",uri); + } } + } else { + NewRelic.getAgent().getTransaction().ignore(); } - Exchange result = Weaver.callOriginal(); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - return result; + return exchange; } @Trace(dispatcher = true) public Exchange receiveNoWait() { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receiveNoWait"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { Endpoint endPt = getEndpoint(); if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "EventDrivenPollingConsumer",endpoint); + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","EventDrivenPollingConsumer",uri); } } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } - return result; + return exchange; } @Trace(dispatcher = true) public Exchange receive(long timeout) { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { Endpoint endPt = getEndpoint(); if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "EventDrivenPollingConsumer",endpoint); + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","EventDrivenPollingConsumer",uri); } } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } - return result; + return exchange; } + } diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/support/ExchangeHelper.java b/camel-core-4.0.0/src/main/java/org/apache/camel/support/ExchangeHelper.java deleted file mode 100644 index a2afa24..0000000 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/support/ExchangeHelper.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.apache.camel.support; - -import org.apache.camel.CamelContext; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; - -@Weave -public class ExchangeHelper { - - public static Exchange copyExchangeAndSetCamelContext(Exchange exchange, CamelContext context, boolean handover) { - Exchange result = Weaver.callOriginal(); - - if(handover) { - CamelHeaders headers = new CamelHeaders(result); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - - return result; - } - - public static Exchange createCopy(Exchange exchange, boolean preserveExchangeId) { - Exchange result = Weaver.callOriginal(); - CamelHeaders headers = new CamelHeaders(result); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - return result; - } - - public static Exchange createCorrelatedCopy(Exchange exchange, boolean handover, boolean useSameMessageId) { - Exchange result = Weaver.callOriginal(); - - if (handover) { - CamelHeaders headers = new CamelHeaders(result); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - return result; - } - - - -} diff --git a/camel-core-4.0.0/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java b/camel-core-4.0.0/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java index 8a2d839..74c8a55 100644 --- a/camel-core-4.0.0/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java +++ b/camel-core-4.0.0/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java @@ -1,84 +1,79 @@ package org.apache.camel.support; -import java.util.HashMap; - import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.Processor; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.TransactionNamePriority; import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type = MatchType.BaseClass) -public abstract class ProcessorPollingConsumer { - public abstract Endpoint getEndpoint(); +@Weave +public abstract class ProcessorPollingConsumer extends PollingConsumerSupport { + public ProcessorPollingConsumer(Endpoint endpoint, Processor processor) { + super(endpoint); + } + @Trace(dispatcher = true) public Exchange receive() { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Endpoint endPt = getEndpoint(); - if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "ProcessorPollingConsumer",endpoint); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); + Endpoint endPt = getEndpoint(); + if(endPt != null) { + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","ProcessorPollingConsumer",uri); + } } + } else { + NewRelic.getAgent().getTransaction().ignore(); } - Exchange result = Weaver.callOriginal(); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - return result; + return exchange; } @Trace(dispatcher = true) public Exchange receiveNoWait() { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receiveNoWait"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { Endpoint endPt = getEndpoint(); if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer","ProcessorPollingConsumer",endpoint); + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","ProcessorPollingConsumer",uri); } } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } - return result; + return exchange; } @Trace(dispatcher = true) public Exchange receive(long timeout) { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); + Exchange exchange = Weaver.callOriginal(); + if(exchange != null) { Endpoint endPt = getEndpoint(); if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "ProcessorPollingConsumer",endpoint); + String uri = endPt.getEndpointUri(); + if(uri != null && !uri.isEmpty()) { + NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "Camel","ProcessorPollingConsumer",uri); } } + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); } else { NewRelic.getAgent().getTransaction().ignore(); } - return result; + return exchange; } + } diff --git a/camel-core-4.1/build.gradle b/camel-core-4.1/build.gradle deleted file mode 100644 index 1dd41ac..0000000 --- a/camel-core-4.1/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ - -// Build.gradle generated for instrumentation module camel-core-3.9 - -targetCompatibility = JavaVersion.VERSION_17 - -dependencies { - implementation 'org.apache.camel:camel-core:4.1.0' - - // New Relic Labs Java Agent dependencies - implementation 'com.newrelic.agent.java:newrelic-agent:7.5.0' - implementation 'com.newrelic.agent.java:newrelic-api:7.5.0' - implementation fileTree(include: ['*.jar'], dir: '../libs') -} - -jar { - manifest { - attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.camel-core-4.1' - attributes 'Implementation-Vendor': 'New Relic Labs' - attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' - attributes 'Implementation-Version': 1.0 - } -} - -verifyInstrumentation { - passes 'org.apache.camel:camel-core:[4.1.0,)' - excludeRegex '.*M[1-9]' - excludeRegex '.*RC[1-9]' -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java deleted file mode 100644 index 78f680d..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(originalName="org.apache.camel.processor.aggregate.AggregateProcessor") -public abstract class AggregateProcessor_instrumentation { - - @Trace(async=true) - protected boolean doProcess(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - String routeID = exchange != null ? exchange.getFromRouteId() : null; - if(routeID != null && !routeID.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","AggregateProcessor","doProcess",routeID}); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "CamelProcessor", new String[] {"AggregateProcessor",routeID}); - } - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - if(token != null) { - token.link(); - } - - return Weaver.callOriginal(); - } - - @Trace(async=true) - protected boolean doProcess(Exchange exchange, String key, AsyncCallback callback, boolean sync) { - String routeID = exchange != null ? exchange.getFromRouteId() : null; - if(routeID != null && !routeID.isEmpty()) { - NewRelic.addCustomParameter("From Route ID", routeID); - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","AggregateProcessor","doProcess",routeID}); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "CamelProcessor", new String[] {"AggregateProcessor",routeID}); - } - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - if(token != null) { - token.link(); - } - - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java deleted file mode 100644 index 07b243d..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TracedMethod; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type=MatchType.BaseClass,originalName="org.apache.camel.impl.engine.CamelInternalProcessor") -public abstract class CamelInternalProcessor_instrumentation { - - @Trace(async=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - if(token != null && token.isActive()) { - token.link(); - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - if(exchange != null && exchange.getFromRouteId() != null) { - traced.setMetricName("Custom","CamelInternalProcessor","process",exchange.getFromRouteId()); - } - if(!attributes.isEmpty()) { - traced.addCustomAttributes(attributes); - } - } - - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java deleted file mode 100644 index 6aa9350..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.CamelContext; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.Message; - -import com.newrelic.api.agent.HttpParameters; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.wrappers.InboundMessageWrapper; - -@Weave(originalName="org.apache.camel.processor.ChoiceProcessor") -public abstract class ChoiceProcessor_instrumentation { - - @Trace(async=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - String classname = getClass().getSimpleName(); - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - if(token != null) { - token.link(); - } - Message inMessage = exchange.getIn(); - InboundMessageWrapper msgWrapper = new InboundMessageWrapper(inMessage); - Endpoint endpoint = exchange.getFromEndpoint(); - if(endpoint != null) { - String endpointURI = endpoint.getEndpointUri(); - if(endpointURI != null && !endpointURI.isEmpty()) { - URI uri = URI.create(endpointURI); - if(uri != null) { - HttpParameters params = HttpParameters.library("Camel").uri(uri).procedure("process").inboundHeaders(msgWrapper).build(); - NewRelic.getAgent().getTracedMethod().reportAsExternal(params); - } - - } - } - String routeID = exchange != null ? exchange.getFromRouteId() : null; - if(routeID != null && !routeID.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom",classname,"process",routeID}); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "ChoiceProcessor", new String[] {"ChoiceProcessor",routeID}); - } - return Weaver.callOriginal(); - } - -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java deleted file mode 100644 index 163c8ff..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type=MatchType.BaseClass,originalName="org.apache.camel.processor.MulticastProcessor") -public abstract class MultiCastProcessor_instrumentation { - - @Trace(async=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - if(token != null) { - token.link(); - } - - return Weaver.callOriginal(); - } - - @Weave(originalName="org.apache.camel.processor.MulticastProcessor$MulticastReactiveTask") - protected static abstract class MulticastReactiveTask { - - - @Trace(async=true) - public void run() { - Weaver.callOriginal(); - } - - } - -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java deleted file mode 100644 index f47f9ec..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Exchange; -import org.apache.camel.Route; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; - -public class NRAsyncProcessorWrapper extends NRProcessorWrapper implements AsyncProcessor { - - public NRAsyncProcessorWrapper(AsyncProcessor p,Route r) { - super(p,r); - } - - @Override - @Trace(dispatcher=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - - if(token != null) { - token.link(); - } - - String[] names; - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process",routeId}; - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "Processor", "Process",routeId); - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - } - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - - } - NewRelic.getAgent().getTracedMethod().setMetricName(names); - return ((AsyncProcessor)delegate).process(exchange, callback); - } - - @Override - @Trace(async=true) - public CompletableFuture processAsync(Exchange exchange) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - - if(token != null) { - token.link(); - } - - String[] names; - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process",routeId}; - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - } - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"processAsync"}; - - } - NewRelic.getAgent().getTracedMethod().setMetricName(names); - return ((AsyncProcessor)delegate).processAsync(exchange); - } - -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java deleted file mode 100644 index 71ee28f..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.Exchange; -import org.apache.camel.Processor; -import org.apache.camel.Route; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - -public class NRProcessorWrapper implements Processor { - - private static boolean isTransformed = false; - protected Route route = null; - - protected Processor delegate = null; - - public NRProcessorWrapper(Processor p,Route r) { - delegate = p; - route = r; - if(!isTransformed) { - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - @Trace(async=true) - public void process(Exchange exchange) throws Exception { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - - if(token != null) { - token.link(); - } - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Processor",delegate.getClass().getSimpleName(),"process",routeId); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Processor",delegate.getClass().getSimpleName(),"process"); - } - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Processor",delegate.getClass().getSimpleName(),"process"); - } - if(delegate != null) { - delegate.process(exchange); - } - - } - -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRRunnable.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRRunnable.java deleted file mode 100644 index 08c8883..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRRunnable.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - -public class NRRunnable implements Runnable { - - private static boolean isTransformed = false; - - private Runnable delegate = null; - private Token token = null; - - public NRRunnable(Runnable d, Token t) { - if(!isTransformed) { - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - isTransformed = true; - } - delegate = d; - token = t; - } - - @Override - @Trace(async=true) - public void run() { - if(token != null) { - token.linkAndExpire(); - token = null; - } - delegate.run(); - } - -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRSynchronization.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRSynchronization.java deleted file mode 100644 index 538009a..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/NRSynchronization.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import org.apache.camel.Exchange; -import org.apache.camel.spi.Synchronization; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; - -public class NRSynchronization implements Synchronization { - - public NRSynchronization() { - } - - @Override - public void onComplete(Exchange exchange) { - if(exchange.hasProperties()) { - Token token = (Token) exchange.removeProperty(Util.NRTOKENPROPERTY); - if(token != null) { - token.expire(); - } - } - } - - @Override - public void onFailure(Exchange exchange) { - NewRelic.incrementCounter("/Custom/NRSynchronization/Failed"); - if(exchange.hasProperties()) { - Token token = (Token) exchange.removeProperty(Util.NRTOKENPROPERTY); - if(token != null) { - token.expire(); - } - } - if(exchange.isFailed()) { - Exception e = exchange.getException(); - if(e != null) { - NewRelic.noticeError(e); - } - } - - } - -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java deleted file mode 100644 index f9b11b6..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(originalName="org.apache.camel.processor.Pipeline") -public abstract class Pipeline_instrumentation { - - private String id = Weaver.callOriginal(); - - @Trace(async=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - - if(token != null) { - token.link(); - } else { - Token t = NewRelic.getAgent().getTransaction().getToken(); - if(t != null && t.isActive()) { - exchange.setProperty(Util.NRTOKENPROPERTY, t); - } else if(t != null) { - t.expire(); - t = null; - } - } - if(id != null) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Pipeline","process",id); - NewRelic.getAgent().getTracedMethod().addCustomAttribute("PipelineID", id); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Pipeline","process"); - } - return Weaver.callOriginal(); - } - - @Weave(originalName="org.apache.camel.processor.Pipeline$PipelineTask") - private static class PipelineTask { - - private Exchange exchange = Weaver.callOriginal(); - - @Trace(async=true) - public void run() { - if(exchange != null) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - - if(token != null) { - token.link(); - } - - } - Weaver.callOriginal(); - } - } - -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java deleted file mode 100644 index 02adfe6..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.wrappers.OutboundExchangeWrapper; - -@Weave(originalName="org.apache.camel.processor.SendProcessor") -public abstract class SendProcessor_instrumentation { - - protected Endpoint destination = Weaver.callOriginal(); - - @Trace(async=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - - if(token != null) { - token.link(); - } - - String dest = destination != null ? destination.getEndpointUri() : null; - if(dest != null && !dest.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","SendProcessor","process",dest); - NewRelic.getAgent().getTracedMethod().addCustomAttribute("DestinationURI", dest); - } - OutboundExchangeWrapper wrapper = new OutboundExchangeWrapper(exchange); - NewRelic.getAgent().getTracedMethod().addOutboundRequestHeaders(wrapper); - return Weaver.callOriginal(); - } - -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java deleted file mode 100644 index 0c1db14..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Exchange; -import org.apache.camel.Processor; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(originalName="org.apache.camel.impl.engine.SharedCamelInternalProcessor") -public class SharedInternalProcessor_instrumentation { - - @Trace - public boolean process(Exchange exchange, AsyncCallback callback, AsyncProcessor processor, Processor resultProcessor) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - - if(token != null) { - token.link(); - } - - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/Util.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/Util.java deleted file mode 100644 index 89c4a2c..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/Util.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.lang.reflect.Method; -import java.util.List; -import java.util.Map; - -import org.apache.camel.CamelContext; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.ExtendedExchange; -import org.apache.camel.spi.Synchronization; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; - -public class Util { - - public static final String NRTOKENPROPERTY = "newrelic.asynctoken"; - - public static String getMethodName(Method m) { - if(m == null) return "UnknownClass.UnknownMethod"; - - String classname = m.getDeclaringClass().getSimpleName(); - String methodName = m.getName(); - - return classname + "." + methodName; - } - - public static void addCompletionIfNeeded(ExtendedExchange exchange) { - if(exchange == null) return; - - List completions = exchange.handoverCompletions(); - if(completions == null || completions.isEmpty()) { - NRSynchronization nrSync = new NRSynchronization(); - exchange.addOnCompletion(nrSync); - } else { - boolean hasNR = false; - for(int i=0; i attributes, Exchange exchange) { - if(exchange != null) { - recordValue(attributes, "ExchangeId", exchange.getExchangeId()); - CamelContext context = exchange.getContext(); - String ctxName = context != null ? context.getName() : null; - recordValue(attributes, "CamelContextName", ctxName); - recordValue(attributes, "CamelContextManagementName", context.getManagementName()); - Endpoint endpoint = exchange.getFromEndpoint(); - if(endpoint != null) { - recordValue(attributes, "From_EndPointURI", endpoint.getEndpointUri()); - } - recordValue(attributes, "FromRouteId", exchange.getFromRouteId()); - } - } - - private static void recordValue(Map attributes, String key, Object value) { - if(key != null && !key.isEmpty() && value != null) { - attributes.put(key, value); - } - } - -} \ No newline at end of file diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/InboundExchangeWrapper.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/InboundExchangeWrapper.java deleted file mode 100644 index fc4a86a..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/InboundExchangeWrapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.nr.instrumentation.apache.camel.wrappers; - -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.InboundHeaders; - -public class InboundExchangeWrapper implements InboundHeaders { - - private Exchange exchange; - - public InboundExchangeWrapper(Exchange ex) { - exchange = ex; - } - - public HeaderType getHeaderType() { - return HeaderType.HTTP; - } - - public String getHeader(String name) { - return (String) exchange.getProperty(name); - } - -} \ No newline at end of file diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/InboundMessageWrapper.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/InboundMessageWrapper.java deleted file mode 100644 index 0a5f947..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/InboundMessageWrapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.nr.instrumentation.apache.camel.wrappers; - -import org.apache.camel.Message; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.InboundHeaders; - -public class InboundMessageWrapper implements InboundHeaders { - - private Message message; - - public InboundMessageWrapper(Message msg) { - message = msg; - } - - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - public String getHeader(String name) { - return (String) message.getHeader(name); - } - -} \ No newline at end of file diff --git a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java b/camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java deleted file mode 100644 index 3f4d92d..0000000 --- a/camel-core-4.1/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.nr.instrumentation.apache.camel.wrappers; - -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.OutboundHeaders; - -public class OutboundExchangeWrapper implements OutboundHeaders { - - private Exchange exchange = null; - - public OutboundExchangeWrapper(Exchange e) { - exchange = e; - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public void setHeader(String name, String value) { - exchange.setProperty(name, value); - } - -} diff --git a/camel-core-4.1/java/org/apache/camel/Endpoint.java b/camel-core-4.1/java/org/apache/camel/Endpoint.java deleted file mode 100644 index 241eb3d..0000000 --- a/camel-core-4.1/java/org/apache/camel/Endpoint.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.apache.camel; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type=MatchType.Interface) -public abstract class Endpoint { - - - public abstract String getEndpointUri(); - - - public Exchange createExchange() { - Exchange exchange = Weaver.callOriginal(); - Token token = (Token) exchange.getProperty(Util.NRTOKENPROPERTY); - if(token == null) { - token = NewRelic.getAgent().getTransaction().getToken(); - if(token.isActive()) { - exchange.setProperty(Util.NRTOKENPROPERTY, token); - } else { - token.expire(); - } - } - if(exchange instanceof ExtendedExchange) { - Util.addCompletionIfNeeded((ExtendedExchange)exchange); - } - - return exchange; - } - - - public Exchange createExchange(ExchangePattern pattern) { - Exchange exchange = Weaver.callOriginal(); - Token token = (Token) exchange.getProperty(Util.NRTOKENPROPERTY); - if(token == null) { - token = NewRelic.getAgent().getTransaction().getToken(); - if(token.isActive()) { - exchange.setProperty(Util.NRTOKENPROPERTY, token); - } else { - token.expire(); - } - } - if(exchange instanceof ExtendedExchange) { - Util.addCompletionIfNeeded((ExtendedExchange)exchange); - } - - return exchange; - } - -} diff --git a/camel-core-4.1/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java b/camel-core-4.1/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java deleted file mode 100644 index 49f3909..0000000 --- a/camel-core-4.1/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.apache.camel.component.bean; - -import java.lang.reflect.Method; - -import org.apache.camel.ExchangePattern; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type=MatchType.BaseClass) -public abstract class AbstractCamelInvocationHandler { - - @Trace - public Object doInvokeProxy(Object proxy, Method method, Object[] args) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","Camel","CamelInvocationHandler",getClass().getSimpleName(),"doProxyInvoke",method.getDeclaringClass().getSimpleName(),method.getName()}); - return Weaver.callOriginal(); - } - - @Trace - protected Object invokeProxy(Method method, ExchangePattern pattern, Object[] args, boolean binding) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","Camel","CamelInvocationHandler",getClass().getSimpleName(),"invokeProxy",method.getDeclaringClass().getSimpleName(),method.getName()}); - return Weaver.callOriginal(); - } - - @Trace - protected Object invokeWithBody(Method method, Object body, ExchangePattern pattern) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","Camel","CamelInvocationHandler",getClass().getSimpleName(),"invokeWithBody",method.getDeclaringClass().getSimpleName(),method.getName()}); - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/java/org/apache/camel/component/bean/BeanProcessor.java b/camel-core-4.1/java/org/apache/camel/component/bean/BeanProcessor.java deleted file mode 100644 index e4073bd..0000000 --- a/camel-core-4.1/java/org/apache/camel/component/bean/BeanProcessor.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.apache.camel.component.bean; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.Util; - -@Weave -public abstract class BeanProcessor { - - public abstract String getMethod(); - - @Trace(async=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - String m = exchange.getIn().getHeader(Exchange.BEAN_METHOD_NAME, getMethod(), String.class); - if(m != null) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","BeanProcessor","process",m}); - NewRelic.getAgent().getTracedMethod().addCustomAttribute("Bean_Method", m); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","BeanProcessor","process"}); - } - Token token = exchange.getProperty(Util.NRTOKENPROPERTY,Token.class); - - if(token != null) { - token.link(); - } - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/java/org/apache/camel/component/bean/MethodInvocation.java b/camel-core-4.1/java/org/apache/camel/component/bean/MethodInvocation.java deleted file mode 100644 index 145c8e0..0000000 --- a/camel-core-4.1/java/org/apache/camel/component/bean/MethodInvocation.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.apache.camel.component.bean; - -import java.lang.reflect.Method; - -import org.apache.camel.AsyncCallback; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type=MatchType.Interface) -public abstract class MethodInvocation { - - public abstract Method getMethod(); - - @Trace - public boolean proceed(AsyncCallback callback) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","MethodInvocation",getClass().getSimpleName(),"proceed",Util.getMethodName(getMethod())); - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/java/org/apache/camel/component/controlbus/ControlBusProducer.java b/camel-core-4.1/java/org/apache/camel/component/controlbus/ControlBusProducer.java deleted file mode 100644 index 6817b9d..0000000 --- a/camel-core-4.1/java/org/apache/camel/component/controlbus/ControlBusProducer.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.apache.camel.component.controlbus; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; -import org.apache.camel.spi.Language; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.Util; - -@Weave -public abstract class ControlBusProducer { - - @Trace - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - return Weaver.callOriginal(); - } - - @Trace - protected void processByAction(Exchange exchange) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Weaver.callOriginal(); - } - - @Trace - protected void processByLanguage(Exchange exchange, Language language) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/java/org/apache/camel/component/seda/SedaProducer.java b/camel-core-4.1/java/org/apache/camel/component/seda/SedaProducer.java deleted file mode 100644 index 4931222..0000000 --- a/camel-core-4.1/java/org/apache/camel/component/seda/SedaProducer.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.apache.camel.component.seda; - -import org.apache.camel.Exchange; -import org.apache.camel.ExtendedExchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.Util; - -@Weave -public abstract class SedaProducer { - - protected void addToQueue(Exchange exchange, boolean copy) { - Token token = (Token) exchange.getProperty(Util.NRTOKENPROPERTY); - if(token == null) { - token = NewRelic.getAgent().getTransaction().getToken(); - if(token.isActive()) { - exchange.setProperty(Util.NRTOKENPROPERTY, token); - } else { - token.expire(); - } - } - if(exchange instanceof ExtendedExchange) { - Util.addCompletionIfNeeded((ExtendedExchange)exchange); - } - Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java b/camel-core-4.1/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java deleted file mode 100644 index 6ca632f..0000000 --- a/camel-core-4.1/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.apache.camel.impl.engine; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; - -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.ExchangePattern; -import org.apache.camel.Processor; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; -import com.nr.instrumentation.apache.camel.Util; - -@Weave -public abstract class DefaultProducerTemplate { - - @Trace(dispatcher=true) - protected CompletableFuture asyncSendExchange(Endpoint endpoint, ExchangePattern pattern, Processor processor, Processor resultProcessor,Exchange inExchange) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, inExchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Token token = (Token) inExchange.getProperty(Util.NRTOKENPROPERTY); - if(token == null) { - token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - inExchange.setProperty(Util.NRTOKENPROPERTY, token); - } else if(token != null) { - token.expire(); - token = null; - } - } - if(endpoint != null) { - String uri = endpoint.getEndpointUri(); - if(uri != null && !uri.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "Producer", "Custom","Producer",uri); - NewRelic.getAgent().getTracedMethod().addCustomAttribute("EndpointURI", uri); - } - } - if(resultProcessor != null && !(resultProcessor instanceof NRProcessorWrapper)) { - resultProcessor = new NRProcessorWrapper(resultProcessor, null); - } - return Weaver.callOriginal(); - } - - @Trace(dispatcher=true) - public Exchange send(Endpoint endpoint, Exchange exchange, Processor resultProcessor) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Token token = (Token) exchange.getProperty(Util.NRTOKENPROPERTY); - if(token == null) { - token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - exchange.setProperty(Util.NRTOKENPROPERTY, token); - } else if(token != null) { - token.expire(); - token = null; - } - } - if(endpoint != null) { - String uri = endpoint.getEndpointUri(); - if(uri != null && !uri.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "Producer", "Custom","Producer",uri); - NewRelic.getAgent().getTracedMethod().addCustomAttribute("EndpointURI", uri); - } - } - if(resultProcessor != null && !(resultProcessor instanceof NRProcessorWrapper)) { - resultProcessor = new NRProcessorWrapper(resultProcessor, null); - } - return Weaver.callOriginal(); - } - - -} diff --git a/camel-core-4.1/java/org/apache/camel/support/DefaultConsumer.java b/camel-core-4.1/java/org/apache/camel/support/DefaultConsumer.java deleted file mode 100644 index 8050b0a..0000000 --- a/camel-core-4.1/java/org/apache/camel/support/DefaultConsumer.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.apache.camel.support; - -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Endpoint; -import org.apache.camel.Processor; -import org.apache.camel.Route; - -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; - -@Weave(type=MatchType.BaseClass) -public abstract class DefaultConsumer { - - public abstract Endpoint getEndpoint(); - - public abstract Route getRoute(); - - public synchronized AsyncProcessor getAsyncProcessor() { - AsyncProcessor asyncProcessor = Weaver.callOriginal(); - if(asyncProcessor != null && !(asyncProcessor instanceof NRAsyncProcessorWrapper)) { - return new NRAsyncProcessorWrapper(asyncProcessor,getRoute()); - } - return asyncProcessor; - } - - public Processor getProcessor() { - Processor processor = Weaver.callOriginal(); - if(!(processor instanceof NRProcessorWrapper)) { - return new NRProcessorWrapper(processor,getRoute()); - } - return processor; - } -} diff --git a/camel-core-4.1/java/org/apache/camel/support/DefaultProducer.java b/camel-core-4.1/java/org/apache/camel/support/DefaultProducer.java deleted file mode 100644 index 38710b6..0000000 --- a/camel-core-4.1/java/org/apache/camel/support/DefaultProducer.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.camel.support; - -import org.apache.camel.Exchange; -import org.apache.camel.ExtendedExchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type=MatchType.BaseClass) -public abstract class DefaultProducer { - - public Exchange createExchange() { - Exchange exchange = Weaver.callOriginal(); - Token token = (Token) exchange.getProperty(Util.NRTOKENPROPERTY); - if(token == null) { - token = NewRelic.getAgent().getTransaction().getToken(); - if(token.isActive()) { - exchange.setProperty(Util.NRTOKENPROPERTY, token); - } else { - token.expire(); - } - } - if(exchange instanceof ExtendedExchange) { - Util.addCompletionIfNeeded((ExtendedExchange)exchange); - } - - return exchange; - } - -} diff --git a/camel-core-4.1/java/org/apache/camel/support/ExchangeHelper.java b/camel-core-4.1/java/org/apache/camel/support/ExchangeHelper.java deleted file mode 100644 index 95f3727..0000000 --- a/camel-core-4.1/java/org/apache/camel/support/ExchangeHelper.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.apache.camel.support; - -import org.apache.camel.CamelContext; -import org.apache.camel.Exchange; -import org.apache.camel.ExtendedExchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.Util; - -@Weave -public class ExchangeHelper { - - public static Exchange copyExchangeAndSetCamelContext(Exchange exchange, CamelContext context, boolean handover) { - Exchange result = Weaver.callOriginal(); - if(result instanceof ExtendedExchange) { - Util.addCompletionIfNeeded((ExtendedExchange)exchange); - } - - if(handover) { - Token token = (Token) exchange.getProperty(Util.NRTOKENPROPERTY); - if(token != null) { - result.setProperty(Util.NRTOKENPROPERTY, token); - exchange.removeProperty(Util.NRTOKENPROPERTY); - } else { - token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - result.setProperty(Util.NRTOKENPROPERTY, token); - } else if(token != null) { - token.expire(); - token = null; - } - } - } - - return result; - } - - public static Exchange createCopy(Exchange exchange, boolean preserveExchangeId) { - Exchange result = Weaver.callOriginal(); - if(result instanceof ExtendedExchange) { - Util.addCompletionIfNeeded((ExtendedExchange)exchange); - } - return result; - } - - public static Exchange createCorrelatedCopy(Exchange exchange, boolean handover, boolean useSameMessageId) { - Exchange result = Weaver.callOriginal(); - if(result instanceof ExtendedExchange) { - Util.addCompletionIfNeeded((ExtendedExchange)exchange); - } - - if (handover) { - Token token = (Token) exchange.getProperty(Util.NRTOKENPROPERTY); - if(token != null) { - token.expire(); - } - Util.addNewToken(result); - } - return result; - } - - - -} diff --git a/camel-core-4.1/java/org/apache/camel/support/component/ApiMethodHelper.java b/camel-core-4.1/java/org/apache/camel/support/component/ApiMethodHelper.java deleted file mode 100644 index 4257eec..0000000 --- a/camel-core-4.1/java/org/apache/camel/support/component/ApiMethodHelper.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.apache.camel.support.component; - -import java.util.Map; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave -public abstract class ApiMethodHelper { - - @Trace - public static Object invokeMethod(Object proxy, ApiMethod method, Map properties) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ApiMethodHelper","invokeMethod",method.getName()); - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java deleted file mode 100644 index 221ea9f..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/AggregateProcessor_instrumentation.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(originalName="org.apache.camel.processor.aggregate.AggregateProcessor") -public abstract class AggregateProcessor_instrumentation { - - @Trace(dispatcher = true) - protected boolean doProcess(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - String routeID = exchange != null ? exchange.getFromRouteId() : null; - if(routeID != null && !routeID.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","AggregateProcessor","doProcess",routeID}); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "CamelProcessor", new String[] {"AggregateProcessor",routeID}); - } - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - return Weaver.callOriginal(); - } - - @Trace(dispatcher=true) - protected boolean doProcess(Exchange exchange, String key, AsyncCallback callback, boolean sync) { - String routeID = exchange != null ? exchange.getFromRouteId() : null; - if(routeID != null && !routeID.isEmpty()) { - NewRelic.addCustomParameter("From Route ID", routeID); - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","AggregateProcessor","doProcess",routeID}); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "CamelProcessor", new String[] {"AggregateProcessor",routeID}); - } - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java deleted file mode 100644 index a4c4ec4..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelHeaders.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import org.apache.camel.Exchange; -import org.apache.camel.Message; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.Headers; - -public class CamelHeaders implements Headers { - - private Exchange exchange = null; - - public CamelHeaders(Exchange ex) { - exchange = ex; - } - - @Override - public void addHeader(String name, String value) { - exchange.setProperty(name, value); - Message msg = exchange.getMessage(); - if(msg != null) { - msg.setHeader(name, value); - } - } - - @Override - public boolean containsHeader(String name) { - return getHeaderNames().contains(name); - } - - @Override - public String getHeader(String name) { - Object value = exchange.getProperty(name); - - if (value == null) { - Message message = exchange.getMessage(); - if (message != null) { - value = message.getHeader(name); - } - } - return value != null ? value.toString() : null; - } - - @Override - public Collection getHeaderNames() { - Map props = exchange.getProperties(); - - return props != null ? props.keySet() : Collections.emptyList(); - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public Collection getHeaders(String name) { - List list = new ArrayList<>(); - String value = getHeader(name); - if(value != null && !value.isEmpty()) { - list.add(value); - } - return list; - } - - @Override - public void setHeader(String name, String value) { - exchange.setProperty(name, value); - Message msg = exchange.getMessage(); - if(msg != null) { - msg.setHeader(name, value); - } - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java deleted file mode 100644 index 3b8ea8d..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelInternalProcessor_instrumentation.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; -import org.apache.camel.Message; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TracedMethod; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type=MatchType.BaseClass,originalName="org.apache.camel.impl.engine.CamelInternalProcessor") -public abstract class CamelInternalProcessor_instrumentation { - - @Trace(dispatcher = true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - if(exchange != null && exchange.getFromRouteId() != null) { - traced.setMetricName("Custom","CamelInternalProcessor","process",exchange.getFromRouteId()); - } - if(!attributes.isEmpty()) { - traced.addCustomAttributes(attributes); - } - Message message = exchange.getMessage(); - - - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelMapHeaders.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelMapHeaders.java deleted file mode 100644 index d92f388..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelMapHeaders.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.Headers; - -public class CamelMapHeaders implements Headers { - - private Map map = null; - - public CamelMapHeaders(Map m) { - map = m; - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public String getHeader(String name) { - Object obj = map.get(name); - if(obj != null) return obj.toString(); - return null; - } - - @Override - public Collection getHeaders(String name) { - List list = new ArrayList<>(); - String value = getHeader(name); - if(value != null && !value.isEmpty()) { - list.add(value); - } - return list; - } - - @Override - public void setHeader(String name, String value) { - map.put(name, value); - } - - @Override - public void addHeader(String name, String value) { - map.put(name, value); - } - - @Override - public Collection getHeaderNames() { - return map.keySet(); - } - - @Override - public boolean containsHeader(String name) { - return getHeaderNames().contains(name); - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelMessageHeaders.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelMessageHeaders.java deleted file mode 100644 index cf3ed85..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/CamelMessageHeaders.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; - -import org.apache.camel.Message; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.Headers; -import com.newrelic.api.agent.NewRelic; - -public class CamelMessageHeaders implements Headers { - - private Message message = null; - - public CamelMessageHeaders(Message ex) { - message = ex; - } - - @Override - public void addHeader(String name, String value) { - message.setHeader(name, value); - } - - @Override - public boolean containsHeader(String name) { - return getHeaderNames().contains(name); - } - - @Override - public String getHeader(String name) { - Object value = message.getHeader(name); - if(value == null) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Message Header is null"); - return null; - } - if(value instanceof String) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Message Header is string: {0}", value.toString()); - return (String)value; - } - if(value instanceof byte[]) { - String v = new String((byte[])value); - NewRelic.getAgent().getLogger().log(Level.FINE, "Message Header is byte array: {0}", v); - return new String((byte[])value); - } - NewRelic.getAgent().getLogger().log(Level.FINE, "Message header is not a string, it is {0}", value.getClass()); - return value.toString(); - } - - @Override - public Collection getHeaderNames() { - Map props = message.getHeaders(); - - return props != null ? props.keySet() : Collections.emptyList(); - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public Collection getHeaders(String name) { - List list = new ArrayList<>(); - - String value = getHeader(name); - if(value != null && !value.isEmpty()) { - list.add(value); - } - return list; - } - - @Override - public void setHeader(String name, String value) { - message.setHeader(name, value); - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java deleted file mode 100644 index 942f421..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/ChoiceProcessor_instrumentation.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(originalName="org.apache.camel.processor.ChoiceProcessor") -public abstract class ChoiceProcessor_instrumentation { - - @Trace(dispatcher=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - String classname = getClass().getSimpleName(); - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, headers); - Endpoint endpoint = exchange.getFromEndpoint(); - if(endpoint != null) { - String endpointURI = endpoint.getEndpointBaseUri(); - if(endpointURI != null && !endpointURI.isEmpty()) { - Util.recordValue(attributes, "EndpointURI", endpointURI); - } - } - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - String routeID = exchange != null ? exchange.getFromRouteId() : null; - if(routeID != null && !routeID.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom",classname,"process",routeID}); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "ChoiceProcessor", new String[] {"ChoiceProcessor",routeID}); - } - return Weaver.callOriginal(); - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/InvokeOnHeader_instrumentation.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/InvokeOnHeader_instrumentation.java deleted file mode 100644 index 0619332..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/InvokeOnHeader_instrumentation.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import com.newrelic.api.agent.weaver.WeaveWithAnnotation; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.api.agent.Transaction; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.WeaveIntoAllMethods; -import org.apache.camel.spi.InvokeOnHeader; - -public abstract class InvokeOnHeader_instrumentation { - - @WeaveIntoAllMethods - @WeaveWithAnnotation(annotationClasses = { "org.apache.camel.spi.InvokeOnHeader" },type=MatchType.Interface) - @Trace(dispatcher=true) - private static void instrumentation() { - - String name = null; - - InvokeOnHeader invokeOnHeaderAnnotation = Weaver.getClassAnnotation(InvokeOnHeader.class); - if(invokeOnHeaderAnnotation != null) { - name = invokeOnHeaderAnnotation.value(); - } - - if(name == null || name.isEmpty()) { - Class thisClass = InvokeOnHeader_instrumentation.class; - name = thisClass.getSimpleName(); - } - - StackTraceElement[] traces = Thread.currentThread().getStackTrace(); - StackTraceElement first = traces[1]; - String methodName = first.getMethodName(); - Transaction transaction = NewRelic.getAgent().getTransaction(); - if(transaction != null) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","Camel",name,methodName}); - transaction.setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, true, "Camel-InvokeOnHeader", new String[] {name,methodName}); - } - } -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java deleted file mode 100644 index 24a6a4e..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/MultiCastProcessor_instrumentation.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type=MatchType.BaseClass,originalName="org.apache.camel.processor.MulticastProcessor") -public abstract class MultiCastProcessor_instrumentation { - - @Trace(dispatcher=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - - return Weaver.callOriginal(); - } - - @Weave(originalName="org.apache.camel.processor.MulticastProcessor$MulticastTask", type = MatchType.BaseClass) - protected static abstract class MulticastTask { - - - @Trace(dispatcher=true) - protected void doDone(Exchange exchange, boolean forceExhaust) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - Weaver.callOriginal(); - } - - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java deleted file mode 100644 index 4396c20..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRAsyncProcessorWrapper.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Exchange; -import org.apache.camel.Route; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; - -public class NRAsyncProcessorWrapper extends NRProcessorWrapper implements AsyncProcessor { - - public NRAsyncProcessorWrapper(AsyncProcessor p,Route r) { - super(p,r); - } - - @Override - @Trace(dispatcher=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - String[] names; - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process",routeId}; - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "Processor", "Process",routeId); - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - } - } else { - Object timerTaskValue = exchange.getProperty(Exchange.TIMER_NAME); - if(timerTaskValue != null) { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process","TimerTask",timerTaskValue.toString()}; - } - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - - } - NewRelic.getAgent().getTracedMethod().setMetricName(names); - return ((AsyncProcessor)delegate).process(exchange, callback); - } - - @Override - @Trace(dispatcher = true) - public CompletableFuture processAsync(Exchange exchange) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - String[] names; - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process",routeId}; - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"process"}; - } - } else { - names = new String[] {"Custom","AsyncProcessor",delegate.getClass().getSimpleName(),"processAsync"}; - - } - NewRelic.getAgent().getTracedMethod().setMetricName(names); - return ((AsyncProcessor)delegate).processAsync(exchange); - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRBiConsumer.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRBiConsumer.java deleted file mode 100644 index dd837aa..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRBiConsumer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.function.BiConsumer; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -public class NRBiConsumer implements BiConsumer { - - private Segment segment = null; - - public NRBiConsumer(String segmentName) { - segment = NewRelic.getAgent().getTransaction().startSegment(segmentName); - } - - @Override - public void accept(T t, Throwable u) { - if(u != null) { - NewRelic.noticeError(u);; - } - if(segment != null) { - segment.end(); - segment = null; - } - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java deleted file mode 100644 index 6a17a6f..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRProcessorWrapper.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.Exchange; -import org.apache.camel.Processor; -import org.apache.camel.Route; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; - -public class NRProcessorWrapper implements Processor { - - private static boolean isTransformed = false; - protected Route route = null; - - protected Processor delegate = null; - - public NRProcessorWrapper(Processor p,Route r) { - delegate = p; - route = r; - if(!isTransformed) { - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - @Trace(dispatcher=true) - public void process(Exchange exchange) throws Exception { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - if(route != null) { - String routeId = route.getId(); - if(routeId != null && !routeId.isEmpty()) { - NewRelic.getAgent().getTracedMethod().addCustomAttribute("RouteId", routeId); - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Consumer","Processor",delegate.getClass().getSimpleName(),"process",routeId); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "Camel-Consumer", "Consumer","Route",routeId); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Consumer","Processor",delegate.getClass().getSimpleName(),"process"); - } - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Producer","Processor",delegate.getClass().getSimpleName(),"process"); - } - if(delegate != null) { - delegate.process(exchange); - } - - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRRunnable.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRRunnable.java deleted file mode 100644 index 6e8b3e7..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/NRRunnable.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - -public class NRRunnable implements Runnable { - - private static boolean isTransformed = false; - - private Runnable delegate = null; - private Token token = null; - - public NRRunnable(Runnable d, Token t) { - if(!isTransformed) { - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - isTransformed = true; - } - delegate = d; - token = t; - } - - @Override - @Trace(async=true) - public void run() { - if(token != null) { - token.linkAndExpire(); - token = null; - } - NewRelic.getAgent().getTracedMethod().addCustomAttribute("Delegate", delegate.getClass().getName()); - delegate.run(); - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java deleted file mode 100644 index 79fbac6..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Pipeline_instrumentation.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(originalName="org.apache.camel.processor.Pipeline") -public abstract class Pipeline_instrumentation { - - private String id = Weaver.callOriginal(); - - @Trace - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - - if(id != null) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Pipeline","process",id); - NewRelic.getAgent().getTracedMethod().addCustomAttribute("PipelineID", id); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Pipeline","process"); - } - return Weaver.callOriginal(); - } - - @Weave(originalName="org.apache.camel.processor.Pipeline$PipelineTask") - private static class PipelineTask { - - private Exchange exchange = Weaver.callOriginal(); - - @Trace(dispatcher=true) - public void run() { - if(exchange != null) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - String fromRoute = exchange.getFromRouteId(); - if(fromRoute == null) fromRoute = "UnknownFromRoute"; - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","PipelineTask","run",fromRoute); - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "Pipeline", "Custom","PipelineTask","run",fromRoute); - } - Weaver.callOriginal(); - } - } - -} \ No newline at end of file diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java deleted file mode 100644 index 5ec5011..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/SendProcessor_instrumentation.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.AsyncProducer; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(originalName="org.apache.camel.processor.SendProcessor") -public abstract class SendProcessor_instrumentation { - - protected final Endpoint destination = Weaver.callOriginal(); - protected String routeId = Weaver.callOriginal(); - protected AsyncProducer producer = Weaver.callOriginal(); - - - @Trace(dispatcher=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - Util.recordValue(attributes, "RouteID", routeId); - - String dest = destination != null ? destination.getEndpointBaseUri() : null; - Util.recordValue(attributes, "Destination", dest); - Util.recordValue(attributes, "SendProcessor-Processor", producer != null ? producer.getClass().getName() : null); - - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - if(dest != null && !dest.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","SendProcessor","process",dest); - NewRelic.getAgent().getTracedMethod().addCustomAttribute("DestinationURI", dest); - } - return Weaver.callOriginal(); - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java deleted file mode 100644 index 681a64d..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/SharedInternalProcessor_instrumentation.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Exchange; -import org.apache.camel.Processor; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(originalName="org.apache.camel.impl.engine.SharedCamelInternalProcessor") -public class SharedInternalProcessor_instrumentation { - - @Trace - public boolean process(Exchange exchange, AsyncCallback callback, AsyncProcessor processor, Processor resultProcessor) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java deleted file mode 100644 index 7fd8517..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Synchronization_instrumentation.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.NewField; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.WeaveAllConstructors; -import com.newrelic.api.agent.weaver.Weaver; - - -@Weave(type=MatchType.Interface,originalName="org.apache.camel.spi.Synchronization") -public abstract class Synchronization_instrumentation { - - - @NewField - private Token token = null; - - @WeaveAllConstructors - public Synchronization_instrumentation() { - if(token == null) { - token = NewRelic.getAgent().getTransaction().getToken(); - - } - } - - @Trace(async=true) - public void onComplete(Exchange exchange) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - Weaver.callOriginal(); - } - - @Trace(async=true) - public void onFailure(Exchange exchange) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - Weaver.callOriginal(); - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Util.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Util.java deleted file mode 100644 index 6397738..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/Util.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.nr.instrumentation.apache.camel; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.camel.CamelContext; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.ExchangeExtension; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; - -public class Util { - - private static final List ignores; - - static { - ignores = new ArrayList<>(); - ignores.add("org.apache.camel.impl.engine.CamelInternalProcessor$AsyncAfterTask"); - } - - @SuppressWarnings("deprecation") - public static boolean isTranscationActive() { - return AgentBridge.getAgent().getTransaction().isStarted(); - } - - public static NRRunnable getRunnable(Runnable runnable) { - String classname = runnable.getClass().getName(); - if(ignores.contains(classname)) return null; - - if(runnable instanceof NRRunnable) return (NRRunnable)runnable; - - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - return new NRRunnable(runnable, token); - } else if(token != null) { - token.expire(); - token = null; - } - - return null; - } - - public static String getMethodName(Method m) { - if(m == null) return "UnknownClass.UnknownMethod"; - - String classname = m.getDeclaringClass().getSimpleName(); - String methodName = m.getName(); - - return classname + "." + methodName; - } - - public static void recordExchange(Map attributes, Exchange exchange) { - if(exchange != null) { - recordValue(attributes, "ExchangeId", exchange.getExchangeId()); - CamelContext context = exchange.getContext(); - String ctxName = context != null ? context.getName() : null; - recordValue(attributes, "CamelContextName", ctxName); - recordValue(attributes, "CamelContextManagementName", context.getManagementName()); - Endpoint endpoint = exchange.getFromEndpoint(); - if(endpoint != null) { - recordValue(attributes, "From_EndPointURI", endpoint.getEndpointBaseUri()); - } - recordValue(attributes, "FromRouteId", exchange.getFromRouteId()); - ExchangeExtension extension = exchange.getExchangeExtension(); - if(extension != null) { - recordExtendedExchange(attributes, extension); - } - } - } - - private static void recordExtendedExchange(Map attributes, ExchangeExtension exchange) { - if(exchange != null) { - recordValue(attributes, "HistoryNodeId", exchange.getHistoryNodeId()); - recordValue(attributes, "HistoryNodeLabel", exchange.getHistoryNodeLabel()); - recordValue(attributes, "HistoryNodeSource", exchange.getHistoryNodeSource()); - Map internalProps = exchange.getInternalProperties(); - if (internalProps != null) { - for (String key : internalProps.keySet()) { - Object value = internalProps.get(key); - recordValue(attributes, "InternalProperty-"+key, value); - } - } - recordValue(attributes, "HistoryNodeId", exchange.getInternalProperties()); - - } - } - - public static void recordValue(Map attributes, String key, Object value) { - if(key != null && !key.isEmpty() && value != null) { - attributes.put(key, value); - } - } - - public static void reportExchange(Exchange exchange) { - HashMap attributes = new HashMap<>(); - recordValue(attributes, "ExchangeId", exchange.getExchangeId()); - Map properties = exchange.getAllProperties(); - Set keys = properties.keySet(); - for(String key : keys) { - recordValue(attributes, key, properties.get(key)); - } - NewRelic.getAgent().getInsights().recordCustomEvent("Pipeline_Exchange", attributes); - } -} \ No newline at end of file diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/ExchangeHeaders.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/ExchangeHeaders.java deleted file mode 100644 index da70374..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/ExchangeHeaders.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.nr.instrumentation.apache.camel.wrappers; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.Headers; - -public class ExchangeHeaders implements Headers { - - private Exchange exchange; - - public ExchangeHeaders(Exchange ex) { - exchange = ex; - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public String getHeader(String name) { - return (String) exchange.getProperty(name); - } - - @Override - public Collection getHeaders(String name) { - String value = getHeader(name); - List list = new ArrayList<>(); - if(value != null && !value.isEmpty()) { - list.add(value); - } - return list; - } - - @Override - public void setHeader(String name, String value) { - exchange.setProperty(name, value); - } - - @Override - public void addHeader(String name, String value) { - exchange.setProperty(name, value); - } - - @Override - public Collection getHeaderNames() { - Map allProps = exchange.getProperties(); - - return allProps == null ? new ArrayList() : allProps.keySet(); - } - - @Override - public boolean containsHeader(String name) { - return getHeaderNames().contains(name); - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/MessageHeaders.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/MessageHeaders.java deleted file mode 100644 index 53fa986..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/MessageHeaders.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.nr.instrumentation.apache.camel.wrappers; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import org.apache.camel.Message; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.Headers; - -public class MessageHeaders implements Headers { - - private Message message; - - public MessageHeaders(Message msg) { - message = msg; - } - - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public String getHeader(String name) { - return (String) message.getHeader(name); - } - - @Override - public Collection getHeaders(String name) { - List list = new ArrayList<>(); - String value = getHeader(name); - if(value != null && !value.isEmpty()) { - list.add(value); - } - return list; - } - - @Override - public void setHeader(String name, String value) { - message.setHeader(name, value); - } - - @Override - public void addHeader(String name, String value) { - message.setHeader(name, value); - } - - @Override - public Collection getHeaderNames() { - Map headers = message.getHeaders(); - return headers != null ? headers.keySet() : new ArrayList(); - } - - @Override - public boolean containsHeader(String name) { - return getHeaderNames().contains(name); - } - -} diff --git a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java b/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java deleted file mode 100644 index 3f4d92d..0000000 --- a/camel-core-4.1/src/main/java/com/nr/instrumentation/apache/camel/wrappers/OutboundExchangeWrapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.nr.instrumentation.apache.camel.wrappers; - -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.OutboundHeaders; - -public class OutboundExchangeWrapper implements OutboundHeaders { - - private Exchange exchange = null; - - public OutboundExchangeWrapper(Exchange e) { - exchange = e; - } - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public void setHeader(String name, String value) { - exchange.setProperty(name, value); - } - -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/ConsumerTemplate.java b/camel-core-4.1/src/main/java/org/apache/camel/ConsumerTemplate.java deleted file mode 100644 index ba6770a..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/ConsumerTemplate.java +++ /dev/null @@ -1,231 +0,0 @@ -package org.apache.camel; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TracedMethod; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelMessageHeaders; - -@Weave(type = MatchType.Interface) -public abstract class ConsumerTemplate { - - @Trace(dispatcher = true) - public Exchange receive(String endpointUri) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); - Exchange exchange = Weaver.callOriginal(); - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); - return exchange; - } - - @Trace(dispatcher = true) - public Exchange receive(String endpointUri, long timeout) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); - Exchange exchange = Weaver.callOriginal(); - if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); - } else { - NewRelic.getAgent().getTransaction().ignore(); - } - return exchange; - } - - @Trace(dispatcher = true) - public Exchange receive(Endpoint endpoint) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); - Exchange exchange = Weaver.callOriginal(); - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); - return exchange; - } - - @Trace(dispatcher = true) - public Exchange receive(Endpoint endpoint, long timeout) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receive"); - Exchange exchange = Weaver.callOriginal(); - if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); - } else { - NewRelic.getAgent().getTransaction().ignore(); - } - return exchange; - } - - @Trace(dispatcher = true) - public Exchange receiveNoWait(String endpointUri) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveNoWait"); - Exchange exchange = Weaver.callOriginal(); - if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); - } else { - NewRelic.getAgent().getTransaction().ignore(); - } - return exchange; - } - - @Trace(dispatcher = true) - public Exchange receiveNoWait(Endpoint endpoint) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveNoWait"); - Exchange exchange = Weaver.callOriginal(); - if (exchange != null) { - Message message = exchange.getMessage(); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelMessageHeaders(message)); - } else { - NewRelic.getAgent().getTransaction().ignore(); - } - return exchange; - } - - @Trace - public Object receiveBody(String endpointUri) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); - return Weaver.callOriginal(); - } - - @Trace - public Object receiveBody(Endpoint endpoint) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); - return Weaver.callOriginal(); - } - - @Trace - public Object receiveBody(String endpointUri, long timeout){ - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); - Object result = Weaver.callOriginal(); - if(result == null) { - traced.addCustomAttribute("TimedOut", true); - } - return result; - } - - @Trace - public Object receiveBody(Endpoint endpoint, long timeout) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); - Object result = Weaver.callOriginal(); - if(result == null) { - traced.addCustomAttribute("TimedOut", true); - } - return result; - } - - @Trace - public Object receiveBodyNoWait(String endpointUri) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); - Object result = Weaver.callOriginal(); - if(result == null) { - traced.addCustomAttribute("NoObjectAvailable", true); - } - return result; - } - - @Trace - public Object receiveBodyNoWait(Endpoint endpoint) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); - Object result = Weaver.callOriginal(); - if(result == null) { - traced.addCustomAttribute("NoObjectAvailable", true); - } - return result; - } - - @Trace - public T receiveBody(String endpointUri, Class type) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpointUri); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); - return Weaver.callOriginal(); - } - - @Trace - public T receiveBody(Endpoint endpoint, Class type) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); - return Weaver.callOriginal(); - } - - @Trace - public T receiveBody(String endpointUri, long timeout, Class type) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpointUri); - traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); - T result = Weaver.callOriginal(); - if(result == null) { - traced.addCustomAttribute("TimedOut", true); - } - return result; - } - - @Trace - public T receiveBody(Endpoint endpoint, long timeout, Class type) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBody"); - T result = Weaver.callOriginal(); - if(result == null) { - traced.addCustomAttribute("TimedOut", true); - } - return result; - } - - @Trace - public T receiveBodyNoWait(String endpointUri, Class type) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpointUri); - traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); - T result = Weaver.callOriginal(); - if(result == null) { - traced.addCustomAttribute("TimedOut", true); - } - return result; - } - - @Trace - public T receiveBodyNoWait(Endpoint endpoint, Class type) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttribute("EndpointURI", endpoint.getEndpointUri()); - traced.addCustomAttribute("BodyClass", type.getName()); - traced.setMetricName("Custom","Camel","Consumer",getClass().getSimpleName(),"receiveBodyNoWait"); - T result = Weaver.callOriginal(); - if(result == null) { - traced.addCustomAttribute("TimedOut", true); - } - return result; - } - - -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/Endpoint_instrumentation.java b/camel-core-4.1/src/main/java/org/apache/camel/Endpoint_instrumentation.java deleted file mode 100644 index 048711d..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/Endpoint_instrumentation.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.apache.camel; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type=MatchType.Interface, originalName = "org.apache.camel.Endpoint") -public abstract class Endpoint_instrumentation { - - - public abstract String getEndpointUri(); - public abstract String getEndpointBaseUri(); - - - public Exchange createExchange() { - Exchange exchange = Weaver.callOriginal(); - if(Util.isTranscationActive()) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - return exchange; - } - - - public Exchange createExchange(ExchangePattern pattern) { - Exchange exchange = Weaver.callOriginal(); - if(Util.isTranscationActive()) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - return exchange; - } - -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/Handler_instrumentation.java b/camel-core-4.1/src/main/java/org/apache/camel/Handler_instrumentation.java deleted file mode 100644 index c8aaabb..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/Handler_instrumentation.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.apache.camel; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.WeaveIntoAllMethods; -import com.newrelic.api.agent.weaver.WeaveWithAnnotation; - -public abstract class Handler_instrumentation { - - @WeaveWithAnnotation(annotationClasses = {"org.apache.camel.Handler"}, type = MatchType.Interface) - @WeaveIntoAllMethods - @Trace - private static void instrumentation() { - - StackTraceElement[] traces = Thread.currentThread().getStackTrace(); - StackTraceElement first = traces[1]; - String methodName = first.getMethodName(); - String classname = first.getClassName(); - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Handler",classname,methodName); - } - -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/Pattern_instrumentation.java b/camel-core-4.1/src/main/java/org/apache/camel/Pattern_instrumentation.java deleted file mode 100644 index b726009..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/Pattern_instrumentation.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.apache.camel; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.WeaveIntoAllMethods; -import com.newrelic.api.agent.weaver.WeaveWithAnnotation; - -@WeaveWithAnnotation(type = MatchType.Interface, annotationClasses = {"org.apache.camel.Pattern"}) -public abstract class Pattern_instrumentation { - - @WeaveWithAnnotation(annotationClasses = {"org.apache.camel.Pattern"}) - @WeaveIntoAllMethods - @Trace - private static void instrumentation() { - - StackTraceElement[] traces = Thread.currentThread().getStackTrace(); - StackTraceElement first = traces[1]; - String methodName = first.getMethodName(); - String classname = first.getClassName(); - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Handler",classname,methodName); - } - -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/Produce_instrumentation.java b/camel-core-4.1/src/main/java/org/apache/camel/Produce_instrumentation.java deleted file mode 100644 index 386e5e3..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/Produce_instrumentation.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.apache.camel; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.WeaveIntoAllMethods; -import com.newrelic.api.agent.weaver.WeaveWithAnnotation; - -public abstract class Produce_instrumentation { - - @WeaveIntoAllMethods - @WeaveWithAnnotation(annotationClasses = {"org.apache.camel.Produce"}) - @Trace(dispatcher = true) - private static void instrumentation() { - - StackTraceElement[] traces = Thread.currentThread().getStackTrace(); - StackTraceElement first = traces[1]; - String methodName = first.getMethodName(); - String classname = first.getClassName(); - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","Handler",classname,methodName); - } - -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java b/camel-core-4.1/src/main/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java deleted file mode 100644 index 49f3909..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.apache.camel.component.bean; - -import java.lang.reflect.Method; - -import org.apache.camel.ExchangePattern; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave(type=MatchType.BaseClass) -public abstract class AbstractCamelInvocationHandler { - - @Trace - public Object doInvokeProxy(Object proxy, Method method, Object[] args) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","Camel","CamelInvocationHandler",getClass().getSimpleName(),"doProxyInvoke",method.getDeclaringClass().getSimpleName(),method.getName()}); - return Weaver.callOriginal(); - } - - @Trace - protected Object invokeProxy(Method method, ExchangePattern pattern, Object[] args, boolean binding) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","Camel","CamelInvocationHandler",getClass().getSimpleName(),"invokeProxy",method.getDeclaringClass().getSimpleName(),method.getName()}); - return Weaver.callOriginal(); - } - - @Trace - protected Object invokeWithBody(Method method, Object body, ExchangePattern pattern) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","Camel","CamelInvocationHandler",getClass().getSimpleName(),"invokeWithBody",method.getDeclaringClass().getSimpleName(),method.getName()}); - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/component/bean/BeanProcessor.java b/camel-core-4.1/src/main/java/org/apache/camel/component/bean/BeanProcessor.java deleted file mode 100644 index 60af46a..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/component/bean/BeanProcessor.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.apache.camel.component.bean; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; - -@Weave -public abstract class BeanProcessor { - - public abstract String getMethod(); - - @Trace(dispatcher=true) - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - String m = exchange.getIn().getHeader(Exchange.BEAN_METHOD_NAME, getMethod(), String.class); - if(m != null) { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","BeanProcessor","process",m}); - NewRelic.getAgent().getTracedMethod().addCustomAttribute("Bean_Method", m); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","BeanProcessor","process"}); - } - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/component/bean/MethodInvocation.java b/camel-core-4.1/src/main/java/org/apache/camel/component/bean/MethodInvocation.java deleted file mode 100644 index 145c8e0..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/component/bean/MethodInvocation.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.apache.camel.component.bean; - -import java.lang.reflect.Method; - -import org.apache.camel.AsyncCallback; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type=MatchType.Interface) -public abstract class MethodInvocation { - - public abstract Method getMethod(); - - @Trace - public boolean proceed(AsyncCallback callback) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","MethodInvocation",getClass().getSimpleName(),"proceed",Util.getMethodName(getMethod())); - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java b/camel-core-4.1/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java deleted file mode 100644 index 6817b9d..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.apache.camel.component.controlbus; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; -import org.apache.camel.spi.Language; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.Util; - -@Weave -public abstract class ControlBusProducer { - - @Trace - public boolean process(Exchange exchange, AsyncCallback callback) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - return Weaver.callOriginal(); - } - - @Trace - protected void processByAction(Exchange exchange) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Weaver.callOriginal(); - } - - @Trace - protected void processByLanguage(Exchange exchange, Language language) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java b/camel-core-4.1/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java deleted file mode 100644 index 4e7351e..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.apache.camel.component.file; - -import java.util.HashMap; -import java.util.Queue; - -import org.apache.camel.Processor; -import org.apache.camel.support.ScheduledBatchPollingConsumer; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type = MatchType.BaseClass) -public abstract class GenericFileConsumer extends ScheduledBatchPollingConsumer { - - protected GenericFileEndpoint endpoint = Weaver.callOriginal(); - - - protected GenericFileConsumer(GenericFileEndpoint endpoint, Processor processor, - GenericFileOperations operations, GenericFileProcessStrategy processStrategy) { - super( endpoint, processor); - } - - @Trace(dispatcher = true) - public int processBatch(Queue exchanges) { - HashMap attributes = new HashMap<>(); - int numToProcess = exchanges.size(); - if(numToProcess == 0) { - NewRelic.getAgent().getTransaction().ignore(); - } else { - NewRelic.getAgent().getTracedMethod().setMetricName(new String[] {"Custom","Camel",getClass().getName(),"processBatch"}); - Util.recordValue(attributes, "RouteId", getRouteId()); - Util.recordValue(attributes, "InputQueueSize", numToProcess); - String routeId = getRouteId(); - - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, true,"CamelFileConsumer", new String[] {"CamelFileConsumer", routeId != null ? getRouteId() : endpoint.toString()}); - } - - - int result=Weaver.callOriginal(); - Util.recordValue(attributes, "NumbertOfBatchProcessed", result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - - return result; - } -} - diff --git a/camel-core-4.1/src/main/java/org/apache/camel/component/seda/SedaProducer.java b/camel-core-4.1/src/main/java/org/apache/camel/component/seda/SedaProducer.java deleted file mode 100644 index 52573f4..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/component/seda/SedaProducer.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.apache.camel.component.seda; - -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; - -@Weave -public abstract class SedaProducer { - - protected void addToQueue(Exchange exchange, boolean copy) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java b/camel-core-4.1/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java deleted file mode 100644 index 117729c..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.apache.camel.impl.engine; - -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; - -@Weave -public abstract class DefaultAsyncProcessorAwaitManager { - - @Trace(dispatcher = true) - public void process(AsyncProcessor processor, Exchange exchange) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java b/camel-core-4.1/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java deleted file mode 100644 index 9a5f3bd..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.apache.camel.impl.engine; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; - -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.ExchangePattern; -import org.apache.camel.Processor; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.CamelMapHeaders; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; -import com.nr.instrumentation.apache.camel.Util; - -@Weave -public abstract class DefaultProducerTemplate { - - @Trace(dispatcher=true) - protected CompletableFuture asyncSendExchange(Endpoint endpoint, ExchangePattern pattern, Processor processor, Processor resultProcessor,Exchange inExchange) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, inExchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - CamelHeaders headers = new CamelHeaders(inExchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - if(endpoint != null) { - String uri = endpoint.getEndpointUri(); - if(uri != null && !uri.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "Producer", "Custom","Producer",uri); - NewRelic.getAgent().getTracedMethod().addCustomAttribute("EndpointURI", uri); - } - } - if(resultProcessor != null && !(resultProcessor instanceof NRProcessorWrapper)) { - resultProcessor = new NRProcessorWrapper(resultProcessor, null); - } - return Weaver.callOriginal(); - } - - @Trace(dispatcher=true) - public Exchange send(Endpoint endpoint, Exchange exchange, Processor resultProcessor) { - Map attributes = new HashMap(); - Util.recordExchange(attributes, exchange); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - if(endpoint != null) { - String uri = endpoint.getEndpointUri(); - if(uri != null && !uri.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_LOW, false, "Producer", "Custom","Producer",uri); - NewRelic.getAgent().getTracedMethod().addCustomAttribute("EndpointURI", uri); - } - } - if(resultProcessor != null && !(resultProcessor instanceof NRProcessorWrapper)) { - resultProcessor = new NRProcessorWrapper(resultProcessor, null); - } - return Weaver.callOriginal(); - } - - - protected Processor createBodyAndHeaders(Object body, Map headers) { - CamelMapHeaders nrHeaders = new CamelMapHeaders(headers); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(nrHeaders); - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java b/camel-core-4.1/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java deleted file mode 100644 index 311ebe6..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.apache.camel.processor.errorhandler; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.camel.Exchange; -import org.apache.camel.ExchangeExtension; -import org.apache.camel.support.ExtendedExchangeExtension; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave -public abstract class RedeliveryErrorHandler { - - @Weave - protected static class SimpleTask { - - private Exchange exchange = Weaver.callOriginal(); - - public void run() { - List names = new ArrayList<>(); - names.add("Custom"); - names.add("Camel"); - names.add("RedeliveryErrorHandler"); - names.add("SimpleTask"); - if(exchange != null) { - String routeId = exchange.getFromRouteId(); - if (routeId != null) { - names.add(routeId); - } - - } - String[] metricNames = new String[names.size()]; - names.toArray(metricNames); - NewRelic.getAgent().getTracedMethod().setMetricName(metricNames); - Weaver.callOriginal(); - } - - } - - @Weave - protected static class RedeliveryTask { - - private Exchange exchange = Weaver.callOriginal(); - - - public void run() { - List names = new ArrayList<>(); - names.add("Custom"); - names.add("Camel"); - names.add("RedeliveryErrorHandler"); - names.add("RedeliveryTask"); - if(exchange != null) { - String routeId = exchange.getFromRouteId(); - if(routeId != null) { - names.add(routeId); - } - - } - String[] metricNames = new String[names.size()]; - names.toArray(metricNames); - NewRelic.getAgent().getTracedMethod().setMetricName(metricNames); - Weaver.callOriginal(); - } - - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java b/camel-core-4.1/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java deleted file mode 100644 index 3038c8d..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/spi/AsyncProcessorAwaitManager.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.apache.camel.spi; - -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; - -@Weave(type = MatchType.Interface) -public abstract class AsyncProcessorAwaitManager { - - @Trace(dispatcher = true) - public void process(AsyncProcessor processor, Exchange exchange) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(exchange)); - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","AsyncProcessorAwaitManager",getClass().getSimpleName(),"process"); - NRAsyncProcessorWrapper wrapper = new NRAsyncProcessorWrapper(processor, null); - processor = wrapper; - Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/spi/CamelLogger.java b/camel-core-4.1/src/main/java/org/apache/camel/spi/CamelLogger.java deleted file mode 100644 index fa2e317..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/spi/CamelLogger.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.apache.camel.spi; - -import org.apache.camel.LoggingLevel; -import org.slf4j.Logger; -import org.slf4j.Marker; - -import java.util.HashMap; -import java.util.Map; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave -public abstract class CamelLogger { - - public static void log(Logger log, LoggingLevel level, String message, Throwable th) { - - if(th != null) { - if(message != null && !message.isEmpty()) { - Map params = new HashMap(); - params.put("Message", message); - - NewRelic.noticeError(th, params); - - } else { - NewRelic.noticeError(th); - } - } - - Weaver.callOriginal(); - } - - - public static void log(Logger log, LoggingLevel level, Marker marker, String message, Throwable th) { - - if(th != null) { - if(message != null && !message.isEmpty()) { - Map params = new HashMap(); - params.put("Message", message); - - NewRelic.noticeError(th, params); - - } else { - NewRelic.noticeError(th); - } - } - - Weaver.callOriginal(); - } - -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/spi/ProducerCache.java b/camel-core-4.1/src/main/java/org/apache/camel/spi/ProducerCache.java deleted file mode 100644 index c3c0360..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/spi/ProducerCache.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.apache.camel.spi; - -import java.util.HashMap; - -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.Processor; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TracedMethod; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type = MatchType.Interface) -public abstract class ProducerCache { - - @Trace - public Exchange send(Endpoint endpoint, Exchange exchange, Processor resultProcessor) { - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.setMetricName("Custom","Camel","ProducerCache",getClass().getSimpleName(),"send"); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, exchange); - String baseURI = endpoint.getEndpointBaseUri(); - if(baseURI != null && !baseURI.isEmpty()) { - attributes.put("EndpointURI", baseURI); - } - traced.addCustomAttributes(attributes); - if(resultProcessor != null && !(resultProcessor instanceof NRProcessorWrapper)) { - resultProcessor = new NRProcessorWrapper(resultProcessor, null); - } - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(new CamelHeaders(exchange)); - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/spi/ReactiveExecutor.java b/camel-core-4.1/src/main/java/org/apache/camel/spi/ReactiveExecutor.java deleted file mode 100644 index 5fc0afd..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/spi/ReactiveExecutor.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.apache.camel.spi; - -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.NRRunnable; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type = MatchType.Interface) -public abstract class ReactiveExecutor { - - public void schedule(Runnable runnable) { - NRRunnable wrapper = Util.getRunnable(runnable); - if(wrapper != null) { - runnable = wrapper; - } - Weaver.callOriginal(); - } - - public void scheduleMain(Runnable runnable) { - NRRunnable wrapper = Util.getRunnable(runnable); - if(wrapper != null) { - runnable = wrapper; - } - Weaver.callOriginal(); - } - - public void scheduleQueue(Runnable runnable) { - NRRunnable wrapper = Util.getRunnable(runnable); - if(wrapper != null) { - runnable = wrapper; - } - Weaver.callOriginal(); - } - - @Trace - public boolean executeFromQueue() { - return Weaver.callOriginal(); - } - -} \ No newline at end of file diff --git a/camel-core-4.1/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java b/camel-core-4.1/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java deleted file mode 100644 index 4786bfe..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/spi/SharedInternalProcessor.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.apache.camel.spi; - -import java.util.HashMap; - -import org.apache.camel.AsyncCallback; -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Exchange; -import org.apache.camel.Processor; - -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type = MatchType.Interface) -public abstract class SharedInternalProcessor { - - @Trace(dispatcher = true) - public boolean process(Exchange exchange, AsyncCallback originalCallback, AsyncProcessor processor, Processor resultProcessor) { - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, exchange); - NRAsyncProcessorWrapper wrapper = new NRAsyncProcessorWrapper(processor, null); - processor = wrapper; - if(resultProcessor != null) { - NRProcessorWrapper pWrapper = new NRProcessorWrapper(resultProcessor, null); - resultProcessor = pWrapper; - } - return Weaver.callOriginal(); - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/support/DefaultAsyncProducer.java b/camel-core-4.1/src/main/java/org/apache/camel/support/DefaultAsyncProducer.java deleted file mode 100644 index c516ebb..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/support/DefaultAsyncProducer.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.apache.camel.support; - -import java.util.HashMap; -import java.util.concurrent.CompletableFuture; - -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TracedMethod; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.NRBiConsumer; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type = MatchType.BaseClass) -public abstract class DefaultAsyncProducer { - - @Trace(dispatcher = true) - public void process(Exchange exchange) { - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, exchange); - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttributes(attributes); - traced.setMetricName("Custom","Camel","AsyncProducer",getClass().getSimpleName(),"process"); - Weaver.callOriginal(); - } - - @Trace(dispatcher = true) - public CompletableFuture processAsync(Exchange exchange) { - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, exchange); - TracedMethod traced = NewRelic.getAgent().getTracedMethod(); - traced.addCustomAttributes(attributes); - traced.setMetricName("Custom","Camel","AsyncProducer",getClass().getSimpleName(),"processAsync"); - CompletableFuture result = Weaver.callOriginal(); - String segmentName = "AsyncProcessor/Processing"; - String fromRoute = exchange.getFromRouteId(); - if(fromRoute != null && !fromRoute.isEmpty()) { - segmentName = "ProcessAsync/RouteId/" + fromRoute; - } else { - Endpoint endPt = exchange.getFromEndpoint(); - if(endPt != null) { - String base = endPt.getEndpointBaseUri(); - if(base != null && !base.isEmpty()) { - segmentName = "ProcessAsync/EndPoint/" + base; - } - } - } - - NRBiConsumer consumer = new NRBiConsumer(segmentName); - return result.whenComplete(consumer); - } - -} \ No newline at end of file diff --git a/camel-core-4.1/src/main/java/org/apache/camel/support/DefaultConsumer.java b/camel-core-4.1/src/main/java/org/apache/camel/support/DefaultConsumer.java deleted file mode 100644 index 4c6e411..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/support/DefaultConsumer.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.apache.camel.support; - -import org.apache.camel.AsyncProcessor; -import org.apache.camel.Endpoint; -import org.apache.camel.Processor; -import org.apache.camel.Route; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.NRAsyncProcessorWrapper; -import com.nr.instrumentation.apache.camel.NRProcessorWrapper; - -@Weave(type=MatchType.BaseClass) -public abstract class DefaultConsumer { - - public abstract Endpoint getEndpoint(); - - public abstract Route getRoute(); - - public abstract String getRouteId(); - - public synchronized AsyncProcessor getAsyncProcessor() { - AsyncProcessor asyncProcessor = Weaver.callOriginal(); - if(asyncProcessor != null && !(asyncProcessor instanceof NRAsyncProcessorWrapper)) { - return new NRAsyncProcessorWrapper(asyncProcessor,getRoute()); - } - return asyncProcessor; - } - - public Processor getProcessor() { - Processor processor = Weaver.callOriginal(); - if(!(processor instanceof NRProcessorWrapper)) { - return new NRProcessorWrapper(processor,getRoute()); - } - return processor; - } - - @Weave - private static class DefaultConsumerCallback { - - private final DefaultConsumer consumer = Weaver.callOriginal(); - - @SuppressWarnings("unused") - public void done(boolean doneSync) { - if(consumer != null) { - String id = consumer.getRouteId(); - if(id != null && !id.isEmpty()) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","DefaultConsumerCallback",id); - } - } - - Weaver.callOriginal(); - } - - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/support/DefaultProducer.java b/camel-core-4.1/src/main/java/org/apache/camel/support/DefaultProducer.java deleted file mode 100644 index 993f03d..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/support/DefaultProducer.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.apache.camel.support; - -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type=MatchType.BaseClass) -public abstract class DefaultProducer { - - public Exchange createExchange() { - Exchange exchange = Weaver.callOriginal(); - if(Util.isTranscationActive()) { - CamelHeaders headers = new CamelHeaders(exchange); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - return exchange; - } - -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java b/camel-core-4.1/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java deleted file mode 100644 index 1968c42..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/support/EventDrivenPollingConsumer.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.apache.camel.support; - -import java.util.HashMap; - -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type = MatchType.BaseClass) -public abstract class EventDrivenPollingConsumer { - - public abstract Endpoint getEndpoint(); - - @Trace(dispatcher = true) - public Exchange receive() { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Endpoint endPt = getEndpoint(); - if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "EventDrivenPollingConsumer",endpoint); - } - } - Exchange result = Weaver.callOriginal(); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - return result; - } - - @Trace(dispatcher = true) - public Exchange receiveNoWait() { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receiveNoWait"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Endpoint endPt = getEndpoint(); - if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "EventDrivenPollingConsumer",endpoint); - } - } - } else { - NewRelic.getAgent().getTransaction().ignore(); - } - return result; - } - - @Trace(dispatcher = true) - public Exchange receive(long timeout) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Endpoint endPt = getEndpoint(); - if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "EventDrivenPollingConsumer",endpoint); - } - } - } else { - NewRelic.getAgent().getTransaction().ignore(); - } - return result; - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/support/ExchangeHelper.java b/camel-core-4.1/src/main/java/org/apache/camel/support/ExchangeHelper.java deleted file mode 100644 index 32a25cd..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/support/ExchangeHelper.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.apache.camel.support; - -import org.apache.camel.CamelContext; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; - -@Weave -public class ExchangeHelper { - - public static Exchange copyExchangeWithProperties(Exchange exchange, CamelContext context) { - Exchange result = Weaver.callOriginal(); - CamelHeaders headers = new CamelHeaders(result); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - return result; - } - - public static Exchange createCopy(Exchange exchange, boolean preserveExchangeId) { - Exchange result = Weaver.callOriginal(); - CamelHeaders headers = new CamelHeaders(result); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - return result; - } - - public static Exchange createCorrelatedCopy(Exchange exchange, boolean handover, boolean useSameMessageId) { - Exchange result = Weaver.callOriginal(); - - if (handover) { - CamelHeaders headers = new CamelHeaders(result); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(headers); - } - return result; - } - - - -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java b/camel-core-4.1/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java deleted file mode 100644 index 8a2d839..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/support/ProcessorPollingConsumer.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.apache.camel.support; - -import java.util.HashMap; - -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.TransactionNamePriority; -import com.newrelic.api.agent.TransportType; -import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.nr.instrumentation.apache.camel.CamelHeaders; -import com.nr.instrumentation.apache.camel.Util; - -@Weave(type = MatchType.BaseClass) -public abstract class ProcessorPollingConsumer { - - public abstract Endpoint getEndpoint(); - - @Trace(dispatcher = true) - public Exchange receive() { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Endpoint endPt = getEndpoint(); - if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "ProcessorPollingConsumer",endpoint); - } - } - Exchange result = Weaver.callOriginal(); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - return result; - } - - @Trace(dispatcher = true) - public Exchange receiveNoWait() { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receiveNoWait"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Endpoint endPt = getEndpoint(); - if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer","ProcessorPollingConsumer",endpoint); - } - } - } else { - NewRelic.getAgent().getTransaction().ignore(); - } - return result; - } - - @Trace(dispatcher = true) - public Exchange receive(long timeout) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","PollingConsumer",getClass().getSimpleName(),"receive"); - Exchange result = Weaver.callOriginal(); - if(result != null) { - NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, new CamelHeaders(result)); - HashMap attributes = new HashMap<>(); - Util.recordExchange(attributes, result); - NewRelic.getAgent().getTracedMethod().addCustomAttributes(attributes); - Endpoint endPt = getEndpoint(); - if(endPt != null) { - String endpoint = endPt.getEndpointBaseUri(); - if(endpoint != null && !endpoint.isEmpty()) { - NewRelic.getAgent().getTransaction().setTransactionName(TransactionNamePriority.FRAMEWORK_HIGH, false, "PollingConsumer", "ProcessorPollingConsumer",endpoint); - } - } - } else { - NewRelic.getAgent().getTransaction().ignore(); - } - return result; - } -} diff --git a/camel-core-4.1/src/main/java/org/apache/camel/support/component/ApiMethodHelper.java b/camel-core-4.1/src/main/java/org/apache/camel/support/component/ApiMethodHelper.java deleted file mode 100644 index 4257eec..0000000 --- a/camel-core-4.1/src/main/java/org/apache/camel/support/component/ApiMethodHelper.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.apache.camel.support.component; - -import java.util.Map; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; - -@Weave -public abstract class ApiMethodHelper { - - @Trace - public static Object invokeMethod(Object proxy, ApiMethod method, Map properties) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Camel","ApiMethodHelper","invokeMethod",method.getName()); - return Weaver.callOriginal(); - } -} From 60fb9afbda34cd2cf5be5c2feed3ec04f7a1e8e0 Mon Sep 17 00:00:00 2001 From: Doug Hilpipre Date: Mon, 29 Jan 2024 10:08:49 -0600 Subject: [PATCH 4/4] migrated changes from 3.18 to 4.0.0 --- settings.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 69a0abe..b094bb4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -19,5 +19,4 @@ include 'camel-kafka-3.12' include 'camel-kafka-3.14' include 'camel-kafka-3.15' include 'camel-kafka-3.18.3' -include 'camel-core-4.1.0' include 'camel-processor'