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