diff --git a/src/main/java/com/avioconsulting/mule/opentelemetry/internal/processor/FlowProcessorComponent.java b/src/main/java/com/avioconsulting/mule/opentelemetry/internal/processor/FlowProcessorComponent.java index f0b5613..e876ed7 100644 --- a/src/main/java/com/avioconsulting/mule/opentelemetry/internal/processor/FlowProcessorComponent.java +++ b/src/main/java/com/avioconsulting/mule/opentelemetry/internal/processor/FlowProcessorComponent.java @@ -54,7 +54,7 @@ public TraceComponent getStartTraceComponent(EnrichedServerNotification notifica TraceComponent traceComponent = TraceComponent.named(notification.getResourceIdentifier()); - Map tags = new HashMap<>(); + Map tags = getProcessorCommonTags(notification.getComponent()); tags.put(MULE_APP_FLOW_NAME.getKey(), notification.getResourceIdentifier()); tags.put(MULE_SERVER_ID.getKey(), notification.getServerId()); tags.put(MULE_CORRELATION_ID.getKey(), notification.getEvent().getCorrelationId()); diff --git a/src/main/java/com/avioconsulting/mule/opentelemetry/internal/processor/util/HttpSpanUtil.java b/src/main/java/com/avioconsulting/mule/opentelemetry/internal/processor/util/HttpSpanUtil.java index 01129e5..6036dc9 100644 --- a/src/main/java/com/avioconsulting/mule/opentelemetry/internal/processor/util/HttpSpanUtil.java +++ b/src/main/java/com/avioconsulting/mule/opentelemetry/internal/processor/util/HttpSpanUtil.java @@ -68,6 +68,7 @@ public static String spanName(String method, String route) { public static String apiKitRoutePath(Map tags, String rootSpanName) { Objects.requireNonNull(rootSpanName, "Root span name must not be null"); String flowName = tags.get(MULE_APP_FLOW_NAME.getKey()); + Objects.requireNonNull(flowName, "Flow name must not be null"); String pathName = (flowName.split(":")[1]).replace(":", "") .replaceAll("\\\\", "/") .replaceAll("\\(", "{").replaceAll("\\)", "}"); diff --git a/src/main/java/com/avioconsulting/mule/opentelemetry/internal/store/FlowSpan.java b/src/main/java/com/avioconsulting/mule/opentelemetry/internal/store/FlowSpan.java index 3bd973d..bbec3b3 100644 --- a/src/main/java/com/avioconsulting/mule/opentelemetry/internal/store/FlowSpan.java +++ b/src/main/java/com/avioconsulting/mule/opentelemetry/internal/store/FlowSpan.java @@ -3,10 +3,10 @@ import com.avioconsulting.mule.opentelemetry.api.sdk.SemanticAttributes; import com.avioconsulting.mule.opentelemetry.api.store.SpanMeta; import com.avioconsulting.mule.opentelemetry.api.traces.TraceComponent; +import com.avioconsulting.mule.opentelemetry.internal.util.ComponentsUtil; import com.avioconsulting.mule.opentelemetry.internal.util.PropertiesUtil; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; - import java.io.Serializable; import java.time.Instant; import java.util.HashMap; @@ -76,7 +76,8 @@ public SpanMeta addProcessorSpan(String containerName, TraceComponent traceCompo private void resetSpanNameIfNeeded(TraceComponent traceComponent) { if (!PropertiesUtil.isUseAPIKitSpanNames()) return; - if (apikitConfigName != null && traceComponent.getName().endsWith(":" + apikitConfigName)) { + if (apikitConfigName != null && ComponentsUtil.isFlowTrace(traceComponent) + && traceComponent.getName().endsWith(":" + apikitConfigName)) { if (rootSpanName.endsWith("/*")) { // Wildcard listener for HTTP APIKit Router String spanName = apiKitRoutePath(traceComponent.getTags(), getRootSpanName()); getSpan().updateName(spanName); diff --git a/src/main/java/com/avioconsulting/mule/opentelemetry/internal/util/ComponentsUtil.java b/src/main/java/com/avioconsulting/mule/opentelemetry/internal/util/ComponentsUtil.java index 6f374ad..b04c53b 100644 --- a/src/main/java/com/avioconsulting/mule/opentelemetry/internal/util/ComponentsUtil.java +++ b/src/main/java/com/avioconsulting/mule/opentelemetry/internal/util/ComponentsUtil.java @@ -1,5 +1,6 @@ package com.avioconsulting.mule.opentelemetry.internal.util; +import com.avioconsulting.mule.opentelemetry.api.traces.TraceComponent; import org.mule.runtime.api.component.Component; import org.mule.runtime.api.component.ComponentIdentifier; import org.mule.runtime.api.component.location.ComponentLocation; @@ -7,6 +8,8 @@ import java.util.Optional; +import static com.avioconsulting.mule.opentelemetry.api.sdk.SemanticAttributes.MULE_APP_PROCESSOR_NAME; + public class ComponentsUtil { public static Optional findLocation(String location, @@ -29,4 +32,9 @@ public static Optional findComponent(ComponentIdentifier identifier, .find(identifier).stream() .filter(c -> c.getLocation().getLocation().equals(location)).findFirst(); } + + public static boolean isFlowTrace(TraceComponent traceComponent) { + return traceComponent != null && traceComponent.getTags() != null + && "flow".equalsIgnoreCase(traceComponent.getTags().get(MULE_APP_PROCESSOR_NAME.getKey())); + } } diff --git a/src/test/java/com/avioconsulting/mule/opentelemetry/MuleOpenTelemetryAPIKitTest.java b/src/test/java/com/avioconsulting/mule/opentelemetry/MuleOpenTelemetryAPIKitTest.java index ed4a35c..0dffc61 100644 --- a/src/test/java/com/avioconsulting/mule/opentelemetry/MuleOpenTelemetryAPIKitTest.java +++ b/src/test/java/com/avioconsulting/mule/opentelemetry/MuleOpenTelemetryAPIKitTest.java @@ -31,7 +31,7 @@ protected void doTearDownAfterMuleContextDispose() throws Exception { public void getAPIKitOrders() throws Exception { sendRequest(CORRELATION_ID, "/api/orders/1234", 200); await().untilAsserted(() -> assertThat(DelegatedLoggingSpanTestExporter.spanQueue) - .hasSize(3) + .hasSize(8) .anySatisfy(span -> { assertThat(span) .as("Span for http:listener source flow") @@ -52,13 +52,27 @@ public void getAPIKitOrders() throws Exception { .extracting("spanName", "spanKind", "spanStatus") .containsOnly("router:router order-exp-config", "INTERNAL", "UNSET"); })); + await().untilAsserted(() -> assertThat(DelegatedLoggingSpanTestExporter.spanQueue) + .anySatisfy(span -> { + assertThat(span) + .as("Span for http:request target flow") + .extracting("spanName", "spanKind", "spanStatus") + .containsOnly("/test", "CLIENT", "UNSET"); + })); + await().untilAsserted(() -> assertThat(DelegatedLoggingSpanTestExporter.spanQueue) + .anySatisfy(span -> { + assertThat(span) + .as("Span for http:listener target flow") + .extracting("spanName", "spanKind", "spanStatus") + .containsOnly("GET /test", "SERVER", "UNSET"); + })); } @Test public void getAPIKitOrders_404Error() throws Exception { sendRequest(CORRELATION_ID, "/api/something/1234", 404); await().untilAsserted(() -> assertThat(DelegatedLoggingSpanTestExporter.spanQueue) - .hasSize(2) + .hasSize(4) .anySatisfy(span -> { assertThat(span) .as("Span for http:listener source flow") @@ -78,7 +92,7 @@ public void postAPIKitOrders() throws Exception { ContentType.APPLICATION_JSON); sendRequest("post", CORRELATION_ID, "/api/orders", 201, stringEntity); await().untilAsserted(() -> assertThat(DelegatedLoggingSpanTestExporter.spanQueue) - .hasSize(3) + .hasSize(4) .anySatisfy(span -> { assertThat(span) .as("Span for http:listener source flow") diff --git a/src/test/resources/apikit-order-exp.xml b/src/test/resources/apikit-order-exp.xml index befd13e..1756440 100644 --- a/src/test/resources/apikit-order-exp.xml +++ b/src/test/resources/apikit-order-exp.xml @@ -2,13 +2,62 @@ + http://www.mulesoft.org/schema/mule/mule-apikit http://www.mulesoft.org/schema/mule/mule-apikit/current/mule-apikit.xsd +http://www.mulesoft.org/schema/mule/opentelemetry http://www.mulesoft.org/schema/mule/opentelemetry/current/mule-opentelemetry.xsd"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -22,8 +71,22 @@ + + + + #[vars.outboundHeaders default {}] + + + #[payload] + #[vars.outboundHeaders default {}] + + + + + + diff --git a/src/test/resources/global-common.xml b/src/test/resources/global-common.xml index 3126fda..bf18f91 100644 --- a/src/test/resources/global-common.xml +++ b/src/test/resources/global-common.xml @@ -30,30 +30,4 @@ http://www.mulesoft.org/schema/mule/opentelemetry http://www.mulesoft.org/schema - - - - - - - - - - - - - - - - - - - - - - - - - -