From 3c52647e79cf2045fa5f1bf0f02fdd140c95855a Mon Sep 17 00:00:00 2001 From: user1 Date: Wed, 13 May 2020 13:25:19 +1000 Subject: [PATCH 1/3] Added population of MDC headers for transaction.id and trace.id. Mimics the APM Java agent functionality of enable_log_correlation --- apm-mule3-agent/pom.xml | 2 +- .../apm/mule/utils/TransactionUtils.java | 24 ++++++++++++++++++ apm-mule3.8-agent/pom.xml | 2 +- .../apm/mule/utils/TransactionUtils.java | 25 +++++++++++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/apm-mule3-agent/pom.xml b/apm-mule3-agent/pom.xml index 3d41ce3..bbc4e7c 100644 --- a/apm-mule3-agent/pom.xml +++ b/apm-mule3-agent/pom.xml @@ -5,7 +5,7 @@ 4.0.0 co.elastic.apm apm-mule3-agent - 1.15.0 + 1.15.1 ${packaging} Mule apm-mule3-agent Application diff --git a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java index 8eebdfb..0a4df68 100644 --- a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java +++ b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java @@ -1,6 +1,7 @@ package co.elastic.apm.mule.utils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.log4j.MDC; import org.mule.api.MessagingException; import org.mule.api.MuleEvent; import org.mule.api.MuleMessage; @@ -21,6 +22,9 @@ * */ public class TransactionUtils { + + private static final String MDC_TRANSACTION_ID = "transaction.id"; + private static final String MDC_TRACE_ID = "trace.id"; @Autowired private SpanStore txMap; @@ -56,6 +60,8 @@ public void startTransactionIfNone(PipelineMessageNotification notification) { txMap.storeTransactionOrSpan(messageId, notification, transaction); + if (isLogCorrelationEnabled()) + addMdcHeaders(transaction); } /** @@ -82,9 +88,27 @@ public void endTransactionIfNeeded(PipelineMessageNotification notification) { transaction.captureException(exceptionThrown); transaction.end(notification.getTimestamp() * 1_000); + + if (isLogCorrelationEnabled()) + removeMdcHeaders(); } } + private boolean isLogCorrelationEnabled() { + return "true".equals(System.getProperty("elastic.apm.enable_log_correlation")) + || "true".equals(System.getenv("ELASTIC_APM_ENABLE_LOG_CORRELATION")); + } + + private void addMdcHeaders(Transaction transaction) { + MDC.put(MDC_TRACE_ID, transaction.getTraceId()); + MDC.put(MDC_TRANSACTION_ID, transaction.getId()); + } + + private void removeMdcHeaders() { + MDC.remove(MDC_TRACE_ID); + MDC.remove(MDC_TRANSACTION_ID); + } + private MuleMessage getMuleMessage(PipelineMessageNotification notification) { return ((MuleEvent) notification.getSource()).getMessage(); } diff --git a/apm-mule3.8-agent/pom.xml b/apm-mule3.8-agent/pom.xml index 41655dc..c9ad15e 100644 --- a/apm-mule3.8-agent/pom.xml +++ b/apm-mule3.8-agent/pom.xml @@ -5,7 +5,7 @@ 4.0.0 co.elastic.apm apm-mule3.8-agent - 1.15.0 + 1.15.1 ${packaging} Mule apm-mule3-agent Application built for Mule 3.8 diff --git a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java index 8eebdfb..d25e462 100644 --- a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java +++ b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java @@ -1,6 +1,7 @@ package co.elastic.apm.mule.utils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.log4j.MDC; import org.mule.api.MessagingException; import org.mule.api.MuleEvent; import org.mule.api.MuleMessage; @@ -22,6 +23,9 @@ */ public class TransactionUtils { + private static final String MDC_TRANSACTION_ID = "transaction.id"; + private static final String MDC_TRACE_ID = "trace.id"; + @Autowired private SpanStore txMap; @@ -56,6 +60,9 @@ public void startTransactionIfNone(PipelineMessageNotification notification) { txMap.storeTransactionOrSpan(messageId, notification, transaction); + if (isLogCorrelationEnabled()) + addMdcHeaders(transaction); + } /** @@ -82,9 +89,27 @@ public void endTransactionIfNeeded(PipelineMessageNotification notification) { transaction.captureException(exceptionThrown); transaction.end(notification.getTimestamp() * 1_000); + + if (isLogCorrelationEnabled()) + removeMdcHeaders(); } } + private boolean isLogCorrelationEnabled() { + return "true".equals(System.getProperty("elastic.apm.enable_log_correlation")) + || "true".equals(System.getenv("ELASTIC_APM_ENABLE_LOG_CORRELATION")); + } + + private void addMdcHeaders(Transaction transaction) { + MDC.put(MDC_TRACE_ID, transaction.getTraceId()); + MDC.put(MDC_TRANSACTION_ID, transaction.getId()); + } + + private void removeMdcHeaders() { + MDC.remove(MDC_TRACE_ID); + MDC.remove(MDC_TRANSACTION_ID); + } + private MuleMessage getMuleMessage(PipelineMessageNotification notification) { return ((MuleEvent) notification.getSource()).getMessage(); } From 8f52ae441699c8b440572d4118ad83ce41fcecec Mon Sep 17 00:00:00 2001 From: user1 Date: Wed, 13 May 2020 13:25:19 +1000 Subject: [PATCH 2/3] Added population of MDC headers for transaction.id and trace.id. Mimics the APM Java agent functionality of enable_log_correlation --- README.md | 8 +++--- apm-mule3-agent/pom.xml | 2 +- .../apm/mule/utils/TransactionUtils.java | 24 ++++++++++++++++++ apm-mule3.8-agent/pom.xml | 2 +- .../apm/mule/utils/TransactionUtils.java | 25 +++++++++++++++++++ 5 files changed, 55 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 00596dc..ae8c99d 100644 --- a/README.md +++ b/README.md @@ -27,13 +27,13 @@ Go to the [Releases](https://github.com/michaelhyatt/elastic-apm-mule3-agent/rel Mule 3.9: ``` mvn install:install-file -Dfile= -DgroupId=co.elastic.apm \ - -DartifactId=apm-mule3-agent -Dversion=1.15.0 -Dpackaging=jar + -DartifactId=apm-mule3-agent -Dversion=1.15.1 -Dpackaging=jar ``` Mule 3.8: ``` mvn install:install-file -Dfile= -DgroupId=co.elastic.apm \ - -DartifactId=apm-mule3.8-agent -Dversion=1.15.0 -Dpackaging=jar + -DartifactId=apm-mule3.8-agent -Dversion=1.15.1 -Dpackaging=jar ``` ### Or, get the code and build it from scratch @@ -46,7 +46,7 @@ Mule 3.9: co.elastic.apm apm-mule3-agent - 1.15.0 + 1.15.1 ``` @@ -55,7 +55,7 @@ Mule 3.8: co.elastic.apm apm-mule3.8-agent - 1.15.0 + 1.15.1 ``` diff --git a/apm-mule3-agent/pom.xml b/apm-mule3-agent/pom.xml index 3d41ce3..bbc4e7c 100644 --- a/apm-mule3-agent/pom.xml +++ b/apm-mule3-agent/pom.xml @@ -5,7 +5,7 @@ 4.0.0 co.elastic.apm apm-mule3-agent - 1.15.0 + 1.15.1 ${packaging} Mule apm-mule3-agent Application diff --git a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java index 8eebdfb..0a4df68 100644 --- a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java +++ b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java @@ -1,6 +1,7 @@ package co.elastic.apm.mule.utils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.log4j.MDC; import org.mule.api.MessagingException; import org.mule.api.MuleEvent; import org.mule.api.MuleMessage; @@ -21,6 +22,9 @@ * */ public class TransactionUtils { + + private static final String MDC_TRANSACTION_ID = "transaction.id"; + private static final String MDC_TRACE_ID = "trace.id"; @Autowired private SpanStore txMap; @@ -56,6 +60,8 @@ public void startTransactionIfNone(PipelineMessageNotification notification) { txMap.storeTransactionOrSpan(messageId, notification, transaction); + if (isLogCorrelationEnabled()) + addMdcHeaders(transaction); } /** @@ -82,9 +88,27 @@ public void endTransactionIfNeeded(PipelineMessageNotification notification) { transaction.captureException(exceptionThrown); transaction.end(notification.getTimestamp() * 1_000); + + if (isLogCorrelationEnabled()) + removeMdcHeaders(); } } + private boolean isLogCorrelationEnabled() { + return "true".equals(System.getProperty("elastic.apm.enable_log_correlation")) + || "true".equals(System.getenv("ELASTIC_APM_ENABLE_LOG_CORRELATION")); + } + + private void addMdcHeaders(Transaction transaction) { + MDC.put(MDC_TRACE_ID, transaction.getTraceId()); + MDC.put(MDC_TRANSACTION_ID, transaction.getId()); + } + + private void removeMdcHeaders() { + MDC.remove(MDC_TRACE_ID); + MDC.remove(MDC_TRANSACTION_ID); + } + private MuleMessage getMuleMessage(PipelineMessageNotification notification) { return ((MuleEvent) notification.getSource()).getMessage(); } diff --git a/apm-mule3.8-agent/pom.xml b/apm-mule3.8-agent/pom.xml index 41655dc..c9ad15e 100644 --- a/apm-mule3.8-agent/pom.xml +++ b/apm-mule3.8-agent/pom.xml @@ -5,7 +5,7 @@ 4.0.0 co.elastic.apm apm-mule3.8-agent - 1.15.0 + 1.15.1 ${packaging} Mule apm-mule3-agent Application built for Mule 3.8 diff --git a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java index 8eebdfb..d25e462 100644 --- a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java +++ b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/TransactionUtils.java @@ -1,6 +1,7 @@ package co.elastic.apm.mule.utils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.log4j.MDC; import org.mule.api.MessagingException; import org.mule.api.MuleEvent; import org.mule.api.MuleMessage; @@ -22,6 +23,9 @@ */ public class TransactionUtils { + private static final String MDC_TRANSACTION_ID = "transaction.id"; + private static final String MDC_TRACE_ID = "trace.id"; + @Autowired private SpanStore txMap; @@ -56,6 +60,9 @@ public void startTransactionIfNone(PipelineMessageNotification notification) { txMap.storeTransactionOrSpan(messageId, notification, transaction); + if (isLogCorrelationEnabled()) + addMdcHeaders(transaction); + } /** @@ -82,9 +89,27 @@ public void endTransactionIfNeeded(PipelineMessageNotification notification) { transaction.captureException(exceptionThrown); transaction.end(notification.getTimestamp() * 1_000); + + if (isLogCorrelationEnabled()) + removeMdcHeaders(); } } + private boolean isLogCorrelationEnabled() { + return "true".equals(System.getProperty("elastic.apm.enable_log_correlation")) + || "true".equals(System.getenv("ELASTIC_APM_ENABLE_LOG_CORRELATION")); + } + + private void addMdcHeaders(Transaction transaction) { + MDC.put(MDC_TRACE_ID, transaction.getTraceId()); + MDC.put(MDC_TRANSACTION_ID, transaction.getId()); + } + + private void removeMdcHeaders() { + MDC.remove(MDC_TRACE_ID); + MDC.remove(MDC_TRANSACTION_ID); + } + private MuleMessage getMuleMessage(PipelineMessageNotification notification) { return ((MuleEvent) notification.getSource()).getMessage(); } From 734396f4b67b740d2d1c5f9811eeea7ed4deaadd Mon Sep 17 00:00:00 2001 From: user1 Date: Wed, 8 Jul 2020 14:57:10 +1000 Subject: [PATCH 3/3] Updated the domain listeners to track flow completion events --- apm-mule3-agent/pom.xml | 2 +- .../apm/mule/listeners/DomainApplicationListener.java | 5 +---- apm-mule3.8-agent/pom.xml | 2 +- .../apm/mule/listeners/DomainApplicationListener.java | 5 +---- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/apm-mule3-agent/pom.xml b/apm-mule3-agent/pom.xml index bbc4e7c..0c574d3 100644 --- a/apm-mule3-agent/pom.xml +++ b/apm-mule3-agent/pom.xml @@ -5,7 +5,7 @@ 4.0.0 co.elastic.apm apm-mule3-agent - 1.15.1 + 1.15.2 ${packaging} Mule apm-mule3-agent Application diff --git a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/listeners/DomainApplicationListener.java b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/listeners/DomainApplicationListener.java index 38ff487..902d3b4 100644 --- a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/listeners/DomainApplicationListener.java +++ b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/listeners/DomainApplicationListener.java @@ -64,13 +64,10 @@ public void onNotification(PipelineMessageNotification notification) { transactionUtils.startTransactionIfNone(notification); break; + case PipelineMessageNotification.PROCESS_COMPLETE: case PipelineMessageNotification.PROCESS_END: transactionUtils.endTransactionIfNeeded(notification); break; - - case PipelineMessageNotification.PROCESS_COMPLETE: - // Ignored, as it is skipped when flow exception is thrown - break; } } }); diff --git a/apm-mule3.8-agent/pom.xml b/apm-mule3.8-agent/pom.xml index c9ad15e..cb4a3ff 100644 --- a/apm-mule3.8-agent/pom.xml +++ b/apm-mule3.8-agent/pom.xml @@ -5,7 +5,7 @@ 4.0.0 co.elastic.apm apm-mule3.8-agent - 1.15.1 + 1.15.2 ${packaging} Mule apm-mule3-agent Application built for Mule 3.8 diff --git a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/listeners/DomainApplicationListener.java b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/listeners/DomainApplicationListener.java index 3a272df..ad08da9 100644 --- a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/listeners/DomainApplicationListener.java +++ b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/listeners/DomainApplicationListener.java @@ -64,13 +64,10 @@ public void onNotification(PipelineMessageNotification notification) { transactionUtils.startTransactionIfNone(notification); break; + case PipelineMessageNotification.PROCESS_COMPLETE: case PipelineMessageNotification.PROCESS_END: transactionUtils.endTransactionIfNeeded(notification); break; - - case PipelineMessageNotification.PROCESS_COMPLETE: - // Ignored, as it is skipped when flow exception is thrown - break; } } });