diff --git a/apm-mule3-agent/pom.xml b/apm-mule3-agent/pom.xml index 625b5e9..514fa40 100644 --- a/apm-mule3-agent/pom.xml +++ b/apm-mule3-agent/pom.xml @@ -6,7 +6,7 @@ co.elastic.apm apm-mule3-agent - 1.17.0 + 1.19.0 ${packaging} Mule apm-mule3-agent Application @@ -35,7 +35,7 @@ 3.9.0 1.2 - 1.17.0 + 1.19.0 1.10.8 1.8 @@ -224,6 +224,24 @@ ${mule.version} provided + + org.mule.modules + mule-module-apikit + ${mule.version} + provided + + + org.mule.modules + mule-module-devkit-support + ${mule.version} + provided + + + org.mule.modules + mule-module-objectstore + 1.3.3 + provided + diff --git a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/AnnotatedObjectUtils.java b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/AnnotatedObjectUtils.java index b3824e2..a526423 100644 --- a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/AnnotatedObjectUtils.java +++ b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/AnnotatedObjectUtils.java @@ -5,6 +5,7 @@ import org.mule.api.AnnotatedObject; import org.mule.api.MuleEvent; import org.mule.api.context.notification.ServerNotification; +import org.mule.api.processor.MessageProcessor; import org.mule.context.notification.MessageProcessorNotification; /** @@ -18,7 +19,15 @@ public class AnnotatedObjectUtils { private static final String HTTP_WWW_MULESOFT_ORG_SCHEMA_MULE_DOCUMENTATION = "http://www.mulesoft.org/schema/mule/documentation"; public static String getProcessorName(MessageProcessorNotification notification) { - AnnotatedObject annotObj = (AnnotatedObject) notification.getProcessor(); + AnnotatedObject annotObj; + MessageProcessor obj = notification.getProcessor(); + + try { + annotObj = (AnnotatedObject) obj; + } catch (ClassCastException e) { + return obj.getClass().getSimpleName(); + } + QName qName = new QName(HTTP_WWW_MULESOFT_ORG_SCHEMA_MULE_DOCUMENTATION, NAME); String step = (String) annotObj.getAnnotation(qName); return step; @@ -30,7 +39,15 @@ public static String getFlowName(ServerNotification notification) { } public static String getProcessorType(MessageProcessorNotification notification) { - AnnotatedObject annotObj = (AnnotatedObject) notification.getProcessor(); + AnnotatedObject annotObj; + Object obj = notification.getProcessor(); + + try { + annotObj = (AnnotatedObject) obj; + } catch (ClassCastException e) { + return obj.getClass().getSimpleName().toLowerCase(); + } + QName qName = new QName(HTTP_WWW_MULESOFT_ORG_SCHEMA_MULE_DOCUMENTATION, SOURCE_ELEMENT); String step = (String) annotObj.getAnnotation(qName); String value = step.split("[ <]")[1]; diff --git a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/SpanUtils.java b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/SpanUtils.java index eb5ee02..4792955 100644 --- a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/SpanUtils.java +++ b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/SpanUtils.java @@ -2,10 +2,12 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.mule.api.MuleMessage; +import org.mule.api.transformer.DataType; import org.mule.api.transport.PropertyScope; import org.mule.context.notification.MessageProcessorNotification; import org.springframework.beans.factory.annotation.Autowired; +import co.elastic.apm.api.HeaderInjector; import co.elastic.apm.api.Span; /** @@ -36,8 +38,18 @@ public void startSpan(MessageProcessorNotification notification) { // Update MuleMessage with distributed tracing properties set into // outboundProperty - span.injectTraceHeaders( - (headerName, headerValue) -> message.setProperty(headerName, headerValue, PropertyScope.OUTBOUND)); + span.injectTraceHeaders(new HeaderInjector() { + + @Override + public void addHeader(String headerName, String headerValue) { + try { + message.setProperty(headerName, headerValue, PropertyScope.OUTBOUND, DataType.STRING_DATA_TYPE); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + }); createFlowvarSpanTags(notification, span, processorName); @@ -60,7 +72,7 @@ private void createFlowvarSpanTags(MessageProcessorNotification notification, Sp } private void updateSpanTags(Span span, ImmutablePair pair) { - span.addLabel("flowVar:" + pair.getLeft(), pair.getRight().toString()); + span.setLabel("flowVar:" + pair.getLeft(), pair.getRight().toString()); } private String getMessageId(MuleMessage message) { 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 0a4df68..2cd750b 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 @@ -56,7 +56,7 @@ public void startTransactionIfNone(PipelineMessageNotification notification) { if (PropertyUtils.isInputPropertyCaptureEnabled()) PropertyUtils.getInputProperties(muleMessage).forEach(pair -> updateProperties(pair, transaction, "in")); - transaction.addLabel("messageId", messageId); + transaction.setLabel("messageId", messageId); txMap.storeTransactionOrSpan(messageId, notification, transaction); @@ -122,17 +122,17 @@ private void updateProperties(ImmutablePair pair, Transaction tr if (value instanceof String) { stringValue = (String) value; - transaction.addLabel(prefix + ":" + key, stringValue); + transaction.setLabel(prefix + ":" + key, stringValue); } else if (value instanceof ParameterMap) { ParameterMap map = (ParameterMap) value; map.keySet().stream() - .forEach((key2) -> transaction.addLabel(prefix + ":" + key + ":" + key2, map.get(key2))); + .forEach((key2) -> transaction.setLabel(prefix + ":" + key + ":" + key2, map.get(key2))); } else { stringValue = "???"; - transaction.addLabel(prefix + ":" + key, stringValue); + transaction.setLabel(prefix + ":" + key, stringValue); } } diff --git a/apm-mule3-agent/src/test/java/co/elastic/apm/mule/functional/AbstractApmFunctionalTestCase.java b/apm-mule3-agent/src/test/java/co/elastic/apm/mule/functional/AbstractApmFunctionalTestCase.java index e788d64..f8b76d2 100644 --- a/apm-mule3-agent/src/test/java/co/elastic/apm/mule/functional/AbstractApmFunctionalTestCase.java +++ b/apm-mule3-agent/src/test/java/co/elastic/apm/mule/functional/AbstractApmFunctionalTestCase.java @@ -67,10 +67,10 @@ public ErrorCapture answer(InvocationOnMock invocation) throws Throwable { } }).when(reporter).report(Mockito.any(ErrorCapture.class)); - Mockito.doNothing().when(reporter).scheduleMetricReporting(Mockito.any(), Mockito.anyLong(), Mockito.any()); +// Mockito.doNothing().when(reporter).scheduleMetricReporting(Mockito.any(), Mockito.anyLong(), Mockito.any()); ElasticApmTracer tracer = new ElasticApmTracerBuilder().reporter(reporter).build(); - tracer.start(); + tracer.start(true); ElasticApmAgent.initInstrumentation(tracer, ByteBuddyAgent.install()); // Skip real initialisation so it is not triggered in the flows for tests diff --git a/apm-mule3-agent/src/test/java/co/elastic/apm/mule/functional/FlowFunctionalTests.java b/apm-mule3-agent/src/test/java/co/elastic/apm/mule/functional/FlowFunctionalTests.java index b32eedc..fb8b82a 100644 --- a/apm-mule3-agent/src/test/java/co/elastic/apm/mule/functional/FlowFunctionalTests.java +++ b/apm-mule3-agent/src/test/java/co/elastic/apm/mule/functional/FlowFunctionalTests.java @@ -106,9 +106,28 @@ public void testFlowWith4steps() throws Exception { assertEquals("201", tx.getContext().getLabel("out:http.response")); } + @Test + public void testFlowWithObjstore() throws Exception { + + runFlow("objstore-testFlow"); + + Mockito.verify(reporter, Mockito.times(3)).report(Mockito.any(Span.class)); + Mockito.verify(reporter, Mockito.times(1)).report(Mockito.any(Transaction.class)); + Mockito.verify(reporter, Mockito.times(0)).report(Mockito.any(ErrorCapture.class)); + + assertEquals("objstore-testFlow", tx.getNameAsString()); + + assertEquals("StoreMessageProcessor", spans.get(0).getNameAsString()); + assertEquals("storemessageprocessor", spans.get(0).getType().toString()); + assertEquals("ContainsMessageProcessor", spans.get(1).getNameAsString()); + assertEquals("containsmessageprocessor", spans.get(1).getType().toString()); + assertEquals("RemoveMessageProcessor", spans.get(2).getNameAsString()); + assertEquals("removemessageprocessor", spans.get(2).getType().toString()); + } + @Override protected String getConfigResources() { - return "test_tracer.xml, test1.xml, test2.xml, parallel_flow.xml"; + return "test_tracer.xml, test1.xml, test2.xml, parallel_flow.xml, objstore-test.xml"; } } diff --git a/apm-mule3-agent/src/test/resources/objstore-test.xml b/apm-mule3-agent/src/test/resources/objstore-test.xml new file mode 100644 index 0000000..df54127 --- /dev/null +++ b/apm-mule3-agent/src/test/resources/objstore-test.xml @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/apm-mule3.8-agent/pom.xml b/apm-mule3.8-agent/pom.xml index c063334..36edd03 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.17.0 + 1.19.0 ${packaging} Mule apm-mule3-agent Application built for Mule 3.8 @@ -34,7 +34,7 @@ 3.8.1 1.2 - 1.17.0 + 1.19.0 1.10.8 1.8 @@ -217,7 +217,18 @@ ${mule.version} provided - + + org.mule.modules + mule-module-devkit-support + ${mule.version} + provided + + + org.mule.modules + mule-module-objectstore + 1.3.3 + provided + @@ -239,7 +250,7 @@ mulesoft-releases MuleSoft Releases Repository - http://repository.mulesoft.org/releases/ + https://repository.mulesoft.org/releases/ default @@ -248,7 +259,7 @@ mulesoft-release mulesoft release repository default - http://repository.mulesoft.org/releases/ + https://repository.mulesoft.org/releases/ false diff --git a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/AnnotatedObjectUtils.java b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/AnnotatedObjectUtils.java index b3824e2..a526423 100644 --- a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/AnnotatedObjectUtils.java +++ b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/AnnotatedObjectUtils.java @@ -5,6 +5,7 @@ import org.mule.api.AnnotatedObject; import org.mule.api.MuleEvent; import org.mule.api.context.notification.ServerNotification; +import org.mule.api.processor.MessageProcessor; import org.mule.context.notification.MessageProcessorNotification; /** @@ -18,7 +19,15 @@ public class AnnotatedObjectUtils { private static final String HTTP_WWW_MULESOFT_ORG_SCHEMA_MULE_DOCUMENTATION = "http://www.mulesoft.org/schema/mule/documentation"; public static String getProcessorName(MessageProcessorNotification notification) { - AnnotatedObject annotObj = (AnnotatedObject) notification.getProcessor(); + AnnotatedObject annotObj; + MessageProcessor obj = notification.getProcessor(); + + try { + annotObj = (AnnotatedObject) obj; + } catch (ClassCastException e) { + return obj.getClass().getSimpleName(); + } + QName qName = new QName(HTTP_WWW_MULESOFT_ORG_SCHEMA_MULE_DOCUMENTATION, NAME); String step = (String) annotObj.getAnnotation(qName); return step; @@ -30,7 +39,15 @@ public static String getFlowName(ServerNotification notification) { } public static String getProcessorType(MessageProcessorNotification notification) { - AnnotatedObject annotObj = (AnnotatedObject) notification.getProcessor(); + AnnotatedObject annotObj; + Object obj = notification.getProcessor(); + + try { + annotObj = (AnnotatedObject) obj; + } catch (ClassCastException e) { + return obj.getClass().getSimpleName().toLowerCase(); + } + QName qName = new QName(HTTP_WWW_MULESOFT_ORG_SCHEMA_MULE_DOCUMENTATION, SOURCE_ELEMENT); String step = (String) annotObj.getAnnotation(qName); String value = step.split("[ <]")[1]; diff --git a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/SpanUtils.java b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/SpanUtils.java index eb5ee02..4792955 100644 --- a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/SpanUtils.java +++ b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/SpanUtils.java @@ -2,10 +2,12 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.mule.api.MuleMessage; +import org.mule.api.transformer.DataType; import org.mule.api.transport.PropertyScope; import org.mule.context.notification.MessageProcessorNotification; import org.springframework.beans.factory.annotation.Autowired; +import co.elastic.apm.api.HeaderInjector; import co.elastic.apm.api.Span; /** @@ -36,8 +38,18 @@ public void startSpan(MessageProcessorNotification notification) { // Update MuleMessage with distributed tracing properties set into // outboundProperty - span.injectTraceHeaders( - (headerName, headerValue) -> message.setProperty(headerName, headerValue, PropertyScope.OUTBOUND)); + span.injectTraceHeaders(new HeaderInjector() { + + @Override + public void addHeader(String headerName, String headerValue) { + try { + message.setProperty(headerName, headerValue, PropertyScope.OUTBOUND, DataType.STRING_DATA_TYPE); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + }); createFlowvarSpanTags(notification, span, processorName); @@ -60,7 +72,7 @@ private void createFlowvarSpanTags(MessageProcessorNotification notification, Sp } private void updateSpanTags(Span span, ImmutablePair pair) { - span.addLabel("flowVar:" + pair.getLeft(), pair.getRight().toString()); + span.setLabel("flowVar:" + pair.getLeft(), pair.getRight().toString()); } private String getMessageId(MuleMessage message) { 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 d25e462..26e1cd5 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 @@ -56,7 +56,7 @@ public void startTransactionIfNone(PipelineMessageNotification notification) { if (PropertyUtils.isInputPropertyCaptureEnabled()) PropertyUtils.getInputProperties(muleMessage).forEach(pair -> updateProperties(pair, transaction, "in")); - transaction.addLabel("messageId", messageId); + transaction.setLabel("messageId", messageId); txMap.storeTransactionOrSpan(messageId, notification, transaction); @@ -123,17 +123,17 @@ private void updateProperties(ImmutablePair pair, Transaction tr if (value instanceof String) { stringValue = (String) value; - transaction.addLabel(prefix + ":" + key, stringValue); + transaction.setLabel(prefix + ":" + key, stringValue); } else if (value instanceof ParameterMap) { ParameterMap map = (ParameterMap) value; map.keySet().stream() - .forEach((key2) -> transaction.addLabel(prefix + ":" + key + ":" + key2, map.get(key2))); + .forEach((key2) -> transaction.setLabel(prefix + ":" + key + ":" + key2, map.get(key2))); } else { stringValue = "???"; - transaction.addLabel(prefix + ":" + key, stringValue); + transaction.setLabel(prefix + ":" + key, stringValue); } } diff --git a/apm-mule3.8-agent/src/test/java/co/elastic/apm/mule/functional/AbstractApmFunctionalTestCase.java b/apm-mule3.8-agent/src/test/java/co/elastic/apm/mule/functional/AbstractApmFunctionalTestCase.java index e788d64..f8b76d2 100644 --- a/apm-mule3.8-agent/src/test/java/co/elastic/apm/mule/functional/AbstractApmFunctionalTestCase.java +++ b/apm-mule3.8-agent/src/test/java/co/elastic/apm/mule/functional/AbstractApmFunctionalTestCase.java @@ -67,10 +67,10 @@ public ErrorCapture answer(InvocationOnMock invocation) throws Throwable { } }).when(reporter).report(Mockito.any(ErrorCapture.class)); - Mockito.doNothing().when(reporter).scheduleMetricReporting(Mockito.any(), Mockito.anyLong(), Mockito.any()); +// Mockito.doNothing().when(reporter).scheduleMetricReporting(Mockito.any(), Mockito.anyLong(), Mockito.any()); ElasticApmTracer tracer = new ElasticApmTracerBuilder().reporter(reporter).build(); - tracer.start(); + tracer.start(true); ElasticApmAgent.initInstrumentation(tracer, ByteBuddyAgent.install()); // Skip real initialisation so it is not triggered in the flows for tests diff --git a/apm-mule3.8-agent/src/test/java/co/elastic/apm/mule/functional/FlowFunctionalTests.java b/apm-mule3.8-agent/src/test/java/co/elastic/apm/mule/functional/FlowFunctionalTests.java index b32eedc..fb8b82a 100644 --- a/apm-mule3.8-agent/src/test/java/co/elastic/apm/mule/functional/FlowFunctionalTests.java +++ b/apm-mule3.8-agent/src/test/java/co/elastic/apm/mule/functional/FlowFunctionalTests.java @@ -106,9 +106,28 @@ public void testFlowWith4steps() throws Exception { assertEquals("201", tx.getContext().getLabel("out:http.response")); } + @Test + public void testFlowWithObjstore() throws Exception { + + runFlow("objstore-testFlow"); + + Mockito.verify(reporter, Mockito.times(3)).report(Mockito.any(Span.class)); + Mockito.verify(reporter, Mockito.times(1)).report(Mockito.any(Transaction.class)); + Mockito.verify(reporter, Mockito.times(0)).report(Mockito.any(ErrorCapture.class)); + + assertEquals("objstore-testFlow", tx.getNameAsString()); + + assertEquals("StoreMessageProcessor", spans.get(0).getNameAsString()); + assertEquals("storemessageprocessor", spans.get(0).getType().toString()); + assertEquals("ContainsMessageProcessor", spans.get(1).getNameAsString()); + assertEquals("containsmessageprocessor", spans.get(1).getType().toString()); + assertEquals("RemoveMessageProcessor", spans.get(2).getNameAsString()); + assertEquals("removemessageprocessor", spans.get(2).getType().toString()); + } + @Override protected String getConfigResources() { - return "test_tracer.xml, test1.xml, test2.xml, parallel_flow.xml"; + return "test_tracer.xml, test1.xml, test2.xml, parallel_flow.xml, objstore-test.xml"; } } diff --git a/apm-mule3.8-agent/src/test/resources/objstore-test.xml b/apm-mule3.8-agent/src/test/resources/objstore-test.xml new file mode 100644 index 0000000..df54127 --- /dev/null +++ b/apm-mule3.8-agent/src/test/resources/objstore-test.xml @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/example-app/component1/pom.xml b/example-app/component1/pom.xml index ac79039..d22ed9d 100644 --- a/example-app/component1/pom.xml +++ b/example-app/component1/pom.xml @@ -16,7 +16,7 @@ 3.9.0 1.7 - 1.16.0 + 1.19.0 true diff --git a/example-app/component2/pom.xml b/example-app/component2/pom.xml index 682ada2..eb5126c 100644 --- a/example-app/component2/pom.xml +++ b/example-app/component2/pom.xml @@ -16,7 +16,7 @@ 3.9.0 1.7 - 1.16.0 + 1.19.0 true diff --git a/example-domain-app/test-domain/pom.xml b/example-domain-app/test-domain/pom.xml index d7aa63c..3b61668 100644 --- a/example-domain-app/test-domain/pom.xml +++ b/example-domain-app/test-domain/pom.xml @@ -28,7 +28,7 @@ co.elastic.apm apm-mule3-agent - 1.16.0 + 1.19.0