From f6cd29564abdb3cc319ff273ec0b629fc87cb526 Mon Sep 17 00:00:00 2001 From: Ruben Date: Tue, 14 Jul 2020 20:57:35 -0500 Subject: [PATCH 1/4] Refactor span decorators to be used in opentelemetry/opentracing Signed-off-by: Ruben --- .../src/main/descriptors/common-bin.xml | 2 + bom/camel-bom/pom.xml | 10 + camel-dependencies/pom.xml | 8 +- .../apache/camel/catalog/others.properties | 2 + .../camel/catalog/others/opentelemetry.json | 15 + .../apache/camel/catalog/others/tracing.json | 14 + components/camel-opentelemetry/pom.xml | 73 + .../org/apache/camel/other.properties | 7 + .../generated/resources/opentelemetry.json | 15 + .../OpenTelemetrySpanWrapper.java | 126 + .../opentelemetry/OpenTelemetryTracer.java | 279 ++ .../propagators/OpenTelemetryGetter.java} | 26 +- .../propagators/OpenTelemetrySetter.java} | 26 +- components/camel-opentracing/pom.xml | 5 +- .../camel/opentracing/ActiveSpanManager.java | 10 +- .../OpenTracingExtractAdapter.java} | 35 +- .../OpenTracingInjectAdapter.java} | 35 +- .../opentracing/OpenTracingSpanWrapper.java | 87 + .../camel/opentracing/OpenTracingTracer.java | 60 +- ...org.apache.camel.opentracing.SpanDecorator | 55 - .../org.apache.camel.tracing.SpanDecorator | 55 + .../CamelOpenTracingTestSupport.java | 1 + .../opentracing/TestSEDASpanDecorator.java | 2 +- .../AbstractHttpSpanDecoratorTest.java | 283 -- .../AbstractMessagingSpanDecoratorTest.java | 112 - .../decorators/AbstractSpanDecoratorTest.java | 143 - .../decorators/AwsSnsSpanDecoratorTest.java | 42 - .../decorators/CqlSpanDecoratorTest.java | 83 - .../ElasticsearchSpanDecoratorTest.java | 71 - .../decorators/JdbcSpanDecoratorTest.java | 56 - .../decorators/KafkaSpanDecoratorTest.java | 116 - .../decorators/MongoDBSpanDecoratorTest.java | 75 - .../decorators/RestSpanDecoratorTest.java | 100 - .../decorators/SqlSpanDecoratorTest.java | 56 - .../decorators/TimerSpanDecoratorTest.java | 46 - ...melMessagingHeadersExtractAdapterTest.java | 74 - ...amelMessagingHeadersInjectAdapterTest.java | 68 - ...=> org.apache.camel.tracing.SpanDecorator} | 0 components/camel-tracing/pom.xml | 45 + .../org/apache/camel/other.properties | 7 + .../src/generated/resources/tracing.json | 14 + .../camel/tracing/HeadersExtractAdapter.java} | 32 +- .../camel/tracing/HeadersInjectAdapter.java | 24 + .../apache/camel/tracing}/SpanDecorator.java | 28 +- .../org/apache/camel/tracing/SpanKind.java | 27 + .../org/apache/camel/tracing/SpanWrap.java | 38 + .../decorators/AbstractHttpSpanDecorator.java | 16 +- .../AbstractInternalSpanDecorator.java | 2 +- .../AbstractMessagingSpanDecorator.java | 31 +- .../decorators/AbstractSpanDecorator.java | 115 +- .../tracing}/decorators/AhcSpanDecorator.java | 2 +- .../decorators/AmqpSpanDecorator.java | 2 +- .../decorators/AwsSnsSpanDecorator.java | 2 +- .../decorators/AwsSqsSpanDecorator.java | 2 +- .../decorators/CometdSpanDecorator.java | 2 +- .../decorators/CometdsSpanDecorator.java | 2 +- .../tracing}/decorators/CqlSpanDecorator.java | 17 +- .../decorators/DirectSpanDecorator.java | 2 +- .../decorators/DirectvmSpanDecorator.java | 2 +- .../decorators/DisruptorSpanDecorator.java | 2 +- .../decorators/DisruptorvmSpanDecorator.java | 2 +- .../ElasticsearchSpanDecorator.java | 14 +- .../decorators/HttpSpanDecorator.java | 2 +- .../decorators/HttpsSpanDecorator.java | 2 +- .../decorators/IronmqSpanDecorator.java | 2 +- .../decorators/JdbcSpanDecorator.java | 12 +- .../decorators/JettySpanDecorator.java | 2 +- .../tracing}/decorators/JmsSpanDecorator.java | 2 +- .../decorators/KafkaSpanDecorator.java | 6 +- .../tracing}/decorators/LogSpanDecorator.java | 2 +- .../decorators/MongoDBSpanDecorator.java | 17 +- .../decorators/NatsSpanDecorator.java | 2 +- .../decorators/NettyHttpSpanDecorator.java | 2 +- .../tracing}/decorators/NsqSpanDecorator.java | 2 +- .../decorators/PahoSpanDecorator.java | 2 +- .../decorators/PlatformHttpSpanDecorator.java | 2 +- .../decorators/RabbitmqSpanDecorator.java | 2 +- .../decorators/RestSpanDecorator.java | 6 +- .../decorators/SedaSpanDecorator.java | 2 +- .../decorators/ServletSpanDecorator.java | 2 +- .../decorators/Sjms2SpanDecorator.java | 2 +- .../decorators/SjmsSpanDecorator.java | 2 +- .../tracing}/decorators/SqlSpanDecorator.java | 12 +- .../decorators/StompSpanDecorator.java | 2 +- .../decorators/TimerSpanDecorator.java | 2 +- .../decorators/UndertowSpanDecorator.java | 2 +- .../tracing}/decorators/VmSpanDecorator.java | 2 +- .../CamelHeadersExtractAdapter.java | 13 +- .../CamelHeadersInjectAdapter.java | 12 +- .../CamelMessagingHeadersExtractAdapter.java | 11 +- .../CamelMessagingHeadersInjectAdapter.java | 12 +- components/pom.xml | 19 + .../endpoint/StaticEndpointBuilders.java | 4 +- parent/pom.xml | 4419 +++++++++-------- 94 files changed, 3374 insertions(+), 3912 deletions(-) create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/opentelemetry.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/tracing.json create mode 100644 components/camel-opentelemetry/pom.xml create mode 100644 components/camel-opentelemetry/src/generated/resources/META-INF/services/org/apache/camel/other.properties create mode 100644 components/camel-opentelemetry/src/generated/resources/opentelemetry.json create mode 100644 components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanWrapper.java create mode 100644 components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java rename components/{camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/StompSpanDecoratorTest.java => camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java} (58%) rename components/{camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CometdSpanDecoratorTest.java => camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetrySetter.java} (57%) rename components/camel-opentracing/src/{test/java/org/apache/camel/opentracing/decorators/JmsSpanDecoratorTest.java => main/java/org/apache/camel/opentracing/OpenTracingExtractAdapter.java} (51%) rename components/camel-opentracing/src/{test/java/org/apache/camel/opentracing/decorators/AwsSqsSpanDecoratorTest.java => main/java/org/apache/camel/opentracing/OpenTracingInjectAdapter.java} (51%) create mode 100644 components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanWrapper.java delete mode 100644 components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator create mode 100644 components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractMessagingSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSnsSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CqlSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/ElasticsearchSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JdbcSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/KafkaSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/RestSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/SqlSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/TimerSpanDecoratorTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersExtractAdapterTest.java delete mode 100644 components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersInjectAdapterTest.java rename components/camel-opentracing/src/test/resources/META-INF/services/{org.apache.camel.opentracing.SpanDecorator => org.apache.camel.tracing.SpanDecorator} (100%) create mode 100644 components/camel-tracing/pom.xml create mode 100644 components/camel-tracing/src/generated/resources/META-INF/services/org/apache/camel/other.properties create mode 100644 components/camel-tracing/src/generated/resources/tracing.json rename components/{camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/IronmqSpanDecoratorTest.java => camel-tracing/src/main/java/org/apache/camel/tracing/HeadersExtractAdapter.java} (50%) create mode 100644 components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersInjectAdapter.java rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/SpanDecorator.java (82%) create mode 100644 components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanKind.java create mode 100644 components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanWrap.java rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/AbstractHttpSpanDecorator.java (87%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/AbstractInternalSpanDecorator.java (96%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/AbstractMessagingSpanDecorator.java (69%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/AbstractSpanDecorator.java (80%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/AhcSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/AmqpSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/AwsSnsSpanDecorator.java (96%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/AwsSqsSpanDecorator.java (96%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/CometdSpanDecorator.java (96%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/CometdsSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/CqlSpanDecorator.java (79%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/DirectSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/DirectvmSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/DisruptorSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/DisruptorvmSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/ElasticsearchSpanDecorator.java (82%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/HttpSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/HttpsSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/IronmqSpanDecorator.java (96%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/JdbcSpanDecorator.java (81%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/JettySpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/JmsSpanDecorator.java (96%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/KafkaSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/LogSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/MongoDBSpanDecorator.java (78%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/NatsSpanDecorator.java (96%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/NettyHttpSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/NsqSpanDecorator.java (97%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/PahoSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/PlatformHttpSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/RabbitmqSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/RestSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/SedaSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/ServletSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/Sjms2SpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/SjmsSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/SqlSpanDecorator.java (82%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/StompSpanDecorator.java (96%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/TimerSpanDecorator.java (96%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/UndertowSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/decorators/VmSpanDecorator.java (95%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/propagation/CamelHeadersExtractAdapter.java (76%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/propagation/CamelHeadersInjectAdapter.java (75%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/propagation/CamelMessagingHeadersExtractAdapter.java (89%) rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/propagation/CamelMessagingHeadersInjectAdapter.java (85%) diff --git a/apache-camel/src/main/descriptors/common-bin.xml b/apache-camel/src/main/descriptors/common-bin.xml index c6efc3f6f4b82..3f907061cef04 100644 --- a/apache-camel/src/main/descriptors/common-bin.xml +++ b/apache-camel/src/main/descriptors/common-bin.xml @@ -284,6 +284,7 @@ org.apache.camel:camel-olingo4-api org.apache.camel:camel-openapi-java org.apache.camel:camel-openstack + org.apache.camel:camel-opentelemetry org.apache.camel:camel-opentracing org.apache.camel:camel-optaplanner org.apache.camel:camel-paho @@ -370,6 +371,7 @@ org.apache.camel:camel-thrift org.apache.camel:camel-tika org.apache.camel:camel-timer + org.apache.camel:camel-tracing org.apache.camel:camel-twilio org.apache.camel:camel-twitter org.apache.camel:camel-undertow diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml index 6df1f0559b298..9c20af50dd705 100644 --- a/bom/camel-bom/pom.xml +++ b/bom/camel-bom/pom.xml @@ -1738,6 +1738,11 @@ camel-telegram ${project.version} + + org.apache.camel + camel-telemetry + ${project.version} + org.apache.camel camel-test @@ -1813,6 +1818,11 @@ camel-tooling-util ${project.version} + + org.apache.camel + camel-tracing + ${project.version} + org.apache.camel camel-twilio diff --git a/camel-dependencies/pom.xml b/camel-dependencies/pom.xml index bc6cb9c329530..bb0147d069621 100644 --- a/camel-dependencies/pom.xml +++ b/camel-dependencies/pom.xml @@ -100,10 +100,10 @@ [$(version;==;$(@)),$(version;+;$(@))) org.apache.camel.*;${camel.osgi.import.camel.version}, - ${camel.osgi.import.before.defaults}, - ${camel.osgi.import.defaults}, - ${camel.osgi.import.additional}, - * + ${camel.osgi.import.before.defaults}, + ${camel.osgi.import.defaults}, + ${camel.osgi.import.additional}, + * version="[$(version;===;${camel.osgi.version.clean}),$(version;==+;${camel.osgi.version.clean}))" ${project.build.outputDirectory}/META-INF/MANIFEST.MF !* diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties index 73a6af4a43ff7..f4a9fc2e0e9d6 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties @@ -12,6 +12,7 @@ microprofile-config microprofile-fault-tolerance microprofile-health openapi-java +opentelemetry opentracing platform-http-vertx reactive-executor-vertx @@ -34,5 +35,6 @@ testcontainers-junit5 testcontainers-spring testcontainers-spring-junit5 threadpoolfactory-vertx +tracing undertow-spring-security zipkin diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/opentelemetry.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/opentelemetry.json new file mode 100644 index 0000000000000..05097fc25345b --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/opentelemetry.json @@ -0,0 +1,15 @@ +{ + "other": { + "kind": "other", + "name": "opentelemetry", + "title": "OpenTelemetry", + "description": "Distributed tracing using OpenTelemetry", + "deprecated": false, + "firstVersion": "3.5.0", + "label": "monitoring,microservice", + "supportLevel": "Preview", + "groupId": "org.apache.camel", + "artifactId": "camel-opentelemetry", + "version": "3.5.0-SNAPSHOT" + } +} diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/tracing.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/tracing.json new file mode 100644 index 0000000000000..27d17605f8030 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/tracing.json @@ -0,0 +1,14 @@ +{ + "other": { + "kind": "other", + "name": "tracing", + "title": "Tracing", + "description": "Distributed tracing common interfaces", + "deprecated": false, + "firstVersion": "2.9.0", + "supportLevel": "Stable", + "groupId": "org.apache.camel", + "artifactId": "camel-tracing", + "version": "3.5.0-SNAPSHOT" + } +} diff --git a/components/camel-opentelemetry/pom.xml b/components/camel-opentelemetry/pom.xml new file mode 100644 index 0000000000000..65b28177c6b8a --- /dev/null +++ b/components/camel-opentelemetry/pom.xml @@ -0,0 +1,73 @@ + + + + 4.0.0 + + + org.apache.camel + components + 3.5.0-SNAPSHOT + + + + camel-opentelemetry + jar + Camel :: OpenTelemetry + Distributed tracing using OpenTelemetry + + + 3.5.0 + + OpenTelemetry + ${project.build.directory}/lib + + + + + org.apache.camel + camel-support + + + org.apache.camel + camel-tracing + + + io.grpc + grpc-netty-shaded + 1.28.0 + + + io.opentelemetry + opentelemetry-sdk + 0.6.0 + + + io.opentelemetry + opentelemetry-api + 0.6.0 + + + io.opentelemetry + opentelemetry-exporters-otlp + 0.6.0 + + + + \ No newline at end of file diff --git a/components/camel-opentelemetry/src/generated/resources/META-INF/services/org/apache/camel/other.properties b/components/camel-opentelemetry/src/generated/resources/META-INF/services/org/apache/camel/other.properties new file mode 100644 index 0000000000000..05406cb22e93b --- /dev/null +++ b/components/camel-opentelemetry/src/generated/resources/META-INF/services/org/apache/camel/other.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +name=opentelemetry +groupId=org.apache.camel +artifactId=camel-opentelemetry +version=3.5.0-SNAPSHOT +projectName=Camel :: OpenTelemetry +projectDescription=Distributed tracing using OpenTelemetry diff --git a/components/camel-opentelemetry/src/generated/resources/opentelemetry.json b/components/camel-opentelemetry/src/generated/resources/opentelemetry.json new file mode 100644 index 0000000000000..05097fc25345b --- /dev/null +++ b/components/camel-opentelemetry/src/generated/resources/opentelemetry.json @@ -0,0 +1,15 @@ +{ + "other": { + "kind": "other", + "name": "opentelemetry", + "title": "OpenTelemetry", + "description": "Distributed tracing using OpenTelemetry", + "deprecated": false, + "firstVersion": "3.5.0", + "label": "monitoring,microservice", + "supportLevel": "Preview", + "groupId": "org.apache.camel", + "artifactId": "camel-opentelemetry", + "version": "3.5.0-SNAPSHOT" + } +} diff --git a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanWrapper.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanWrapper.java new file mode 100644 index 0000000000000..14e92977ffac0 --- /dev/null +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanWrapper.java @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import java.util.*; + +import io.opentelemetry.common.AttributeValue; +import io.opentelemetry.common.Attributes; +import io.opentelemetry.trace.Span; +import io.opentelemetry.trace.attributes.SemanticAttributes; +import org.apache.camel.tracing.SpanWrap; + +/** + * @author rvargasp + */ +public class OpenTelemetrySpanWrapper implements SpanWrap { + private static final String DEFAULT_EVENT_NAME = "log"; + + Span span; + + OpenTelemetrySpanWrapper(Span span) { + this.span = span; + } + + @Override public void setComponent(String component) { + this.span.setAttribute("component", component); + } + + @Override public void setHttpStatus(Integer status) { + this.span.setAttribute(SemanticAttributes.HTTP_STATUS_CODE.key(), status.longValue()); + } + + @Override public void setHttpMethod(String method) { + this.span.setAttribute(SemanticAttributes.HTTP_METHOD.key(), method); + + } + + @Override public void setHttpURL(String url) { + this.span.setAttribute(SemanticAttributes.HTTP_URL.key(), url); + } + + @Override public void setMessageBusDestination(String dest) { + this.span.setAttribute("message.destination", dest); + } + + @Override public void setError(boolean error) { + this.span.setAttribute("error", error); + } + + @Override public void setDBType(String type) { + this.span.setAttribute(SemanticAttributes.DB_TYPE.key(), type); + } + + @Override public void setDBInstance(String instance) { + this.span.setAttribute(SemanticAttributes.DB_INSTANCE.key(), instance); + } + + @Override public void setDBStatement(String statement) { + this.span.setAttribute(SemanticAttributes.DB_STATEMENT.key(), statement); + } + + @Override public void setTag(String key, String value) { + this.span.setAttribute(key, value); + } + + @Override public void setTag(String key, Number value) { + this.span.setAttribute(key, value.intValue()); + } + + @Override public void setTag(String key, Boolean value) { + this.span.setAttribute(key, value); + } + + @Override public void log(Map fields) { + span.addEvent(getEventNameFromFields(fields), convertToAttributes(fields)); + + } + String getEventNameFromFields(Map fields) { + Object eventValue = fields == null ? null : fields.get("event"); + if (eventValue != null) { + return eventValue.toString(); + } + + return DEFAULT_EVENT_NAME; + } + Attributes convertToAttributes(Map fields) { + Attributes.Builder attributesBuilder = Attributes.newBuilder(); + + for (Map.Entry entry : fields.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + if (value == null) { + continue; + } + if (value instanceof Byte + || value instanceof Short + || value instanceof Integer + || value instanceof Long) { + attributesBuilder.setAttribute( + key, AttributeValue.longAttributeValue(((Number) value).longValue())); + } else if (value instanceof Float || value instanceof Double) { + attributesBuilder.setAttribute( + key, AttributeValue.doubleAttributeValue(((Number) value).doubleValue())); + } else if (value instanceof Boolean) { + attributesBuilder.setAttribute(key, AttributeValue.booleanAttributeValue((Boolean) value)); + } else { + attributesBuilder.setAttribute(key, AttributeValue.stringAttributeValue(value.toString())); + } + } + return attributesBuilder.build(); + } +} diff --git a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java new file mode 100644 index 0000000000000..a6021f4675d21 --- /dev/null +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java @@ -0,0 +1,279 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import java.util.*; + +import io.grpc.Context; +import io.opentelemetry.OpenTelemetry; +import io.opentelemetry.context.ContextUtils; +import io.opentelemetry.context.Scope; +import io.opentelemetry.trace.Span; +import io.opentelemetry.trace.Tracer; +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; +import org.apache.camel.Component; +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.NamedNode; +import org.apache.camel.Route; +import org.apache.camel.StaticService; +import org.apache.camel.opentelemetry.propagators.OpenTelemetryGetter; +import org.apache.camel.opentelemetry.propagators.OpenTelemetrySetter; +import org.apache.camel.spi.CamelEvent; +import org.apache.camel.spi.CamelLogger; +import org.apache.camel.spi.LogListener; +import org.apache.camel.spi.RoutePolicy; +import org.apache.camel.spi.RoutePolicyFactory; +import org.apache.camel.support.DefaultEndpoint; +import org.apache.camel.support.EndpointHelper; +import org.apache.camel.support.EventNotifierSupport; +import org.apache.camel.support.RoutePolicySupport; +import org.apache.camel.support.service.ServiceSupport; +import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.SpanKind; +import org.apache.camel.util.StringHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author rvargasp + */ + +public class OpenTelemetryTracer extends ServiceSupport +implements RoutePolicyFactory, StaticService, CamelContextAware { + + private static final Map DECORATORS = new HashMap<>(); + private static final Logger LOG = LoggerFactory.getLogger(OpenTelemetryTracer.class); + + static { + ServiceLoader.load(SpanDecorator.class).forEach(d -> { + SpanDecorator existing = DECORATORS.get(d.getComponent()); + // Add span decorator if no existing decorator for the component, + // or if derived from the existing decorator's class, allowing + // custom decorators to be added if they extend the standard + // decorators + if (existing == null || existing.getClass().isInstance(d)) { + DECORATORS.put(d.getComponent(), d); + } + }); + } + + private final OpenTelemetryEventNotifier eventNotifier = new OpenTelemetryEventNotifier(); + private Tracer tracer; + private CamelContext camelContext; + private boolean encoding; + private Set excludePatterns = new HashSet<>(); + + protected SpanDecorator getSpanDecorator(Endpoint endpoint) { + SpanDecorator sd = null; + + String uri = endpoint.getEndpointUri(); + String splitURI[] = StringHelper.splitOnCharacter(uri, ":", 2); + if (splitURI[1] != null) { + String scheme = splitURI[0]; + sd = DECORATORS.get(scheme); + } + if (sd == null) { + // okay there was no decorator found via component name (scheme), then try FQN + if (endpoint instanceof DefaultEndpoint) { + Component comp = ((DefaultEndpoint) endpoint).getComponent(); + String fqn = comp.getClass().getName(); + // lookup via FQN + sd = DECORATORS.values().stream().filter(d -> fqn.equals(d.getComponentClassName())).findFirst() + .orElse(null); + } + } + if (sd == null) { + sd = SpanDecorator.DEFAULT; + } + + return sd; + } + + public Set getExcludePatterns() { + return excludePatterns; + } + + public void setExcludePatterns(Set excludePatterns) { + this.excludePatterns = excludePatterns; + } + + public void addExcludePattern(String pattern) { + excludePatterns.add(pattern); + } + + public Tracer getTracer() { + return tracer; + } + + public void setTracer(Tracer tracer) { + this.tracer = tracer; + } + + @Override public CamelContext getCamelContext() { + return camelContext; + } + + @Override public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } + + @Override public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) { + return new OpenTelemetryRoutePolicy(); + + } + + @Override protected void doInit() throws Exception { + camelContext.getManagementStrategy().addEventNotifier(eventNotifier); + if (!camelContext.getRoutePolicyFactories().contains(this)) { + camelContext.addRoutePolicyFactory(this); + } + if (tracer == null) { + Set tracers = camelContext.getRegistry().findByType(Tracer.class); + if (tracers.size() == 1) { + tracer = tracers.iterator().next(); + } + } + } + + private Span.Kind mapToSpanKind(SpanKind kind) { + if (kind == SpanKind.SPAN_KIND_CLIENT) { + return Span.Kind.CLIENT; + } + return Span.Kind.SERVER; + } + + private boolean isExcluded(Exchange exchange, Endpoint endpoint) { + String url = endpoint.getEndpointUri(); + if (url != null && !excludePatterns.isEmpty()) { + for (String pattern : excludePatterns) { + if (EndpointHelper.matchEndpoint(exchange.getContext(), url, pattern)) { + return true; + } + } + } + return false; + } + + private final class OpenTelemetryEventNotifier extends EventNotifierSupport { + + private void handleExchangeSendingEvent(CamelEvent.ExchangeSendingEvent e) { + Span parent = tracer.getCurrentSpan(); + if (parent != null) { + tracer.withSpan(parent); + } + Span span = tracer.spanBuilder("operation").startSpan(); + SpanDecorator sd = getSpanDecorator(e.getEndpoint()); + if (!sd.newSpan() || isExcluded(e.getExchange(), e.getEndpoint())) { + return; + } + sd.pre(new OpenTelemetrySpanWrapper(span), e.getExchange(), e.getEndpoint()); + OpenTelemetry.getPropagators().getHttpTextFormat().inject(Context.current(), + sd.getInjectAdapter(e.getExchange().getIn().getHeaders(), encoding), new OpenTelemetrySetter()); + if (LOG.isTraceEnabled()) { + LOG.trace("OpenTracing: start client span={}", span); + } + } + + + private void handleExchangeSentEvent(CamelEvent.ExchangeSentEvent e) { + Span span = tracer.getCurrentSpan(); + SpanDecorator sd = getSpanDecorator(e.getEndpoint()); + if (!sd.newSpan() || isExcluded(e.getExchange(), e.getEndpoint())) { + return; + } + if (span != null) { + sd.post(new OpenTelemetrySpanWrapper(span), e.getExchange(), e.getEndpoint()); + span.end(); + } else { + LOG.warn("OpenTelemetry: could not find managed span for exchange={}", e.getExchange()); + } + } + + @Override + public void notify(CamelEvent event) throws Exception { + try { + if (event instanceof CamelEvent.ExchangeSendingEvent) { + CamelEvent.ExchangeSendingEvent ese = (CamelEvent.ExchangeSendingEvent) event; + handleExchangeSendingEvent(ese); + + } else if (event instanceof CamelEvent.ExchangeSentEvent) { + CamelEvent.ExchangeSentEvent ese = (CamelEvent.ExchangeSentEvent) event; + handleExchangeSentEvent(ese); + } + } catch (Throwable t) { + LOG.warn("OpenTracing: Failed to capture tracing data", t); + } + } + + @Override + public boolean isEnabled(CamelEvent event) { + return event instanceof CamelEvent.ExchangeSendingEvent || event instanceof CamelEvent.ExchangeSentEvent; + } + + @Override + public String toString() { + return "OpenTelemetryEventNotifier"; + } + } + + private final class OpenTelemetryRoutePolicy extends RoutePolicySupport { + @Override + public void onExchangeBegin(Route route, Exchange exchange) { + SpanDecorator sd = getSpanDecorator(route.getEndpoint()); + + Context extractedContext = OpenTelemetry.getPropagators().getHttpTextFormat().extract(Context.current(), + sd.getExtractAdapter(exchange.getIn().getHeaders(), encoding), new OpenTelemetryGetter()); + try (Scope scope = ContextUtils.withScopedContext(extractedContext)) { + Span span = tracer.spanBuilder(sd.getOperationName(exchange, route.getEndpoint())) + .setSpanKind(mapToSpanKind(sd.getReceiverSpanKind())).startSpan(); + sd.pre(new OpenTelemetrySpanWrapper(span), exchange, route.getEndpoint()); + if (LOG.isTraceEnabled()) { + LOG.trace("OpenTelemetry: start server span={}", span); + } + } + } + + @Override + public void onExchangeDone(Route route, Exchange exchange) { + try { + Span span = tracer.getCurrentSpan(); + if (span != null) { + if (LOG.isTraceEnabled()) { + LOG.trace("OpenTracing: finish server span={}", span); + } + SpanDecorator sd = getSpanDecorator(route.getEndpoint()); + sd.post(new OpenTelemetrySpanWrapper(span), exchange, route.getEndpoint()); + span.end(); + } else { + LOG.warn("OpenTracing: could not find managed span for exchange={}", exchange); + } + } catch (Throwable t) { + // This exception is ignored + LOG.warn("OpenTracing: Failed to capture tracing data", t); + } + } + + private final class OpenTracingLogListener implements LogListener { + + @Override public String onLog(Exchange exchange, CamelLogger camelLogger, String message) { + return null; + } + } + } +} \ No newline at end of file diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/StompSpanDecoratorTest.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java similarity index 58% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/StompSpanDecoratorTest.java rename to components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java index 4412537ef8781..f8b6bb48af6e5 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/StompSpanDecoratorTest.java +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java @@ -14,25 +14,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.opentelemetry.propagators; -import org.apache.camel.Endpoint; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; +import javax.annotation.Nullable; -import static org.junit.jupiter.api.Assertions.assertEquals; +import io.opentelemetry.context.propagation.HttpTextFormat; +import org.apache.camel.tracing.HeadersExtractAdapter; -public class StompSpanDecoratorTest { - - @Test - public void testGetDestination() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("stomp:queue:test"); - - StompSpanDecorator decorator = new StompSpanDecorator(); +/** + * @author rvargasp + */ +public class OpenTelemetryGetter implements HttpTextFormat.Getter { - assertEquals("test", decorator.getDestination(null, endpoint)); + @Nullable @Override public String get(HeadersExtractAdapter adapter, String key) { + return (String) adapter.get(key); } - } diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CometdSpanDecoratorTest.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetrySetter.java similarity index 57% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CometdSpanDecoratorTest.java rename to components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetrySetter.java index 1800f9a5184e3..8dc7d5d77f9c6 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CometdSpanDecoratorTest.java +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetrySetter.java @@ -14,24 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.opentelemetry.propagators; -import org.apache.camel.Endpoint; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; +import javax.annotation.Nullable; -import static org.junit.jupiter.api.Assertions.assertEquals; +import io.opentelemetry.context.propagation.HttpTextFormat; +import org.apache.camel.tracing.HeadersInjectAdapter; -public class CometdSpanDecoratorTest { - - @Test - public void testGetDestination() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("cometd://localhost:8080/MyQueue?hello=world"); - - CometdSpanDecorator decorator = new CometdSpanDecorator(); - - assertEquals("MyQueue", decorator.getDestination(null, endpoint)); +/** + * @author rvargasp + */ +public class OpenTelemetrySetter implements HttpTextFormat.Setter { + @Override public void set(@Nullable HeadersInjectAdapter adapter, String key, String value) { + adapter.put(key, value); } } diff --git a/components/camel-opentracing/pom.xml b/components/camel-opentracing/pom.xml index df3e2e600cf05..02a6d3ed29fbe 100644 --- a/components/camel-opentracing/pom.xml +++ b/components/camel-opentracing/pom.xml @@ -51,7 +51,10 @@ camel-base provided - + + org.apache.camel + camel-tracing + io.opentracing diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/ActiveSpanManager.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/ActiveSpanManager.java index 50be44dded8c7..be9dfa511e3c2 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/ActiveSpanManager.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/ActiveSpanManager.java @@ -22,7 +22,6 @@ /** * Utility class for managing active spans as a stack associated with * an exchange. - * */ public final class ActiveSpanManager { @@ -52,7 +51,7 @@ public static Span getSpan(Exchange exchange) { * onto a stack. * * @param exchange The exchange - * @param span The span + * @param span The span */ public static void activate(Exchange exchange, Span span) { exchange.setProperty(ACTIVE_SPAN_PROPERTY, @@ -79,21 +78,20 @@ public static void deactivate(Exchange exchange) { * the parent holder. This will be used to maintain a stack for spans, built * up during the execution of a series of chained camel exchanges, and then * unwound when the responses are processed. - * */ public static class Holder { private Holder parent; private Span span; - + public Holder(Holder parent, Span span) { this.parent = parent; this.span = span; } - + public Holder getParent() { return parent; } - + public Span getSpan() { return span; } diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JmsSpanDecoratorTest.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingExtractAdapter.java similarity index 51% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JmsSpanDecoratorTest.java rename to components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingExtractAdapter.java index afcab81ff0b2d..5c73e9306f5f6 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JmsSpanDecoratorTest.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingExtractAdapter.java @@ -14,29 +14,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.opentracing; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; +import java.util.*; -import static org.junit.jupiter.api.Assertions.assertEquals; +import io.opentracing.propagation.TextMap; +import org.apache.camel.tracing.HeadersExtractAdapter; -public class JmsSpanDecoratorTest { - - @Test - public void testGetMessageId() { - String messageId = "abcd"; - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(JmsSpanDecorator.JMS_MESSAGE_ID)).thenReturn(messageId); +/** + * @author rvargasp + */ +public class OpenTracingExtractAdapter implements TextMap { + HeadersExtractAdapter adapter; - JmsSpanDecorator decorator = new JmsSpanDecorator(); + OpenTracingExtractAdapter(HeadersExtractAdapter adapter) { + this.adapter = adapter; + } - assertEquals(messageId, decorator.getMessageId(exchange)); + @Override public Iterator> iterator() { + return this.adapter.iterator(); } + @Override public void put(String s, String s1) { + throw new UnsupportedOperationException("OpenTracingExtractAdapter should only be used with Tracer.extract()"); + } } diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSqsSpanDecoratorTest.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingInjectAdapter.java similarity index 51% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSqsSpanDecoratorTest.java rename to components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingInjectAdapter.java index 7d70ef66ad57b..c96aa975ba3d4 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSqsSpanDecoratorTest.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingInjectAdapter.java @@ -14,29 +14,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.opentracing; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; +import java.util.*; -import static org.junit.jupiter.api.Assertions.assertEquals; +import io.opentracing.propagation.TextMap; +import org.apache.camel.tracing.HeadersInjectAdapter; -public class AwsSqsSpanDecoratorTest { - - @Test - public void testGetMessageId() { - String messageId = "abcd"; - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(AwsSqsSpanDecorator.CAMEL_AWS_SQS_MESSAGE_ID)).thenReturn(messageId); +/** + * @author rvargasp + */ +public class OpenTracingInjectAdapter implements TextMap { + private final HeadersInjectAdapter adapter; - AwsSqsSpanDecorator decorator = new AwsSqsSpanDecorator(); + OpenTracingInjectAdapter(final HeadersInjectAdapter adapter) { + this.adapter = adapter; + } - assertEquals(messageId, decorator.getMessageId(exchange)); + @Override public Iterator> iterator() { + throw new UnsupportedOperationException("CamelHeadersInjectAdapter should only be used with Tracer.inject()"); } + @Override public void put(String key, String value) { + this.adapter.put(key, value); + } } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanWrapper.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanWrapper.java new file mode 100644 index 0000000000000..928d5414ad096 --- /dev/null +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanWrapper.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentracing; + +import java.util.*; + +import io.opentracing.Span; +import io.opentracing.tag.Tags; +import org.apache.camel.tracing.SpanWrap; + +/** + * @author rvargasp + */ +public class OpenTracingSpanWrapper implements SpanWrap { + + Span span; + + OpenTracingSpanWrapper(Span span) { + this.span = span; + } + + @Override public void setComponent(String component) { + span.setTag(Tags.COMPONENT.getKey(), component); + } + + @Override public void setHttpStatus(Integer responseCode) { + span.setTag(Tags.HTTP_STATUS.getKey(), responseCode); + } + + @Override public void setHttpMethod(String method) { + span.setTag(Tags.HTTP_METHOD.getKey(), method); + } + + @Override public void setHttpURL(String httpUrl) { + span.setTag(Tags.HTTP_URL.getKey(), httpUrl); + } + + @Override public void setMessageBusDestination(String dest) { + span.setTag(Tags.MESSAGE_BUS_DESTINATION.getKey(), dest); + } + + @Override public void setError(boolean error) { + span.setTag(Tags.ERROR.getKey(), error); + } + + @Override public void setDBType(String type) { + span.setTag(Tags.DB_TYPE.getKey(), type); + } + + @Override public void setDBInstance(String instance) { + span.setTag(Tags.DB_INSTANCE.getKey(), instance); + } + + @Override public void setDBStatement(String statement) { + span.setTag(Tags.DB_STATEMENT.getKey(), statement); + } + + @Override public void setTag(String key, String value) { + span.setTag(key, value); + } + + @Override public void setTag(String key, Number value) { + span.setTag(key, value); + } + + @Override public void setTag(String key, Boolean value) { + span.setTag(key, value); + } + + @Override public void log(Map log) { + + } +} diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java index 5e3b259241129..258a94d766874 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java @@ -16,11 +16,7 @@ */ package org.apache.camel.opentracing; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.ServiceLoader; -import java.util.Set; +import java.util.*; import io.opentracing.Span; import io.opentracing.Tracer; @@ -40,7 +36,7 @@ import org.apache.camel.RuntimeCamelException; import org.apache.camel.StaticService; import org.apache.camel.api.management.ManagedResource; -import org.apache.camel.opentracing.decorators.AbstractInternalSpanDecorator; +import org.apache.camel.tracing.decorators.AbstractInternalSpanDecorator; import org.apache.camel.spi.CamelEvent; import org.apache.camel.spi.CamelEvent.ExchangeSendingEvent; import org.apache.camel.spi.CamelEvent.ExchangeSentEvent; @@ -55,11 +51,14 @@ import org.apache.camel.support.RoutePolicySupport; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.support.service.ServiceSupport; +import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.SpanKind; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.StringHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + /** * To use OpenTracing with Camel then setup this {@link OpenTracingTracer} in * your Camel application. @@ -77,14 +76,6 @@ public class OpenTracingTracer extends ServiceSupport implements RoutePolicyFact private static final Logger LOG = LoggerFactory.getLogger(OpenTracingTracer.class); private static final Map DECORATORS = new HashMap<>(); - private final OpenTracingEventNotifier eventNotifier = new OpenTracingEventNotifier(); - private final OpenTracingLogListener logListener = new OpenTracingLogListener(); - private Tracer tracer; - private CamelContext camelContext; - private Set excludePatterns = new HashSet<>(0); - private InterceptStrategy tracingStrategy; - private boolean encoding; - static { ServiceLoader.load(SpanDecorator.class).forEach(d -> { SpanDecorator existing = DECORATORS.get(d.getComponent()); @@ -98,6 +89,14 @@ public class OpenTracingTracer extends ServiceSupport implements RoutePolicyFact }); } + private final OpenTracingEventNotifier eventNotifier = new OpenTracingEventNotifier(); + private final OpenTracingLogListener logListener = new OpenTracingLogListener(); + private Tracer tracer; + private CamelContext camelContext; + private Set excludePatterns = new HashSet<>(0); + private InterceptStrategy tracingStrategy; + private boolean encoding; + public OpenTracingTracer() { } @@ -234,6 +233,13 @@ protected void doInit() throws Exception { } } + private String mapToSpanKind(SpanKind kind) { + if (kind == SpanKind.SPAN_KIND_CLIENT) { + return Tags.SPAN_KIND_CLIENT; + } + return Tags.SPAN_KIND_SERVER; + } + @Override protected void doShutdown() throws Exception { // stop event notifier @@ -259,7 +265,8 @@ protected SpanDecorator getSpanDecorator(Endpoint endpoint) { Component comp = ((DefaultEndpoint) endpoint).getComponent(); String fqn = comp.getClass().getName(); // lookup via FQN - sd = DECORATORS.values().stream().filter(d -> fqn.equals(d.getComponentClassName())).findFirst().orElse(null); + sd = DECORATORS.values().stream().filter(d -> fqn.equals(d.getComponentClassName())).findFirst() + .orElse(null); } } if (sd == null) { @@ -287,29 +294,32 @@ private final class OpenTracingEventNotifier extends EventNotifierSupport { public void notify(CamelEvent event) throws Exception { try { if (event instanceof ExchangeSendingEvent) { - ExchangeSendingEvent ese = (ExchangeSendingEvent)event; + ExchangeSendingEvent ese = (ExchangeSendingEvent) event; SpanDecorator sd = getSpanDecorator(ese.getEndpoint()); if (sd instanceof AbstractInternalSpanDecorator || !sd.newSpan() || isExcluded(ese.getExchange(), ese.getEndpoint())) { return; } Span parent = ActiveSpanManager.getSpan(ese.getExchange()); - SpanBuilder spanBuilder = tracer.buildSpan(sd.getOperationName(ese.getExchange(), ese.getEndpoint())).withTag(Tags.SPAN_KIND.getKey(), - sd.getInitiatorSpanKind()); + SpanBuilder spanBuilder = + tracer.buildSpan(sd.getOperationName(ese.getExchange(), ese.getEndpoint())) + .withTag(Tags.SPAN_KIND.getKey(), + mapToSpanKind(sd.getInitiatorSpanKind())); // Temporary workaround to avoid adding 'null' span as a // parent if (parent != null) { spanBuilder.asChildOf(parent); } Span span = spanBuilder.start(); - sd.pre(span, ese.getExchange(), ese.getEndpoint()); - tracer.inject(span.context(), Format.Builtin.TEXT_MAP, sd.getInjectAdapter(ese.getExchange().getIn().getHeaders(), encoding)); + sd.pre(new OpenTracingSpanWrapper(span), ese.getExchange(), ese.getEndpoint()); + tracer.inject(span.context(), Format.Builtin.TEXT_MAP, + new OpenTracingInjectAdapter(sd.getInjectAdapter(ese.getExchange().getIn().getHeaders(), encoding))); ActiveSpanManager.activate(ese.getExchange(), span); if (LOG.isTraceEnabled()) { LOG.trace("OpenTracing: start client span={}", span); } } else if (event instanceof ExchangeSentEvent) { - ExchangeSentEvent ese = (ExchangeSentEvent)event; + ExchangeSentEvent ese = (ExchangeSentEvent) event; SpanDecorator sd = getSpanDecorator(ese.getEndpoint()); if (sd instanceof AbstractInternalSpanDecorator || !sd.newSpan() || isExcluded(ese.getExchange(), ese.getEndpoint())) { return; @@ -319,7 +329,7 @@ public void notify(CamelEvent event) throws Exception { if (LOG.isTraceEnabled()) { LOG.trace("OpenTracing: start client span={}", span); } - sd.post(span, ese.getExchange(), ese.getEndpoint()); + sd.post(new OpenTracingSpanWrapper(span), ese.getExchange(), ese.getEndpoint()); span.finish(); ActiveSpanManager.deactivate(ese.getExchange()); } else { @@ -361,10 +371,10 @@ public void onExchangeBegin(Route route, Exchange exchange) { .start(); if (parent == null && !(sd instanceof AbstractInternalSpanDecorator)) { - span.setTag(Tags.SPAN_KIND.getKey(), sd.getReceiverSpanKind()); + span.setTag(Tags.SPAN_KIND.getKey(), mapToSpanKind(sd.getInitiatorSpanKind())); } - sd.pre(span, exchange, route.getEndpoint()); + sd.pre(new OpenTracingSpanWrapper(span), exchange, route.getEndpoint()); ActiveSpanManager.activate(exchange, span); if (LOG.isTraceEnabled()) { LOG.trace("OpenTracing: start server span={}", span); @@ -387,7 +397,7 @@ public void onExchangeDone(Route route, Exchange exchange) { LOG.trace("OpenTracing: finish server span={}", span); } SpanDecorator sd = getSpanDecorator(route.getEndpoint()); - sd.post(span, exchange, route.getEndpoint()); + sd.post(new OpenTracingSpanWrapper(span), exchange, route.getEndpoint()); span.finish(); ActiveSpanManager.deactivate(exchange); } else { diff --git a/components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator b/components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator deleted file mode 100644 index 0e96a82cfc6df..0000000000000 --- a/components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator +++ /dev/null @@ -1,55 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -org.apache.camel.opentracing.decorators.AhcSpanDecorator -org.apache.camel.opentracing.decorators.AmqpSpanDecorator -org.apache.camel.opentracing.decorators.AwsSqsSpanDecorator -org.apache.camel.opentracing.decorators.AwsSnsSpanDecorator -org.apache.camel.opentracing.decorators.CometdSpanDecorator -org.apache.camel.opentracing.decorators.CometdsSpanDecorator -org.apache.camel.opentracing.decorators.CqlSpanDecorator -org.apache.camel.opentracing.decorators.DirectSpanDecorator -org.apache.camel.opentracing.decorators.DirectvmSpanDecorator -org.apache.camel.opentracing.decorators.DisruptorSpanDecorator -org.apache.camel.opentracing.decorators.DisruptorvmSpanDecorator -org.apache.camel.opentracing.decorators.ElasticsearchSpanDecorator -org.apache.camel.opentracing.decorators.HttpSpanDecorator -org.apache.camel.opentracing.decorators.HttpsSpanDecorator -org.apache.camel.opentracing.decorators.IronmqSpanDecorator -org.apache.camel.opentracing.decorators.JdbcSpanDecorator -org.apache.camel.opentracing.decorators.JettySpanDecorator -org.apache.camel.opentracing.decorators.JmsSpanDecorator -org.apache.camel.opentracing.decorators.KafkaSpanDecorator -org.apache.camel.opentracing.decorators.LogSpanDecorator -org.apache.camel.opentracing.decorators.MongoDBSpanDecorator -org.apache.camel.opentracing.decorators.NettyHttpSpanDecorator -org.apache.camel.opentracing.decorators.NatsSpanDecorator -org.apache.camel.opentracing.decorators.NsqSpanDecorator -org.apache.camel.opentracing.decorators.PahoSpanDecorator -org.apache.camel.opentracing.decorators.PlatformHttpSpanDecorator -org.apache.camel.opentracing.decorators.RabbitmqSpanDecorator -org.apache.camel.opentracing.decorators.RestSpanDecorator -org.apache.camel.opentracing.decorators.SedaSpanDecorator -org.apache.camel.opentracing.decorators.ServletSpanDecorator -org.apache.camel.opentracing.decorators.SjmsSpanDecorator -org.apache.camel.opentracing.decorators.Sjms2SpanDecorator -org.apache.camel.opentracing.decorators.SqlSpanDecorator -org.apache.camel.opentracing.decorators.StompSpanDecorator -org.apache.camel.opentracing.decorators.TimerSpanDecorator -org.apache.camel.opentracing.decorators.UndertowSpanDecorator -org.apache.camel.opentracing.decorators.VmSpanDecorator - diff --git a/components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator b/components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator new file mode 100644 index 0000000000000..2d8ec83446e1e --- /dev/null +++ b/components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator @@ -0,0 +1,55 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +org.apache.camel.tracing.decorators.AhcSpanDecorator +org.apache.camel.tracing.decorators.AmqpSpanDecorator +org.apache.camel.tracing.decorators.AwsSqsSpanDecorator +org.apache.camel.tracing.decorators.AwsSnsSpanDecorator +org.apache.camel.tracing.decorators.CometdSpanDecorator +org.apache.camel.tracing.decorators.CometdsSpanDecorator +org.apache.camel.tracing.decorators.CqlSpanDecorator +org.apache.camel.tracing.decorators.DirectSpanDecorator +org.apache.camel.tracing.decorators.DirectvmSpanDecorator +org.apache.camel.tracing.decorators.DisruptorSpanDecorator +org.apache.camel.tracing.decorators.DisruptorvmSpanDecorator +org.apache.camel.tracing.decorators.ElasticsearchSpanDecorator +org.apache.camel.tracing.decorators.HttpSpanDecorator +org.apache.camel.tracing.decorators.HttpsSpanDecorator +org.apache.camel.tracing.decorators.IronmqSpanDecorator +org.apache.camel.tracing.decorators.JdbcSpanDecorator +org.apache.camel.tracing.decorators.JettySpanDecorator +org.apache.camel.tracing.decorators.JmsSpanDecorator +org.apache.camel.tracing.decorators.KafkaSpanDecorator +org.apache.camel.tracing.decorators.LogSpanDecorator +org.apache.camel.tracing.decorators.MongoDBSpanDecorator +org.apache.camel.tracing.decorators.NettyHttpSpanDecorator +org.apache.camel.tracing.decorators.NatsSpanDecorator +org.apache.camel.tracing.decorators.NsqSpanDecorator +org.apache.camel.tracing.decorators.PahoSpanDecorator +org.apache.camel.tracing.decorators.PlatformHttpSpanDecorator +org.apache.camel.tracing.decorators.RabbitmqSpanDecorator +org.apache.camel.tracing.decorators.RestSpanDecorator +org.apache.camel.tracing.decorators.SedaSpanDecorator +org.apache.camel.tracing.decorators.ServletSpanDecorator +org.apache.camel.tracing.decorators.SjmsSpanDecorator +org.apache.camel.tracing.decorators.Sjms2SpanDecorator +org.apache.camel.tracing.decorators.SqlSpanDecorator +org.apache.camel.tracing.decorators.StompSpanDecorator +org.apache.camel.tracing.decorators.TimerSpanDecorator +org.apache.camel.tracing.decorators.UndertowSpanDecorator +org.apache.camel.tracing.decorators.VmSpanDecorator + diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CamelOpenTracingTestSupport.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CamelOpenTracingTestSupport.java index 9c598e3d0f397..d80b6cf3e76f9 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CamelOpenTracingTestSupport.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CamelOpenTracingTestSupport.java @@ -39,6 +39,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; + public class CamelOpenTracingTestSupport extends CamelTestSupport { protected OpenTracingTracer ottracer; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TestSEDASpanDecorator.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TestSEDASpanDecorator.java index e23f9f920e12c..bb811117c9042 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TestSEDASpanDecorator.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TestSEDASpanDecorator.java @@ -19,7 +19,7 @@ import io.opentracing.Span; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.opentracing.decorators.SedaSpanDecorator; +import org.apache.camel.tracing.decorators.SedaSpanDecorator; public class TestSEDASpanDecorator extends SedaSpanDecorator { diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecoratorTest.java deleted file mode 100644 index 566cfbab4fbe5..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecoratorTest.java +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import io.opentracing.mock.MockSpan; -import io.opentracing.mock.MockTracer; -import io.opentracing.tag.Tags; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.apache.camel.opentracing.SpanDecorator; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class AbstractHttpSpanDecoratorTest { - - private static final String TEST_URI = "http://localhost:8080/test"; - - @Test - public void testGetOperationName() { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(Exchange.HTTP_METHOD)).thenReturn("PUT"); - - AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - assertEquals("PUT", decorator.getOperationName(exchange, null)); - } - - @Test - public void testGetMethodFromMethodHeader() { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(Exchange.HTTP_METHOD)).thenReturn("PUT"); - - assertEquals("PUT", AbstractHttpSpanDecorator.getHttpMethod(exchange, null)); - } - - @Test - public void testGetMethodQueryStringHeader() { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(Exchange.HTTP_QUERY)).thenReturn("MyQuery"); - - assertEquals(AbstractHttpSpanDecorator.GET_METHOD, - AbstractHttpSpanDecorator.getHttpMethod(exchange, null)); - } - - @Test - public void testGetMethodQueryStringInEndpoint() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("http://localhost:8080/endpoint?query=hello"); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn("http://localhost:8080/endpoint?query=hello"); - - assertEquals(AbstractHttpSpanDecorator.GET_METHOD, - AbstractHttpSpanDecorator.getHttpMethod(exchange, endpoint)); - } - - @Test - public void testGetMethodBodyNotNull() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI); - Mockito.when(message.getBody()).thenReturn("Message Body"); - - assertEquals(AbstractHttpSpanDecorator.POST_METHOD, - AbstractHttpSpanDecorator.getHttpMethod(exchange, endpoint)); - } - - @Test - public void testGetMethodDefault() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI); - - assertEquals(AbstractHttpSpanDecorator.GET_METHOD, - AbstractHttpSpanDecorator.getHttpMethod(exchange, endpoint)); - } - - @Test - public void testPreUri() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI); - - SpanDecorator decorator = new AbstractHttpSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, exchange, endpoint); - - assertEquals(TEST_URI, span.tags().get(Tags.HTTP_URL.getKey())); - assertTrue(span.tags().containsKey(Tags.HTTP_METHOD.getKey())); - } - - @Test - public void testGetHttpURLFromHeaderUrl() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn("Another URL"); - Mockito.when(message.getHeader(Exchange.HTTP_URL)).thenReturn(TEST_URI); - - AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint)); - } - - @Test - public void testGetHttpURLFromHeaderUri() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI); - - AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint)); - } - - @Test - public void testGetHttpURLFromEndpointUri() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); - Mockito.when(exchange.getIn()).thenReturn(message); - - AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint)); - } - - @Test - public void testGetHttpURLFromEndpointUriWithAdditionalScheme() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("netty-http:" + TEST_URI); - Mockito.when(exchange.getIn()).thenReturn(message); - - AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint)); - } - - @Test - public void testPostResponseCode() { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(exchange.getMessage()).thenReturn(message); - Mockito.when(message.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class)).thenReturn(200); - - SpanDecorator decorator = new AbstractHttpSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.post(span, exchange, null); - - assertEquals(200, span.tags().get(Tags.HTTP_STATUS.getKey())); - } - -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractMessagingSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractMessagingSpanDecoratorTest.java deleted file mode 100644 index de1fb93cdedcf..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractMessagingSpanDecoratorTest.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import io.opentracing.mock.MockSpan; -import io.opentracing.mock.MockTracer; -import io.opentracing.tag.Tags; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.opentracing.SpanDecorator; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class AbstractMessagingSpanDecoratorTest { - - @Test - public void testOperationName() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("jms://MyQueue?hello=world"); - - SpanDecorator decorator = new AbstractMessagingSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - assertEquals("MyQueue", decorator.getOperationName(null, endpoint)); - } - - @Test - public void testPreMessageBusDestination() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("jms://MyQueue?hello=world"); - - SpanDecorator decorator = new AbstractMessagingSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, null, endpoint); - - assertEquals("MyQueue", span.tags().get(Tags.MESSAGE_BUS_DESTINATION.getKey())); - } - - @Test - public void testPreMessageId() { - String messageId = "abcd"; - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("test"); - - SpanDecorator decorator = new AbstractMessagingSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - - @Override - public String getMessageId(Exchange exchange) { - return messageId; - } - }; - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, exchange, endpoint); - - assertEquals(messageId, span.tags().get(AbstractMessagingSpanDecorator.MESSAGE_BUS_ID)); - } - -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractSpanDecoratorTest.java deleted file mode 100644 index 222668d25d2b6..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractSpanDecoratorTest.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import io.opentracing.mock.MockSpan; -import io.opentracing.mock.MockTracer; -import io.opentracing.tag.Tags; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.opentracing.SpanDecorator; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class AbstractSpanDecoratorTest { - - private static final String TEST_URI = "test:/uri"; - - @Test - public void testGetOperationName() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); - - SpanDecorator decorator = new AbstractSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - // Operation name is scheme, as no specific span decorator to - // identify an appropriate name - assertEquals("test", decorator.getOperationName(null, endpoint)); - } - - @Test - public void testPre() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); - - SpanDecorator decorator = new AbstractSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, null, endpoint); - - assertEquals("camel-test", span.tags().get(Tags.COMPONENT.getKey())); - } - - @Test - public void testPostExchangeFailed() { - Exchange exchange = Mockito.mock(Exchange.class); - - Mockito.when(exchange.isFailed()).thenReturn(true); - - Exception e = new Exception("Test Message"); - Mockito.when(exchange.getException()).thenReturn(e); - - SpanDecorator decorator = new AbstractSpanDecorator() { - @Override - public String getComponent() { - return null; - } - - @Override - public String getComponentClassName() { - return null; - } - }; - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.post(span, exchange, null); - - assertEquals(true, span.tags().get(Tags.ERROR.getKey())); - assertEquals(1, span.logEntries().size()); - assertEquals("error", span.logEntries().get(0).fields().get("event")); - assertEquals("Exception", span.logEntries().get(0).fields().get("error.kind")); - assertEquals(e.getMessage(), span.logEntries().get(0).fields().get("message")); - } - - @Test - public void testStripSchemeNoOptions() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("direct:hello"); - - assertEquals("hello", AbstractSpanDecorator.stripSchemeAndOptions(endpoint)); - } - - @Test - public void testStripSchemeNoOptionsWithSlashes() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("direct://hello"); - - assertEquals("hello", AbstractSpanDecorator.stripSchemeAndOptions(endpoint)); - } - - @Test - public void testStripSchemeAndOptions() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("direct:hello?world=true"); - - assertEquals("hello", AbstractSpanDecorator.stripSchemeAndOptions(endpoint)); - } - -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSnsSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSnsSpanDecoratorTest.java deleted file mode 100644 index 7906befce6a57..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSnsSpanDecoratorTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class AwsSnsSpanDecoratorTest { - - @Test - public void testGetMessageId() { - String messageId = "abcd"; - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(AwsSnsSpanDecorator.CAMEL_AWS_SNS_MESSAGE_ID)).thenReturn(messageId); - - AwsSnsSpanDecorator decorator = new AwsSnsSpanDecorator(); - - assertEquals(messageId, decorator.getMessageId(exchange)); - } - -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CqlSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CqlSpanDecoratorTest.java deleted file mode 100644 index cb83bfdb53b90..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CqlSpanDecoratorTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import io.opentracing.mock.MockSpan; -import io.opentracing.mock.MockTracer; -import io.opentracing.tag.Tags; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.apache.camel.opentracing.SpanDecorator; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; - -public class CqlSpanDecoratorTest { - - @Test - public void testPreCqlFromUri() { - String cql = "select%20*%20from%20users"; - String keyspace = "test"; - - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("cql://host1,host2:8080/" + keyspace + "?cql=" - + cql + "&consistencyLevel=quorum"); - Mockito.when(exchange.getIn()).thenReturn(message); - - SpanDecorator decorator = new CqlSpanDecorator(); - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, exchange, endpoint); - - assertEquals(CqlSpanDecorator.CASSANDRA_DB_TYPE, span.tags().get(Tags.DB_TYPE.getKey())); - assertEquals(cql, span.tags().get(Tags.DB_STATEMENT.getKey())); - assertEquals(keyspace, span.tags().get(Tags.DB_INSTANCE.getKey())); - } - - @Test - public void testPreCqlFromHeader() { - String cql = "select * from users"; - - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("cql://host1,host2?consistencyLevel=quorum"); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(CqlSpanDecorator.CAMEL_CQL_QUERY)).thenReturn(cql); - - SpanDecorator decorator = new CqlSpanDecorator(); - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, exchange, endpoint); - - assertEquals(CqlSpanDecorator.CASSANDRA_DB_TYPE, span.tags().get(Tags.DB_TYPE.getKey())); - assertEquals(cql, span.tags().get(Tags.DB_STATEMENT.getKey())); - assertNull(span.tags().get(Tags.DB_INSTANCE.getKey())); - } - -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/ElasticsearchSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/ElasticsearchSpanDecoratorTest.java deleted file mode 100644 index 13f2b6b60fe04..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/ElasticsearchSpanDecoratorTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import io.opentracing.mock.MockSpan; -import io.opentracing.mock.MockTracer; -import io.opentracing.tag.Tags; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.apache.camel.opentracing.SpanDecorator; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class ElasticsearchSpanDecoratorTest { - - @Test - public void testOperationName() { - String opName = "INDEX"; - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("elasticsearch://local?operation=" - + opName + "&indexName=twitter&indexType=tweet"); - - SpanDecorator decorator = new ElasticsearchSpanDecorator(); - - assertEquals(opName, decorator.getOperationName(null, endpoint)); - } - - @Test - public void testPre() { - String indexName = "twitter"; - String cluster = "local"; - - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("elasticsearch://" + cluster - + "?operation=INDEX&indexName=" + indexName + "&indexType=tweet"); - Mockito.when(exchange.getIn()).thenReturn(message); - - SpanDecorator decorator = new ElasticsearchSpanDecorator(); - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, exchange, endpoint); - - assertEquals(ElasticsearchSpanDecorator.ELASTICSEARCH_DB_TYPE, span.tags().get(Tags.DB_TYPE.getKey())); - assertEquals(indexName, span.tags().get(Tags.DB_INSTANCE.getKey())); - assertEquals(cluster, span.tags().get(ElasticsearchSpanDecorator.ELASTICSEARCH_CLUSTER_TAG)); - } - -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JdbcSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JdbcSpanDecoratorTest.java deleted file mode 100644 index a860fe429e5fc..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JdbcSpanDecoratorTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import io.opentracing.mock.MockSpan; -import io.opentracing.mock.MockTracer; -import io.opentracing.tag.Tags; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.apache.camel.opentracing.SpanDecorator; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class JdbcSpanDecoratorTest { - - private static final String SQL_STATEMENT = "select * from customer"; - - @Test - public void testPre() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("test"); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getBody()).thenReturn(SQL_STATEMENT); - - SpanDecorator decorator = new JdbcSpanDecorator(); - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, exchange, endpoint); - - assertEquals("sql", span.tags().get(Tags.DB_TYPE.getKey())); - assertEquals(SQL_STATEMENT, span.tags().get(Tags.DB_STATEMENT.getKey())); - } - -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/KafkaSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/KafkaSpanDecoratorTest.java deleted file mode 100644 index 870a39dd5f8b0..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/KafkaSpanDecoratorTest.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import io.opentracing.mock.MockSpan; -import io.opentracing.mock.MockTracer; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.apache.camel.opentracing.SpanDecorator; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class KafkaSpanDecoratorTest { - - @Test - public void testGetDestinationHeaderTopic() { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(KafkaSpanDecorator.TOPIC)).thenReturn("test"); - - KafkaSpanDecorator decorator = new KafkaSpanDecorator(); - - assertEquals("test", decorator.getDestination(exchange, null)); - } - - @Test - public void testGetDestinationNoHeaderTopic() { - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(endpoint.getEndpointUri()) - .thenReturn("kafka:localhost:9092?topic=test&groupId=testing&consumersCount=1"); - - KafkaSpanDecorator decorator = new KafkaSpanDecorator(); - - assertEquals("test", decorator.getDestination(exchange, endpoint)); - } - - @Test - public void testPreOffsetAndPartitionAsStringHeader() { - String testKey = "TestKey"; - String testOffset = "TestOffset"; - String testPartition = "TestPartition"; - String testPartitionKey = "TestPartitionKey"; - - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("test"); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(KafkaSpanDecorator.KEY)).thenReturn(testKey); - Mockito.when(message.getHeader(KafkaSpanDecorator.OFFSET, String.class)).thenReturn(testOffset); - Mockito.when(message.getHeader(KafkaSpanDecorator.PARTITION, String.class)).thenReturn(testPartition); - Mockito.when(message.getHeader(KafkaSpanDecorator.PARTITION_KEY)).thenReturn(testPartitionKey); - - SpanDecorator decorator = new KafkaSpanDecorator(); - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, exchange, endpoint); - - assertEquals(testKey, span.tags().get(KafkaSpanDecorator.KAFKA_KEY_TAG)); - assertEquals(testOffset, span.tags().get(KafkaSpanDecorator.KAFKA_OFFSET_TAG)); - assertEquals(testPartition, span.tags().get(KafkaSpanDecorator.KAFKA_PARTITION_TAG)); - assertEquals(testPartitionKey, span.tags().get(KafkaSpanDecorator.KAFKA_PARTITION_KEY_TAG)); - } - - @Test - public void testPrePartitionAsIntegerHeaderAndOffsetAsLongHeader() { - Long testOffset = 4875454L; - Integer testPartition = 0; - - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("test"); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(KafkaSpanDecorator.OFFSET, Long.class)).thenReturn(testOffset); - Mockito.when(message.getHeader(KafkaSpanDecorator.PARTITION, Integer.class)).thenReturn(testPartition); - - SpanDecorator decorator = new KafkaSpanDecorator(); - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, exchange, endpoint); - - assertEquals(String.valueOf(testOffset), span.tags().get(KafkaSpanDecorator.KAFKA_OFFSET_TAG)); - assertEquals(String.valueOf(testPartition), span.tags().get(KafkaSpanDecorator.KAFKA_PARTITION_TAG)); - } - -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecoratorTest.java deleted file mode 100644 index 2041857a35f3b..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecoratorTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import java.util.Map; - -import io.opentracing.mock.MockSpan; -import io.opentracing.mock.MockTracer; -import io.opentracing.tag.Tags; -import org.apache.camel.Endpoint; -import org.apache.camel.opentracing.SpanDecorator; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class MongoDBSpanDecoratorTest { - - private static final String MONGODB_STATEMENT = - "mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery"; - - @Test - public void testGetOperationName() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn(MONGODB_STATEMENT); - - SpanDecorator decorator = new MongoDBSpanDecorator(); - - assertEquals("findOneByQuery", decorator.getOperationName(null, endpoint)); - } - - @Test - public void testToQueryParameters() { - Map params = AbstractSpanDecorator.toQueryParameters(MONGODB_STATEMENT); - assertEquals(3, params.size()); - assertEquals("flights", params.get("database")); - assertEquals("tickets", params.get("collection")); - assertEquals("findOneByQuery", params.get("operation")); - } - - @Test - public void testPre() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn(MONGODB_STATEMENT); - - SpanDecorator decorator = new MongoDBSpanDecorator(); - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, null, endpoint); - - assertEquals("mongodb", span.tags().get(Tags.DB_TYPE.getKey())); - assertEquals("flights", span.tags().get(Tags.DB_INSTANCE.getKey())); - assertTrue(span.tags().containsKey(Tags.DB_STATEMENT.getKey())); - } - -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/RestSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/RestSpanDecoratorTest.java deleted file mode 100644 index 377e1064eccd5..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/RestSpanDecoratorTest.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import java.util.Arrays; - -import io.opentracing.mock.MockSpan; -import io.opentracing.mock.MockTracer; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.apache.camel.opentracing.SpanDecorator; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class RestSpanDecoratorTest { - - @Test - public void testGetOperation() { - String path = "/persons/{personId}"; - String uri = "rest://put:/persons:/%7BpersonId%7D?routeId=route4"; - - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn(uri); - Mockito.when(exchange.getFromEndpoint()).thenReturn(endpoint); - - SpanDecorator decorator = new RestSpanDecorator(); - - assertEquals(path, decorator.getOperationName(exchange, endpoint)); - } - - @Test - public void testGetParameters() { - assertEquals(Arrays.asList("id1", "id2"), RestSpanDecorator.getParameters("/context/{id1}/{id2}")); - } - - @Test - public void testGetParametersNone() { - assertTrue(RestSpanDecorator.getParameters("rest://put:/persons/hello/world?routeId=route4").isEmpty()); - } - - @Test - public void testPreStringParameter() { - testParameter("strParam", "strValue"); - } - - @Test - public void testPreNumberParameter() { - testParameter("numParam", 5.6); - } - - @Test - public void testPreBooleanParameter() { - testParameter("boolParam", Boolean.TRUE); - } - - protected void testParameter(String paramName, Object paramValue) { - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("rest://put:/context:/%7B" + paramName + "%7D?routeId=route4"); - Mockito.when(exchange.getFromEndpoint()).thenReturn(endpoint); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(paramName)).thenReturn(paramValue); - - SpanDecorator decorator = new RestSpanDecorator(); - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, exchange, endpoint); - - assertEquals(paramValue, span.tags().get(paramName)); - } - - @Test - public void testGetPath() { - assertEquals("/persons/{personId}", RestSpanDecorator.getPath("rest://put:/persons:/%7BpersonId%7D?routeId=route4")); - } -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/SqlSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/SqlSpanDecoratorTest.java deleted file mode 100644 index f695dfda32dfd..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/SqlSpanDecoratorTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import io.opentracing.mock.MockSpan; -import io.opentracing.mock.MockTracer; -import io.opentracing.tag.Tags; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.apache.camel.opentracing.SpanDecorator; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class SqlSpanDecoratorTest { - - private static final String SQL_STATEMENT = "select * from customer"; - - @Test - public void testPre() { - Endpoint endpoint = Mockito.mock(Endpoint.class); - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(endpoint.getEndpointUri()).thenReturn("test"); - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(SqlSpanDecorator.CAMEL_SQL_QUERY)).thenReturn(SQL_STATEMENT); - - SpanDecorator decorator = new SqlSpanDecorator(); - - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); - - decorator.pre(span, exchange, endpoint); - - assertEquals("sql", span.tags().get(Tags.DB_TYPE.getKey())); - assertEquals(SQL_STATEMENT, span.tags().get(Tags.DB_STATEMENT.getKey())); - } - -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/TimerSpanDecoratorTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/TimerSpanDecoratorTest.java deleted file mode 100644 index ecfb8ccd44aa1..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/TimerSpanDecoratorTest.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.decorators; - -import org.apache.camel.Exchange; -import org.apache.camel.opentracing.SpanDecorator; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class TimerSpanDecoratorTest { - - private static final String TEST_NAME = "TestName"; - - @Test - public void testGetOperationName() { - Exchange exchange = Mockito.mock(Exchange.class); - - Mockito.when(exchange.getProperty(Exchange.TIMER_NAME)).thenReturn(TEST_NAME); - - SpanDecorator decorator = new TimerSpanDecorator() { - @Override - public String getComponent() { - return null; - } - }; - - assertEquals(TEST_NAME, decorator.getOperationName(exchange, null)); - } - -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersExtractAdapterTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersExtractAdapterTest.java deleted file mode 100644 index 980a5463c8e38..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersExtractAdapterTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.propagation; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.apache.camel.opentracing.propagation.CamelMessagingHeadersInjectAdapter.JMS_DASH; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; - -public class CamelMessagingHeadersExtractAdapterTest { - - private Map map; - - @BeforeEach - public void before() { - map = new HashMap<>(); - } - - @Test - public void noProperties() { - CamelMessagingHeadersExtractAdapter adapter = new CamelMessagingHeadersExtractAdapter(map, true); - Iterator> iterator = adapter.iterator(); - assertFalse(iterator.hasNext()); - } - - @Test - public void oneProperty() { - map.put("key", "value"); - CamelMessagingHeadersExtractAdapter adapter = new CamelMessagingHeadersExtractAdapter(map, true); - Iterator> iterator = adapter.iterator(); - Map.Entry entry = iterator.next(); - assertEquals("key", entry.getKey()); - assertEquals("value", entry.getValue()); - } - - @Test - public void propertyWithDash() { - map.put(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH, "value1"); - CamelMessagingHeadersExtractAdapter adapter = new CamelMessagingHeadersExtractAdapter(map, true); - Iterator> iterator = adapter.iterator(); - Map.Entry entry = iterator.next(); - assertEquals("-key-1-", entry.getKey()); - assertEquals("value1", entry.getValue()); - } - - @Test - public void propertyWithoutDashEncoding() { - map.put(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH, "value1"); - CamelMessagingHeadersExtractAdapter adapter = new CamelMessagingHeadersExtractAdapter(map, false); - Iterator> iterator = adapter.iterator(); - Map.Entry entry = iterator.next(); - assertEquals(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH, entry.getKey()); - } -} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersInjectAdapterTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersInjectAdapterTest.java deleted file mode 100644 index 5b8326d6d0a6f..0000000000000 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersInjectAdapterTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.opentracing.propagation; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.apache.camel.opentracing.propagation.CamelMessagingHeadersInjectAdapter.JMS_DASH; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -public class CamelMessagingHeadersInjectAdapterTest { - - private Map map; - - @BeforeEach - public void before() { - map = new HashMap<>(); - } - - @Test - public void cannotGetIterator() { - CamelMessagingHeadersInjectAdapter adapter = new CamelMessagingHeadersInjectAdapter(map, true); - assertThrows(UnsupportedOperationException.class, - () -> adapter.iterator()); - } - - @Test - public void putProperties() { - CamelMessagingHeadersInjectAdapter adapter = new CamelMessagingHeadersInjectAdapter(map, true); - adapter.put("key1", "value1"); - adapter.put("key2", "value2"); - adapter.put("key1", "value3"); - assertEquals("value3", map.get("key1")); - assertEquals("value2", map.get("key2")); - } - - @Test - public void propertyWithDash() { - CamelMessagingHeadersInjectAdapter adapter = new CamelMessagingHeadersInjectAdapter(map, true); - adapter.put("-key-1-", "value1"); - assertEquals("value1", map.get(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH)); - } - - @Test - public void propertyWithoutDashEncoding() { - CamelMessagingHeadersInjectAdapter adapter = new CamelMessagingHeadersInjectAdapter(map, false); - adapter.put("-key-1-", "value1"); - assertEquals(null, map.get(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH)); - } -} diff --git a/components/camel-opentracing/src/test/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator b/components/camel-opentracing/src/test/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator similarity index 100% rename from components/camel-opentracing/src/test/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator rename to components/camel-opentracing/src/test/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator diff --git a/components/camel-tracing/pom.xml b/components/camel-tracing/pom.xml new file mode 100644 index 0000000000000..0ac10092589e2 --- /dev/null +++ b/components/camel-tracing/pom.xml @@ -0,0 +1,45 @@ + + + + + 4.0.0 + + + org.apache.camel + components + 3.5.0-SNAPSHOT + + + + 2.9.0 + + + camel-tracing + jar + Camel :: Common Tracing + Distributed tracing common interfaces + + + org.apache.camel + camel-support + + + \ No newline at end of file diff --git a/components/camel-tracing/src/generated/resources/META-INF/services/org/apache/camel/other.properties b/components/camel-tracing/src/generated/resources/META-INF/services/org/apache/camel/other.properties new file mode 100644 index 0000000000000..73dc7931747fb --- /dev/null +++ b/components/camel-tracing/src/generated/resources/META-INF/services/org/apache/camel/other.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +name=tracing +groupId=org.apache.camel +artifactId=camel-tracing +version=3.5.0-SNAPSHOT +projectName=Camel :: Common Tracing +projectDescription=Distributed tracing common interfaces diff --git a/components/camel-tracing/src/generated/resources/tracing.json b/components/camel-tracing/src/generated/resources/tracing.json new file mode 100644 index 0000000000000..27d17605f8030 --- /dev/null +++ b/components/camel-tracing/src/generated/resources/tracing.json @@ -0,0 +1,14 @@ +{ + "other": { + "kind": "other", + "name": "tracing", + "title": "Tracing", + "description": "Distributed tracing common interfaces", + "deprecated": false, + "firstVersion": "2.9.0", + "supportLevel": "Stable", + "groupId": "org.apache.camel", + "artifactId": "camel-tracing", + "version": "3.5.0-SNAPSHOT" + } +} diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/IronmqSpanDecoratorTest.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersExtractAdapter.java similarity index 50% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/IronmqSpanDecoratorTest.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersExtractAdapter.java index 0b385a3b03fe8..db954468107f5 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/IronmqSpanDecoratorTest.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersExtractAdapter.java @@ -14,29 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing; -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class IronmqSpanDecoratorTest { - - @Test - public void testGetMessageId() { - String messageId = "abcd"; - Exchange exchange = Mockito.mock(Exchange.class); - Message message = Mockito.mock(Message.class); - - Mockito.when(exchange.getIn()).thenReturn(message); - Mockito.when(message.getHeader(IronmqSpanDecorator.CAMEL_IRON_MQ_MESSAGE_ID)).thenReturn(messageId); - - IronmqSpanDecorator decorator = new IronmqSpanDecorator(); - - assertEquals(messageId, decorator.getMessageId(exchange)); - } +import java.util.Iterator; +import java.util.Map; +/** + * @author rvargasp + */ +public interface HeadersExtractAdapter { + Iterator> iterator(); + Object get(String key); } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersInjectAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersInjectAdapter.java new file mode 100644 index 0000000000000..ad7dea2a5e092 --- /dev/null +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersInjectAdapter.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing; + +/** + * @author rvargasp + */ +public interface HeadersInjectAdapter { + void put(String key, String value); +} diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/SpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanDecorator.java similarity index 82% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/SpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanDecorator.java index 57bf0acdf4925..18220c83a350e 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/SpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanDecorator.java @@ -14,15 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing; +package org.apache.camel.tracing; import java.util.Map; -import io.opentracing.Span; -import io.opentracing.propagation.TextMap; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.opentracing.decorators.AbstractSpanDecorator; +import org.apache.camel.tracing.decorators.AbstractSpanDecorator; /** * This interface represents a decorator specific to the component/endpoint @@ -83,21 +81,21 @@ public String getComponentClassName() { * This method adds appropriate details (tags/logs) to the supplied span * based on the pre processing of the exchange. * - * @param span The span + * @param span The span * @param exchange The exchange * @param endpoint The endpoint */ - void pre(Span span, Exchange exchange, Endpoint endpoint); + void pre(SpanWrap span, Exchange exchange, Endpoint endpoint); /** * This method adds appropriate details (tags/logs) to the supplied span * based on the post processing of the exchange. * - * @param span The span + * @param span The span * @param exchange The exchange * @param endpoint The endpoint */ - void post(Span span, Exchange exchange, Endpoint endpoint); + void post(SpanWrap span, Exchange exchange, Endpoint endpoint); /** * This method returns the 'span.kind' value for use when the component @@ -105,7 +103,7 @@ public String getComponentClassName() { * * @return The kind */ - String getInitiatorSpanKind(); + SpanKind getInitiatorSpanKind(); /** * This method returns the 'span.kind' value for use when the component @@ -113,26 +111,26 @@ public String getComponentClassName() { * * @return The kind */ - String getReceiverSpanKind(); + SpanKind getReceiverSpanKind(); /** * This method returns the map to be used for headers extraction * when the component is receiving a communication. * - * @param map a map containing the objects + * @param map a map containing the objects * @param encoding whether the headers are encoded * @return The extraction map */ - TextMap getExtractAdapter(Map map, boolean encoding); + HeadersExtractAdapter getExtractAdapter(Map map, boolean encoding); /** * This method returns the map to be used for headers injection - * when the component is receiving a communication. + * when the component is receiving a communication. * - * @param map a map containing the objects + * @param map a map containing the objects * @param encoding whether the headers are encoded * @return The injection map */ - TextMap getInjectAdapter(Map map, boolean encoding); + HeadersInjectAdapter getInjectAdapter(Map map, boolean encoding); } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanKind.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanKind.java new file mode 100644 index 0000000000000..025873207849c --- /dev/null +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanKind.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing; + +/** + * @author rvargasp + */ +public enum SpanKind { + SPAN_KIND_CLIENT, + SPAN_KIND_SERVER, + CONSUMER, + PRODUCER, +} diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanWrap.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanWrap.java new file mode 100644 index 0000000000000..107b07c41f17d --- /dev/null +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanWrap.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing; + +import java.util.Map; + +/** + * @author rvargasp + */ +public interface SpanWrap { + void setComponent(String component); + void setHttpStatus(Integer status); + void setHttpMethod(String method); + void setHttpURL(String url); + void setMessageBusDestination(String dest); + void setError(boolean error); + void setDBType(String type); + void setDBInstance(String type); + void setDBStatement(String type); + void setTag(String key, String value); + void setTag(String key, Number value); + void setTag(String key, Boolean value); + void log(Map log); +} diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecorator.java similarity index 87% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecorator.java index 617223a8795c9..84fa8a694aaef 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecorator.java @@ -14,13 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; -import io.opentracing.Span; -import io.opentracing.tag.Tags; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.Message; +import org.apache.camel.tracing.SpanWrap; public abstract class AbstractHttpSpanDecorator extends AbstractSpanDecorator { @@ -60,15 +59,14 @@ public static String getHttpMethod(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(Span span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); String httpUrl = getHttpURL(exchange, endpoint); if (httpUrl != null) { - span.setTag(Tags.HTTP_URL.getKey(), httpUrl); + span.setHttpURL(httpUrl); } - - span.setTag(Tags.HTTP_METHOD.getKey(), getHttpMethod(exchange, endpoint)); + span.setHttpMethod(getHttpMethod(exchange, endpoint)); } protected String getHttpURL(Exchange exchange, Endpoint endpoint) { @@ -91,14 +89,14 @@ protected String getHttpURL(Exchange exchange, Endpoint endpoint) { } @Override - public void post(Span span, Exchange exchange, Endpoint endpoint) { + public void post(SpanWrap span, Exchange exchange, Endpoint endpoint) { super.post(span, exchange, endpoint); Message message = exchange.getMessage(); if (message != null) { Integer responseCode = message.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class); if (responseCode != null) { - span.setTag(Tags.HTTP_STATUS.getKey(), responseCode); + span.setHttpStatus(responseCode); } } } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractInternalSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractInternalSpanDecorator.java similarity index 96% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractInternalSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractInternalSpanDecorator.java index 1d9e329fc78b1..a0c08a91b523a 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractInternalSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractInternalSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractMessagingSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecorator.java similarity index 69% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractMessagingSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecorator.java index e3b5ac3a136a0..cd3ac473531c6 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractMessagingSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecorator.java @@ -14,17 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import java.util.Map; -import io.opentracing.Span; -import io.opentracing.propagation.TextMap; -import io.opentracing.tag.Tags; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.opentracing.propagation.CamelMessagingHeadersExtractAdapter; -import org.apache.camel.opentracing.propagation.CamelMessagingHeadersInjectAdapter; +import org.apache.camel.tracing.HeadersExtractAdapter; +import org.apache.camel.tracing.HeadersInjectAdapter; +import org.apache.camel.tracing.SpanKind; +import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.propagation.CamelMessagingHeadersExtractAdapter; +import org.apache.camel.tracing.propagation.CamelMessagingHeadersInjectAdapter; public abstract class AbstractMessagingSpanDecorator extends AbstractSpanDecorator { @@ -37,10 +38,10 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(Span span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - - span.setTag(Tags.MESSAGE_BUS_DESTINATION.getKey(), getDestination(exchange, endpoint)); + span.setMessageBusDestination(getDestination(exchange, endpoint)); + //span.setTag(Tags.MESSAGE_BUS_DESTINATION.getKey(), getDestination(exchange, endpoint)); String messageId = getMessageId(exchange); if (messageId != null) { @@ -61,13 +62,13 @@ protected String getDestination(Exchange exchange, Endpoint endpoint) { } @Override - public String getInitiatorSpanKind() { - return "producer"; + public SpanKind getInitiatorSpanKind() { + return SpanKind.PRODUCER; } @Override - public String getReceiverSpanKind() { - return "consumer"; + public SpanKind getReceiverSpanKind() { + return SpanKind.CONSUMER; } /** @@ -80,12 +81,12 @@ protected String getMessageId(Exchange exchange) { } @Override - public TextMap getExtractAdapter(final Map map, final boolean jmsEncoding) { + public HeadersExtractAdapter getExtractAdapter(final Map map, final boolean jmsEncoding) { return new CamelMessagingHeadersExtractAdapter(map, jmsEncoding); } @Override - public TextMap getInjectAdapter(final Map map, final boolean jmsEncoding) { + public HeadersInjectAdapter getInjectAdapter(final Map map, final boolean jmsEncoding) { return new CamelMessagingHeadersInjectAdapter(map, jmsEncoding); } } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractSpanDecorator.java similarity index 80% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractSpanDecorator.java index 1f392d9c07bde..d54b70456fd65 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractSpanDecorator.java @@ -14,20 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import io.opentracing.Span; -import io.opentracing.propagation.TextMap; -import io.opentracing.tag.Tags; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.opentracing.SpanDecorator; -import org.apache.camel.opentracing.propagation.CamelHeadersExtractAdapter; -import org.apache.camel.opentracing.propagation.CamelHeadersInjectAdapter; +import org.apache.camel.tracing.HeadersExtractAdapter; +import org.apache.camel.tracing.HeadersInjectAdapter; +import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.SpanKind; +import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.propagation.CamelHeadersExtractAdapter; +import org.apache.camel.tracing.propagation.CamelHeadersInjectAdapter; import org.apache.camel.util.StringHelper; import org.apache.camel.util.URISupport; @@ -36,21 +37,6 @@ */ public abstract class AbstractSpanDecorator implements SpanDecorator { - @Override - public boolean newSpan() { - return true; - } - - @Override - public String getOperationName(Exchange exchange, Endpoint endpoint) { - // OpenTracing aims to use low cardinality operation names. Ideally a - // specific - // span decorator should be defined for all relevant Camel components - // that - // identify a meaningful operation name - return getComponentName(endpoint); - } - /** * This method removes the scheme, any leading slash characters and options * from the supplied URI. This is intended to extract a meaningful name from @@ -70,10 +56,50 @@ public static String stripSchemeAndOptions(Endpoint endpoint) { return end == -1 ? endpoint.getEndpointUri().substring(start) : endpoint.getEndpointUri().substring(start, end); } + public static Map toQueryParameters(String uri) { + int index = uri.indexOf('?'); + if (index != -1) { + String queryString = uri.substring(index + 1); + Map map = new HashMap<>(); + for (String param : queryString.split("&")) { + String[] parts = param.split("="); + if (parts.length == 2) { + map.put(parts[0], parts[1]); + } + } + return map; + } + return Collections.emptyMap(); + } + + private static String getComponentName(Endpoint endpoint) { + String[] splitURI = StringHelper.splitOnCharacter(endpoint.getEndpointUri(), ":", 2); + if (splitURI.length > 0) { + return splitURI[0]; + } else { + return null; + } + } + @Override - public void pre(Span span, Exchange exchange, Endpoint endpoint) { + public boolean newSpan() { + return true; + } + + @Override + public String getOperationName(Exchange exchange, Endpoint endpoint) { + // OpenTracing aims to use low cardinality operation names. Ideally a + // specific + // span decorator should be defined for all relevant Camel components + // that + // identify a meaningful operation name + return getComponentName(endpoint); + } + + @Override + public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { String scheme = getComponentName(endpoint); - span.setTag(Tags.COMPONENT.getKey(), CAMEL_COMPONENT + scheme); + span.setComponent(CAMEL_COMPONENT + scheme); // Including the endpoint URI provides access to any options that may // have been provided, for @@ -82,9 +108,9 @@ public void pre(Span span, Exchange exchange, Endpoint endpoint) { } @Override - public void post(Span span, Exchange exchange, Endpoint endpoint) { + public void post(SpanWrap span, Exchange exchange, Endpoint endpoint) { if (exchange.isFailed()) { - span.setTag(Tags.ERROR.getKey(), true); + span.setError(true); if (exchange.getException() != null) { Map logEvent = new HashMap<>(); logEvent.put("event", "error"); @@ -96,48 +122,23 @@ public void post(Span span, Exchange exchange, Endpoint endpoint) { } @Override - public String getInitiatorSpanKind() { - return Tags.SPAN_KIND_CLIENT; + public SpanKind getInitiatorSpanKind() { + return SpanKind.SPAN_KIND_CLIENT; } @Override - public String getReceiverSpanKind() { - return Tags.SPAN_KIND_SERVER; - } - - public static Map toQueryParameters(String uri) { - int index = uri.indexOf('?'); - if (index != -1) { - String queryString = uri.substring(index + 1); - Map map = new HashMap<>(); - for (String param : queryString.split("&")) { - String[] parts = param.split("="); - if (parts.length == 2) { - map.put(parts[0], parts[1]); - } - } - return map; - } - return Collections.emptyMap(); - } - - private static String getComponentName(Endpoint endpoint) { - String[] splitURI = StringHelper.splitOnCharacter(endpoint.getEndpointUri(), ":", 2); - if (splitURI.length > 0) { - return splitURI[0]; - } else { - return null; - } + public SpanKind getReceiverSpanKind() { + return SpanKind.SPAN_KIND_SERVER; } @Override - public TextMap getExtractAdapter(final Map map, boolean encoding) { + public HeadersExtractAdapter getExtractAdapter(final Map map, boolean encoding) { // no encoding supported per default return new CamelHeadersExtractAdapter(map); } @Override - public TextMap getInjectAdapter(final Map map, boolean encoding) { + public HeadersInjectAdapter getInjectAdapter(final Map map, boolean encoding) { // no encoding supported per default return new CamelHeadersInjectAdapter(map); } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AhcSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AhcSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AhcSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AhcSpanDecorator.java index e2a8358123ae7..897b8e1a2441f 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AhcSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AhcSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class AhcSpanDecorator extends AbstractHttpSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AmqpSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AmqpSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AmqpSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AmqpSpanDecorator.java index b0b0c03bcd8a0..1b8bd0f6886bc 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AmqpSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AmqpSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class AmqpSpanDecorator extends AbstractMessagingSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AwsSnsSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AwsSnsSpanDecorator.java similarity index 96% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AwsSnsSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AwsSnsSpanDecorator.java index 0190e97a957ff..b446a132fef6f 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AwsSnsSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AwsSnsSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import org.apache.camel.Exchange; diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AwsSqsSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AwsSqsSpanDecorator.java similarity index 96% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AwsSqsSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AwsSqsSpanDecorator.java index 64a7e04b90a9e..a0efd0c4d3754 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AwsSqsSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AwsSqsSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import org.apache.camel.Exchange; diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/CometdSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CometdSpanDecorator.java similarity index 96% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/CometdSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CometdSpanDecorator.java index 3021bca85e743..7521c804a72b6 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/CometdSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CometdSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import java.net.URI; diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/CometdsSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CometdsSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/CometdsSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CometdsSpanDecorator.java index ac8a83f190037..6432dbfdc8d81 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/CometdsSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CometdsSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class CometdsSpanDecorator extends CometdSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/CqlSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CqlSpanDecorator.java similarity index 79% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/CqlSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CqlSpanDecorator.java index ad4f279fd801b..6e6c80662e756 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/CqlSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CqlSpanDecorator.java @@ -14,15 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import java.net.URI; import java.util.Map; -import io.opentracing.Span; -import io.opentracing.tag.Tags; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.tracing.SpanWrap; public class CqlSpanDecorator extends AbstractSpanDecorator { @@ -41,24 +40,24 @@ public String getComponentClassName() { } @Override - public void pre(Span span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - - span.setTag(Tags.DB_TYPE.getKey(), CASSANDRA_DB_TYPE); + span.setDBType(CASSANDRA_DB_TYPE); + //span.setTag(Tags.DB_TYPE.getKey(), CASSANDRA_DB_TYPE); URI uri = URI.create(endpoint.getEndpointUri()); if (uri.getPath() != null && uri.getPath().length() > 0) { // Strip leading '/' from path - span.setTag(Tags.DB_INSTANCE.getKey(), uri.getPath().substring(1)); + span.setDBType(uri.getPath().substring(1)); } Object cql = exchange.getIn().getHeader(CAMEL_CQL_QUERY); if (cql != null) { - span.setTag(Tags.DB_STATEMENT.getKey(), cql.toString()); + span.setDBStatement(cql.toString()); } else { Map queryParameters = toQueryParameters(endpoint.getEndpointUri()); if (queryParameters.containsKey("cql")) { - span.setTag(Tags.DB_STATEMENT.getKey(), queryParameters.get("cql")); + span.setDBStatement(queryParameters.get("cql")); } } } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DirectSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DirectSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DirectSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DirectSpanDecorator.java index 98b3fd4f76c58..67ae5858896dd 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DirectSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DirectSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class DirectSpanDecorator extends AbstractInternalSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DirectvmSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DirectvmSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DirectvmSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DirectvmSpanDecorator.java index 85aee6eb66d43..f29f03f510640 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DirectvmSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DirectvmSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class DirectvmSpanDecorator extends AbstractInternalSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DisruptorSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DisruptorSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DisruptorSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DisruptorSpanDecorator.java index 1e0f43f7774c5..d254ec9eae751 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DisruptorSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DisruptorSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class DisruptorSpanDecorator extends AbstractInternalSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DisruptorvmSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DisruptorvmSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DisruptorvmSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DisruptorvmSpanDecorator.java index 4f8bd2c61d5c5..967a38fc78483 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/DisruptorvmSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/DisruptorvmSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class DisruptorvmSpanDecorator extends AbstractInternalSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/ElasticsearchSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecorator.java similarity index 82% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/ElasticsearchSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecorator.java index aadfc2fc0a465..f48375cabb53a 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/ElasticsearchSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecorator.java @@ -14,14 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import java.util.Map; -import io.opentracing.Span; -import io.opentracing.tag.Tags; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.tracing.SpanWrap; public class ElasticsearchSpanDecorator extends AbstractSpanDecorator { @@ -47,14 +46,15 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(Span span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - - span.setTag(Tags.DB_TYPE.getKey(), ELASTICSEARCH_DB_TYPE); + span.setDBType(ELASTICSEARCH_DB_TYPE); + // span.setTag(Tags.DB_TYPE.getKey(), ELASTICSEARCH_DB_TYPE); Map queryParameters = toQueryParameters(endpoint.getEndpointUri()); if (queryParameters.containsKey("indexName")) { - span.setTag(Tags.DB_INSTANCE.getKey(), queryParameters.get("indexName")); + span.setDBInstance(queryParameters.get("indexName")); + // span.setTag(Tags.DB_INSTANCE.getKey(), queryParameters.get("indexName")); } String cluster = stripSchemeAndOptions(endpoint); diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/HttpSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/HttpSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/HttpSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/HttpSpanDecorator.java index 60d03a9fb4137..def7a352fcada 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/HttpSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/HttpSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class HttpSpanDecorator extends AbstractHttpSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/HttpsSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/HttpsSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/HttpsSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/HttpsSpanDecorator.java index 61ff7514c3cd1..38377eb3010f4 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/HttpsSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/HttpsSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class HttpsSpanDecorator extends HttpSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/IronmqSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/IronmqSpanDecorator.java similarity index 96% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/IronmqSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/IronmqSpanDecorator.java index 32d140b695d63..4c4ec594b3d46 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/IronmqSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/IronmqSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import org.apache.camel.Exchange; diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JdbcSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JdbcSpanDecorator.java similarity index 81% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JdbcSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JdbcSpanDecorator.java index 221f782bf0b22..be8749f00b6f8 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JdbcSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JdbcSpanDecorator.java @@ -14,12 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; -import io.opentracing.Span; -import io.opentracing.tag.Tags; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.tracing.SpanWrap; public class JdbcSpanDecorator extends AbstractSpanDecorator { @@ -34,14 +33,13 @@ public String getComponentClassName() { } @Override - public void pre(Span span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - - span.setTag(Tags.DB_TYPE.getKey(), "sql"); + span.setDBType("sql"); Object body = exchange.getIn().getBody(); if (body instanceof String) { - span.setTag(Tags.DB_STATEMENT.getKey(), (String)body); + span.setDBStatement((String)body); } } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JettySpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JettySpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JettySpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JettySpanDecorator.java index 0f006de8e940b..94a418a60a3f2 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JettySpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JettySpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class JettySpanDecorator extends AbstractHttpSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JmsSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JmsSpanDecorator.java similarity index 96% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JmsSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JmsSpanDecorator.java index 336016069af9a..560e5aa158ec1 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JmsSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JmsSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import org.apache.camel.Exchange; diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/KafkaSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/KafkaSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/KafkaSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/KafkaSpanDecorator.java index 664f832b4d1bc..3698b1da73316 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/KafkaSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/KafkaSpanDecorator.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import java.util.Map; -import io.opentracing.Span; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.tracing.SpanWrap; public class KafkaSpanDecorator extends AbstractMessagingSpanDecorator { @@ -59,7 +59,7 @@ public String getDestination(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(Span span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); String partition = getValue(exchange, PARTITION, Integer.class); diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/LogSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/LogSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/LogSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/LogSpanDecorator.java index d0489e476dcd3..8117c26460717 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/LogSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/LogSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class LogSpanDecorator extends AbstractSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/MongoDBSpanDecorator.java similarity index 78% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/MongoDBSpanDecorator.java index 6c1e9a2150182..c89f9ff7d166a 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/MongoDBSpanDecorator.java @@ -14,14 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import java.util.Map; -import io.opentracing.Span; -import io.opentracing.tag.Tags; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.tracing.SpanWrap; public class MongoDBSpanDecorator extends AbstractSpanDecorator { @@ -46,17 +45,19 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(Span span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - span.setTag(Tags.DB_TYPE.getKey(), getComponent()); - + // span.setTag(Tags.DB_TYPE.getKey(), getComponent()); + span.setDBType(getComponent()); Map queryParameters = toQueryParameters(endpoint.getEndpointUri()); String database = queryParameters.get("database"); if (database != null) { - span.setTag(Tags.DB_INSTANCE.getKey(), database); + span.setDBInstance(database); + //span.setTag(Tags.DB_INSTANCE.getKey(), database); } - span.setTag(Tags.DB_STATEMENT.getKey(), queryParameters.toString()); + span.setDBStatement(queryParameters.toString()); + //span.setTag(Tags.DB_STATEMENT.getKey(), queryParameters.toString()); } } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NatsSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/NatsSpanDecorator.java similarity index 96% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NatsSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/NatsSpanDecorator.java index 0882576c56231..0cc1be87215e2 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NatsSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/NatsSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import org.apache.camel.Exchange; diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NettyHttpSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/NettyHttpSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NettyHttpSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/NettyHttpSpanDecorator.java index 909a01fe04c61..fbda6ba5c0caa 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NettyHttpSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/NettyHttpSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class NettyHttpSpanDecorator extends AbstractHttpSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NsqSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/NsqSpanDecorator.java similarity index 97% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NsqSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/NsqSpanDecorator.java index aeb8d385d818e..b953ba3e3559f 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NsqSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/NsqSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import java.util.Map; diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/PahoSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/PahoSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/PahoSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/PahoSpanDecorator.java index 5e9faa52f2004..c215529effb0a 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/PahoSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/PahoSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class PahoSpanDecorator extends AbstractMessagingSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/PlatformHttpSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/PlatformHttpSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/PlatformHttpSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/PlatformHttpSpanDecorator.java index 8bdaa78494334..4e600ebe73931 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/PlatformHttpSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/PlatformHttpSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class PlatformHttpSpanDecorator extends AbstractHttpSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/RabbitmqSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RabbitmqSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/RabbitmqSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RabbitmqSpanDecorator.java index d741744061393..922960837b443 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/RabbitmqSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RabbitmqSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class RabbitmqSpanDecorator extends AbstractMessagingSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/RestSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RestSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/RestSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RestSpanDecorator.java index c484021936ec6..a437102ab41c4 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/RestSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RestSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -22,9 +22,9 @@ import java.util.Collections; import java.util.List; -import io.opentracing.Span; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.tracing.SpanWrap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,7 +48,7 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(Span span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); getParameters(getPath(endpoint.getEndpointUri())).forEach(param -> { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SedaSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SedaSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SedaSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SedaSpanDecorator.java index 57096ee666c97..b8c0924e69433 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SedaSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SedaSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class SedaSpanDecorator extends AbstractInternalSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/ServletSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ServletSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/ServletSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ServletSpanDecorator.java index c0d03ddd3fec9..a91875c29c099 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/ServletSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ServletSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class ServletSpanDecorator extends AbstractHttpSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/Sjms2SpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/Sjms2SpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/Sjms2SpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/Sjms2SpanDecorator.java index d3fde0fbfd494..90dc95434dd67 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/Sjms2SpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/Sjms2SpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class Sjms2SpanDecorator extends AbstractMessagingSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SjmsSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SjmsSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SjmsSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SjmsSpanDecorator.java index 074d94134d5d2..3b64dddaec352 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SjmsSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SjmsSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class SjmsSpanDecorator extends AbstractMessagingSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SqlSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SqlSpanDecorator.java similarity index 82% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SqlSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SqlSpanDecorator.java index 220ec4dd02795..5fc7f29449a69 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SqlSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SqlSpanDecorator.java @@ -14,12 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; -import io.opentracing.Span; -import io.opentracing.tag.Tags; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.tracing.SpanWrap; public class SqlSpanDecorator extends AbstractSpanDecorator { @@ -36,14 +35,13 @@ public String getComponentClassName() { } @Override - public void pre(Span span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - - span.setTag(Tags.DB_TYPE.getKey(), "sql"); + span.setDBType("sql"); Object sqlquery = exchange.getIn().getHeader(CAMEL_SQL_QUERY); if (sqlquery instanceof String) { - span.setTag(Tags.DB_STATEMENT.getKey(), (String) sqlquery); + span.setDBStatement((String) sqlquery); } } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/StompSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/StompSpanDecorator.java similarity index 96% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/StompSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/StompSpanDecorator.java index fcd24894b5668..b470bcd68ed8f 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/StompSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/StompSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/TimerSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/TimerSpanDecorator.java similarity index 96% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/TimerSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/TimerSpanDecorator.java index 3ba7c25723860..148cba10d6e73 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/TimerSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/TimerSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/UndertowSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/UndertowSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/UndertowSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/UndertowSpanDecorator.java index 4ba59d27abbbc..56f3e6c6e42df 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/UndertowSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/UndertowSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class UndertowSpanDecorator extends AbstractHttpSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/VmSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/VmSpanDecorator.java similarity index 95% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/VmSpanDecorator.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/VmSpanDecorator.java index 4d5c48792e452..eec86bb800b6e 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/VmSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/VmSpanDecorator.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.decorators; +package org.apache.camel.tracing.decorators; public class VmSpanDecorator extends AbstractInternalSpanDecorator { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelHeadersExtractAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersExtractAdapter.java similarity index 76% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelHeadersExtractAdapter.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersExtractAdapter.java index 3387560b347b9..6633296081d2c 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelHeadersExtractAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersExtractAdapter.java @@ -14,21 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.propagation; +package org.apache.camel.tracing.propagation; import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import io.opentracing.propagation.TextMap; +import org.apache.camel.tracing.HeadersExtractAdapter; -public final class CamelHeadersExtractAdapter implements TextMap { +public final class CamelHeadersExtractAdapter implements HeadersExtractAdapter { private final Map map = new HashMap<>(); public CamelHeadersExtractAdapter(final Map map) { // Extract string valued map entries map.entrySet().stream().filter(e -> e.getValue() instanceof String).forEach(e -> - this.map.put(e.getKey(), (String) e.getValue())); + this.map.put(e.getKey(), (String) e.getValue())); } @Override @@ -36,8 +36,7 @@ public Iterator> iterator() { return map.entrySet().iterator(); } - @Override - public void put(String key, String value) { - throw new UnsupportedOperationException("CamelHeadersExtractAdapter should only be used with Tracer.extract()"); + @Override public Object get(String key) { + return this.map.get(key); } } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelHeadersInjectAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java similarity index 75% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelHeadersInjectAdapter.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java index 682ababd25ea1..e74b8cf9b7d1f 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelHeadersInjectAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java @@ -14,25 +14,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.propagation; +package org.apache.camel.tracing.propagation; -import java.util.Iterator; import java.util.Map; -import io.opentracing.propagation.TextMap; +import org.apache.camel.tracing.HeadersInjectAdapter; -public final class CamelHeadersInjectAdapter implements TextMap { +public final class CamelHeadersInjectAdapter implements HeadersInjectAdapter { private final Map map; public CamelHeadersInjectAdapter(final Map map) { this.map = map; } - @Override - public Iterator> iterator() { - throw new UnsupportedOperationException("CamelHeadersInjectAdapter should only be used with Tracer.inject()"); - } - @Override public void put(String key, String value) { // Assume any header property that begins with 'Camel' is for internal use diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersExtractAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapter.java similarity index 89% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersExtractAdapter.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapter.java index 0f1ae098e23fc..c1fbd4ef4f73e 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersExtractAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapter.java @@ -14,16 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.propagation; +package org.apache.camel.tracing.propagation; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import io.opentracing.propagation.TextMap; +import org.apache.camel.tracing.HeadersExtractAdapter; -public final class CamelMessagingHeadersExtractAdapter implements TextMap { +public final class CamelMessagingHeadersExtractAdapter implements HeadersExtractAdapter { private final Map map = new HashMap<>(); private final boolean jmsEncoding; @@ -46,8 +46,8 @@ public Iterator> iterator() { } @Override - public void put(String key, String value) { - throw new UnsupportedOperationException("CamelMessagingHeadersExtractAdapter should only be used with Tracer.extract()"); + public Object get(String key) { + return this.map.get(key); } /** @@ -55,7 +55,6 @@ public void put(String key, String value) { * encoding and decoding is required by JMS. This is implemented here rather * than specifically to JMS so that other Camel messaging endpoints can take * part in traces where the peer is using JMS. - * */ private String decodeDash(String key) { if (jmsEncoding) { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersInjectAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapter.java similarity index 85% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersInjectAdapter.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapter.java index d42c928c321a6..3e215580d6729 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersInjectAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapter.java @@ -14,14 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing.propagation; +package org.apache.camel.tracing.propagation; -import java.util.Iterator; import java.util.Map; -import io.opentracing.propagation.TextMap; +import org.apache.camel.tracing.HeadersInjectAdapter; -public final class CamelMessagingHeadersInjectAdapter implements TextMap { +public final class CamelMessagingHeadersInjectAdapter implements HeadersInjectAdapter { // As per the JMS specs, header names must be valid Java identifier part // characters. @@ -38,11 +37,6 @@ public CamelMessagingHeadersInjectAdapter(final Map map, boolean this.jmsEncoding = jmsEncoding; } - @Override - public Iterator> iterator() { - throw new UnsupportedOperationException("CamelHeadersInjectAdapter should only be used with Tracer.inject()"); - } - @Override public void put(String key, String value) { // Assume any header property that begins with 'Camel' is for internal diff --git a/components/pom.xml b/components/pom.xml index bb8a568fc518b..8b89796f3d90e 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -235,6 +235,24 @@ camel-jbpm camel-jcache camel-jclouds + camel-tracing camel-jcr camel-jdbc camel-jgroups-raft @@ -291,6 +309,7 @@ camel-olingo4 camel-openstack camel-opentracing + camel-opentelemetry camel-optaplanner camel-paho camel-pdf diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java index 42f252ab247a3..2a0528559e84e 100644 --- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java +++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java @@ -10806,7 +10806,7 @@ public static org.apache.camel.builder.endpoint.dsl.Olingo2EndpointBuilderFactor * * @param path apiName/methodName */ - public static org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.Olingo4EndpointBuilder olingo4( + static org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.Olingo4EndpointBuilder olingo4( String path) { return org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.endpointBuilder("olingo4", path); } @@ -10831,7 +10831,7 @@ public static org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactor * instead of the default name * @param path apiName/methodName */ - public static org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.Olingo4EndpointBuilder olingo4( + static org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.Olingo4EndpointBuilder olingo4( String componentName, String path) { return org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.endpointBuilder(componentName, path); diff --git a/parent/pom.xml b/parent/pom.xml index 20374383ba1e3..4fb866d214f34 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -17,20 +17,21 @@ limitations under the License. --> - - 4.0.0 + + 4.0.0 - - org.apache.camel - camel - 3.5.0-SNAPSHOT - + + org.apache.camel + camel + 3.5.0-SNAPSHOT + - camel-parent - pom + camel-parent + pom - Camel :: Parent - Camel Parent POM + Camel :: Parent + Camel Parent POM true @@ -575,175 +576,174 @@ 2.21.1 3.5.7 3.4.0 + + + version="[$(version;==;${camel.osgi.version.clean}),$(version;=+;${camel.osgi.version.clean}))" + + + version="[$(version;===;${camel.osgi.version.clean}),$(version;==+;${camel.osgi.version.clean}))" + + [$(version;==;$(@)),$(version;+;$(@))) + + + + + + org.apache.camel.*;${camel.osgi.import.camel.version}, + ${camel.osgi.import.before.defaults}, + ${camel.osgi.import.defaults}, + ${camel.osgi.import.additional}, + * + + + false + !* + $${replace;{local-packages};;;\;} + ${camel.osgi.export.pkg};-noimport:=true;${camel.osgi.version} + version=${project.version} + ${camel.osgi.import.pkg} + + ${project.groupId}.${project.artifactId} + false + + - - - version="[$(version;==;${camel.osgi.version.clean}),$(version;=+;${camel.osgi.version.clean}))" - - - version="[$(version;===;${camel.osgi.version.clean}),$(version;==+;${camel.osgi.version.clean}))" - - [$(version;==;$(@)),$(version;+;$(@))) - - - - - - org.apache.camel.*;${camel.osgi.import.camel.version}, - ${camel.osgi.import.before.defaults}, - ${camel.osgi.import.defaults}, - ${camel.osgi.import.additional}, - * - - - false - !* - $${replace;{local-packages};;;\;} - ${camel.osgi.export.pkg};-noimport:=true;${camel.osgi.version} - version=${project.version} - ${camel.osgi.import.pkg} - - ${project.groupId}.${project.artifactId} - false - - - - ${project.build.outputDirectory}/META-INF/MANIFEST.MF - + ${project.build.outputDirectory}/META-INF/MANIFEST.MF + - - + + - - - org.apache.camel - camel-util-json - ${project.version} - - - org.apache.camel - camel-tooling-util - ${project.version} - - - org.apache.camel - camel-tooling-model - ${project.version} - - - org.apache.camel - camel-api - ${project.version} - - - org.apache.camel - camel-util - ${project.version} - - - org.apache.camel - camel-management-api - ${project.version} - - - org.apache.camel - camel-management - ${project.version} - - - org.apache.camel - camel-base - ${project.version} - - - org.apache.camel - camel-xml-jaxp - ${project.version} - - - org.apache.camel - camel-core-catalog - ${project.version} - - - org.apache.camel - camel-support - ${project.version} - - - org.apache.camel - camel-core - ${project.version} - - - org.apache.camel - camel-core-engine - ${project.version} - - - org.apache.camel - camel-core-languages - ${project.version} - - - org.apache.camel - camel-endpointdsl - ${project.version} - - - org.apache.camel - camel-componentdsl - ${project.version} - - - org.apache.camel - camel-core-xml - ${project.version} - - - org.apache.camel - camel-caffeine-lrucache - ${project.version} - - - org.apache.camel - camel-cloud - ${project.version} - - - org.apache.camel - camel-cluster - ${project.version} - - - org.apache.camel - camel-health - ${project.version} - - - org.apache.camel - camel-main - ${project.version} - - - org.apache.camel - camel-xml-io - ${project.version} - - - org.apache.camel - camel-xml-jaxb - ${project.version} - - - org.apache.camel - camel-allcomponents - pom - ${project.version} - + + + org.apache.camel + camel-util-json + ${project.version} + + + org.apache.camel + camel-tooling-util + ${project.version} + + + org.apache.camel + camel-tooling-model + ${project.version} + + + org.apache.camel + camel-api + ${project.version} + + + org.apache.camel + camel-util + ${project.version} + + + org.apache.camel + camel-management-api + ${project.version} + + + org.apache.camel + camel-management + ${project.version} + + + org.apache.camel + camel-base + ${project.version} + + + org.apache.camel + camel-xml-jaxp + ${project.version} + + + org.apache.camel + camel-core-catalog + ${project.version} + + + org.apache.camel + camel-support + ${project.version} + + + org.apache.camel + camel-core + ${project.version} + + + org.apache.camel + camel-core-engine + ${project.version} + + + org.apache.camel + camel-core-languages + ${project.version} + + + org.apache.camel + camel-endpointdsl + ${project.version} + + + org.apache.camel + camel-componentdsl + ${project.version} + + + org.apache.camel + camel-core-xml + ${project.version} + + + org.apache.camel + camel-caffeine-lrucache + ${project.version} + + + org.apache.camel + camel-cloud + ${project.version} + + + org.apache.camel + camel-cluster + ${project.version} + + + org.apache.camel + camel-health + ${project.version} + + + org.apache.camel + camel-main + ${project.version} + + + org.apache.camel + camel-xml-io + ${project.version} + + + org.apache.camel + camel-xml-jaxb + ${project.version} + + + org.apache.camel + camel-allcomponents + pom + ${project.version} + - - + + org.apache.camel camel-activemq @@ -1944,6 +1944,11 @@ camel-openstack ${project.version} + + org.apache.camel + camel-opentelemetry + ${project.version} + org.apache.camel camel-opentracing @@ -2394,6 +2399,11 @@ camel-timer ${project.version} + + org.apache.camel + camel-tracing + ${project.version} + org.apache.camel camel-twilio @@ -2566,78 +2576,65 @@ - - + + - + + + org.apache.camel + camel-catalog + ${project.version} + + + org.apache.camel + camel-catalog-lucene + ${project.version} + + + org.apache.camel + camel-catalog-maven + ${project.version} + + + org.apache.camel + camel-route-parser + ${project.version} + + + + + org.apache.camel + camel-manual + ${project.version} + + + org.apache.camel.tests + org.apache.camel.tests.mock-javamail_1.7 + ${project.version} + + + org.apache.camel + spi-annotations + ${project.version} + + +<<<<<<< HEAD + - org.apache.camel - camel-catalog - ${project.version} + org.apache.cassandra + cassandra-all + ${cassandra-version} - org.apache.camel - camel-catalog-lucene - ${project.version} + com.datastax.oss + java-driver-core + ${cassandra-driver-version} - org.apache.camel - camel-catalog-maven - ${project.version} - - - org.apache.camel - camel-route-parser - ${project.version} - - - - - org.apache.camel - camel-manual - ${project.version} - - - org.apache.camel.tests - org.apache.camel.tests.mock-javamail_1.7 - ${project.version} - - - org.apache.camel - spi-annotations - ${project.version} - - - - - org.apache.camel - camel-core - ${project.version} - test-jar - - - org.apache.camel - camel-management - ${project.version} - test-jar - - - - - org.apache.cassandra - cassandra-all - ${cassandra-version} - - - com.datastax.oss - java-driver-core - ${cassandra-driver-version} - - - com.datastax.oss - java-driver-query-builder - ${cassandra-driver-version} + com.datastax.oss + java-driver-query-builder + ${cassandra-driver-version} org.cassandraunit @@ -2650,2045 +2647,2067 @@ + + + org.apache.cassandra + cassandra-all + ${cassandra-version} + + + com.datastax.cassandra + cassandra-driver-core + ${cassandra-driver-version} + + + org.cassandraunit + cassandra-unit + ${cassandra-unit-version} + + + org.apache.cassandra + cassandra-all + + + - - com.fasterxml.jackson.core - jackson-annotations - ${jackson2-version} - - - com.fasterxml.jackson.core - jackson-core - ${jackson2-version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson2-version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-cbor - ${jackson2-version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-smile - ${jackson2-version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - ${jackson2-version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - ${jackson2-version} - - - com.fasterxml.jackson.datatype - jackson-datatype-joda - ${jackson2-version} - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-base - ${jackson2-version} - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson2-version} - - - com.fasterxml.jackson.module - jackson-module-jaxb-annotations - ${jackson2-version} - - - com.fasterxml.jackson.module - jackson-module-jsonSchema - ${jackson2-version} - - - com.fasterxml.jackson.jr - jackson-jr-objects - ${jackson2-version} - - - com.github.jasminb - jsonapi-converter - ${jasminb-jsonapi-version} - - - net.corda - corda-rpc - ${corda-version} - - - co.paralleluniverse - quasar-core - - - org.hibernate - hibernate-core - - - org.hibernate.javax.persistence - hibernate-jpa-2.1-api - - - + + com.fasterxml.jackson.core + jackson-annotations + ${jackson2-version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson2-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson2-version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-cbor + ${jackson2-version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-smile + ${jackson2-version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + ${jackson2-version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${jackson2-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson2-version} + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-base + ${jackson2-version} + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson2-version} + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + ${jackson2-version} + + + com.fasterxml.jackson.module + jackson-module-jsonSchema + ${jackson2-version} + + + com.fasterxml.jackson.jr + jackson-jr-objects + ${jackson2-version} + + + com.github.jasminb + jsonapi-converter + ${jasminb-jsonapi-version} + + + net.corda + corda-rpc + ${corda-version} + + + co.paralleluniverse + quasar-core + + + org.hibernate + hibernate-core + + + org.hibernate.javax.persistence + hibernate-jpa-2.1-api + + + - - com.alibaba - fastjson - ${fastjson-version} - + + com.alibaba + fastjson + ${fastjson-version} + - - org.knowm.xchange - xchange-core - ${xchange-version} - + + org.knowm.xchange + xchange-core + ${xchange-version} + - - - org.apache.abdera - abdera-core - ${abdera-version} - + + + org.apache.abdera + abdera-core + ${abdera-version} + - - - org.apache.commons - commons-pool2 - ${commons-pool2-version} - + + + org.apache.commons + commons-pool2 + ${commons-pool2-version} + - - - org.apache.cxf - cxf-core - ${cxf-version} - - - org.apache.cxf - cxf-rt-bindings-soap - ${cxf-version} - - - org.apache.cxf - cxf-rt-bindings-xml - ${cxf-version} - - - org.apache.cxf - cxf-rt-databinding-jaxb - ${cxf-version} - - - org.apache.cxf - cxf-rt-features-clustering - ${cxf-version} - - - org.apache.cxf - cxf-rt-features-logging - ${cxf-version} - - - org.apache.cxf - cxf-rt-frontend-jaxrs - ${cxf-version} - - - org.apache.cxf - cxf-rt-frontend-jaxws - ${cxf-version} - - - org.apache.cxf - cxf-rt-frontend-simple - ${cxf-version} - - - org.apache.cxf - cxf-rt-management - ${cxf-version} - - - org.apache.cxf - cxf-rt-rs-client - ${cxf-version} - - - org.apache.cxf - cxf-rt-rs-service-description-swagger - ${cxf-version} - - - org.apache.cxf - cxf-rt-rs-extension-providers - ${cxf-version} - - - org.apache.cxf - cxf-rt-rs-security-oauth2 - ${cxf-version} - - - org.apache.cxf - cxf-rt-transports-local - ${cxf-version} - - - org.apache.cxf - cxf-rt-transports-http - ${cxf-version} - - - org.apache.cxf - cxf-rt-transports-http-jetty - ${cxf-version} - - - org.apache.cxf - cxf-rt-transports-jms - ${cxf-version} - - - org.apache.cxf - cxf-rt-wsdl - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-addr - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-mex - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-policy - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-rm - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-security - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-security-oauth2 - ${cxf-version} - - - org.apache.cxf - cxf-testutils - ${cxf-version} - - - org.apache.cxf.services.sts - cxf-services-sts-core - ${cxf-version} - - - org.apache.cxf.services.ws-discovery - cxf-services-ws-discovery-api - ${cxf-version} - - - org.apache.kafka - kafka-clients - ${kafka-version} - + + + org.apache.cxf + cxf-core + ${cxf-version} + + + org.apache.cxf + cxf-rt-bindings-soap + ${cxf-version} + + + org.apache.cxf + cxf-rt-bindings-xml + ${cxf-version} + + + org.apache.cxf + cxf-rt-databinding-jaxb + ${cxf-version} + + + org.apache.cxf + cxf-rt-features-clustering + ${cxf-version} + + + org.apache.cxf + cxf-rt-features-logging + ${cxf-version} + + + org.apache.cxf + cxf-rt-frontend-jaxrs + ${cxf-version} + + + org.apache.cxf + cxf-rt-frontend-jaxws + ${cxf-version} + + + org.apache.cxf + cxf-rt-frontend-simple + ${cxf-version} + + + org.apache.cxf + cxf-rt-management + ${cxf-version} + + + org.apache.cxf + cxf-rt-rs-client + ${cxf-version} + + + org.apache.cxf + cxf-rt-rs-service-description-swagger + ${cxf-version} + + + org.apache.cxf + cxf-rt-rs-extension-providers + ${cxf-version} + + + org.apache.cxf + cxf-rt-rs-security-oauth2 + ${cxf-version} + + + org.apache.cxf + cxf-rt-transports-local + ${cxf-version} + + + org.apache.cxf + cxf-rt-transports-http + ${cxf-version} + + + org.apache.cxf + cxf-rt-transports-http-jetty + ${cxf-version} + + + org.apache.cxf + cxf-rt-transports-jms + ${cxf-version} + + + org.apache.cxf + cxf-rt-wsdl + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-addr + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-mex + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-policy + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-rm + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-security + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-security-oauth2 + ${cxf-version} + + + org.apache.cxf + cxf-testutils + ${cxf-version} + + + org.apache.cxf.services.sts + cxf-services-sts-core + ${cxf-version} + + + org.apache.cxf.services.ws-discovery + cxf-services-ws-discovery-api + ${cxf-version} + + + org.apache.kafka + kafka-clients + ${kafka-version} + - - - com.github.ben-manes.caffeine - caffeine - ${caffeine-version} - - - org.checkerframework - checker-qual - - - com.google.errorprone - error_prone_annotations - - - + + + com.github.ben-manes.caffeine + caffeine + ${caffeine-version} + + + org.checkerframework + checker-qual + + + com.google.errorprone + error_prone_annotations + + + - - - stax - stax-api - ${stax-api-version} - - - com.sun.xml.bind - jaxb-impl - ${jaxb-version} - - - javax.jws - jsr181-api - - - - - com.sun.xml.bind - jaxb-core - ${jaxb-version} - - - com.sun.xml.bind - jaxb-jxc - ${jaxb-version} - - - com.sun.xml.parsers - jaxp-ri - 1.4.5 - + + + stax + stax-api + ${stax-api-version} + + + com.sun.xml.bind + jaxb-impl + ${jaxb-version} + + + javax.jws + jsr181-api + + + + + com.sun.xml.bind + jaxb-core + ${jaxb-version} + + + com.sun.xml.bind + jaxb-jxc + ${jaxb-version} + + + com.sun.xml.parsers + jaxp-ri + 1.4.5 + - - - org.slf4j - slf4j-api - ${slf4j-api-version} - - - org.slf4j - slf4j-log4j12 - ${slf4j-version} - - - org.slf4j - jul-to-slf4j - ${slf4j-version} - - - org.slf4j - log4j-over-slf4j - ${slf4j-version} - - - log4j - log4j - ${log4j-version} - - - org.apache.logging.log4j - log4j-api - ${log4j2-version} - - - org.apache.logging.log4j - log4j-core - ${log4j2-version} - - - org.apache.logging.log4j - log4j-slf4j-impl - ${log4j2-version} - - - org.apache.logging.log4j - log4j-1.2-api - ${log4j2-version} - - - org.apache.logging.log4j - log4j-jcl - ${log4j2-version} - - - org.apache.logging.log4j - log4j-jul - ${log4j2-version} - - - org.apache.logging.log4j - log4j-web - ${log4j2-version} - - - - commons-logging - commons-logging - ${commons-logging-version} - + + + org.slf4j + slf4j-api + ${slf4j-api-version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + + + org.slf4j + jul-to-slf4j + ${slf4j-version} + + + org.slf4j + log4j-over-slf4j + ${slf4j-version} + + + log4j + log4j + ${log4j-version} + + + org.apache.logging.log4j + log4j-api + ${log4j2-version} + + + org.apache.logging.log4j + log4j-core + ${log4j2-version} + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j2-version} + + + org.apache.logging.log4j + log4j-1.2-api + ${log4j2-version} + + + org.apache.logging.log4j + log4j-jcl + ${log4j2-version} + + + org.apache.logging.log4j + log4j-jul + ${log4j2-version} + + + org.apache.logging.log4j + log4j-web + ${log4j2-version} + + + + commons-logging + commons-logging + ${commons-logging-version} + - - commons-codec - commons-codec - ${commons-codec-version} - + + commons-codec + commons-codec + ${commons-codec-version} + - - - org.osgi - osgi.core - ${osgi-version} - - - org.osgi - osgi.cmpn - ${osgi-version} - + + + org.osgi + osgi.core + ${osgi-version} + + + org.osgi + osgi.cmpn + ${osgi-version} + - - - org.apache.activemq - activemq-broker - ${activemq-version} - - - org.apache.activemq - activemq-kahadb-store - ${activemq-version} - - - org.apache.activemq - activemq-client - ${activemq-version} - - - org.apache.activemq - activemq-spring - ${activemq-version} - - - org.apache.activemq - activemq-camel - ${activemq-version} - - - org.apache.activemq - activemq-pool - ${activemq-version} - - - org.apache.activemq - activemq-rar - ${activemq-version} - rar - - - org.apache.activemq - activemq-all - ${activemq-version} - - - org.apache.activemq - activemq-amqp - ${activemq-version} - - - org.apache.activemq - activemq-openwire-legacy - ${activemq-version} - - - org.apache.activemq - activemq-jaas - ${activemq-version} - - - org.apache.activemq - activemq-mqtt - ${activemq-version} - + + + org.apache.activemq + activemq-broker + ${activemq-version} + + + org.apache.activemq + activemq-kahadb-store + ${activemq-version} + + + org.apache.activemq + activemq-client + ${activemq-version} + + + org.apache.activemq + activemq-spring + ${activemq-version} + + + org.apache.activemq + activemq-camel + ${activemq-version} + + + org.apache.activemq + activemq-pool + ${activemq-version} + + + org.apache.activemq + activemq-rar + ${activemq-version} + rar + + + org.apache.activemq + activemq-all + ${activemq-version} + + + org.apache.activemq + activemq-amqp + ${activemq-version} + + + org.apache.activemq + activemq-openwire-legacy + ${activemq-version} + + + org.apache.activemq + activemq-jaas + ${activemq-version} + + + org.apache.activemq + activemq-mqtt + ${activemq-version} + + + + org.apache.xbean + xbean-spring + ${xbean-spring-version} + + + + + org.apache.geronimo.specs + geronimo-j2ee-connector_1.5_spec + ${geronimo-j2ee-connector-spec-version} + + + org.apache.geronimo.specs + geronimo-j2ee-jacc_1.0_spec + ${geronimo-j2ee-jacc-spec-version} + + + org.apache.geronimo.specs + geronimo-j2ee-management_1.0_spec + ${geronimo-j2ee-management-spec-version} + + + org.apache.geronimo.specs + geronimo-jms_1.1_spec + ${geronimo-jms-spec-version} + + + org.apache.geronimo.specs + geronimo-jms_2.0_spec + ${geronimo-jms2-spec-version} + + + org.apache.geronimo.specs + geronimo-jpa_2.1_spec + ${geronimo-jpa-spec-version} + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + ${geronimo-jta-spec-version} + + + javax.servlet + javax.servlet-api + ${javax-servlet-api-version} + + + + org.springframework + spring-context + ${spring-version} + + + org.springframework + spring-test + ${spring-version} + + + org.springframework + spring-core + ${spring-version} + + + org.springframework + spring-beans + ${spring-version} + + + org.springframework + spring-web + ${spring-version} + + + org.springframework + spring-aop + ${spring-version} + + + org.springframework + spring-jdbc + ${spring-version} + + + org.springframework + spring-orm + ${spring-version} + + + org.springframework + spring-jms + ${spring-version} + + + org.springframework + spring-context-support + ${spring-version} + + + org.springframework + spring-tx + ${spring-version} + + + org.springframework + spring-expression + ${spring-version} + + + org.springframework.security + spring-security-config + ${spring-security-version} + + + org.springframework.security + spring-security-core + ${spring-security-version} + - - org.apache.xbean - xbean-spring - ${xbean-spring-version} - + + org.scala-lang + scala-library + ${scala-version} + - - - org.apache.geronimo.specs - geronimo-j2ee-connector_1.5_spec - ${geronimo-j2ee-connector-spec-version} - - - org.apache.geronimo.specs - geronimo-j2ee-jacc_1.0_spec - ${geronimo-j2ee-jacc-spec-version} - - - org.apache.geronimo.specs - geronimo-j2ee-management_1.0_spec - ${geronimo-j2ee-management-spec-version} - - - org.apache.geronimo.specs - geronimo-jms_1.1_spec - ${geronimo-jms-spec-version} - - - org.apache.geronimo.specs - geronimo-jms_2.0_spec - ${geronimo-jms2-spec-version} - - - org.apache.geronimo.specs - geronimo-jpa_2.1_spec - ${geronimo-jpa-spec-version} - - - org.apache.geronimo.specs - geronimo-jta_1.1_spec - ${geronimo-jta-spec-version} - - - javax.servlet - javax.servlet-api - ${javax-servlet-api-version} - - - - org.springframework - spring-context - ${spring-version} - - - org.springframework - spring-test - ${spring-version} - - - org.springframework - spring-core - ${spring-version} - - - org.springframework - spring-beans - ${spring-version} - - - org.springframework - spring-web - ${spring-version} - - - org.springframework - spring-aop - ${spring-version} - - - org.springframework - spring-jdbc - ${spring-version} - - - org.springframework - spring-orm - ${spring-version} - - - org.springframework - spring-jms - ${spring-version} - - - org.springframework - spring-context-support - ${spring-version} - - - org.springframework - spring-tx - ${spring-version} - - - org.springframework - spring-expression - ${spring-version} - - - org.springframework.security - spring-security-config - ${spring-security-version} - - - org.springframework.security - spring-security-core - ${spring-security-version} - + + org.yaml + snakeyaml + ${snakeyaml-version} + - - org.scala-lang - scala-library - ${scala-version} - + + javax.annotation + jsr250-api + 1.0 + - - org.yaml - snakeyaml - ${snakeyaml-version} - + + com.google.guava + guava + ${google-guava-version} + - - javax.annotation - jsr250-api - 1.0 - + + + ca.uhn.hapi + hapi-structures-v21 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v22 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v23 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v231 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v24 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v25 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v251 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v26 + ${hapi-version} + - - com.google.guava - guava - ${google-guava-version} - + + + com.lmax + disruptor + ${disruptor-version} + - - - ca.uhn.hapi - hapi-structures-v21 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v22 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v23 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v231 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v24 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v25 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v251 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v26 - ${hapi-version} - + + + com.github.dozermapper + dozer-core + ${dozer-version} + - - - com.lmax - disruptor - ${disruptor-version} - + + + com.dropbox.core + dropbox-core-sdk + ${dropbox-version} + - - - com.github.dozermapper - dozer-core - ${dozer-version} - + + + org.apache.mina + mina-core + ${mina-version} + - - - com.dropbox.core - dropbox-core-sdk - ${dropbox-version} - + + org.slf4j + slf4j-simple + ${slf4j-version} + - - - org.apache.mina - mina-core - ${mina-version} - + + + org.apache.httpcomponents + httpcore + ${httpcore4-version} + + + org.apache.httpcomponents + httpcore-nio + ${httpcore4-version} + - - org.slf4j - slf4j-simple - ${slf4j-version} - + + + org.apache.httpcomponents + httpclient + ${httpclient4-version} + + + org.apache.httpcomponents + httpclient-cache + ${httpclient4-version} + + + org.apache.httpcomponents + httpclient-osgi + ${httpclient4-version} + + + org.apache.httpcomponents + httpmime + ${httpclient4-version} + - - - org.apache.httpcomponents - httpcore - ${httpcore4-version} - - - org.apache.httpcomponents - httpcore-nio - ${httpcore4-version} - + + + org.apache.httpcomponents + httpasyncclient + ${httpasyncclient-version} + - - - org.apache.httpcomponents - httpclient - ${httpclient4-version} - - - org.apache.httpcomponents - httpclient-cache - ${httpclient4-version} - - - org.apache.httpcomponents - httpclient-osgi - ${httpclient4-version} - - - org.apache.httpcomponents - httpmime - ${httpclient4-version} - - - - org.apache.httpcomponents - httpasyncclient - ${httpasyncclient-version} - + + + org.codehaus.groovy + groovy + ${groovy-version} + + + org.codehaus.groovy + groovy-xml + ${groovy-version} + + + org.codehaus.groovy + groovy-ant + ${groovy-version} + + + org.codehaus.groovy + groovy-jsr223 + ${groovy-version} + + + + ognl + ognl + ${ognl-version} + - - - org.codehaus.groovy - groovy - ${groovy-version} - - - org.codehaus.groovy - groovy-xml - ${groovy-version} - - - org.codehaus.groovy - groovy-ant - ${groovy-version} - - - org.codehaus.groovy - groovy-jsr223 - ${groovy-version} - + + + net.sf.saxon + Saxon-HE + ${saxon-version} + - - - ognl - ognl - ${ognl-version} - + + + junit + junit + ${junit-version} + + + org.junit + junit-bom + ${junit-jupiter-version} + pom + import + + + org.awaitility + awaitility + ${awaitility-version} + + + org.assertj + assertj-core + ${assertj-version} + + + org.hamcrest + hamcrest + ${hamcrest-version} + + + org.mockito + mockito-core + ${mockito-version} + + + org.mockito + mockito-junit-jupiter + ${mockito-version} + + + httpunit + httpunit + ${httpunit-version} + + + org.testcontainers + junit-jupiter + ${testcontainers-version} + - - - net.sf.saxon - Saxon-HE - ${saxon-version} - + + + org.apache.openjpa + openjpa-persistence-jdbc + ${openjpa-version} + - - - junit - junit - ${junit-version} - - - org.junit - junit-bom - ${junit-jupiter-version} - pom - import - - - org.awaitility - awaitility - ${awaitility-version} - - - org.assertj - assertj-core - ${assertj-version} - - - org.hamcrest - hamcrest - ${hamcrest-version} - - - org.mockito - mockito-core - ${mockito-version} - - - org.mockito - mockito-junit-jupiter - ${mockito-version} - - - httpunit - httpunit - ${httpunit-version} - - - org.testcontainers - junit-jupiter - ${testcontainers-version} - + + + org.hibernate + hibernate-entitymanager + ${hibernate-version} + + + javax.transaction + jta + + + + + org.apache.derby + derby + ${derby-version} + + + org.hsqldb + hsqldb + ${hsqldb-version} + test + - - - org.apache.openjpa - openjpa-persistence-jdbc - ${openjpa-version} - + + + org.apache.servicemix.bundles + org.apache.servicemix.bundles.snmp4j + ${snmp4j-version} + - - - org.hibernate - hibernate-entitymanager - ${hibernate-version} - - - javax.transaction - jta - - - - - org.apache.derby - derby - ${derby-version} - - - org.hsqldb - hsqldb - ${hsqldb-version} - test - + + + com.thoughtworks.xstream + xstream + ${xstream-version} + - - - org.apache.servicemix.bundles - org.apache.servicemix.bundles.snmp4j - ${snmp4j-version} - + + + org.codehaus.jettison + jettison + ${jettison-version} + - - - com.thoughtworks.xstream - xstream - ${xstream-version} - + + + org.ccil.cowan.tagsoup + tagsoup + ${tagsoup-version} + - - - org.codehaus.jettison - jettison - ${jettison-version} - + + + org.apache.any23 + apache-any23-core + ${apache-any23-version} + + + + + org.eclipse.rdf4j + rdf4j-model + ${rdf4j-model-version} + + + + org.eclipse.rdf4j + rdf4j-rio-api + ${rdf4j-rio-version} + + + + + org.apache.ws.commons.axiom + axiom-api + ${axiom-version} + + + org.apache.ws.commons.axiom + axiom-impl + ${axiom-version} + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin-version} + - - - org.ccil.cowan.tagsoup - tagsoup - ${tagsoup-version} - + + + com.cloudbees.thirdparty + zendesk-java-client + ${zendesk-client-version} + - - - org.apache.any23 - apache-any23-core - ${apache-any23-version} - + + + org.python + jython + ${jython-version} + + + org.mozilla + rhino + ${rhino-version} + + + rhino + js + ${rhino-js-version} + + + commons-dbcp + commons-dbcp + ${commons-dbcp-version} + + + org.apache.commons + commons-dbcp2 + ${commons-dbcp2-version} + + + commons-pool + commons-pool + ${commons-pool-version} + + + commons-collections + commons-collections + ${commons-collections-version} + + + commons-io + commons-io + ${commons-io-version} + + + xalan + xalan + ${xalan-version} + + + xerces + xercesImpl + ${xerces-version} + + + xml-apis + xml-apis + ${xml-apis-version} + + + org.codehaus.woodstox + woodstox-core-asl + ${woodstox-version} + + + javax.xml.stream + stax-api + + + - - - org.eclipse.rdf4j - rdf4j-model - ${rdf4j-model-version} - + + + org.apache.avro + avro + ${avro-version} + + + org.apache.avro + avro-ipc + ${avro-version} + - - org.eclipse.rdf4j - rdf4j-rio-api - ${rdf4j-rio-version} - + + + org.apache.ftpserver + ftpserver-core + ${ftpserver-version} + + + org.apache.ftpserver + ftplet-api + ${ftpserver-version} + - - - org.apache.ws.commons.axiom - axiom-api - ${axiom-version} - - - org.apache.ws.commons.axiom - axiom-impl - ${axiom-version} - + + + org.apache.zookeeper + zookeeper + ${zookeeper-version} + - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin-version} - + + + org.optaplanner + optaplanner-bom + ${optaplanner-version} + pom + import + - - - com.cloudbees.thirdparty - zendesk-java-client - ${zendesk-client-version} - + + + org.dizitart + nitrite + ${nitrite-version} + + + + org.apache.aries.blueprint + org.apache.aries.blueprint.api + ${aries-blueprint-api-version} + + + org.apache.aries.blueprint + org.apache.aries.blueprint.core + ${aries-blueprint-core-version} + + + org.apache.aries.blueprint + org.apache.aries.blueprint.cm + ${aries-blueprint-cm-version} + - - - org.python - jython - ${jython-version} - - - org.mozilla - rhino - ${rhino-version} - - - rhino - js - ${rhino-js-version} - - - commons-dbcp - commons-dbcp - ${commons-dbcp-version} - - - org.apache.commons - commons-dbcp2 - ${commons-dbcp2-version} - - - commons-pool - commons-pool - ${commons-pool-version} - - - commons-collections - commons-collections - ${commons-collections-version} - - - commons-io - commons-io - ${commons-io-version} - - - xalan - xalan - ${xalan-version} - - - xerces - xercesImpl - ${xerces-version} - - - xml-apis - xml-apis - ${xml-apis-version} - - - org.codehaus.woodstox - woodstox-core-asl - ${woodstox-version} - - - javax.xml.stream - stax-api - - - + + + org.apache.felix + org.apache.felix.configadmin + ${felix-configadmin-version} + - - - org.apache.avro - avro - ${avro-version} - - - org.apache.avro - avro-ipc - ${avro-version} - + + + org.apache.maven.archetype + archetype-packaging + ${maven-archetype-packaging-version} + - - - org.apache.ftpserver - ftpserver-core - ${ftpserver-version} - - - org.apache.ftpserver - ftplet-api - ${ftpserver-version} - + + + org.apache.pdfbox + fontbox + ${pdfbox-version} + + + org.apache.pdfbox + pdfbox + ${pdfbox-version} + + + org.apache.pdfbox + pdfbox-tools + ${pdfbox-version} + + + org.apache.pdfbox + pdfbox-debugger + ${pdfbox-version} + - - - org.apache.zookeeper - zookeeper - ${zookeeper-version} - + + io.nessus + nessus-ipfs-client + ${nessus-ipfs-version} + - - - org.optaplanner - optaplanner-bom - ${optaplanner-version} - pom - import - + + + org.apache.pulsar + pulsar-client + ${pulsar-version} + + + org.apache.pulsar + pulsar-client-admin + ${pulsar-version} + - - - org.dizitart - nitrite - ${nitrite-version} - - - - org.apache.aries.blueprint - org.apache.aries.blueprint.api - ${aries-blueprint-api-version} - - - org.apache.aries.blueprint - org.apache.aries.blueprint.core - ${aries-blueprint-core-version} - - - org.apache.aries.blueprint - org.apache.aries.blueprint.cm - ${aries-blueprint-cm-version} - + + + io.apicurio + apicurio-data-models + ${apicurio-version} + - - - org.apache.felix - org.apache.felix.configadmin - ${felix-configadmin-version} - - - - org.apache.maven.archetype - archetype-packaging - ${maven-archetype-packaging-version} - + + + io.krakens + java-grok + ${java-grok-version} + - - - org.apache.pdfbox - fontbox - ${pdfbox-version} - - - org.apache.pdfbox - pdfbox - ${pdfbox-version} - - - org.apache.pdfbox - pdfbox-tools - ${pdfbox-version} - - - org.apache.pdfbox - pdfbox-debugger - ${pdfbox-version} - + + + io.methvin + directory-watcher + ${directory-watcher-version} + + + - - io.nessus - nessus-ipfs-client - ${nessus-ipfs-version} - + + install + + + + org.apache.camel + camel-package-maven-plugin + ${project.version} + + + org.apache.camel + camel-javadoc-plugin + ${project.version} + + + org.codehaus.mojo + jaxb2-maven-plugin + ${jaxb2-maven-plugin-version} + + + org.apache.maven.plugins + maven-plugin-plugin + ${maven-plugin-plugin-version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin-version} + + + ${camel.osgi.manifest} + + + + + org.apache.cxf + cxf-codegen-plugin + ${cxf-codegen-plugin-version} + + once + + true + 1 + + true + + + + + xerces + xercesImpl + ${xerces-version} + + + + + org.apache.maven.plugins + maven-antrun-plugin + ${maven-antrun-plugin-version} + + + com.sun.xml.bind + jaxb-impl + ${jaxb-version} + + + com.sun.xml.bind + jaxb-jxc + ${jaxb-version} + + + ant-contrib + ant-contrib + 1.0b3 + + + ant + ant + + + + + org.apache.ant + ant-trax + 1.8.0 + + + org.apache.ant + ant-nodeps + 1.8.1 + + + org.apache.openjpa + openjpa-persistence-jdbc + ${openjpa-version} + + + ant + ant + + + + + + + org.apache.maven.plugins + maven-archetype-plugin + ${maven-archetype-plugin-version} + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven-checkstyle-plugin-version} + + + org.apache.camel + camel-buildtools + ${project.version} + + + com.puppycrawl.tools + checkstyle + ${maven-checkstyle-version} + + + + + default-cli + validate + + false + camel-checkstyle.xml + true + ${checkstyle.failOnViolation} + false + camel-checkstyle-suppressions.xml + UTF-8 + + ${basedir}/src + + header-java.txt + **/*.java,**/*.groovy,**/*.scala,**/*.properties,**/*.xml,**/*.xsd + + **/archetype-resources/**/*.java,**/archetype-resources/**/*.groovy,**/archetype-resources/**/*.scala,**/archetype-resources/**/*.xml,**/org/json/simple/**/*.java + + + + checkstyle + + + + + + org.apache.maven.plugins + maven-clean-plugin + + + + + activemq-data + false + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin-version} + + ${jdk.version} + ${jdk.version} + 512M + ${compiler.fork} + true + true + + + -parameters + + + + + org.apache.maven.plugins + maven-eclipse-plugin + + + org.eclipse.jdt.core.javabuilder + net.sf.eclipsecs.core.CheckstyleBuilder + + + org.eclipse.jdt.core.javanature + net.sf.eclipsecs.core.CheckstyleNature + + + + .checkstyle + /camel-eclipse-checkstyle + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + ${jdk.version} + true + Apache Camel + false + 1.8.0 + UTF-8 + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin-version} + + UTF-8 + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade-plugin-version} + + + org.apache.maven.plugins + maven-source-plugin + + + + ${project.groupId}.${project.artifactId}.source + + ${camel.osgi.version.clean} + + ${project.groupId}.${project.artifactId};version="${camel.osgi.version.clean}" + + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin-version} + + + + + ${project.build.outputDirectory} + + META-INF/LICENSE* + META-INF/NOTICE* + META-INF/DEPENDENCIES* + + + + + + + org.apache.maven.plugins + maven-surefire-report-plugin + ${maven-surefire-report-plugin-version} + + + org.apache.servicemix.tooling + depends-maven-plugin + 1.2 + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.1 + + / + true + + + + org.codehaus.mojo + build-helper-maven-plugin + ${build-helper-maven-plugin-version} + + + org.codehaus.mojo + cobertura-maven-plugin + ${cobertura-maven-plugin-version} + + + 85 + 85 + false + 85 + 85 + 85 + 85 + + + org.apache.camel.impl.* + 90 + 80 + + + org.apache.camel.builder.* + 40 + 30 + + + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin-version} + + + org.codehaus.mojo + findbugs-maven-plugin + ${findbugs-maven-plugin-version} + + + org.codehaus.mojo + properties-maven-plugin + ${properties-maven-plugin-version} + + + org.codehaus.mojo + tomcat-maven-plugin + 1.1 + + / + + + + org.jvnet.jaxb2.maven2 + maven-jaxb2-plugin + 0.8.3 + + + + generate + + + + + false + true + + -Xfluent-api + + + + net.java.dev.jaxb2-commons + jaxb-fluent-api + 2.1.8 + + + + + + xerces + xercesImpl + ${xerces-version} + + + + + ${jetty-runner-groupId} + jetty-maven-plugin + ${jetty-plugin-version} + + + org.owasp + dependency-check-maven + ${maven-owasp-plugin-version} + + 16 + false + false + true + true + ALL + + + + validate + + aggregate + + + + + + + org.eclipse.m2e + lifecycle-mapping + ${lifecycle-mapping-version} + + + + + + org.apache.maven.plugins + maven-remote-resources-plugin + ${maven-remote-resources-plugin-version} + + process + + + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin-version} + + + + + + + org.apache.maven.plugins + maven-site-plugin + + + attach-descriptor + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + enforce-maven-version + + + + - - - org.apache.pulsar - pulsar-client - ${pulsar-version} - - - org.apache.pulsar - pulsar-client-admin - ${pulsar-version} - + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin-version} + + -XX:+ExitOnOutOfMemoryError + + 300 + false + true + false + alphabetical + + 2 + + file,http,https + file,http + target/derby.log + ${java.awt.headless} + ${basedir}/target/test-classes/logging.properties + + target/ + + + + **/*Test.java + + + **/*IntegrationTest.java + **/*XXXTest.* + + + + + - - - io.apicurio - apicurio-data-models - ${apicurio-version} - + + + + org.codehaus.mojo + cobertura-maven-plugin + ${cobertura-maven-plugin-version} + + + html + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven-checkstyle-plugin-version} + + + org.apache.maven.plugins + maven-surefire-report-plugin + ${maven-surefire-report-plugin-version} + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin-version} + + + http://docs.oracle.com/javase/8/docs/api/ + http://docs.oracle.com/javaee/7/api/ + http://docs.spring.io/spring/docs/${spring-version}/javadoc-api/ + + ${basedir}/../../etc/css/stylesheet.css + true + 500m + ${jdk.version} + + + + org.codehaus.mojo + findbugs-maven-plugin + ${findbugs-maven-plugin-version} + + + org.owasp + dependency-check-maven + ${maven-owasp-plugin-version} + + + + - - - io.krakens - java-grok - ${java-grok-version} - + + nochecks + + true + + - - - io.methvin - directory-watcher - ${directory-watcher-version} - - - + + fastinstall + + + fastinstall + + + + true + true + true + true + + - - install - - - - org.apache.camel - camel-package-maven-plugin - ${project.version} - - - org.apache.camel - camel-javadoc-plugin - ${project.version} - - - org.codehaus.mojo - jaxb2-maven-plugin - ${jaxb2-maven-plugin-version} - - - org.apache.maven.plugins - maven-plugin-plugin - ${maven-plugin-plugin-version} - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin-version} - - - ${camel.osgi.manifest} - - - - - org.apache.cxf - cxf-codegen-plugin - ${cxf-codegen-plugin-version} - - once - - true - 1 - - true - - - - - xerces - xercesImpl - ${xerces-version} - - - - - org.apache.maven.plugins - maven-antrun-plugin - ${maven-antrun-plugin-version} - - - com.sun.xml.bind - jaxb-impl - ${jaxb-version} - - - com.sun.xml.bind - jaxb-jxc - ${jaxb-version} - - - ant-contrib - ant-contrib - 1.0b3 - - - ant - ant - - - - - org.apache.ant - ant-trax - 1.8.0 - - - org.apache.ant - ant-nodeps - 1.8.1 - - - org.apache.openjpa - openjpa-persistence-jdbc - ${openjpa-version} - - - ant - ant - - - - - - - org.apache.maven.plugins - maven-archetype-plugin - ${maven-archetype-plugin-version} - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${maven-checkstyle-plugin-version} - - - org.apache.camel - camel-buildtools - ${project.version} - - - com.puppycrawl.tools - checkstyle - ${maven-checkstyle-version} - - - - - default-cli - validate - - false - camel-checkstyle.xml - true - ${checkstyle.failOnViolation} - false - camel-checkstyle-suppressions.xml - UTF-8 - - ${basedir}/src - - header-java.txt - **/*.java,**/*.groovy,**/*.scala,**/*.properties,**/*.xml,**/*.xsd - - **/archetype-resources/**/*.java,**/archetype-resources/**/*.groovy,**/archetype-resources/**/*.scala,**/archetype-resources/**/*.xml,**/org/json/simple/**/*.java - - - - checkstyle - - - - - - org.apache.maven.plugins - maven-clean-plugin - - - - - activemq-data - false - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin-version} - - ${jdk.version} - ${jdk.version} - 512M - ${compiler.fork} - true - true - - - -parameters - - - - - org.apache.maven.plugins - maven-eclipse-plugin - - - org.eclipse.jdt.core.javabuilder - net.sf.eclipsecs.core.CheckstyleBuilder - - - org.eclipse.jdt.core.javanature - net.sf.eclipsecs.core.CheckstyleNature - - - - .checkstyle - /camel-eclipse-checkstyle - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - true - ${jdk.version} - true - Apache Camel - false - 1.8.0 - UTF-8 - - - - org.apache.maven.plugins - maven-resources-plugin - ${maven-resources-plugin-version} - - UTF-8 - - - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin-version} - - - org.apache.maven.plugins - maven-source-plugin - - - - ${project.groupId}.${project.artifactId}.source - - ${camel.osgi.version.clean} - - ${project.groupId}.${project.artifactId};version="${camel.osgi.version.clean}" - - - - - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin-version} - - - - - ${project.build.outputDirectory} - - META-INF/LICENSE* - META-INF/NOTICE* - META-INF/DEPENDENCIES* - - - - - - - org.apache.maven.plugins - maven-surefire-report-plugin - ${maven-surefire-report-plugin-version} - - - org.apache.servicemix.tooling - depends-maven-plugin - 1.2 - - - org.apache.tomcat.maven - tomcat7-maven-plugin - 2.1 - - / - true - - - - org.codehaus.mojo - build-helper-maven-plugin - ${build-helper-maven-plugin-version} - - - org.codehaus.mojo - cobertura-maven-plugin - ${cobertura-maven-plugin-version} - - - 85 - 85 - false - 85 - 85 - 85 - 85 - - - org.apache.camel.impl.* - 90 - 80 - - - org.apache.camel.builder.* - 40 - 30 - - - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin-version} - - - org.codehaus.mojo - findbugs-maven-plugin - ${findbugs-maven-plugin-version} - - - org.codehaus.mojo - properties-maven-plugin - ${properties-maven-plugin-version} - - - org.codehaus.mojo - tomcat-maven-plugin - 1.1 - - / - - - - org.jvnet.jaxb2.maven2 - maven-jaxb2-plugin - 0.8.3 - - - - generate - - - - - false - true - - -Xfluent-api - - - - net.java.dev.jaxb2-commons - jaxb-fluent-api - 2.1.8 - - - - - - xerces - xercesImpl - ${xerces-version} - - - - - ${jetty-runner-groupId} - jetty-maven-plugin - ${jetty-plugin-version} - - - org.owasp - dependency-check-maven - ${maven-owasp-plugin-version} - - 16 - false - false - true - true - ALL - - - - validate - - aggregate - - - - - - - org.eclipse.m2e - lifecycle-mapping - ${lifecycle-mapping-version} - - - - - - org.apache.maven.plugins - maven-remote-resources-plugin - ${maven-remote-resources-plugin-version} - - process - - - - - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin-version} - - - + + impsort + - - - org.apache.maven.plugins - maven-site-plugin - - - attach-descriptor - - - - - - - org.apache.maven.plugins - maven-enforcer-plugin - - - enforce-maven-version - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin-version} + + net.revelc.code + impsort-maven-plugin + ${impsort-maven-plugin-version} + + + sort-imports + + sort + + process-sources - -XX:+ExitOnOutOfMemoryError - - 300 - false - true - false - alphabetical - - 2 - - file,http,https - file,http - target/derby.log - ${java.awt.headless} - ${basedir}/target/test-classes/logging.properties - - target/ - - - - **/*Test.java - - - **/*IntegrationTest.java - **/*XXXTest.* - + java.,javax.,org.w3c.,org.xml.,junit.,* + **/package-info.java + true + true - + + + - + + - + + sourcecheck + - - org.codehaus.mojo - cobertura-maven-plugin - ${cobertura-maven-plugin-version} - - - html - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${maven-checkstyle-plugin-version} - - - org.apache.maven.plugins - maven-surefire-report-plugin - ${maven-surefire-report-plugin-version} - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven-javadoc-plugin-version} - - - http://docs.oracle.com/javase/8/docs/api/ - http://docs.oracle.com/javaee/7/api/ - http://docs.spring.io/spring/docs/${spring-version}/javadoc-api/ - - ${basedir}/../../etc/css/stylesheet.css - true - 500m - ${jdk.version} - - - - org.codehaus.mojo - findbugs-maven-plugin - ${findbugs-maven-plugin-version} - - - org.owasp - dependency-check-maven - ${maven-owasp-plugin-version} - + + org.apache.maven.plugins + maven-checkstyle-plugin + - - - - - - nochecks - - true - - - - - fastinstall - - - fastinstall - - - - true - true - true - true - - - - - impsort - - - - net.revelc.code - impsort-maven-plugin - ${impsort-maven-plugin-version} - - - sort-imports - - sort - - process-sources - - java.,javax.,org.w3c.,org.xml.,junit.,* - **/package-info.java - true - true - - - - - - - - - - sourcecheck - - - - org.apache.maven.plugins - maven-checkstyle-plugin - - - - + + - - revapi - - - - org.revapi - revapi-maven-plugin - ${revapi-maven-plugin-version} - - - org.revapi - revapi-java - ${revapi-java-version} - - - - - ${project.basedir}/src/revapi/ignore.json - - - - - - check - - - - - - - + + revapi + + + + org.revapi + revapi-maven-plugin + ${revapi-maven-plugin-version} + + + org.revapi + revapi-java + ${revapi-java-version} + + + + + ${project.basedir}/src/revapi/ignore.json + + + + + + check + + + + + + + - - dependencycheck - - - - org.owasp - dependency-check-maven - - - - + + dependencycheck + + + + org.owasp + dependency-check-maven + + + + - - errorprone - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin-version} - - ${jdk.version} - ${jdk.version} - 512M - ${compiler.fork} - javac-with-errorprone - true - - - - org.codehaus.plexus - plexus-compiler-javac-errorprone - ${errorprone-version} - - - - - - + + errorprone + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin-version} + + ${jdk.version} + ${jdk.version} + 512M + ${compiler.fork} + javac-with-errorprone + true + + + + org.codehaus.plexus + plexus-compiler-javac-errorprone + ${errorprone-version} + + + + + + - - cleanrepo - - build-helper:remove-project-artifact - - + + cleanrepo + + build-helper:remove-project-artifact + + - - setup.eclipse - - process-test-sources - - - org.apache.maven.plugins - maven-eclipse-plugin - true - - - org.apache.camel - camel-buildtools - ${project.version} - - - - - setup.eclipse.project - process-test-sources - - eclipse - - - - - - - + + setup.eclipse + + process-test-sources + + + org.apache.maven.plugins + maven-eclipse-plugin + true + + + org.apache.camel + camel-buildtools + ${project.version} + + + + + setup.eclipse.project + process-test-sources + + eclipse + + + + + + + - - integration - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin-version} - - 300 - false - true - false - alphabetical - 0 - - target/derby.log - ${java.awt.headless} - - - **/*Test.* - **/*IntegrationTest.* - - - **/*XXXTest.* - - - - - - + + integration + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin-version} + + 300 + false + true + false + alphabetical + 0 + + target/derby.log + ${java.awt.headless} + + + **/*Test.* + **/*IntegrationTest.* + + + **/*XXXTest.* + + + + + + - - partial-build - - - partial-build - - + + partial-build + + + partial-build + + - - - - com.lesfurets - partial-build-plugin - ${partial-build-plugin-version} - true - - - - + + + + com.lesfurets + partial-build-plugin + ${partial-build-plugin-version} + true + + + + - - - - Linux - - - - - - maven-surefire-plugin - ${maven-surefire-plugin-version} - - - - file:///dev/urandom - - - - - - + + + + Linux + + + + + + maven-surefire-plugin + ${maven-surefire-plugin-version} + + + + file:///dev/urandom + + + + + + - - jdk9+-build - - [9,) - - - true - - - - - - org.codehaus.mojo - jaxb2-maven-plugin - - - jakarta.xml.bind - jakarta.xml.bind-api - ${jakarta-jaxb-version} - - - - - org.apache.camel - camel-package-maven-plugin - - - jakarta.xml.bind - jakarta.xml.bind-api - ${jakarta-jaxb-version} - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin-version} - - ${jdk.version} - ${jdk.version} - 512M - true - true - true - - - - maven-surefire-plugin - - - ${camel.surefire.fork.vmargs} - - - - - - - - javax.annotation - javax.annotation-api - ${javax-annotation-api-version} - - - javax.xml.ws - jaxws-api - 2.3.0 - - - javax.xml.bind - jaxb-api - - - - - jakarta.xml.bind - jakarta.xml.bind-api - ${jakarta-jaxb-version} - - - org.apache.geronimo.specs - geronimo-ws-metadata_2.0_spec - ${geronimo-ws-metadata-spec-version} - - - com.sun.xml.messaging.saaj - saaj-impl - 1.3.28 - - - javax.xml.soap - javax.xml.soap-api - - - - org.jvnet.staxex - stax-ex - - - - - org.apache.geronimo.specs - geronimo-jta_1.1_spec - - - org.jboss.spec.javax.rmi - jboss-rmi-api_1.0_spec - 1.0.6.Final - + + jdk9+-build + + [9,) + + + true + + + + + + org.codehaus.mojo + jaxb2-maven-plugin + - org.glassfish.jaxb - jaxb-runtime - ${glassfish-jaxb-runtime-version} + jakarta.xml.bind + jakarta.xml.bind-api + ${jakarta-jaxb-version} + + + + org.apache.camel + camel-package-maven-plugin + - javax.xml.soap - javax.xml.soap-api - 1.4.0 + jakarta.xml.bind + jakarta.xml.bind-api + ${jakarta-jaxb-version} - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin-version} + + ${jdk.version} + ${jdk.version} + 512M + true + true + true + + + + maven-surefire-plugin + + + ${camel.surefire.fork.vmargs} + + + + + + + + javax.annotation + javax.annotation-api + ${javax-annotation-api-version} + + + javax.xml.ws + jaxws-api + 2.3.0 + + + javax.xml.bind + jaxb-api + + + + + jakarta.xml.bind + jakarta.xml.bind-api + ${jakarta-jaxb-version} + + + org.apache.geronimo.specs + geronimo-ws-metadata_2.0_spec + ${geronimo-ws-metadata-spec-version} + + + com.sun.xml.messaging.saaj + saaj-impl + 1.3.28 + + + javax.xml.soap + javax.xml.soap-api + + + + org.jvnet.staxex + stax-ex + + + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + + + org.jboss.spec.javax.rmi + jboss-rmi-api_1.0_spec + 1.0.6.Final + + + org.glassfish.jaxb + jaxb-runtime + ${glassfish-jaxb-runtime-version} + + + javax.xml.soap + javax.xml.soap-api + 1.4.0 + + + + From 819ccdcbba9b5eb6d69580dea35ed8d438621820 Mon Sep 17 00:00:00 2001 From: Ruben Date: Thu, 16 Jul 2020 21:02:48 -0500 Subject: [PATCH 2/4] Unify tracing class Signed-off-by: Ruben --- bom/camel-bom/pom.xml | 10 +- camel-dependencies/pom.xml | 9 +- components/camel-opentelemetry/pom.xml | 22 +- ...per.java => OpenTelemetrySpanAdapter.java} | 71 +- .../opentelemetry/OpenTelemetryTracer.java | 265 +- .../propagators/OpenTelemetryGetter.java | 9 +- .../propagators/OpenTelemetrySetter.java | 9 +- .../org.apache.camel.tracing.SpanDecorator | 55 + .../src/test/resources/log4j2.properties | 29 + .../OpenTelemetrySimpleRouteTest.xml | 52 + components/camel-opentracing/pom.xml | 1 + .../opentracing/GetBaggageProcessor.java | 5 +- .../OpenTracingExtractAdapter.java | 9 +- .../opentracing/OpenTracingInjectAdapter.java | 9 +- ...apper.java => OpenTracingSpanAdapter.java} | 72 +- .../camel/opentracing/OpenTracingTracer.java | 370 +- .../OpenTracingTracingStrategy.java | 7 +- .../opentracing/SetBaggageProcessor.java | 4 +- .../camel/opentracing/TagProcessor.java | 4 +- .../CamelOpenTracingTestSupport.java | 7 +- .../ClientRecipientListRouteTest.java | 1 - .../CustomComponentNameRouteTest.java | 1 - .../opentracing/EIPTracingRouteTest.java | 5 - .../MulticastParallelRouteTest.java | 1 - .../camel/opentracing/MulticastRouteTest.java | 1 - .../opentracing/RouteConcurrentTest.java | 1 - .../camel/opentracing/SpanProcessorsTest.java | 1 - .../opentracing/TestSEDASpanDecorator.java | 8 +- .../TracingClientRecipientListRouteTest.java | 1 - .../TracingMulticastParallelRouteTest.java | 1 - .../camel/opentracing/TwoServiceTest.java | 1 - .../TwoServiceWithExcludeTest.java | 1 - .../org.apache.camel.tracing.SpanDecorator | 18 - components/camel-tracing/pom.xml | 21 +- .../src/generated/resources/tracing.json | 4 +- .../camel/tracing}/ActiveSpanManager.java | 16 +- ...xtractAdapter.java => ExtractAdapter.java} | 5 +- ...sInjectAdapter.java => InjectAdapter.java} | 5 +- .../{SpanWrap.java => SpanAdapter.java} | 14 +- .../apache/camel/tracing/SpanDecorator.java | 16 +- .../org/apache/camel/tracing/SpanKind.java | 3 - .../java/org/apache/camel/tracing/Tag.java | 29 + .../java/org/apache/camel/tracing/Tracer.java | 345 ++ .../decorators/AbstractHttpSpanDecorator.java | 27 +- .../AbstractMessagingSpanDecorator.java | 18 +- .../decorators/AbstractSpanDecorator.java | 18 +- .../tracing/decorators/CqlSpanDecorator.java | 15 +- .../ElasticsearchSpanDecorator.java | 11 +- .../tracing/decorators/JdbcSpanDecorator.java | 10 +- .../decorators/KafkaSpanDecorator.java | 4 +- .../decorators/MongoDBSpanDecorator.java | 14 +- .../tracing/decorators/RestSpanDecorator.java | 4 +- .../tracing/decorators/SqlSpanDecorator.java | 9 +- .../CamelHeadersExtractAdapter.java | 4 +- .../CamelHeadersInjectAdapter.java | 4 +- .../CamelMessagingHeadersExtractAdapter.java | 4 +- .../CamelMessagingHeadersInjectAdapter.java | 4 +- .../camel/tracing}/ActiveSpanManagerTest.java | 18 +- .../apache/camel/tracing/MockSpanAdapter.java | 98 + .../AbstractHttpSpanDecoratorTest.java | 280 ++ .../AbstractMessagingSpanDecoratorTest.java | 109 + .../decorators/AbstractSpanDecoratorTest.java | 140 + .../decorators/AwsSnsSpanDecoratorTest.java | 42 + .../decorators/AwsSqsSpanDecoratorTest.java | 42 + .../decorators/CometdSpanDecoratorTest.java | 37 + .../decorators/CqlSpanDecoratorTest.java | 80 + .../ElasticsearchSpanDecoratorTest.java | 69 + .../decorators/IronmqSpanDecoratorTest.java | 42 + .../decorators/JdbcSpanDecoratorTest.java | 54 + .../decorators/JmsSpanDecoratorTest.java | 42 + .../decorators/KafkaSpanDecoratorTest.java | 113 + .../decorators/MongoDBSpanDecoratorTest.java | 73 + .../decorators/RestSpanDecoratorTest.java | 98 + .../decorators/SqlSpanDecoratorTest.java | 54 + .../decorators/StompSpanDecoratorTest.java | 38 + .../decorators/TimerSpanDecoratorTest.java | 47 + ...melMessagingHeadersExtractAdapterTest.java | 74 + ...amelMessagingHeadersInjectAdapterTest.java | 61 + components/pom.xml | 19 +- .../endpoint/StaticEndpointBuilders.java | 4 +- parent/pom.xml | 4422 ++++++++--------- 81 files changed, 4640 insertions(+), 3080 deletions(-) rename components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/{OpenTelemetrySpanWrapper.java => OpenTelemetrySpanAdapter.java} (64%) create mode 100644 components/camel-opentelemetry/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator create mode 100644 components/camel-opentelemetry/src/test/resources/log4j2.properties create mode 100644 components/camel-opentelemetry/src/test/resources/org/apache/camel/opentelemetry/OpenTelemetrySimpleRouteTest.xml rename components/camel-opentracing/src/main/java/org/apache/camel/opentracing/{OpenTracingSpanWrapper.java => OpenTracingSpanAdapter.java} (52%) delete mode 100644 components/camel-opentracing/src/test/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator rename components/{camel-opentracing/src/main/java/org/apache/camel/opentracing => camel-tracing/src/main/java/org/apache/camel/tracing}/ActiveSpanManager.java (90%) rename components/camel-tracing/src/main/java/org/apache/camel/tracing/{HeadersExtractAdapter.java => ExtractAdapter.java} (93%) rename components/camel-tracing/src/main/java/org/apache/camel/tracing/{HeadersInjectAdapter.java => InjectAdapter.java} (92%) rename components/camel-tracing/src/main/java/org/apache/camel/tracing/{SpanWrap.java => SpanAdapter.java} (77%) create mode 100644 components/camel-tracing/src/main/java/org/apache/camel/tracing/Tag.java create mode 100644 components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java rename components/{camel-opentracing/src/test/java/org/apache/camel/opentracing => camel-tracing/src/test/java/org/apache/camel/tracing}/ActiveSpanManagerTest.java (84%) create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/MockSpanAdapter.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSnsSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSqsSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CometdSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CqlSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/IronmqSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JdbcSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JmsSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/KafkaSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/MongoDBSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/RestSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/SqlSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/StompSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/TimerSpanDecoratorTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapterTest.java create mode 100644 components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapterTest.java diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml index 9c20af50dd705..a5c1517e6f5dc 100644 --- a/bom/camel-bom/pom.xml +++ b/bom/camel-bom/pom.xml @@ -1343,6 +1343,11 @@ camel-openstack ${project.version} + + org.apache.camel + camel-opentelemetry + ${project.version} + org.apache.camel camel-opentracing @@ -1738,11 +1743,6 @@ camel-telegram ${project.version} - - org.apache.camel - camel-telemetry - ${project.version} - org.apache.camel camel-test diff --git a/camel-dependencies/pom.xml b/camel-dependencies/pom.xml index bb0147d069621..7e62ff9615bdf 100644 --- a/camel-dependencies/pom.xml +++ b/camel-dependencies/pom.xml @@ -100,10 +100,10 @@ [$(version;==;$(@)),$(version;+;$(@))) org.apache.camel.*;${camel.osgi.import.camel.version}, - ${camel.osgi.import.before.defaults}, - ${camel.osgi.import.defaults}, - ${camel.osgi.import.additional}, - * + ${camel.osgi.import.before.defaults}, + ${camel.osgi.import.defaults}, + ${camel.osgi.import.additional}, + * version="[$(version;===;${camel.osgi.version.clean}),$(version;==+;${camel.osgi.version.clean}))" ${project.build.outputDirectory}/META-INF/MANIFEST.MF !* @@ -459,6 +459,7 @@ 4.7.1 3.1.2 3.0.2 + 0.6.0 0.1.8 0.33.0 1.7.3 diff --git a/components/camel-opentelemetry/pom.xml b/components/camel-opentelemetry/pom.xml index 65b28177c6b8a..5fb6c075a997e 100644 --- a/components/camel-opentelemetry/pom.xml +++ b/components/camel-opentelemetry/pom.xml @@ -51,23 +51,39 @@ io.grpc grpc-netty-shaded - 1.28.0 + ${grpc-version} io.opentelemetry opentelemetry-sdk - 0.6.0 + ${opentelemetry-version} io.opentelemetry opentelemetry-api - 0.6.0 + ${opentelemetry-version} io.opentelemetry opentelemetry-exporters-otlp + ${opentelemetry-version} + + + org.apache.logging.log4j + log4j-slf4j-impl + test + + + org.apache.camel + camel-test-spring-junit5 + test + + + io.opentelemetry + opentelemetry-exporters-inmemory 0.6.0 + \ No newline at end of file diff --git a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanWrapper.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanAdapter.java similarity index 64% rename from components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanWrapper.java rename to components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanAdapter.java index 14e92977ffac0..b6243c30b1704 100644 --- a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanWrapper.java +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanAdapter.java @@ -16,61 +16,56 @@ */ package org.apache.camel.opentelemetry; -import java.util.*; +import java.util.EnumMap; +import java.util.Map; import io.opentelemetry.common.AttributeValue; import io.opentelemetry.common.Attributes; -import io.opentelemetry.trace.Span; import io.opentelemetry.trace.attributes.SemanticAttributes; -import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.Tag; -/** - * @author rvargasp - */ -public class OpenTelemetrySpanWrapper implements SpanWrap { +public class OpenTelemetrySpanAdapter implements SpanAdapter { private static final String DEFAULT_EVENT_NAME = "log"; - Span span; + private static EnumMap tagMap = new EnumMap<>(Tag.class); - OpenTelemetrySpanWrapper(Span span) { - this.span = span; + static { + tagMap.put(Tag.COMPONENT, "component"); + tagMap.put(Tag.DB_TYPE, SemanticAttributes.DB_TYPE.key()); + tagMap.put(Tag.DB_STATEMENT, SemanticAttributes.DB_STATEMENT.key()); + tagMap.put(Tag.DB_INSTANCE, SemanticAttributes.DB_INSTANCE.key()); + tagMap.put(Tag.HTTP_METHOD, SemanticAttributes.HTTP_METHOD.key()); + tagMap.put(Tag.HTTP_STATUS, SemanticAttributes.HTTP_STATUS_CODE.key()); + tagMap.put(Tag.HTTP_URL, SemanticAttributes.HTTP_URL.key()); + tagMap.put(Tag.MESSAGE_BUS_DESTINATION, "message_bus.destination"); } - @Override public void setComponent(String component) { - this.span.setAttribute("component", component); - } - - @Override public void setHttpStatus(Integer status) { - this.span.setAttribute(SemanticAttributes.HTTP_STATUS_CODE.key(), status.longValue()); - } - @Override public void setHttpMethod(String method) { - this.span.setAttribute(SemanticAttributes.HTTP_METHOD.key(), method); + io.opentelemetry.trace.Span span; + OpenTelemetrySpanAdapter(io.opentelemetry.trace.Span span) { + this.span = span; } - @Override public void setHttpURL(String url) { - this.span.setAttribute(SemanticAttributes.HTTP_URL.key(), url); + io.opentelemetry.trace.Span getOpenTelemetrySpan() { + return this.span; } - @Override public void setMessageBusDestination(String dest) { - this.span.setAttribute("message.destination", dest); + @Override public void setComponent(String component) { + this.span.setAttribute("component", component); } @Override public void setError(boolean error) { this.span.setAttribute("error", error); } - @Override public void setDBType(String type) { - this.span.setAttribute(SemanticAttributes.DB_TYPE.key(), type); + @Override public void setTag(Tag key, String value) { + this.span.setAttribute(tagMap.get(key), value); } - @Override public void setDBInstance(String instance) { - this.span.setAttribute(SemanticAttributes.DB_INSTANCE.key(), instance); - } - - @Override public void setDBStatement(String statement) { - this.span.setAttribute(SemanticAttributes.DB_STATEMENT.key(), statement); + @Override public void setTag(Tag key, Number value) { + this.span.setAttribute(tagMap.get(key), value.intValue()); } @Override public void setTag(String key, String value) { @@ -89,6 +84,7 @@ public class OpenTelemetrySpanWrapper implements SpanWrap { span.addEvent(getEventNameFromFields(fields), convertToAttributes(fields)); } + String getEventNameFromFields(Map fields) { Object eventValue = fields == null ? null : fields.get("event"); if (eventValue != null) { @@ -97,6 +93,7 @@ String getEventNameFromFields(Map fields) { return DEFAULT_EVENT_NAME; } + Attributes convertToAttributes(Map fields) { Attributes.Builder attributesBuilder = Attributes.newBuilder(); @@ -107,14 +104,12 @@ Attributes convertToAttributes(Map fields) { continue; } if (value instanceof Byte - || value instanceof Short - || value instanceof Integer - || value instanceof Long) { - attributesBuilder.setAttribute( - key, AttributeValue.longAttributeValue(((Number) value).longValue())); + || value instanceof Short + || value instanceof Integer + || value instanceof Long) { + attributesBuilder.setAttribute(key, AttributeValue.longAttributeValue(((Number) value).longValue())); } else if (value instanceof Float || value instanceof Double) { - attributesBuilder.setAttribute( - key, AttributeValue.doubleAttributeValue(((Number) value).doubleValue())); + attributesBuilder.setAttribute(key, AttributeValue.doubleAttributeValue(((Number) value).doubleValue())); } else if (value instanceof Boolean) { attributesBuilder.setAttribute(key, AttributeValue.booleanAttributeValue((Boolean) value)); } else { diff --git a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java index a6021f4675d21..3decb8f403e4f 100644 --- a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java @@ -16,106 +16,23 @@ */ package org.apache.camel.opentelemetry; -import java.util.*; +import java.util.Set; import io.grpc.Context; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.context.ContextUtils; -import io.opentelemetry.context.Scope; +import io.opentelemetry.trace.DefaultTracer; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; -import org.apache.camel.CamelContext; -import org.apache.camel.CamelContextAware; -import org.apache.camel.Component; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.NamedNode; -import org.apache.camel.Route; -import org.apache.camel.StaticService; -import org.apache.camel.opentelemetry.propagators.OpenTelemetryGetter; +import org.apache.camel.api.management.ManagedResource; import org.apache.camel.opentelemetry.propagators.OpenTelemetrySetter; -import org.apache.camel.spi.CamelEvent; -import org.apache.camel.spi.CamelLogger; -import org.apache.camel.spi.LogListener; -import org.apache.camel.spi.RoutePolicy; -import org.apache.camel.spi.RoutePolicyFactory; -import org.apache.camel.support.DefaultEndpoint; -import org.apache.camel.support.EndpointHelper; -import org.apache.camel.support.EventNotifierSupport; -import org.apache.camel.support.RoutePolicySupport; -import org.apache.camel.support.service.ServiceSupport; -import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.InjectAdapter; +import org.apache.camel.tracing.SpanAdapter; import org.apache.camel.tracing.SpanKind; -import org.apache.camel.util.StringHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -/** - * @author rvargasp - */ - -public class OpenTelemetryTracer extends ServiceSupport -implements RoutePolicyFactory, StaticService, CamelContextAware { - - private static final Map DECORATORS = new HashMap<>(); - private static final Logger LOG = LoggerFactory.getLogger(OpenTelemetryTracer.class); +@ManagedResource(description = "OpenTelemetryTracer") +public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer { - static { - ServiceLoader.load(SpanDecorator.class).forEach(d -> { - SpanDecorator existing = DECORATORS.get(d.getComponent()); - // Add span decorator if no existing decorator for the component, - // or if derived from the existing decorator's class, allowing - // custom decorators to be added if they extend the standard - // decorators - if (existing == null || existing.getClass().isInstance(d)) { - DECORATORS.put(d.getComponent(), d); - } - }); - } - - private final OpenTelemetryEventNotifier eventNotifier = new OpenTelemetryEventNotifier(); private Tracer tracer; - private CamelContext camelContext; - private boolean encoding; - private Set excludePatterns = new HashSet<>(); - - protected SpanDecorator getSpanDecorator(Endpoint endpoint) { - SpanDecorator sd = null; - - String uri = endpoint.getEndpointUri(); - String splitURI[] = StringHelper.splitOnCharacter(uri, ":", 2); - if (splitURI[1] != null) { - String scheme = splitURI[0]; - sd = DECORATORS.get(scheme); - } - if (sd == null) { - // okay there was no decorator found via component name (scheme), then try FQN - if (endpoint instanceof DefaultEndpoint) { - Component comp = ((DefaultEndpoint) endpoint).getComponent(); - String fqn = comp.getClass().getName(); - // lookup via FQN - sd = DECORATORS.values().stream().filter(d -> fqn.equals(d.getComponentClassName())).findFirst() - .orElse(null); - } - } - if (sd == null) { - sd = SpanDecorator.DEFAULT; - } - - return sd; - } - - public Set getExcludePatterns() { - return excludePatterns; - } - - public void setExcludePatterns(Set excludePatterns) { - this.excludePatterns = excludePatterns; - } - - public void addExcludePattern(String pattern) { - excludePatterns.add(pattern); - } public Tracer getTracer() { return tracer; @@ -125,32 +42,6 @@ public void setTracer(Tracer tracer) { this.tracer = tracer; } - @Override public CamelContext getCamelContext() { - return camelContext; - } - - @Override public void setCamelContext(CamelContext camelContext) { - this.camelContext = camelContext; - } - - @Override public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) { - return new OpenTelemetryRoutePolicy(); - - } - - @Override protected void doInit() throws Exception { - camelContext.getManagementStrategy().addEventNotifier(eventNotifier); - if (!camelContext.getRoutePolicyFactories().contains(this)) { - camelContext.addRoutePolicyFactory(this); - } - if (tracer == null) { - Set tracers = camelContext.getRegistry().findByType(Tracer.class); - if (tracers.size() == 1) { - tracer = tracers.iterator().next(); - } - } - } - private Span.Kind mapToSpanKind(SpanKind kind) { if (kind == SpanKind.SPAN_KIND_CLIENT) { return Span.Kind.CLIENT; @@ -158,122 +49,52 @@ private Span.Kind mapToSpanKind(SpanKind kind) { return Span.Kind.SERVER; } - private boolean isExcluded(Exchange exchange, Endpoint endpoint) { - String url = endpoint.getEndpointUri(); - if (url != null && !excludePatterns.isEmpty()) { - for (String pattern : excludePatterns) { - if (EndpointHelper.matchEndpoint(exchange.getContext(), url, pattern)) { - return true; - } - } - } - return false; - } - - private final class OpenTelemetryEventNotifier extends EventNotifierSupport { - - private void handleExchangeSendingEvent(CamelEvent.ExchangeSendingEvent e) { - Span parent = tracer.getCurrentSpan(); - if (parent != null) { - tracer.withSpan(parent); - } - Span span = tracer.spanBuilder("operation").startSpan(); - SpanDecorator sd = getSpanDecorator(e.getEndpoint()); - if (!sd.newSpan() || isExcluded(e.getExchange(), e.getEndpoint())) { - return; - } - sd.pre(new OpenTelemetrySpanWrapper(span), e.getExchange(), e.getEndpoint()); - OpenTelemetry.getPropagators().getHttpTextFormat().inject(Context.current(), - sd.getInjectAdapter(e.getExchange().getIn().getHeaders(), encoding), new OpenTelemetrySetter()); - if (LOG.isTraceEnabled()) { - LOG.trace("OpenTracing: start client span={}", span); - } - } - - - private void handleExchangeSentEvent(CamelEvent.ExchangeSentEvent e) { - Span span = tracer.getCurrentSpan(); - SpanDecorator sd = getSpanDecorator(e.getEndpoint()); - if (!sd.newSpan() || isExcluded(e.getExchange(), e.getEndpoint())) { - return; - } - if (span != null) { - sd.post(new OpenTelemetrySpanWrapper(span), e.getExchange(), e.getEndpoint()); - span.end(); - } else { - LOG.warn("OpenTelemetry: could not find managed span for exchange={}", e.getExchange()); - } - } - - @Override - public void notify(CamelEvent event) throws Exception { - try { - if (event instanceof CamelEvent.ExchangeSendingEvent) { - CamelEvent.ExchangeSendingEvent ese = (CamelEvent.ExchangeSendingEvent) event; - handleExchangeSendingEvent(ese); - - } else if (event instanceof CamelEvent.ExchangeSentEvent) { - CamelEvent.ExchangeSentEvent ese = (CamelEvent.ExchangeSentEvent) event; - handleExchangeSentEvent(ese); - } - } catch (Throwable t) { - LOG.warn("OpenTracing: Failed to capture tracing data", t); + @Override + protected void initTracer() { + if (tracer == null) { + Set tracers = getCamelContext().getRegistry().findByType(Tracer.class); + if (tracers.size() == 1) { + tracer = tracers.iterator().next(); } } - @Override - public boolean isEnabled(CamelEvent event) { - return event instanceof CamelEvent.ExchangeSendingEvent || event instanceof CamelEvent.ExchangeSentEvent; + if (tracer == null) { + // No tracer is available, so setup NoopTracer + tracer = DefaultTracer.getInstance(); } + } - @Override - public String toString() { - return "OpenTelemetryEventNotifier"; + @Override + protected SpanAdapter startSendingEventSpan(String operationName, SpanKind kind, SpanAdapter parent) { + Span.Builder builder = tracer.spanBuilder(operationName).setSpanKind(mapToSpanKind(kind)); + if (parent != null) { + OpenTelemetrySpanAdapter oTelSpanWrapper = (OpenTelemetrySpanAdapter) parent; + Span parentSpan = oTelSpanWrapper.getOpenTelemetrySpan(); + builder = builder.setParent(parentSpan); } + return new OpenTelemetrySpanAdapter(builder.startSpan()); } - private final class OpenTelemetryRoutePolicy extends RoutePolicySupport { - @Override - public void onExchangeBegin(Route route, Exchange exchange) { - SpanDecorator sd = getSpanDecorator(route.getEndpoint()); - - Context extractedContext = OpenTelemetry.getPropagators().getHttpTextFormat().extract(Context.current(), - sd.getExtractAdapter(exchange.getIn().getHeaders(), encoding), new OpenTelemetryGetter()); - try (Scope scope = ContextUtils.withScopedContext(extractedContext)) { - Span span = tracer.spanBuilder(sd.getOperationName(exchange, route.getEndpoint())) - .setSpanKind(mapToSpanKind(sd.getReceiverSpanKind())).startSpan(); - sd.pre(new OpenTelemetrySpanWrapper(span), exchange, route.getEndpoint()); - if (LOG.isTraceEnabled()) { - LOG.trace("OpenTelemetry: start server span={}", span); - } - } + @Override + protected SpanAdapter startExchangeBeginSpan(String operationName, SpanKind kind, SpanAdapter parent) { + Span.Builder builder = tracer.spanBuilder(operationName); + if (parent != null) { + OpenTelemetrySpanAdapter oTelSpanWrapper = (OpenTelemetrySpanAdapter) parent; + builder = builder.setParent(((OpenTelemetrySpanAdapter) parent).getOpenTelemetrySpan()); } - @Override - public void onExchangeDone(Route route, Exchange exchange) { - try { - Span span = tracer.getCurrentSpan(); - if (span != null) { - if (LOG.isTraceEnabled()) { - LOG.trace("OpenTracing: finish server span={}", span); - } - SpanDecorator sd = getSpanDecorator(route.getEndpoint()); - sd.post(new OpenTelemetrySpanWrapper(span), exchange, route.getEndpoint()); - span.end(); - } else { - LOG.warn("OpenTracing: could not find managed span for exchange={}", exchange); - } - } catch (Throwable t) { - // This exception is ignored - LOG.warn("OpenTracing: Failed to capture tracing data", t); - } - } + return new OpenTelemetrySpanAdapter(builder.startSpan()); + } - private final class OpenTracingLogListener implements LogListener { + @Override + protected void finishSpan(SpanAdapter span) { + OpenTelemetrySpanAdapter openTracingSpanWrapper = (OpenTelemetrySpanAdapter) span; + openTracingSpanWrapper.getOpenTelemetrySpan().end(); + } - @Override public String onLog(Exchange exchange, CamelLogger camelLogger, String message) { - return null; - } - } + @Override + protected void inject(SpanAdapter span, InjectAdapter adapter) { + OpenTelemetry.getPropagators().getHttpTextFormat().inject(Context.current(), adapter, new OpenTelemetrySetter()); } -} \ No newline at end of file + +} diff --git a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java index f8b6bb48af6e5..3193b590e36e8 100644 --- a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java @@ -19,14 +19,11 @@ import javax.annotation.Nullable; import io.opentelemetry.context.propagation.HttpTextFormat; -import org.apache.camel.tracing.HeadersExtractAdapter; +import org.apache.camel.tracing.ExtractAdapter; -/** - * @author rvargasp - */ -public class OpenTelemetryGetter implements HttpTextFormat.Getter { +public class OpenTelemetryGetter implements HttpTextFormat.Getter { - @Nullable @Override public String get(HeadersExtractAdapter adapter, String key) { + @Nullable @Override public String get(ExtractAdapter adapter, String key) { return (String) adapter.get(key); } } diff --git a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetrySetter.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetrySetter.java index 8dc7d5d77f9c6..1ad5a5f981af8 100644 --- a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetrySetter.java +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetrySetter.java @@ -19,13 +19,10 @@ import javax.annotation.Nullable; import io.opentelemetry.context.propagation.HttpTextFormat; -import org.apache.camel.tracing.HeadersInjectAdapter; +import org.apache.camel.tracing.InjectAdapter; -/** - * @author rvargasp - */ -public class OpenTelemetrySetter implements HttpTextFormat.Setter { - @Override public void set(@Nullable HeadersInjectAdapter adapter, String key, String value) { +public class OpenTelemetrySetter implements HttpTextFormat.Setter { + @Override public void set(@Nullable InjectAdapter adapter, String key, String value) { adapter.put(key, value); } } diff --git a/components/camel-opentelemetry/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator b/components/camel-opentelemetry/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator new file mode 100644 index 0000000000000..2d8ec83446e1e --- /dev/null +++ b/components/camel-opentelemetry/src/main/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator @@ -0,0 +1,55 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +org.apache.camel.tracing.decorators.AhcSpanDecorator +org.apache.camel.tracing.decorators.AmqpSpanDecorator +org.apache.camel.tracing.decorators.AwsSqsSpanDecorator +org.apache.camel.tracing.decorators.AwsSnsSpanDecorator +org.apache.camel.tracing.decorators.CometdSpanDecorator +org.apache.camel.tracing.decorators.CometdsSpanDecorator +org.apache.camel.tracing.decorators.CqlSpanDecorator +org.apache.camel.tracing.decorators.DirectSpanDecorator +org.apache.camel.tracing.decorators.DirectvmSpanDecorator +org.apache.camel.tracing.decorators.DisruptorSpanDecorator +org.apache.camel.tracing.decorators.DisruptorvmSpanDecorator +org.apache.camel.tracing.decorators.ElasticsearchSpanDecorator +org.apache.camel.tracing.decorators.HttpSpanDecorator +org.apache.camel.tracing.decorators.HttpsSpanDecorator +org.apache.camel.tracing.decorators.IronmqSpanDecorator +org.apache.camel.tracing.decorators.JdbcSpanDecorator +org.apache.camel.tracing.decorators.JettySpanDecorator +org.apache.camel.tracing.decorators.JmsSpanDecorator +org.apache.camel.tracing.decorators.KafkaSpanDecorator +org.apache.camel.tracing.decorators.LogSpanDecorator +org.apache.camel.tracing.decorators.MongoDBSpanDecorator +org.apache.camel.tracing.decorators.NettyHttpSpanDecorator +org.apache.camel.tracing.decorators.NatsSpanDecorator +org.apache.camel.tracing.decorators.NsqSpanDecorator +org.apache.camel.tracing.decorators.PahoSpanDecorator +org.apache.camel.tracing.decorators.PlatformHttpSpanDecorator +org.apache.camel.tracing.decorators.RabbitmqSpanDecorator +org.apache.camel.tracing.decorators.RestSpanDecorator +org.apache.camel.tracing.decorators.SedaSpanDecorator +org.apache.camel.tracing.decorators.ServletSpanDecorator +org.apache.camel.tracing.decorators.SjmsSpanDecorator +org.apache.camel.tracing.decorators.Sjms2SpanDecorator +org.apache.camel.tracing.decorators.SqlSpanDecorator +org.apache.camel.tracing.decorators.StompSpanDecorator +org.apache.camel.tracing.decorators.TimerSpanDecorator +org.apache.camel.tracing.decorators.UndertowSpanDecorator +org.apache.camel.tracing.decorators.VmSpanDecorator + diff --git a/components/camel-opentelemetry/src/test/resources/log4j2.properties b/components/camel-opentelemetry/src/test/resources/log4j2.properties new file mode 100644 index 0000000000000..ae9e53005926f --- /dev/null +++ b/components/camel-opentelemetry/src/test/resources/log4j2.properties @@ -0,0 +1,29 @@ +## --------------------------------------------------------------------------- +## Licensed to the Apache Software Foundation (ASF) under one or more +## contributor license agreements. See the NOTICE file distributed with +## this work for additional information regarding copyright ownership. +## The ASF licenses this file to You under the Apache License, Version 2.0 +## (the "License"); you may not use this file except in compliance with +## the License. You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## --------------------------------------------------------------------------- +appender.file.type=File +appender.file.name=file +appender.file.fileName=target/camel-opentracing-test.log +appender.file.layout.type=PatternLayout +appender.file.layout.pattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n +appender.out.type=Console +appender.out.name=out +appender.out.layout.type=PatternLayout +appender.out.layout.pattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n +logger.opentracing.name=org.apache.camel.opentracing +logger.opentracing.level=INFO +rootLogger.level=INFO +rootLogger.appenderRef.file.ref=file diff --git a/components/camel-opentelemetry/src/test/resources/org/apache/camel/opentelemetry/OpenTelemetrySimpleRouteTest.xml b/components/camel-opentelemetry/src/test/resources/org/apache/camel/opentelemetry/OpenTelemetrySimpleRouteTest.xml new file mode 100644 index 0000000000000..ab190dc8178a5 --- /dev/null +++ b/components/camel-opentelemetry/src/test/resources/org/apache/camel/opentelemetry/OpenTelemetrySimpleRouteTest.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + ${random(1000,2000)} + + + + + + + + ${random(1000,2000)} + + + + + diff --git a/components/camel-opentracing/pom.xml b/components/camel-opentracing/pom.xml index 02a6d3ed29fbe..f8907963a419b 100644 --- a/components/camel-opentracing/pom.xml +++ b/components/camel-opentracing/pom.xml @@ -51,6 +51,7 @@ camel-base provided + org.apache.camel camel-tracing diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/GetBaggageProcessor.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/GetBaggageProcessor.java index 5878be9b2574b..ce0cdcc387386 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/GetBaggageProcessor.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/GetBaggageProcessor.java @@ -19,11 +19,11 @@ import io.opentracing.Span; import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; -import org.apache.camel.Expression; import org.apache.camel.Traceable; import org.apache.camel.spi.IdAware; import org.apache.camel.spi.RouteIdAware; import org.apache.camel.support.AsyncProcessorSupport; +import org.apache.camel.tracing.ActiveSpanManager; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,7 +50,8 @@ public GetBaggageProcessor(String baggageName, String headerName) { @Override public boolean process(Exchange exchange, AsyncCallback callback) { try { - Span span = ActiveSpanManager.getSpan(exchange); + OpenTracingSpanAdapter camelSpan = (OpenTracingSpanAdapter) ActiveSpanManager.getSpan(exchange); + Span span = camelSpan.getOpenTracingSpan(); if (span != null) { String item = span.getBaggageItem(baggageName); exchange.getMessage().setHeader(headerName, item); diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingExtractAdapter.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingExtractAdapter.java index 5c73e9306f5f6..d1bd9950acca5 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingExtractAdapter.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingExtractAdapter.java @@ -19,15 +19,12 @@ import java.util.*; import io.opentracing.propagation.TextMap; -import org.apache.camel.tracing.HeadersExtractAdapter; +import org.apache.camel.tracing.ExtractAdapter; -/** - * @author rvargasp - */ public class OpenTracingExtractAdapter implements TextMap { - HeadersExtractAdapter adapter; + ExtractAdapter adapter; - OpenTracingExtractAdapter(HeadersExtractAdapter adapter) { + OpenTracingExtractAdapter(ExtractAdapter adapter) { this.adapter = adapter; } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingInjectAdapter.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingInjectAdapter.java index c96aa975ba3d4..f29b4a420b71e 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingInjectAdapter.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingInjectAdapter.java @@ -19,15 +19,12 @@ import java.util.*; import io.opentracing.propagation.TextMap; -import org.apache.camel.tracing.HeadersInjectAdapter; +import org.apache.camel.tracing.InjectAdapter; -/** - * @author rvargasp - */ public class OpenTracingInjectAdapter implements TextMap { - private final HeadersInjectAdapter adapter; + private final InjectAdapter adapter; - OpenTracingInjectAdapter(final HeadersInjectAdapter adapter) { + OpenTracingInjectAdapter(final InjectAdapter adapter) { this.adapter = adapter; } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanWrapper.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanAdapter.java similarity index 52% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanWrapper.java rename to components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanAdapter.java index 928d5414ad096..d15a9cfa559e9 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanWrapper.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanAdapter.java @@ -16,57 +16,54 @@ */ package org.apache.camel.opentracing; -import java.util.*; +import java.util.EnumMap; +import java.util.Map; -import io.opentracing.Span; +import io.opentracing.tag.AbstractTag; import io.opentracing.tag.Tags; -import org.apache.camel.tracing.SpanWrap; - -/** - * @author rvargasp - */ -public class OpenTracingSpanWrapper implements SpanWrap { - - Span span; - - OpenTracingSpanWrapper(Span span) { - this.span = span; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.Tag; + +public class OpenTracingSpanAdapter implements SpanAdapter { + + static EnumMap tagMap = new EnumMap<>(Tag.class); + + static { + tagMap.put(Tag.COMPONENT, Tags.COMPONENT); + tagMap.put(Tag.DB_TYPE, Tags.DB_TYPE); + tagMap.put(Tag.DB_STATEMENT, Tags.DB_STATEMENT); + tagMap.put(Tag.DB_INSTANCE, Tags.DB_INSTANCE); + tagMap.put(Tag.HTTP_METHOD, Tags.HTTP_METHOD); + tagMap.put(Tag.HTTP_STATUS, Tags.HTTP_STATUS); + tagMap.put(Tag.HTTP_URL, Tags.HTTP_URL); + tagMap.put(Tag.ERROR, Tags.ERROR); + tagMap.put(Tag.MESSAGE_BUS_DESTINATION, Tags.MESSAGE_BUS_DESTINATION); } - @Override public void setComponent(String component) { - span.setTag(Tags.COMPONENT.getKey(), component); - } + private io.opentracing.Span span; - @Override public void setHttpStatus(Integer responseCode) { - span.setTag(Tags.HTTP_STATUS.getKey(), responseCode); - } - - @Override public void setHttpMethod(String method) { - span.setTag(Tags.HTTP_METHOD.getKey(), method); + OpenTracingSpanAdapter(io.opentracing.Span span) { + this.span = span; } - @Override public void setHttpURL(String httpUrl) { - span.setTag(Tags.HTTP_URL.getKey(), httpUrl); + public io.opentracing.Span getOpenTracingSpan() { + return this.span; } - @Override public void setMessageBusDestination(String dest) { - span.setTag(Tags.MESSAGE_BUS_DESTINATION.getKey(), dest); + @Override public void setComponent(String component) { + span.setTag(Tags.COMPONENT.getKey(), component); } @Override public void setError(boolean error) { - span.setTag(Tags.ERROR.getKey(), error); + span.setTag(Tags.ERROR, error); } - @Override public void setDBType(String type) { - span.setTag(Tags.DB_TYPE.getKey(), type); + @Override public void setTag(Tag key, String value) { + span.setTag(tagMap.get(key), value); } - @Override public void setDBInstance(String instance) { - span.setTag(Tags.DB_INSTANCE.getKey(), instance); - } - - @Override public void setDBStatement(String statement) { - span.setTag(Tags.DB_STATEMENT.getKey(), statement); + @Override public void setTag(Tag key, Number value) { + span.setTag(tagMap.get(key), value); } @Override public void setTag(String key, String value) { @@ -81,7 +78,8 @@ public class OpenTracingSpanWrapper implements SpanWrap { span.setTag(key, value); } - @Override public void log(Map log) { - + @Override public void log(Map fields) { + this.span.log(fields); } + } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java index 258a94d766874..c15efced145c9 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java @@ -16,49 +16,23 @@ */ package org.apache.camel.opentracing; -import java.util.*; +import java.util.Set; -import io.opentracing.Span; import io.opentracing.Tracer; import io.opentracing.Tracer.SpanBuilder; import io.opentracing.contrib.tracerresolver.TracerResolver; import io.opentracing.noop.NoopTracerFactory; import io.opentracing.propagation.Format; import io.opentracing.tag.Tags; -import org.apache.camel.CamelContext; -import org.apache.camel.CamelContextAware; -import org.apache.camel.Component; -import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.ExtendedCamelContext; -import org.apache.camel.NamedNode; -import org.apache.camel.Route; -import org.apache.camel.RuntimeCamelException; -import org.apache.camel.StaticService; import org.apache.camel.api.management.ManagedResource; -import org.apache.camel.tracing.decorators.AbstractInternalSpanDecorator; -import org.apache.camel.spi.CamelEvent; -import org.apache.camel.spi.CamelEvent.ExchangeSendingEvent; -import org.apache.camel.spi.CamelEvent.ExchangeSentEvent; -import org.apache.camel.spi.CamelLogger; -import org.apache.camel.spi.InterceptStrategy; -import org.apache.camel.spi.LogListener; import org.apache.camel.spi.RoutePolicy; -import org.apache.camel.spi.RoutePolicyFactory; -import org.apache.camel.support.DefaultEndpoint; -import org.apache.camel.support.EndpointHelper; -import org.apache.camel.support.EventNotifierSupport; -import org.apache.camel.support.RoutePolicySupport; -import org.apache.camel.support.service.ServiceHelper; -import org.apache.camel.support.service.ServiceSupport; -import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.InjectAdapter; +import org.apache.camel.tracing.SpanAdapter; import org.apache.camel.tracing.SpanKind; -import org.apache.camel.util.ObjectHelper; -import org.apache.camel.util.StringHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - /** * To use OpenTracing with Camel then setup this {@link OpenTracingTracer} in * your Camel application. @@ -71,143 +45,26 @@ * {@link org.apache.camel.spi.EventNotifier}. */ @ManagedResource(description = "OpenTracingTracer") -public class OpenTracingTracer extends ServiceSupport implements RoutePolicyFactory, StaticService, CamelContextAware { +public class OpenTracingTracer extends org.apache.camel.tracing.Tracer { private static final Logger LOG = LoggerFactory.getLogger(OpenTracingTracer.class); - private static final Map DECORATORS = new HashMap<>(); - - static { - ServiceLoader.load(SpanDecorator.class).forEach(d -> { - SpanDecorator existing = DECORATORS.get(d.getComponent()); - // Add span decorator if no existing decorator for the component, - // or if derived from the existing decorator's class, allowing - // custom decorators to be added if they extend the standard - // decorators - if (existing == null || existing.getClass().isInstance(d)) { - DECORATORS.put(d.getComponent(), d); - } - }); - } - private final OpenTracingEventNotifier eventNotifier = new OpenTracingEventNotifier(); - private final OpenTracingLogListener logListener = new OpenTracingLogListener(); - private Tracer tracer; - private CamelContext camelContext; - private Set excludePatterns = new HashSet<>(0); - private InterceptStrategy tracingStrategy; - private boolean encoding; + Tracer tracer; public OpenTracingTracer() { } - /** - * To add a custom decorator that does not come out of the box with camel-opentracing. - */ - public void addDecorator(SpanDecorator decorator) { - DECORATORS.put(decorator.getComponent(), decorator); - } - - @Override - public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) { - // ensure this opentracing tracer gets initialized when Camel starts - init(camelContext); - return new OpenTracingRoutePolicy(routeId); - } - - /** - * Registers this {@link OpenTracingTracer} on the {@link CamelContext} if - * not already registered. - */ - public void init(CamelContext camelContext) { - if (!camelContext.hasService(this)) { - try { - // start this service eager so we init before Camel is starting up - camelContext.addService(this, true, true); - } catch (Exception e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); - } + private String mapToSpanKind(SpanKind kind) { + if (kind == SpanKind.SPAN_KIND_CLIENT) { + return Tags.SPAN_KIND_CLIENT; } + return Tags.SPAN_KIND_SERVER; } - @Override - public CamelContext getCamelContext() { - return camelContext; - } - - @Override - public void setCamelContext(CamelContext camelContext) { - this.camelContext = camelContext; - } - - /** - * Returns the currently used tracing strategy which is responsible for tracking invoked EIP or - * beans. - * - * @return The currently used tracing strategy - */ - public InterceptStrategy getTracingStrategy() { - return tracingStrategy; - } - - /** - * Specifies the instance responsible for tracking invoked EIP and beans with OpenTracing. - * - * @param tracingStrategy The instance which tracks invoked EIP and beans - */ - public void setTracingStrategy(InterceptStrategy tracingStrategy) { - this.tracingStrategy = tracingStrategy; - } - - public Set getExcludePatterns() { - return excludePatterns; - } - - public void setExcludePatterns(Set excludePatterns) { - this.excludePatterns = excludePatterns; - } - - public boolean isEncoding() { - return encoding; - } - - public void setEncoding(boolean encoding) { - this.encoding = encoding; - } - - /** - * Adds an exclude pattern that will disable tracing for Camel messages that - * matches the pattern. - * - * @param pattern the pattern such as route id, endpoint url - */ - public void addExcludePattern(String pattern) { - excludePatterns.add(pattern); - } - - public Tracer getTracer() { - return tracer; - } - - public void setTracer(Tracer tracer) { - this.tracer = tracer; - } - - @Override - protected void doInit() throws Exception { - ObjectHelper.notNull(camelContext, "CamelContext", this); - - camelContext.getManagementStrategy().addEventNotifier(eventNotifier); - if (!camelContext.getRoutePolicyFactories().contains(this)) { - camelContext.addRoutePolicyFactory(this); - } - camelContext.adapt(ExtendedCamelContext.class).addLogListener(logListener); - - if (tracingStrategy != null) { - camelContext.adapt(ExtendedCamelContext.class).addInterceptStrategy(tracingStrategy); - } + protected void initTracer() { if (tracer == null) { - Set tracers = camelContext.getRegistry().findByType(Tracer.class); + Set tracers = getCamelContext().getRegistry().findByType(Tracer.class); if (tracers.size() == 1) { tracer = tracers.iterator().next(); } @@ -222,8 +79,6 @@ protected void doInit() throws Exception { tracer = NoopTracerFactory.create(); } - ServiceHelper.startService(eventNotifier); - if (tracer != null) { try { // Take care NOT to import GlobalTracer as it is an optional dependency and may not be on the classpath. io.opentracing.util.GlobalTracer.registerIfAbsent(tracer); @@ -233,199 +88,38 @@ protected void doInit() throws Exception { } } - private String mapToSpanKind(SpanKind kind) { - if (kind == SpanKind.SPAN_KIND_CLIENT) { - return Tags.SPAN_KIND_CLIENT; + @Override protected SpanAdapter startSendingEventSpan(String operationName, SpanKind kind, SpanAdapter parent) { + SpanBuilder spanBuilder = tracer.buildSpan(operationName).withTag(Tags.SPAN_KIND.getKey(), mapToSpanKind(kind)); + if (parent != null) { + io.opentracing.Span parentSpan = ((OpenTracingSpanAdapter) parent).getOpenTracingSpan(); + spanBuilder.asChildOf(parentSpan); } - return Tags.SPAN_KIND_SERVER; + return new OpenTracingSpanAdapter(spanBuilder.start()); } - @Override - protected void doShutdown() throws Exception { - // stop event notifier - camelContext.getManagementStrategy().removeEventNotifier(eventNotifier); - ServiceHelper.stopService(eventNotifier); - - // remove route policy - camelContext.getRoutePolicyFactories().remove(this); - } - - protected SpanDecorator getSpanDecorator(Endpoint endpoint) { - SpanDecorator sd = null; - - String uri = endpoint.getEndpointUri(); - String splitURI[] = StringHelper.splitOnCharacter(uri, ":", 2); - if (splitURI[1] != null) { - String scheme = splitURI[0]; - sd = DECORATORS.get(scheme); + @Override protected SpanAdapter startExchangeBeginSpan(String operationName, SpanKind kind, SpanAdapter parent) { + SpanBuilder spanBuilder = tracer.buildSpan(operationName); + if (parent != null) { + spanBuilder.asChildOf(((OpenTracingSpanAdapter) parent).getOpenTracingSpan()); } - if (sd == null) { - // okay there was no decorator found via component name (scheme), then try FQN - if (endpoint instanceof DefaultEndpoint) { - Component comp = ((DefaultEndpoint) endpoint).getComponent(); - String fqn = comp.getClass().getName(); - // lookup via FQN - sd = DECORATORS.values().stream().filter(d -> fqn.equals(d.getComponentClassName())).findFirst() - .orElse(null); - } - } - if (sd == null) { - sd = SpanDecorator.DEFAULT; - } - - return sd; + return new OpenTracingSpanAdapter(spanBuilder.start()); } - private boolean isExcluded(Exchange exchange, Endpoint endpoint) { - String url = endpoint.getEndpointUri(); - if (url != null && !excludePatterns.isEmpty()) { - for (String pattern : excludePatterns) { - if (EndpointHelper.matchEndpoint(exchange.getContext(), url, pattern)) { - return true; - } - } - } - return false; + public Tracer getTracer() { + return tracer; } - private final class OpenTracingEventNotifier extends EventNotifierSupport { - - @Override - public void notify(CamelEvent event) throws Exception { - try { - if (event instanceof ExchangeSendingEvent) { - ExchangeSendingEvent ese = (ExchangeSendingEvent) event; - SpanDecorator sd = getSpanDecorator(ese.getEndpoint()); - if (sd instanceof AbstractInternalSpanDecorator || !sd.newSpan() || isExcluded(ese.getExchange(), ese.getEndpoint())) { - return; - } - Span parent = ActiveSpanManager.getSpan(ese.getExchange()); - SpanBuilder spanBuilder = - tracer.buildSpan(sd.getOperationName(ese.getExchange(), ese.getEndpoint())) - .withTag(Tags.SPAN_KIND.getKey(), - mapToSpanKind(sd.getInitiatorSpanKind())); - // Temporary workaround to avoid adding 'null' span as a - // parent - if (parent != null) { - spanBuilder.asChildOf(parent); - } - Span span = spanBuilder.start(); - sd.pre(new OpenTracingSpanWrapper(span), ese.getExchange(), ese.getEndpoint()); - tracer.inject(span.context(), Format.Builtin.TEXT_MAP, - new OpenTracingInjectAdapter(sd.getInjectAdapter(ese.getExchange().getIn().getHeaders(), encoding))); - ActiveSpanManager.activate(ese.getExchange(), span); - - if (LOG.isTraceEnabled()) { - LOG.trace("OpenTracing: start client span={}", span); - } - } else if (event instanceof ExchangeSentEvent) { - ExchangeSentEvent ese = (ExchangeSentEvent) event; - SpanDecorator sd = getSpanDecorator(ese.getEndpoint()); - if (sd instanceof AbstractInternalSpanDecorator || !sd.newSpan() || isExcluded(ese.getExchange(), ese.getEndpoint())) { - return; - } - Span span = ActiveSpanManager.getSpan(ese.getExchange()); - if (span != null) { - if (LOG.isTraceEnabled()) { - LOG.trace("OpenTracing: start client span={}", span); - } - sd.post(new OpenTracingSpanWrapper(span), ese.getExchange(), ese.getEndpoint()); - span.finish(); - ActiveSpanManager.deactivate(ese.getExchange()); - } else { - LOG.warn("OpenTracing: could not find managed span for exchange={}", ese.getExchange()); - } - } - } catch (Throwable t) { - // This exception is ignored - LOG.warn("OpenTracing: Failed to capture tracing data", t); - } - } - - @Override - public boolean isEnabled(CamelEvent event) { - return event instanceof ExchangeSendingEvent || event instanceof ExchangeSentEvent; - } - - @Override - public String toString() { - return "OpenTracingEventNotifier"; - } + public void setTracer(Tracer tracer) { + this.tracer = tracer; } - private final class OpenTracingRoutePolicy extends RoutePolicySupport { - - OpenTracingRoutePolicy(String routeId) { - } - - @Override - public void onExchangeBegin(Route route, Exchange exchange) { - try { - if (isExcluded(exchange, route.getEndpoint())) { - return; - } - SpanDecorator sd = getSpanDecorator(route.getEndpoint()); - Span parent = ActiveSpanManager.getSpan(exchange); - Span span = tracer.buildSpan(sd.getOperationName(exchange, route.getEndpoint())) - .asChildOf(parent) - .start(); - - if (parent == null && !(sd instanceof AbstractInternalSpanDecorator)) { - span.setTag(Tags.SPAN_KIND.getKey(), mapToSpanKind(sd.getInitiatorSpanKind())); - } - - sd.pre(new OpenTracingSpanWrapper(span), exchange, route.getEndpoint()); - ActiveSpanManager.activate(exchange, span); - if (LOG.isTraceEnabled()) { - LOG.trace("OpenTracing: start server span={}", span); - } - } catch (Throwable t) { - // This exception is ignored - LOG.warn("OpenTracing: Failed to capture tracing data", t); - } - } - - @Override - public void onExchangeDone(Route route, Exchange exchange) { - try { - if (isExcluded(exchange, route.getEndpoint())) { - return; - } - Span span = ActiveSpanManager.getSpan(exchange); - if (span != null) { - if (LOG.isTraceEnabled()) { - LOG.trace("OpenTracing: finish server span={}", span); - } - SpanDecorator sd = getSpanDecorator(route.getEndpoint()); - sd.post(new OpenTracingSpanWrapper(span), exchange, route.getEndpoint()); - span.finish(); - ActiveSpanManager.deactivate(exchange); - } else { - LOG.warn("OpenTracing: could not find managed span for exchange={}", exchange); - } - } catch (Throwable t) { - // This exception is ignored - LOG.warn("OpenTracing: Failed to capture tracing data", t); - } - } + protected void finishSpan(SpanAdapter span) { + OpenTracingSpanAdapter openTracingSpanWrapper = (OpenTracingSpanAdapter) span; + openTracingSpanWrapper.getOpenTracingSpan().finish(); } - private final class OpenTracingLogListener implements LogListener { - - @Override - public String onLog(Exchange exchange, CamelLogger camelLogger, String message) { - try { - Span span = ActiveSpanManager.getSpan(exchange); - if (span != null) { - Map fields = new HashMap<>(); - fields.put("message", message); - span.log(fields); - } - } catch (Throwable t) { - // This exception is ignored - LOG.warn("OpenTracing: Failed to capture tracing data", t); - } - return message; - } + protected void inject(SpanAdapter span, InjectAdapter adapter) { + OpenTracingSpanAdapter openTracingSpanWrapper = (OpenTracingSpanAdapter) span; + tracer.inject(openTracingSpanWrapper.getOpenTracingSpan().context(), Format.Builtin.TEXT_MAP, new OpenTracingInjectAdapter(adapter)); } } diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracingStrategy.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracingStrategy.java index 2112e4c66e229..16aa69653d48e 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracingStrategy.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracingStrategy.java @@ -30,6 +30,8 @@ import org.apache.camel.spi.InterceptStrategy; import org.apache.camel.support.PatternHelper; import org.apache.camel.support.processor.DelegateAsyncProcessor; +import org.apache.camel.tracing.ActiveSpanManager; +import org.apache.camel.tracing.SpanDecorator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,7 +54,8 @@ public Processor wrapProcessorInInterceptors(CamelContext camelContext, } return new DelegateAsyncProcessor((Exchange exchange) -> { - Span span = ActiveSpanManager.getSpan(exchange); + OpenTracingSpanAdapter spanWrapper = (OpenTracingSpanAdapter) ActiveSpanManager.getSpan(exchange); + Span span = spanWrapper.getOpenTracingSpan(); if (span == null) { target.process(exchange); return; @@ -69,7 +72,7 @@ public Processor wrapProcessorInInterceptors(CamelContext camelContext, || target instanceof SetBaggageProcessor); if (activateExchange) { - ActiveSpanManager.activate(exchange, processorSpan); + ActiveSpanManager.activate(exchange, new OpenTracingSpanAdapter(processorSpan)); } try (final Scope inScope = tracer.getTracer().activateSpan(processorSpan)) { diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/SetBaggageProcessor.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/SetBaggageProcessor.java index 84658dde406b7..4c0bbdbad70d6 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/SetBaggageProcessor.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/SetBaggageProcessor.java @@ -24,6 +24,7 @@ import org.apache.camel.spi.IdAware; import org.apache.camel.spi.RouteIdAware; import org.apache.camel.support.AsyncProcessorSupport; +import org.apache.camel.tracing.ActiveSpanManager; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,7 +51,8 @@ public SetBaggageProcessor(String baggageName, Expression expression) { @Override public boolean process(Exchange exchange, AsyncCallback callback) { try { - Span span = ActiveSpanManager.getSpan(exchange); + OpenTracingSpanAdapter camelSpan = (OpenTracingSpanAdapter) ActiveSpanManager.getSpan(exchange); + Span span = camelSpan.getOpenTracingSpan(); if (span != null) { String item = expression.evaluate(exchange, String.class); span.setBaggageItem(baggageName, item); diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/TagProcessor.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/TagProcessor.java index acf03f36fdb4e..b72bde75bcfb5 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/TagProcessor.java +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/TagProcessor.java @@ -24,6 +24,7 @@ import org.apache.camel.spi.IdAware; import org.apache.camel.spi.RouteIdAware; import org.apache.camel.support.AsyncProcessorSupport; +import org.apache.camel.tracing.ActiveSpanManager; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,7 +51,8 @@ public TagProcessor(String tagName, Expression expression) { @Override public boolean process(Exchange exchange, AsyncCallback callback) { try { - Span span = ActiveSpanManager.getSpan(exchange); + OpenTracingSpanAdapter camelSpan = (OpenTracingSpanAdapter) ActiveSpanManager.getSpan(exchange); + Span span = camelSpan.getOpenTracingSpan(); if (span != null) { String tag = expression.evaluate(exchange, String.class); span.setTag(tagName, tag); diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CamelOpenTracingTestSupport.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CamelOpenTracingTestSupport.java index d80b6cf3e76f9..a6c3a88e69e60 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CamelOpenTracingTestSupport.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CamelOpenTracingTestSupport.java @@ -34,12 +34,12 @@ import org.apache.camel.CamelContext; import org.apache.camel.spi.InterceptStrategy; import org.apache.camel.test.junit5.CamelTestSupport; +import org.apache.camel.tracing.SpanDecorator; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; - public class CamelOpenTracingTestSupport extends CamelTestSupport { protected OpenTracingTracer ottracer; @@ -65,9 +65,8 @@ protected CamelContext createCamelContext() throws Exception { ottracer.setTracer(tracer); ottracer.setExcludePatterns(getExcludePatterns()); ottracer.setTracingStrategy(getTracingStrategy()); - + ottracer.addDecorator(new TestSEDASpanDecorator()); ottracer.init(context); - return context; } @@ -140,7 +139,7 @@ protected void verifySpan(int index, SpanTestData[] testdata, List spa } assertEquals(td.getUri(), span.tags().get("camel.uri"), td.getLabel()); - // If span associated with TestSEDASpanDecorator, check that pre/post tags have been defined + // If span associated with org.apache.camel.opentracing.TestSEDASpanDecorator, check that pre/post tags have been defined if ("camel-seda".equals(component)) { assertTrue(span.tags().containsKey("pre")); assertTrue(span.tags().containsKey("post")); diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/ClientRecipientListRouteTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/ClientRecipientListRouteTest.java index c5f7cb9cd0d6c..96a0dbfed3bc6 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/ClientRecipientListRouteTest.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/ClientRecipientListRouteTest.java @@ -16,7 +16,6 @@ */ package org.apache.camel.opentracing; -import io.opentracing.tag.Tags; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.junit.jupiter.api.Test; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CustomComponentNameRouteTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CustomComponentNameRouteTest.java index 8912d056a5da9..0d9c9644aa03d 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CustomComponentNameRouteTest.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/CustomComponentNameRouteTest.java @@ -16,7 +16,6 @@ */ package org.apache.camel.opentracing; -import io.opentracing.tag.Tags; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.junit.jupiter.api.Test; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/EIPTracingRouteTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/EIPTracingRouteTest.java index 5310b4c8d5306..4db8359211c5b 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/EIPTracingRouteTest.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/EIPTracingRouteTest.java @@ -16,11 +16,6 @@ */ package org.apache.camel.opentracing; -import io.opentracing.Span; -import io.opentracing.tag.Tags; -import io.opentracing.util.GlobalTracer; -import org.apache.camel.Exchange; -import org.apache.camel.Processor; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.spi.InterceptStrategy; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/MulticastParallelRouteTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/MulticastParallelRouteTest.java index 90c394e29027c..661512bf850de 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/MulticastParallelRouteTest.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/MulticastParallelRouteTest.java @@ -16,7 +16,6 @@ */ package org.apache.camel.opentracing; -import io.opentracing.tag.Tags; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.junit.jupiter.api.Test; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/MulticastRouteTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/MulticastRouteTest.java index 1bee543800dfb..619f86aacbcb7 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/MulticastRouteTest.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/MulticastRouteTest.java @@ -16,7 +16,6 @@ */ package org.apache.camel.opentracing; -import io.opentracing.tag.Tags; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.junit.jupiter.api.Test; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/RouteConcurrentTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/RouteConcurrentTest.java index aa0a92710f398..4646ad899a278 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/RouteConcurrentTest.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/RouteConcurrentTest.java @@ -18,7 +18,6 @@ import java.util.concurrent.TimeUnit; -import io.opentracing.tag.Tags; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.NotifyBuilder; import org.apache.camel.builder.RouteBuilder; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/SpanProcessorsTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/SpanProcessorsTest.java index 52a6b82cd90ba..ca48c19cbcc82 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/SpanProcessorsTest.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/SpanProcessorsTest.java @@ -16,7 +16,6 @@ */ package org.apache.camel.opentracing; -import io.opentracing.tag.Tags; import org.apache.camel.Exchange; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TestSEDASpanDecorator.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TestSEDASpanDecorator.java index bb811117c9042..d8cdf61976f06 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TestSEDASpanDecorator.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TestSEDASpanDecorator.java @@ -16,23 +16,23 @@ */ package org.apache.camel.opentracing; -import io.opentracing.Span; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.tracing.SpanAdapter; import org.apache.camel.tracing.decorators.SedaSpanDecorator; public class TestSEDASpanDecorator extends SedaSpanDecorator { @Override - public void pre(Span span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); span.setTag("pre", "test"); } @Override - public void post(Span span, Exchange exchange, Endpoint endpoint) { + public void post(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.post(span, exchange, endpoint); span.setTag("post", "test"); } -} +} \ No newline at end of file diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TracingClientRecipientListRouteTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TracingClientRecipientListRouteTest.java index c5d1245ef1344..34b47a4453bad 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TracingClientRecipientListRouteTest.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TracingClientRecipientListRouteTest.java @@ -16,7 +16,6 @@ */ package org.apache.camel.opentracing; -import io.opentracing.tag.Tags; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.spi.InterceptStrategy; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TracingMulticastParallelRouteTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TracingMulticastParallelRouteTest.java index ade81c0fcd7dc..c0a9f800eba48 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TracingMulticastParallelRouteTest.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TracingMulticastParallelRouteTest.java @@ -16,7 +16,6 @@ */ package org.apache.camel.opentracing; -import io.opentracing.tag.Tags; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.spi.InterceptStrategy; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TwoServiceTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TwoServiceTest.java index 497dcaebfcfe2..e987ebcc45759 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TwoServiceTest.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TwoServiceTest.java @@ -16,7 +16,6 @@ */ package org.apache.camel.opentracing; -import io.opentracing.tag.Tags; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.junit.jupiter.api.Test; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TwoServiceWithExcludeTest.java b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TwoServiceWithExcludeTest.java index 497dc9553f36f..670c62f92fa3e 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TwoServiceWithExcludeTest.java +++ b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/TwoServiceWithExcludeTest.java @@ -19,7 +19,6 @@ import java.util.Collections; import java.util.Set; -import io.opentracing.tag.Tags; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.junit.jupiter.api.Test; diff --git a/components/camel-opentracing/src/test/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator b/components/camel-opentracing/src/test/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator deleted file mode 100644 index 403bde45a36e7..0000000000000 --- a/components/camel-opentracing/src/test/resources/META-INF/services/org.apache.camel.tracing.SpanDecorator +++ /dev/null @@ -1,18 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -org.apache.camel.opentracing.TestSEDASpanDecorator diff --git a/components/camel-tracing/pom.xml b/components/camel-tracing/pom.xml index 0ac10092589e2..6138e19e8fce6 100644 --- a/components/camel-tracing/pom.xml +++ b/components/camel-tracing/pom.xml @@ -29,17 +29,34 @@ - 2.9.0 + 3.5.0 camel-tracing jar Camel :: Common Tracing Distributed tracing common interfaces + + org.apache.camel camel-support + + org.apache.camel + camel-test-spring-junit5 + test + + + org.apache.logging.log4j + log4j-slf4j-impl + test + + + org.mockito + mockito-junit-jupiter + test + - \ No newline at end of file + diff --git a/components/camel-tracing/src/generated/resources/tracing.json b/components/camel-tracing/src/generated/resources/tracing.json index 27d17605f8030..6b36673be3b7a 100644 --- a/components/camel-tracing/src/generated/resources/tracing.json +++ b/components/camel-tracing/src/generated/resources/tracing.json @@ -5,8 +5,8 @@ "title": "Tracing", "description": "Distributed tracing common interfaces", "deprecated": false, - "firstVersion": "2.9.0", - "supportLevel": "Stable", + "firstVersion": "3.5.0", + "supportLevel": "Preview", "groupId": "org.apache.camel", "artifactId": "camel-tracing", "version": "3.5.0-SNAPSHOT" diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/ActiveSpanManager.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/ActiveSpanManager.java similarity index 90% rename from components/camel-opentracing/src/main/java/org/apache/camel/opentracing/ActiveSpanManager.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/ActiveSpanManager.java index be9dfa511e3c2..3d74cde08e783 100644 --- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/ActiveSpanManager.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/ActiveSpanManager.java @@ -14,9 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing; +package org.apache.camel.tracing; -import io.opentracing.Span; import org.apache.camel.Exchange; /** @@ -37,7 +36,7 @@ private ActiveSpanManager() { * @param exchange The exchange * @return The current active span, or null if none exists */ - public static Span getSpan(Exchange exchange) { + public static SpanAdapter getSpan(Exchange exchange) { Holder holder = (Holder) exchange.getProperty(ACTIVE_SPAN_PROPERTY); if (holder != null) { return holder.getSpan(); @@ -51,9 +50,9 @@ public static Span getSpan(Exchange exchange) { * onto a stack. * * @param exchange The exchange - * @param span The span + * @param span The span */ - public static void activate(Exchange exchange, Span span) { + public static void activate(Exchange exchange, SpanAdapter span) { exchange.setProperty(ACTIVE_SPAN_PROPERTY, new Holder((Holder) exchange.getProperty(ACTIVE_SPAN_PROPERTY), span)); } @@ -78,12 +77,13 @@ public static void deactivate(Exchange exchange) { * the parent holder. This will be used to maintain a stack for spans, built * up during the execution of a series of chained camel exchanges, and then * unwound when the responses are processed. + * */ public static class Holder { private Holder parent; - private Span span; + private SpanAdapter span; - public Holder(Holder parent, Span span) { + public Holder(Holder parent, SpanAdapter span) { this.parent = parent; this.span = span; } @@ -92,7 +92,7 @@ public Holder getParent() { return parent; } - public Span getSpan() { + public SpanAdapter getSpan() { return span; } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersExtractAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/ExtractAdapter.java similarity index 93% rename from components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersExtractAdapter.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/ExtractAdapter.java index db954468107f5..0cd426df58e41 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersExtractAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/ExtractAdapter.java @@ -19,10 +19,7 @@ import java.util.Iterator; import java.util.Map; -/** - * @author rvargasp - */ -public interface HeadersExtractAdapter { +public interface ExtractAdapter { Iterator> iterator(); Object get(String key); } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersInjectAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/InjectAdapter.java similarity index 92% rename from components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersInjectAdapter.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/InjectAdapter.java index ad7dea2a5e092..72f27dad39ee8 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/HeadersInjectAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/InjectAdapter.java @@ -16,9 +16,6 @@ */ package org.apache.camel.tracing; -/** - * @author rvargasp - */ -public interface HeadersInjectAdapter { +public interface InjectAdapter { void put(String key, String value); } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanWrap.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanAdapter.java similarity index 77% rename from components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanWrap.java rename to components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanAdapter.java index 107b07c41f17d..fae4f07bf2eaa 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanWrap.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanAdapter.java @@ -18,19 +18,11 @@ import java.util.Map; -/** - * @author rvargasp - */ -public interface SpanWrap { +public interface SpanAdapter { void setComponent(String component); - void setHttpStatus(Integer status); - void setHttpMethod(String method); - void setHttpURL(String url); - void setMessageBusDestination(String dest); void setError(boolean error); - void setDBType(String type); - void setDBInstance(String type); - void setDBStatement(String type); + void setTag(Tag key, String value); + void setTag(Tag key, Number value); void setTag(String key, String value); void setTag(String key, Number value); void setTag(String key, Boolean value); diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanDecorator.java index 18220c83a350e..1ac91c8662392 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanDecorator.java @@ -81,21 +81,21 @@ public String getComponentClassName() { * This method adds appropriate details (tags/logs) to the supplied span * based on the pre processing of the exchange. * - * @param span The span + * @param span The span * @param exchange The exchange * @param endpoint The endpoint */ - void pre(SpanWrap span, Exchange exchange, Endpoint endpoint); + void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint); /** * This method adds appropriate details (tags/logs) to the supplied span * based on the post processing of the exchange. * - * @param span The span + * @param span The span * @param exchange The exchange * @param endpoint The endpoint */ - void post(SpanWrap span, Exchange exchange, Endpoint endpoint); + void post(SpanAdapter span, Exchange exchange, Endpoint endpoint); /** * This method returns the 'span.kind' value for use when the component @@ -117,20 +117,20 @@ public String getComponentClassName() { * This method returns the map to be used for headers extraction * when the component is receiving a communication. * - * @param map a map containing the objects + * @param map a map containing the objects * @param encoding whether the headers are encoded * @return The extraction map */ - HeadersExtractAdapter getExtractAdapter(Map map, boolean encoding); + ExtractAdapter getExtractAdapter(Map map, boolean encoding); /** * This method returns the map to be used for headers injection * when the component is receiving a communication. * - * @param map a map containing the objects + * @param map a map containing the objects * @param encoding whether the headers are encoded * @return The injection map */ - HeadersInjectAdapter getInjectAdapter(Map map, boolean encoding); + InjectAdapter getInjectAdapter(Map map, boolean encoding); } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanKind.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanKind.java index 025873207849c..f2afa79518815 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanKind.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanKind.java @@ -16,9 +16,6 @@ */ package org.apache.camel.tracing; -/** - * @author rvargasp - */ public enum SpanKind { SPAN_KIND_CLIENT, SPAN_KIND_SERVER, diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tag.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tag.java new file mode 100644 index 0000000000000..26a838636def0 --- /dev/null +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tag.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing; + +public enum Tag { + COMPONENT, + HTTP_STATUS, + HTTP_METHOD, + HTTP_URL, + MESSAGE_BUS_DESTINATION, + DB_TYPE, + DB_INSTANCE, + DB_STATEMENT, + ERROR +} diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java new file mode 100644 index 0000000000000..b825f700ce6e7 --- /dev/null +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java @@ -0,0 +1,345 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.ServiceLoader; +import java.util.Set; + +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; +import org.apache.camel.Component; +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.ExtendedCamelContext; +import org.apache.camel.NamedNode; +import org.apache.camel.Route; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.StaticService; +import org.apache.camel.spi.CamelEvent; +import org.apache.camel.spi.CamelLogger; +import org.apache.camel.spi.InterceptStrategy; +import org.apache.camel.spi.LogListener; +import org.apache.camel.spi.RoutePolicy; +import org.apache.camel.spi.RoutePolicyFactory; +import org.apache.camel.support.DefaultEndpoint; +import org.apache.camel.support.EndpointHelper; +import org.apache.camel.support.EventNotifierSupport; +import org.apache.camel.support.RoutePolicySupport; +import org.apache.camel.support.service.ServiceHelper; +import org.apache.camel.support.service.ServiceSupport; +import org.apache.camel.tracing.decorators.AbstractInternalSpanDecorator; +import org.apache.camel.util.ObjectHelper; +import org.apache.camel.util.StringHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class Tracer extends ServiceSupport implements RoutePolicyFactory, StaticService, CamelContextAware { + protected static final Map DECORATORS = new HashMap<>(); + private static final Logger LOG = LoggerFactory.getLogger(Tracer.class); + + static { + ServiceLoader.load(SpanDecorator.class).forEach(d -> { + SpanDecorator existing = DECORATORS.get(d.getComponent()); + // Add span decorator if no existing decorator for the component, + // or if derived from the existing decorator's class, allowing + // custom decorators to be added if they extend the standard + // decorators + if (existing == null || existing.getClass().isInstance(d)) { + DECORATORS.put(d.getComponent(), d); + } + }); + } + + private final TracingLogListener logListener = new TracingLogListener(); + private final TracingEventNotifier eventNotifier = new TracingEventNotifier(); + private Set excludePatterns = new HashSet<>(0); + private InterceptStrategy tracingStrategy; + private boolean encoding; + private CamelContext camelContext; + + protected abstract void initTracer(); + + protected abstract SpanAdapter startSendingEventSpan(String operationName, SpanKind kind, SpanAdapter parent); + + protected abstract SpanAdapter startExchangeBeginSpan(String operationName, SpanKind kind, SpanAdapter parent); + + protected abstract void finishSpan(SpanAdapter span); + + protected abstract void inject(SpanAdapter span, InjectAdapter adapter); + + /** + * Returns the currently used tracing strategy which is responsible for tracking invoked EIP or + * beans. + * + * @return The currently used tracing strategy + */ + public InterceptStrategy getTracingStrategy() { + return tracingStrategy; + } + + /** + * Specifies the instance responsible for tracking invoked EIP and beans with OpenTracing. + * + * @param tracingStrategy The instance which tracks invoked EIP and beans + */ + public void setTracingStrategy(InterceptStrategy tracingStrategy) { + this.tracingStrategy = tracingStrategy; + } + + public void addDecorator(SpanDecorator decorator) { + DECORATORS.put(decorator.getComponent(), decorator); + } + + @Override + public CamelContext getCamelContext() { + return camelContext; + } + + @Override + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } + + public Set getExcludePatterns() { + return excludePatterns; + } + + public void setExcludePatterns(Set excludePatterns) { + this.excludePatterns = excludePatterns; + } + + public boolean isEncoding() { + return encoding; + } + + public void setEncoding(boolean encoding) { + this.encoding = encoding; + } + + /** + * Adds an exclude pattern that will disable tracing for Camel messages that + * matches the pattern. + * + * @param pattern the pattern such as route id, endpoint url + */ + public void addExcludePattern(String pattern) { + excludePatterns.add(pattern); + } + + @Override public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) { + init(camelContext); + return new TracingRoutePolicy(); + + } + + /** + * Registers this {@link Tracer} on the {@link CamelContext} if + * not already registered. + */ + public void init(CamelContext camelContext) { + if (!camelContext.hasService(this)) { + try { + // start this service eager so we init before Camel is starting up + camelContext.addService(this, true, true); + } catch (Exception e) { + throw RuntimeCamelException.wrapRuntimeCamelException(e); + } + } + } + + @Override protected void doInit() throws Exception { + ObjectHelper.notNull(camelContext, "CamelContext", this); + + camelContext.getManagementStrategy().addEventNotifier(eventNotifier); + if (!camelContext.getRoutePolicyFactories().contains(this)) { + camelContext.addRoutePolicyFactory(this); + } + camelContext.adapt(ExtendedCamelContext.class).addLogListener(logListener); + + if (tracingStrategy != null) { + camelContext.adapt(ExtendedCamelContext.class).addInterceptStrategy(tracingStrategy); + } + initTracer(); + ServiceHelper.startService(eventNotifier); + } + + @Override + protected void doShutdown() throws Exception { + // stop event notifier + camelContext.getManagementStrategy().removeEventNotifier(eventNotifier); + ServiceHelper.stopService(eventNotifier); + + // remove route policy + camelContext.getRoutePolicyFactories().remove(this); + } + + protected SpanDecorator getSpanDecorator(Endpoint endpoint) { + SpanDecorator sd = null; + + String uri = endpoint.getEndpointUri(); + String splitURI[] = StringHelper.splitOnCharacter(uri, ":", 2); + if (splitURI[1] != null) { + String scheme = splitURI[0]; + sd = DECORATORS.get(scheme); + } + if (sd == null) { + // okay there was no decorator found via component name (scheme), then try FQN + if (endpoint instanceof DefaultEndpoint) { + Component comp = ((DefaultEndpoint) endpoint).getComponent(); + String fqn = comp.getClass().getName(); + // lookup via FQN + sd = DECORATORS.values().stream().filter(d -> fqn.equals(d.getComponentClassName())).findFirst() + .orElse(null); + } + } + if (sd == null) { + sd = SpanDecorator.DEFAULT; + } + + return sd; + } + + private boolean isExcluded(Exchange exchange, Endpoint endpoint) { + String url = endpoint.getEndpointUri(); + if (url != null && !excludePatterns.isEmpty()) { + for (String pattern : excludePatterns) { + if (EndpointHelper.matchEndpoint(exchange.getContext(), url, pattern)) { + return true; + } + } + } + return false; + } + + private final class TracingEventNotifier extends EventNotifierSupport { + + @Override + public void notify(CamelEvent event) throws Exception { + try { + if (event instanceof CamelEvent.ExchangeSendingEvent) { + CamelEvent.ExchangeSendingEvent ese = (CamelEvent.ExchangeSendingEvent) event; + SpanDecorator sd = getSpanDecorator(ese.getEndpoint()); + if (sd instanceof AbstractInternalSpanDecorator || !sd.newSpan() || isExcluded(ese.getExchange(), ese.getEndpoint())) { + return; + } + SpanAdapter parent = ActiveSpanManager.getSpan(ese.getExchange()); + SpanAdapter span = startSendingEventSpan(sd.getOperationName(ese.getExchange(), ese.getEndpoint()), sd.getInitiatorSpanKind(), parent); + sd.pre(span, ese.getExchange(), ese.getEndpoint()); + inject(span, sd.getInjectAdapter(ese.getExchange().getIn().getHeaders(), encoding)); + ActiveSpanManager.activate(ese.getExchange(), span); + if (LOG.isTraceEnabled()) { + LOG.trace("OpenTracing: start client span={}", span); + } + } else if (event instanceof CamelEvent.ExchangeSentEvent) { + CamelEvent.ExchangeSentEvent ese = (CamelEvent.ExchangeSentEvent) event; + SpanDecorator sd = getSpanDecorator(ese.getEndpoint()); + if (sd instanceof AbstractInternalSpanDecorator || !sd.newSpan() || isExcluded(ese.getExchange(), ese.getEndpoint())) { + return; + } + SpanAdapter span = ActiveSpanManager.getSpan(ese.getExchange()); + if (span != null) { + if (LOG.isTraceEnabled()) { + LOG.trace("OpenTracing: start client span={}", span); + } + sd.post(span, ese.getExchange(), ese.getEndpoint()); + finishSpan(span); + ActiveSpanManager.deactivate(ese.getExchange()); + } else { + LOG.warn("Tracing: could not find managed span for exchange={}", ese.getExchange()); + } + } + } catch (Throwable t) { + // This exception is ignored + LOG.warn("OpenTracing: Failed to capture tracing data", t); + } + } + } + + private final class TracingRoutePolicy extends RoutePolicySupport { + + @Override + public void onExchangeBegin(Route route, Exchange exchange) { + try { + if (isExcluded(exchange, route.getEndpoint())) { + return; + } + SpanDecorator sd = getSpanDecorator(route.getEndpoint()); + SpanAdapter parent = ActiveSpanManager.getSpan(exchange); + SpanAdapter span; + if (parent == null && !(sd instanceof AbstractInternalSpanDecorator)) { + span = startExchangeBeginSpan(sd.getOperationName(exchange, route.getEndpoint()), sd.getReceiverSpanKind(), null); + } else { + span = startExchangeBeginSpan(sd.getOperationName(exchange, route.getEndpoint()), null, parent); + } + sd.pre(span, exchange, route.getEndpoint()); + ActiveSpanManager.activate(exchange, span); + if (LOG.isTraceEnabled()) { + LOG.trace("OpenTracing: start server span={}", span); + } + } catch (Throwable t) { + // This exception is ignored + LOG.warn("OpenTracing: Failed to capture tracing data", t); + } + } + + @Override + public void onExchangeDone(Route route, Exchange exchange) { + try { + if (isExcluded(exchange, route.getEndpoint())) { + return; + } + SpanAdapter span = ActiveSpanManager.getSpan(exchange); + if (span != null) { + if (LOG.isTraceEnabled()) { + LOG.trace("OpenTracing: finish server span={}", span); + } + SpanDecorator sd = getSpanDecorator(route.getEndpoint()); + sd.post(span, exchange, route.getEndpoint()); + finishSpan(span); + ActiveSpanManager.deactivate(exchange); + } else { + LOG.warn("OpenTracing: could not find managed span for exchange={}", exchange); + } + } catch (Throwable t) { + // This exception is ignored + LOG.warn("OpenTracing: Failed to capture tracing data", t); + } + } + } + + private final class TracingLogListener implements LogListener { + + @Override + public String onLog(Exchange exchange, CamelLogger camelLogger, String message) { + try { + SpanAdapter span = ActiveSpanManager.getSpan(exchange); + if (span != null) { + Map fields = new HashMap<>(); + fields.put("message", message); + span.log(fields); + } + } catch (Throwable t) { + // This exception is ignored + LOG.warn("OpenTracing: Failed to capture tracing data", t); + } + return message; + } + } +} diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecorator.java index 84fa8a694aaef..cbdc67b1f0bcd 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecorator.java @@ -19,24 +19,19 @@ import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.Message; -import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.Tag; public abstract class AbstractHttpSpanDecorator extends AbstractSpanDecorator { public static final String POST_METHOD = "POST"; public static final String GET_METHOD = "GET"; - @Override - public String getOperationName(Exchange exchange, Endpoint endpoint) { - // Based on HTTP component documentation: - return getHttpMethod(exchange, endpoint); - } - public static String getHttpMethod(Exchange exchange, Endpoint endpoint) { // 1. Use method provided in header. Object method = exchange.getIn().getHeader(Exchange.HTTP_METHOD); if (method instanceof String) { - return (String)method; + return (String) method; } // 2. GET if query string is provided in header. @@ -59,14 +54,20 @@ public static String getHttpMethod(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public String getOperationName(Exchange exchange, Endpoint endpoint) { + // Based on HTTP component documentation: + return getHttpMethod(exchange, endpoint); + } + + @Override + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); String httpUrl = getHttpURL(exchange, endpoint); if (httpUrl != null) { - span.setHttpURL(httpUrl); + span.setTag(Tag.HTTP_URL, httpUrl); } - span.setHttpMethod(getHttpMethod(exchange, endpoint)); + span.setTag(Tag.HTTP_METHOD, getHttpMethod(exchange, endpoint)); } protected String getHttpURL(Exchange exchange, Endpoint endpoint) { @@ -89,14 +90,14 @@ protected String getHttpURL(Exchange exchange, Endpoint endpoint) { } @Override - public void post(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public void post(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.post(span, exchange, endpoint); Message message = exchange.getMessage(); if (message != null) { Integer responseCode = message.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class); if (responseCode != null) { - span.setHttpStatus(responseCode); + span.setTag(Tag.HTTP_STATUS, responseCode); } } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecorator.java index cd3ac473531c6..976580fbd262e 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecorator.java @@ -16,14 +16,15 @@ */ package org.apache.camel.tracing.decorators; -import java.util.Map; +import java.util.*; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.tracing.HeadersExtractAdapter; -import org.apache.camel.tracing.HeadersInjectAdapter; +import org.apache.camel.tracing.ExtractAdapter; +import org.apache.camel.tracing.InjectAdapter; +import org.apache.camel.tracing.SpanAdapter; import org.apache.camel.tracing.SpanKind; -import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.Tag; import org.apache.camel.tracing.propagation.CamelMessagingHeadersExtractAdapter; import org.apache.camel.tracing.propagation.CamelMessagingHeadersInjectAdapter; @@ -38,10 +39,9 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - span.setMessageBusDestination(getDestination(exchange, endpoint)); - //span.setTag(Tags.MESSAGE_BUS_DESTINATION.getKey(), getDestination(exchange, endpoint)); + span.setTag(Tag.MESSAGE_BUS_DESTINATION, getDestination(exchange, endpoint)); String messageId = getMessageId(exchange); if (messageId != null) { @@ -81,12 +81,12 @@ protected String getMessageId(Exchange exchange) { } @Override - public HeadersExtractAdapter getExtractAdapter(final Map map, final boolean jmsEncoding) { + public ExtractAdapter getExtractAdapter(final Map map, final boolean jmsEncoding) { return new CamelMessagingHeadersExtractAdapter(map, jmsEncoding); } @Override - public HeadersInjectAdapter getInjectAdapter(final Map map, final boolean jmsEncoding) { + public InjectAdapter getInjectAdapter(final Map map, final boolean jmsEncoding) { return new CamelMessagingHeadersInjectAdapter(map, jmsEncoding); } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractSpanDecorator.java index d54b70456fd65..5a80df243a43b 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/AbstractSpanDecorator.java @@ -16,17 +16,15 @@ */ package org.apache.camel.tracing.decorators; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.tracing.HeadersExtractAdapter; -import org.apache.camel.tracing.HeadersInjectAdapter; +import org.apache.camel.tracing.ExtractAdapter; +import org.apache.camel.tracing.InjectAdapter; +import org.apache.camel.tracing.SpanAdapter; import org.apache.camel.tracing.SpanDecorator; import org.apache.camel.tracing.SpanKind; -import org.apache.camel.tracing.SpanWrap; import org.apache.camel.tracing.propagation.CamelHeadersExtractAdapter; import org.apache.camel.tracing.propagation.CamelHeadersInjectAdapter; import org.apache.camel.util.StringHelper; @@ -97,7 +95,7 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { String scheme = getComponentName(endpoint); span.setComponent(CAMEL_COMPONENT + scheme); @@ -108,7 +106,7 @@ public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { } @Override - public void post(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public void post(SpanAdapter span, Exchange exchange, Endpoint endpoint) { if (exchange.isFailed()) { span.setError(true); if (exchange.getException() != null) { @@ -132,13 +130,13 @@ public SpanKind getReceiverSpanKind() { } @Override - public HeadersExtractAdapter getExtractAdapter(final Map map, boolean encoding) { + public ExtractAdapter getExtractAdapter(final Map map, boolean encoding) { // no encoding supported per default return new CamelHeadersExtractAdapter(map); } @Override - public HeadersInjectAdapter getInjectAdapter(final Map map, boolean encoding) { + public InjectAdapter getInjectAdapter(final Map map, boolean encoding) { // no encoding supported per default return new CamelHeadersInjectAdapter(map); } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CqlSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CqlSpanDecorator.java index 6e6c80662e756..e4a5a9c3eb125 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CqlSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/CqlSpanDecorator.java @@ -21,7 +21,8 @@ import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.Tag; public class CqlSpanDecorator extends AbstractSpanDecorator { @@ -40,24 +41,22 @@ public String getComponentClassName() { } @Override - public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - span.setDBType(CASSANDRA_DB_TYPE); - //span.setTag(Tags.DB_TYPE.getKey(), CASSANDRA_DB_TYPE); - + span.setTag(Tag.DB_TYPE, CASSANDRA_DB_TYPE); URI uri = URI.create(endpoint.getEndpointUri()); if (uri.getPath() != null && uri.getPath().length() > 0) { // Strip leading '/' from path - span.setDBType(uri.getPath().substring(1)); + span.setTag(Tag.DB_INSTANCE, uri.getPath().substring(1)); } Object cql = exchange.getIn().getHeader(CAMEL_CQL_QUERY); if (cql != null) { - span.setDBStatement(cql.toString()); + span.setTag(Tag.DB_STATEMENT, cql.toString()); } else { Map queryParameters = toQueryParameters(endpoint.getEndpointUri()); if (queryParameters.containsKey("cql")) { - span.setDBStatement(queryParameters.get("cql")); + span.setTag(Tag.DB_STATEMENT, queryParameters.get("cql")); } } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecorator.java index f48375cabb53a..fec79cac2bd6b 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecorator.java @@ -20,7 +20,8 @@ import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.Tag; public class ElasticsearchSpanDecorator extends AbstractSpanDecorator { @@ -46,15 +47,13 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - span.setDBType(ELASTICSEARCH_DB_TYPE); - // span.setTag(Tags.DB_TYPE.getKey(), ELASTICSEARCH_DB_TYPE); + span.setTag(Tag.DB_TYPE, ELASTICSEARCH_DB_TYPE); Map queryParameters = toQueryParameters(endpoint.getEndpointUri()); if (queryParameters.containsKey("indexName")) { - span.setDBInstance(queryParameters.get("indexName")); - // span.setTag(Tags.DB_INSTANCE.getKey(), queryParameters.get("indexName")); + span.setTag(Tag.DB_INSTANCE, queryParameters.get("indexName")); } String cluster = stripSchemeAndOptions(endpoint); diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JdbcSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JdbcSpanDecorator.java index be8749f00b6f8..8b1a197166bef 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JdbcSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/JdbcSpanDecorator.java @@ -18,7 +18,8 @@ import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.Tag; public class JdbcSpanDecorator extends AbstractSpanDecorator { @@ -33,13 +34,14 @@ public String getComponentClassName() { } @Override - public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - span.setDBType("sql"); + + span.setTag(Tag.DB_TYPE, "sql"); Object body = exchange.getIn().getBody(); if (body instanceof String) { - span.setDBStatement((String)body); + span.setTag(Tag.DB_STATEMENT, (String)body); } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/KafkaSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/KafkaSpanDecorator.java index 3698b1da73316..1900b7abb93f2 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/KafkaSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/KafkaSpanDecorator.java @@ -20,7 +20,7 @@ import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.SpanAdapter; public class KafkaSpanDecorator extends AbstractMessagingSpanDecorator { @@ -59,7 +59,7 @@ public String getDestination(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); String partition = getValue(exchange, PARTITION, Integer.class); diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/MongoDBSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/MongoDBSpanDecorator.java index c89f9ff7d166a..31add1d1e76b7 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/MongoDBSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/MongoDBSpanDecorator.java @@ -20,7 +20,8 @@ import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.Tag; public class MongoDBSpanDecorator extends AbstractSpanDecorator { @@ -45,19 +46,16 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - // span.setTag(Tags.DB_TYPE.getKey(), getComponent()); - span.setDBType(getComponent()); + span.setTag(Tag.DB_TYPE, getComponent()); Map queryParameters = toQueryParameters(endpoint.getEndpointUri()); String database = queryParameters.get("database"); if (database != null) { - span.setDBInstance(database); - //span.setTag(Tags.DB_INSTANCE.getKey(), database); + span.setTag(Tag.DB_INSTANCE, database); } - span.setDBStatement(queryParameters.toString()); - //span.setTag(Tags.DB_STATEMENT.getKey(), queryParameters.toString()); + span.setTag(Tag.DB_STATEMENT, queryParameters.toString()); } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RestSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RestSpanDecorator.java index a437102ab41c4..6bbdd95ac20f1 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RestSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/RestSpanDecorator.java @@ -24,7 +24,7 @@ import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.SpanAdapter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,7 +48,7 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); getParameters(getPath(endpoint.getEndpointUri())).forEach(param -> { diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SqlSpanDecorator.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SqlSpanDecorator.java index 5fc7f29449a69..c21be7ee9ae8a 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SqlSpanDecorator.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/decorators/SqlSpanDecorator.java @@ -18,7 +18,8 @@ import org.apache.camel.Endpoint; import org.apache.camel.Exchange; -import org.apache.camel.tracing.SpanWrap; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.Tag; public class SqlSpanDecorator extends AbstractSpanDecorator { @@ -35,13 +36,13 @@ public String getComponentClassName() { } @Override - public void pre(SpanWrap span, Exchange exchange, Endpoint endpoint) { + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { super.pre(span, exchange, endpoint); - span.setDBType("sql"); + span.setTag(Tag.DB_TYPE, "sql"); Object sqlquery = exchange.getIn().getHeader(CAMEL_SQL_QUERY); if (sqlquery instanceof String) { - span.setDBStatement((String) sqlquery); + span.setTag(Tag.DB_STATEMENT, (String) sqlquery); } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersExtractAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersExtractAdapter.java index 6633296081d2c..a4c36a538d66c 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersExtractAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersExtractAdapter.java @@ -20,9 +20,9 @@ import java.util.Iterator; import java.util.Map; -import org.apache.camel.tracing.HeadersExtractAdapter; +import org.apache.camel.tracing.ExtractAdapter; -public final class CamelHeadersExtractAdapter implements HeadersExtractAdapter { +public final class CamelHeadersExtractAdapter implements ExtractAdapter { private final Map map = new HashMap<>(); public CamelHeadersExtractAdapter(final Map map) { diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java index e74b8cf9b7d1f..70a3f3f101e16 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java @@ -18,9 +18,9 @@ import java.util.Map; -import org.apache.camel.tracing.HeadersInjectAdapter; +import org.apache.camel.tracing.InjectAdapter; -public final class CamelHeadersInjectAdapter implements HeadersInjectAdapter { +public final class CamelHeadersInjectAdapter implements InjectAdapter { private final Map map; public CamelHeadersInjectAdapter(final Map map) { diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapter.java index c1fbd4ef4f73e..c7a5b8b8a1b38 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapter.java @@ -21,9 +21,9 @@ import java.util.Iterator; import java.util.Map; -import org.apache.camel.tracing.HeadersExtractAdapter; +import org.apache.camel.tracing.ExtractAdapter; -public final class CamelMessagingHeadersExtractAdapter implements HeadersExtractAdapter { +public final class CamelMessagingHeadersExtractAdapter implements ExtractAdapter { private final Map map = new HashMap<>(); private final boolean jmsEncoding; diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapter.java index 3e215580d6729..7057b339b6170 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapter.java @@ -18,9 +18,9 @@ import java.util.Map; -import org.apache.camel.tracing.HeadersInjectAdapter; +import org.apache.camel.tracing.InjectAdapter; -public final class CamelMessagingHeadersInjectAdapter implements HeadersInjectAdapter { +public final class CamelMessagingHeadersInjectAdapter implements InjectAdapter { // As per the JMS specs, header names must be valid Java identifier part // characters. diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/ActiveSpanManagerTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/ActiveSpanManagerTest.java similarity index 84% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/ActiveSpanManagerTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/ActiveSpanManagerTest.java index d4b33358c45fe..972354dbdadbf 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/ActiveSpanManagerTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/ActiveSpanManagerTest.java @@ -14,10 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.opentracing; +package org.apache.camel.tracing; -import io.opentracing.Span; -import io.opentracing.mock.MockTracer; import org.apache.camel.Exchange; import org.apache.camel.test.junit5.ExchangeTestSupport; import org.junit.jupiter.api.Test; @@ -27,8 +25,6 @@ public class ActiveSpanManagerTest extends ExchangeTestSupport { - private MockTracer tracer = new MockTracer(); - @Test public void testNoSpan() { Exchange exchange = createExchange(); @@ -38,7 +34,7 @@ public void testNoSpan() { @Test public void testCurrentSpan() { Exchange exchange = createExchange(); - Span span = tracer.buildSpan("test").start(); + SpanAdapter span = MockSpanAdapter.buildSpan("test"); ActiveSpanManager.activate(exchange, span); assertEquals(span, ActiveSpanManager.getSpan(exchange)); @@ -49,9 +45,9 @@ public void testCurrentSpan() { @Test public void testCreateChild() { Exchange exchange = createExchange(); - Span parent = tracer.buildSpan("parent").start(); + SpanAdapter parent = MockSpanAdapter.buildSpan("parent"); ActiveSpanManager.activate(exchange, parent); - Span child = tracer.buildSpan("child").start(); + SpanAdapter child = MockSpanAdapter.buildSpan("child"); ActiveSpanManager.activate(exchange, child); assertEquals(child, ActiveSpanManager.getSpan(exchange)); @@ -63,7 +59,7 @@ public void testCreateChild() { @Test public void testIsolatedConcurrentExchanges() { Exchange exchange = createExchange(); - Span parent = tracer.buildSpan("parent").start(); + SpanAdapter parent = MockSpanAdapter.buildSpan("parent"); ActiveSpanManager.activate(exchange, parent); Exchange path1 = exchange.copy(); @@ -73,10 +69,10 @@ public void testIsolatedConcurrentExchanges() { assertEquals(parent, ActiveSpanManager.getSpan(path1)); assertEquals(parent, ActiveSpanManager.getSpan(path2)); - Span child1 = tracer.buildSpan("child1").start(); + SpanAdapter child1 = MockSpanAdapter.buildSpan("child1"); ActiveSpanManager.activate(path1, child1); - Span child2 = tracer.buildSpan("child2").start(); + SpanAdapter child2 = MockSpanAdapter.buildSpan("child2"); ActiveSpanManager.activate(path2, child2); ActiveSpanManager.deactivate(path2); diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/MockSpanAdapter.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/MockSpanAdapter.java new file mode 100644 index 0000000000000..884fd043b94ee --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/MockSpanAdapter.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MockSpanAdapter implements SpanAdapter { + + private List logEntries = new ArrayList<>(); + private HashMap tags = new HashMap<>(); + + static long nowMicros() { + return System.currentTimeMillis() * 1000; + } + + static MockSpanAdapter buildSpan(String operation) { + return new MockSpanAdapter().setOperation(operation); + } + + public HashMap tags() { + return tags; + } + + @Override public void setComponent(String component) { + this.tags.put(Tag.COMPONENT.name(), component); + } + + @Override public void setError(boolean error) { + this.tags.put(Tag.ERROR.name(), error); + } + + @Override public void setTag(Tag key, String value) { + this.tags.put(key.name(), value); + } + + @Override public void setTag(Tag key, Number value) { + this.tags.put(key.name(), value); + } + + @Override public void setTag(String key, String value) { + this.tags.put(key, value); + } + + @Override public void setTag(String key, Number value) { + this.tags.put(key, value); + } + + @Override public void setTag(String key, Boolean value) { + this.tags.put(key, value); + } + + @Override public void log(Map fields) { + this.logEntries.add(new LogEntry(nowMicros(), fields)); + } + + public List logEntries() { + return new ArrayList<>(this.logEntries); + } + + public static final class LogEntry { + private final long timestampMicros; + private final Map fields; + + public LogEntry(long timestampMicros, Map fields) { + this.timestampMicros = timestampMicros; + this.fields = fields; + } + + public long timestampMicros() { + return timestampMicros; + } + + public Map fields() { + return fields; + } + } + + public MockSpanAdapter setOperation(String operation) { + return this; + } +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecoratorTest.java new file mode 100644 index 0000000000000..56825db84a60d --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecoratorTest.java @@ -0,0 +1,280 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.Tag; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class AbstractHttpSpanDecoratorTest { + + private static final String TEST_URI = "http://localhost:8080/test"; + + @Test + public void testGetOperationName() { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(Exchange.HTTP_METHOD)).thenReturn("PUT"); + + AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + assertEquals("PUT", decorator.getOperationName(exchange, null)); + } + + @Test + public void testGetMethodFromMethodHeader() { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(Exchange.HTTP_METHOD)).thenReturn("PUT"); + + assertEquals("PUT", AbstractHttpSpanDecorator.getHttpMethod(exchange, null)); + } + + @Test + public void testGetMethodQueryStringHeader() { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(Exchange.HTTP_QUERY)).thenReturn("MyQuery"); + + assertEquals(AbstractHttpSpanDecorator.GET_METHOD, + AbstractHttpSpanDecorator.getHttpMethod(exchange, null)); + } + + @Test + public void testGetMethodQueryStringInEndpoint() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("http://localhost:8080/endpoint?query=hello"); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn("http://localhost:8080/endpoint?query=hello"); + + assertEquals(AbstractHttpSpanDecorator.GET_METHOD, + AbstractHttpSpanDecorator.getHttpMethod(exchange, endpoint)); + } + + @Test + public void testGetMethodBodyNotNull() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI); + Mockito.when(message.getBody()).thenReturn("Message Body"); + + assertEquals(AbstractHttpSpanDecorator.POST_METHOD, + AbstractHttpSpanDecorator.getHttpMethod(exchange, endpoint)); + } + + @Test + public void testGetMethodDefault() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI); + + assertEquals(AbstractHttpSpanDecorator.GET_METHOD, + AbstractHttpSpanDecorator.getHttpMethod(exchange, endpoint)); + } + + @Test + public void testPreUri() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI); + + SpanDecorator decorator = new AbstractHttpSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, exchange, endpoint); + + assertEquals(TEST_URI, span.tags().get(Tag.HTTP_URL.name())); + assertTrue(span.tags().containsKey(Tag.HTTP_METHOD.name())); + } + + @Test + public void testGetHttpURLFromHeaderUrl() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn("Another URL"); + Mockito.when(message.getHeader(Exchange.HTTP_URL)).thenReturn(TEST_URI); + + AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint)); + } + + @Test + public void testGetHttpURLFromHeaderUri() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI); + + AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint)); + } + + @Test + public void testGetHttpURLFromEndpointUri() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); + Mockito.when(exchange.getIn()).thenReturn(message); + + AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint)); + } + + @Test + public void testGetHttpURLFromEndpointUriWithAdditionalScheme() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("netty-http:" + TEST_URI); + Mockito.when(exchange.getIn()).thenReturn(message); + + AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint)); + } + + @Test + public void testPostResponseCode() { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(exchange.getMessage()).thenReturn(message); + Mockito.when(message.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class)).thenReturn(200); + + SpanDecorator decorator = new AbstractHttpSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.post(span, exchange, null); + + assertEquals(200, span.tags().get(Tag.HTTP_STATUS.name())); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecoratorTest.java new file mode 100644 index 0000000000000..3c9ee24bc6d83 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecoratorTest.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.Tag; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AbstractMessagingSpanDecoratorTest { + + @Test + public void testOperationName() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("jms://MyQueue?hello=world"); + + SpanDecorator decorator = new AbstractMessagingSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + assertEquals("MyQueue", decorator.getOperationName(null, endpoint)); + } + + @Test + public void testPreMessageBusDestination() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("jms://MyQueue?hello=world"); + + SpanDecorator decorator = new AbstractMessagingSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, null, endpoint); + + assertEquals("MyQueue", span.tags().get(Tag.MESSAGE_BUS_DESTINATION.name())); + } + + @Test + public void testPreMessageId() { + String messageId = "abcd"; + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("test"); + + SpanDecorator decorator = new AbstractMessagingSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + + @Override + public String getMessageId(Exchange exchange) { + return messageId; + } + }; + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, exchange, endpoint); + + assertEquals(messageId, span.tags().get(AbstractMessagingSpanDecorator.MESSAGE_BUS_ID)); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractSpanDecoratorTest.java new file mode 100644 index 0000000000000..452768e3d3dcd --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractSpanDecoratorTest.java @@ -0,0 +1,140 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.Tag; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AbstractSpanDecoratorTest { + + private static final String TEST_URI = "test:/uri"; + + @Test + public void testGetOperationName() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); + + SpanDecorator decorator = new AbstractSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + // Operation name is scheme, as no specific span decorator to + // identify an appropriate name + assertEquals("test", decorator.getOperationName(null, endpoint)); + } + + @Test + public void testPre() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI); + + SpanDecorator decorator = new AbstractSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, null, endpoint); + + assertEquals("camel-test", span.tags().get(Tag.COMPONENT.name())); + } + + @Test + public void testPostExchangeFailed() { + Exchange exchange = Mockito.mock(Exchange.class); + + Mockito.when(exchange.isFailed()).thenReturn(true); + + Exception e = new Exception("Test Message"); + Mockito.when(exchange.getException()).thenReturn(e); + + SpanDecorator decorator = new AbstractSpanDecorator() { + @Override + public String getComponent() { + return null; + } + + @Override + public String getComponentClassName() { + return null; + } + }; + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.post(span, exchange, null); + + assertEquals(true, span.tags().get(Tag.ERROR.name())); + assertEquals(1, span.logEntries().size()); + assertEquals("error", span.logEntries().get(0).fields().get("event")); + assertEquals("Exception", span.logEntries().get(0).fields().get("error.kind")); + assertEquals(e.getMessage(), span.logEntries().get(0).fields().get("message")); + } + + @Test + public void testStripSchemeNoOptions() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("direct:hello"); + + assertEquals("hello", AbstractSpanDecorator.stripSchemeAndOptions(endpoint)); + } + + @Test + public void testStripSchemeNoOptionsWithSlashes() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("direct://hello"); + + assertEquals("hello", AbstractSpanDecorator.stripSchemeAndOptions(endpoint)); + } + + @Test + public void testStripSchemeAndOptions() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("direct:hello?world=true"); + + assertEquals("hello", AbstractSpanDecorator.stripSchemeAndOptions(endpoint)); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSnsSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSnsSpanDecoratorTest.java new file mode 100644 index 0000000000000..87bd1a498a6a4 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSnsSpanDecoratorTest.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AwsSnsSpanDecoratorTest { + + @Test + public void testGetMessageId() { + String messageId = "abcd"; + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(AwsSnsSpanDecorator.CAMEL_AWS_SNS_MESSAGE_ID)).thenReturn(messageId); + + AwsSnsSpanDecorator decorator = new AwsSnsSpanDecorator(); + + assertEquals(messageId, decorator.getMessageId(exchange)); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSqsSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSqsSpanDecoratorTest.java new file mode 100644 index 0000000000000..819e0971f1f44 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSqsSpanDecoratorTest.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AwsSqsSpanDecoratorTest { + + @Test + public void testGetMessageId() { + String messageId = "abcd"; + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(AwsSqsSpanDecorator.CAMEL_AWS_SQS_MESSAGE_ID)).thenReturn(messageId); + + AwsSqsSpanDecorator decorator = new AwsSqsSpanDecorator(); + + assertEquals(messageId, decorator.getMessageId(exchange)); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CometdSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CometdSpanDecoratorTest.java new file mode 100644 index 0000000000000..bc3e18fd80c74 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CometdSpanDecoratorTest.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Endpoint; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class CometdSpanDecoratorTest { + + @Test + public void testGetDestination() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("cometd://localhost:8080/MyQueue?hello=world"); + + CometdSpanDecorator decorator = new CometdSpanDecorator(); + + assertEquals("MyQueue", decorator.getDestination(null, endpoint)); + } +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CqlSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CqlSpanDecoratorTest.java new file mode 100644 index 0000000000000..cead7b81b3ff4 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CqlSpanDecoratorTest.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.Tag; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class CqlSpanDecoratorTest { + + @Test + public void testPreCqlFromUri() { + String cql = "select%20*%20from%20users"; + String keyspace = "test"; + + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("cql://host1,host2:8080/" + keyspace + "?cql=" + + cql + "&consistencyLevel=quorum"); + Mockito.when(exchange.getIn()).thenReturn(message); + + SpanDecorator decorator = new CqlSpanDecorator(); + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, exchange, endpoint); + + assertEquals(CqlSpanDecorator.CASSANDRA_DB_TYPE, span.tags().get(Tag.DB_TYPE.name())); + assertEquals(cql, span.tags().get(Tag.DB_STATEMENT.name())); + assertEquals(keyspace, span.tags().get(Tag.DB_INSTANCE.name())); + } + + @Test + public void testPreCqlFromHeader() { + String cql = "select * from users"; + + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("cql://host1,host2?consistencyLevel=quorum"); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(CqlSpanDecorator.CAMEL_CQL_QUERY)).thenReturn(cql); + + SpanDecorator decorator = new CqlSpanDecorator(); + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, exchange, endpoint); + + assertEquals(CqlSpanDecorator.CASSANDRA_DB_TYPE, span.tags().get(Tag.DB_TYPE.name())); + assertEquals(cql, span.tags().get(Tag.DB_STATEMENT.name())); + assertNull(span.tags().get(Tag.DB_INSTANCE.name())); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecoratorTest.java new file mode 100644 index 0000000000000..76858b0c59ba4 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecoratorTest.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.Tag; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ElasticsearchSpanDecoratorTest { + + @Test + public void testOperationName() { + String opName = "INDEX"; + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("elasticsearch://local?operation=" + + opName + "&indexName=twitter&indexType=tweet"); + + SpanDecorator decorator = new ElasticsearchSpanDecorator(); + + assertEquals(opName, decorator.getOperationName(null, endpoint)); + } + + @Test + public void testPre() { + String indexName = "twitter"; + String cluster = "local"; + + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("elasticsearch://" + cluster + + "?operation=INDEX&indexName=" + indexName + "&indexType=tweet"); + Mockito.when(exchange.getIn()).thenReturn(message); + + SpanDecorator decorator = new ElasticsearchSpanDecorator(); + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, exchange, endpoint); + + assertEquals(ElasticsearchSpanDecorator.ELASTICSEARCH_DB_TYPE, span.tags().get(Tag.DB_TYPE.name())); + assertEquals(indexName, span.tags().get(Tag.DB_INSTANCE.name())); + assertEquals(cluster, span.tags().get(ElasticsearchSpanDecorator.ELASTICSEARCH_CLUSTER_TAG)); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/IronmqSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/IronmqSpanDecoratorTest.java new file mode 100644 index 0000000000000..72000ac8c4b59 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/IronmqSpanDecoratorTest.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class IronmqSpanDecoratorTest { + + @Test + public void testGetMessageId() { + String messageId = "abcd"; + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(IronmqSpanDecorator.CAMEL_IRON_MQ_MESSAGE_ID)).thenReturn(messageId); + + IronmqSpanDecorator decorator = new IronmqSpanDecorator(); + + assertEquals(messageId, decorator.getMessageId(exchange)); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JdbcSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JdbcSpanDecoratorTest.java new file mode 100644 index 0000000000000..e3162a8bd623b --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JdbcSpanDecoratorTest.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.Tag; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class JdbcSpanDecoratorTest { + + private static final String SQL_STATEMENT = "select * from customer"; + + @Test + public void testPre() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("test"); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getBody()).thenReturn(SQL_STATEMENT); + + SpanDecorator decorator = new JdbcSpanDecorator(); + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, exchange, endpoint); + + assertEquals("sql", span.tags().get(Tag.DB_TYPE.name())); + assertEquals(SQL_STATEMENT, span.tags().get(Tag.DB_STATEMENT.name())); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JmsSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JmsSpanDecoratorTest.java new file mode 100644 index 0000000000000..6081438a600ea --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JmsSpanDecoratorTest.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class JmsSpanDecoratorTest { + + @Test + public void testGetMessageId() { + String messageId = "abcd"; + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(JmsSpanDecorator.JMS_MESSAGE_ID)).thenReturn(messageId); + + JmsSpanDecorator decorator = new JmsSpanDecorator(); + + assertEquals(messageId, decorator.getMessageId(exchange)); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/KafkaSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/KafkaSpanDecoratorTest.java new file mode 100644 index 0000000000000..abf7ec97b16d3 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/KafkaSpanDecoratorTest.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class KafkaSpanDecoratorTest { + + @Test + public void testGetDestinationHeaderTopic() { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(KafkaSpanDecorator.TOPIC)).thenReturn("test"); + + KafkaSpanDecorator decorator = new KafkaSpanDecorator(); + + assertEquals("test", decorator.getDestination(exchange, null)); + } + + @Test + public void testGetDestinationNoHeaderTopic() { + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(endpoint.getEndpointUri()) + .thenReturn("kafka:localhost:9092?topic=test&groupId=testing&consumersCount=1"); + + KafkaSpanDecorator decorator = new KafkaSpanDecorator(); + + assertEquals("test", decorator.getDestination(exchange, endpoint)); + } + + @Test + public void testPreOffsetAndPartitionAsStringHeader() { + String testKey = "TestKey"; + String testOffset = "TestOffset"; + String testPartition = "TestPartition"; + String testPartitionKey = "TestPartitionKey"; + + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("test"); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(KafkaSpanDecorator.KEY)).thenReturn(testKey); + Mockito.when(message.getHeader(KafkaSpanDecorator.OFFSET, String.class)).thenReturn(testOffset); + Mockito.when(message.getHeader(KafkaSpanDecorator.PARTITION, String.class)).thenReturn(testPartition); + Mockito.when(message.getHeader(KafkaSpanDecorator.PARTITION_KEY)).thenReturn(testPartitionKey); + + SpanDecorator decorator = new KafkaSpanDecorator(); + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, exchange, endpoint); + + assertEquals(testKey, span.tags().get(KafkaSpanDecorator.KAFKA_KEY_TAG)); + assertEquals(testOffset, span.tags().get(KafkaSpanDecorator.KAFKA_OFFSET_TAG)); + assertEquals(testPartition, span.tags().get(KafkaSpanDecorator.KAFKA_PARTITION_TAG)); + assertEquals(testPartitionKey, span.tags().get(KafkaSpanDecorator.KAFKA_PARTITION_KEY_TAG)); + } + + @Test + public void testPrePartitionAsIntegerHeaderAndOffsetAsLongHeader() { + Long testOffset = 4875454L; + Integer testPartition = 0; + + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("test"); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(KafkaSpanDecorator.OFFSET, Long.class)).thenReturn(testOffset); + Mockito.when(message.getHeader(KafkaSpanDecorator.PARTITION, Integer.class)).thenReturn(testPartition); + + SpanDecorator decorator = new KafkaSpanDecorator(); + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, exchange, endpoint); + + assertEquals(String.valueOf(testOffset), span.tags().get(KafkaSpanDecorator.KAFKA_OFFSET_TAG)); + assertEquals(String.valueOf(testPartition), span.tags().get(KafkaSpanDecorator.KAFKA_PARTITION_TAG)); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/MongoDBSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/MongoDBSpanDecoratorTest.java new file mode 100644 index 0000000000000..8023a8c4a378e --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/MongoDBSpanDecoratorTest.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import java.util.Map; + +import org.apache.camel.Endpoint; +import org.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.Tag; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class MongoDBSpanDecoratorTest { + + private static final String MONGODB_STATEMENT = + "mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery"; + + @Test + public void testGetOperationName() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn(MONGODB_STATEMENT); + + SpanDecorator decorator = new MongoDBSpanDecorator(); + + assertEquals("findOneByQuery", decorator.getOperationName(null, endpoint)); + } + + @Test + public void testToQueryParameters() { + Map params = AbstractSpanDecorator.toQueryParameters(MONGODB_STATEMENT); + assertEquals(3, params.size()); + assertEquals("flights", params.get("database")); + assertEquals("tickets", params.get("collection")); + assertEquals("findOneByQuery", params.get("operation")); + } + + @Test + public void testPre() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn(MONGODB_STATEMENT); + + SpanDecorator decorator = new MongoDBSpanDecorator(); + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, null, endpoint); + + assertEquals("mongodb", span.tags().get(Tag.DB_TYPE.name())); + assertEquals("flights", span.tags().get(Tag.DB_INSTANCE.name())); + assertTrue(span.tags().containsKey(Tag.DB_STATEMENT.name())); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/RestSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/RestSpanDecoratorTest.java new file mode 100644 index 0000000000000..54ba0f2961eab --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/RestSpanDecoratorTest.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import java.util.Arrays; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class RestSpanDecoratorTest { + + @Test + public void testGetOperation() { + String path = "/persons/{personId}"; + String uri = "rest://put:/persons:/%7BpersonId%7D?routeId=route4"; + + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn(uri); + Mockito.when(exchange.getFromEndpoint()).thenReturn(endpoint); + + SpanDecorator decorator = new RestSpanDecorator(); + + assertEquals(path, decorator.getOperationName(exchange, endpoint)); + } + + @Test + public void testGetParameters() { + assertEquals(Arrays.asList("id1", "id2"), RestSpanDecorator.getParameters("/context/{id1}/{id2}")); + } + + @Test + public void testGetParametersNone() { + assertTrue(RestSpanDecorator.getParameters("rest://put:/persons/hello/world?routeId=route4").isEmpty()); + } + + @Test + public void testPreStringParameter() { + testParameter("strParam", "strValue"); + } + + @Test + public void testPreNumberParameter() { + testParameter("numParam", 5.6); + } + + @Test + public void testPreBooleanParameter() { + testParameter("boolParam", Boolean.TRUE); + } + + protected void testParameter(String paramName, Object paramValue) { + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("rest://put:/context:/%7B" + paramName + "%7D?routeId=route4"); + Mockito.when(exchange.getFromEndpoint()).thenReturn(endpoint); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(paramName)).thenReturn(paramValue); + + SpanDecorator decorator = new RestSpanDecorator(); + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, exchange, endpoint); + + assertEquals(paramValue, span.tags().get(paramName)); + } + + @Test + public void testGetPath() { + assertEquals("/persons/{personId}", RestSpanDecorator.getPath("rest://put:/persons:/%7BpersonId%7D?routeId=route4")); + } +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/SqlSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/SqlSpanDecoratorTest.java new file mode 100644 index 0000000000000..697a8effb9b97 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/SqlSpanDecoratorTest.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; +import org.apache.camel.tracing.Tag; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SqlSpanDecoratorTest { + + private static final String SQL_STATEMENT = "select * from customer"; + + @Test + public void testPre() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + Exchange exchange = Mockito.mock(Exchange.class); + Message message = Mockito.mock(Message.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("test"); + Mockito.when(exchange.getIn()).thenReturn(message); + Mockito.when(message.getHeader(SqlSpanDecorator.CAMEL_SQL_QUERY)).thenReturn(SQL_STATEMENT); + + SpanDecorator decorator = new SqlSpanDecorator(); + + MockSpanAdapter span = new MockSpanAdapter(); + + decorator.pre(span, exchange, endpoint); + + assertEquals("sql", span.tags().get(Tag.DB_TYPE.name())); + assertEquals(SQL_STATEMENT, span.tags().get(Tag.DB_STATEMENT.name())); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/StompSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/StompSpanDecoratorTest.java new file mode 100644 index 0000000000000..3c63879b1b08b --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/StompSpanDecoratorTest.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + +import org.apache.camel.Endpoint; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class StompSpanDecoratorTest { + + @Test + public void testGetDestination() { + Endpoint endpoint = Mockito.mock(Endpoint.class); + + Mockito.when(endpoint.getEndpointUri()).thenReturn("stomp:queue:test"); + + StompSpanDecorator decorator = new StompSpanDecorator(); + + assertEquals("test", decorator.getDestination(null, endpoint)); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/TimerSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/TimerSpanDecoratorTest.java new file mode 100644 index 0000000000000..e26eec72d86c4 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/TimerSpanDecoratorTest.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.decorators; + + +import org.apache.camel.Exchange; +import org.apache.camel.tracing.SpanDecorator; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TimerSpanDecoratorTest { + + private static final String TEST_NAME = "TestName"; + + @Test + public void testGetOperationName() { + Exchange exchange = Mockito.mock(Exchange.class); + + Mockito.when(exchange.getProperty(Exchange.TIMER_NAME)).thenReturn(TEST_NAME); + + SpanDecorator decorator = new TimerSpanDecorator() { + @Override + public String getComponent() { + return null; + } + }; + + assertEquals(TEST_NAME, decorator.getOperationName(exchange, null)); + } + +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapterTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapterTest.java new file mode 100644 index 0000000000000..7868118d5fb89 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapterTest.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.propagation; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.apache.camel.tracing.propagation.CamelMessagingHeadersInjectAdapter.JMS_DASH; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +public class CamelMessagingHeadersExtractAdapterTest { + + private Map map; + + @BeforeEach + public void before() { + map = new HashMap<>(); + } + + @Test + public void noProperties() { + CamelMessagingHeadersExtractAdapter adapter = new CamelMessagingHeadersExtractAdapter(map, true); + Iterator> iterator = adapter.iterator(); + assertFalse(iterator.hasNext()); + } + + @Test + public void oneProperty() { + map.put("key", "value"); + CamelMessagingHeadersExtractAdapter adapter = new CamelMessagingHeadersExtractAdapter(map, true); + Iterator> iterator = adapter.iterator(); + Map.Entry entry = iterator.next(); + assertEquals("key", entry.getKey()); + assertEquals("value", entry.getValue()); + } + + @Test + public void propertyWithDash() { + map.put(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH, "value1"); + CamelMessagingHeadersExtractAdapter adapter = new CamelMessagingHeadersExtractAdapter(map, true); + Iterator> iterator = adapter.iterator(); + Map.Entry entry = iterator.next(); + assertEquals("-key-1-", entry.getKey()); + assertEquals("value1", entry.getValue()); + } + + @Test + public void propertyWithoutDashEncoding() { + map.put(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH, "value1"); + CamelMessagingHeadersExtractAdapter adapter = new CamelMessagingHeadersExtractAdapter(map, false); + Iterator> iterator = adapter.iterator(); + Map.Entry entry = iterator.next(); + assertEquals(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH, entry.getKey()); + } +} diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapterTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapterTest.java new file mode 100644 index 0000000000000..b80c79f45fee3 --- /dev/null +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapterTest.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.tracing.propagation; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.apache.camel.tracing.propagation.CamelMessagingHeadersInjectAdapter.JMS_DASH; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class CamelMessagingHeadersInjectAdapterTest { + + private Map map; + + @BeforeEach + public void before() { + map = new HashMap<>(); + } + + @Test + public void putProperties() { + CamelMessagingHeadersInjectAdapter adapter = new CamelMessagingHeadersInjectAdapter(map, true); + adapter.put("key1", "value1"); + adapter.put("key2", "value2"); + adapter.put("key1", "value3"); + assertEquals("value3", map.get("key1")); + assertEquals("value2", map.get("key2")); + } + + @Test + public void propertyWithDash() { + CamelMessagingHeadersInjectAdapter adapter = new CamelMessagingHeadersInjectAdapter(map, true); + adapter.put("-key-1-", "value1"); + assertEquals("value1", map.get(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH)); + } + + @Test + public void propertyWithoutDashEncoding() { + CamelMessagingHeadersInjectAdapter adapter = new CamelMessagingHeadersInjectAdapter(map, false); + adapter.put("-key-1-", "value1"); + assertEquals(null, map.get(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH)); + } +} diff --git a/components/pom.xml b/components/pom.xml index 8b89796f3d90e..97b592a17274a 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -235,24 +235,7 @@ camel-jbpm camel-jcache camel-jclouds - camel-tracing + camel-tracing camel-jcr camel-jdbc camel-jgroups-raft diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java index 2a0528559e84e..42f252ab247a3 100644 --- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java +++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java @@ -10806,7 +10806,7 @@ public static org.apache.camel.builder.endpoint.dsl.Olingo2EndpointBuilderFactor * * @param path apiName/methodName */ - static org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.Olingo4EndpointBuilder olingo4( + public static org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.Olingo4EndpointBuilder olingo4( String path) { return org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.endpointBuilder("olingo4", path); } @@ -10831,7 +10831,7 @@ static org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.Oling * instead of the default name * @param path apiName/methodName */ - static org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.Olingo4EndpointBuilder olingo4( + public static org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.Olingo4EndpointBuilder olingo4( String componentName, String path) { return org.apache.camel.builder.endpoint.dsl.Olingo4EndpointBuilderFactory.endpointBuilder(componentName, path); diff --git a/parent/pom.xml b/parent/pom.xml index 4fb866d214f34..68a91849a0bfa 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -17,21 +17,20 @@ limitations under the License. --> - - 4.0.0 + + 4.0.0 - - org.apache.camel - camel - 3.5.0-SNAPSHOT - + + org.apache.camel + camel + 3.5.0-SNAPSHOT + - camel-parent - pom + camel-parent + pom - Camel :: Parent - Camel Parent POM + Camel :: Parent + Camel Parent POM true @@ -448,6 +447,7 @@ 3.1.12 3.1.2 3.0.2 + 0.6.0 0.33.0 0.1.8 7.40.0.Final @@ -576,174 +576,175 @@ 2.21.1 3.5.7 3.4.0 - - - version="[$(version;==;${camel.osgi.version.clean}),$(version;=+;${camel.osgi.version.clean}))" - - - version="[$(version;===;${camel.osgi.version.clean}),$(version;==+;${camel.osgi.version.clean}))" - - [$(version;==;$(@)),$(version;+;$(@))) - - - - - - org.apache.camel.*;${camel.osgi.import.camel.version}, - ${camel.osgi.import.before.defaults}, - ${camel.osgi.import.defaults}, - ${camel.osgi.import.additional}, - * - - - false - !* - $${replace;{local-packages};;;\;} - ${camel.osgi.export.pkg};-noimport:=true;${camel.osgi.version} - version=${project.version} - ${camel.osgi.import.pkg} - - ${project.groupId}.${project.artifactId} - false - - - ${project.build.outputDirectory}/META-INF/MANIFEST.MF - + + + version="[$(version;==;${camel.osgi.version.clean}),$(version;=+;${camel.osgi.version.clean}))" + + + version="[$(version;===;${camel.osgi.version.clean}),$(version;==+;${camel.osgi.version.clean}))" + + [$(version;==;$(@)),$(version;+;$(@))) + + + + + + org.apache.camel.*;${camel.osgi.import.camel.version}, + ${camel.osgi.import.before.defaults}, + ${camel.osgi.import.defaults}, + ${camel.osgi.import.additional}, + * + + + false + !* + $${replace;{local-packages};;;\;} + ${camel.osgi.export.pkg};-noimport:=true;${camel.osgi.version} + version=${project.version} + ${camel.osgi.import.pkg} + + ${project.groupId}.${project.artifactId} + false + + - - + ${project.build.outputDirectory}/META-INF/MANIFEST.MF + - - - org.apache.camel - camel-util-json - ${project.version} - - - org.apache.camel - camel-tooling-util - ${project.version} - - - org.apache.camel - camel-tooling-model - ${project.version} - - - org.apache.camel - camel-api - ${project.version} - - - org.apache.camel - camel-util - ${project.version} - - - org.apache.camel - camel-management-api - ${project.version} - - - org.apache.camel - camel-management - ${project.version} - - - org.apache.camel - camel-base - ${project.version} - - - org.apache.camel - camel-xml-jaxp - ${project.version} - - - org.apache.camel - camel-core-catalog - ${project.version} - - - org.apache.camel - camel-support - ${project.version} - - - org.apache.camel - camel-core - ${project.version} - - - org.apache.camel - camel-core-engine - ${project.version} - - - org.apache.camel - camel-core-languages - ${project.version} - - - org.apache.camel - camel-endpointdsl - ${project.version} - - - org.apache.camel - camel-componentdsl - ${project.version} - - - org.apache.camel - camel-core-xml - ${project.version} - - - org.apache.camel - camel-caffeine-lrucache - ${project.version} - - - org.apache.camel - camel-cloud - ${project.version} - - - org.apache.camel - camel-cluster - ${project.version} - - - org.apache.camel - camel-health - ${project.version} - - - org.apache.camel - camel-main - ${project.version} - - - org.apache.camel - camel-xml-io - ${project.version} - - - org.apache.camel - camel-xml-jaxb - ${project.version} - - - org.apache.camel - camel-allcomponents - pom - ${project.version} - + + + + + + org.apache.camel + camel-util-json + ${project.version} + + + org.apache.camel + camel-tooling-util + ${project.version} + + + org.apache.camel + camel-tooling-model + ${project.version} + + + org.apache.camel + camel-api + ${project.version} + + + org.apache.camel + camel-util + ${project.version} + + + org.apache.camel + camel-management-api + ${project.version} + + + org.apache.camel + camel-management + ${project.version} + + + org.apache.camel + camel-base + ${project.version} + + + org.apache.camel + camel-xml-jaxp + ${project.version} + + + org.apache.camel + camel-core-catalog + ${project.version} + + + org.apache.camel + camel-support + ${project.version} + + + org.apache.camel + camel-core + ${project.version} + + + org.apache.camel + camel-core-engine + ${project.version} + + + org.apache.camel + camel-core-languages + ${project.version} + + + org.apache.camel + camel-endpointdsl + ${project.version} + + + org.apache.camel + camel-componentdsl + ${project.version} + + + org.apache.camel + camel-core-xml + ${project.version} + + + org.apache.camel + camel-caffeine-lrucache + ${project.version} + + + org.apache.camel + camel-cloud + ${project.version} + + + org.apache.camel + camel-cluster + ${project.version} + + + org.apache.camel + camel-health + ${project.version} + + + org.apache.camel + camel-main + ${project.version} + + + org.apache.camel + camel-xml-io + ${project.version} + + + org.apache.camel + camel-xml-jaxb + ${project.version} + + + org.apache.camel + camel-allcomponents + pom + ${project.version} + - - + + org.apache.camel camel-activemq @@ -2576,2138 +2577,2129 @@ - - + + - - - org.apache.camel - camel-catalog - ${project.version} - - - org.apache.camel - camel-catalog-lucene - ${project.version} - - - org.apache.camel - camel-catalog-maven - ${project.version} - - - org.apache.camel - camel-route-parser - ${project.version} - - - - - org.apache.camel - camel-manual - ${project.version} - - - org.apache.camel.tests - org.apache.camel.tests.mock-javamail_1.7 - ${project.version} - - - org.apache.camel - spi-annotations - ${project.version} - - -<<<<<<< HEAD - + - org.apache.cassandra - cassandra-all - ${cassandra-version} + org.apache.camel + camel-catalog + ${project.version} - com.datastax.oss - java-driver-core - ${cassandra-driver-version} + org.apache.camel + camel-catalog-lucene + ${project.version} - com.datastax.oss - java-driver-query-builder - ${cassandra-driver-version} + org.apache.camel + camel-catalog-maven + ${project.version} - org.cassandraunit - cassandra-unit - ${cassandra-unit-version} - - - org.apache.cassandra - cassandra-all - - + org.apache.camel + camel-route-parser + ${project.version} - - - org.apache.cassandra - cassandra-all - ${cassandra-version} - - - com.datastax.cassandra - cassandra-driver-core - ${cassandra-driver-version} - - - org.cassandraunit - cassandra-unit - ${cassandra-unit-version} - - - org.apache.cassandra - cassandra-all - - - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson2-version} - - - com.fasterxml.jackson.core - jackson-core - ${jackson2-version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson2-version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-cbor - ${jackson2-version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-smile - ${jackson2-version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - ${jackson2-version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - ${jackson2-version} - - - com.fasterxml.jackson.datatype - jackson-datatype-joda - ${jackson2-version} - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-base - ${jackson2-version} - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson2-version} - - - com.fasterxml.jackson.module - jackson-module-jaxb-annotations - ${jackson2-version} - - - com.fasterxml.jackson.module - jackson-module-jsonSchema - ${jackson2-version} - - - com.fasterxml.jackson.jr - jackson-jr-objects - ${jackson2-version} - - - com.github.jasminb - jsonapi-converter - ${jasminb-jsonapi-version} - - - net.corda - corda-rpc - ${corda-version} - - - co.paralleluniverse - quasar-core - - - org.hibernate - hibernate-core - - - org.hibernate.javax.persistence - hibernate-jpa-2.1-api - - - - - - com.alibaba - fastjson - ${fastjson-version} - - - - org.knowm.xchange - xchange-core - ${xchange-version} - - - - - org.apache.abdera - abdera-core - ${abdera-version} - + + + org.apache.camel + camel-manual + ${project.version} + + + org.apache.camel.tests + org.apache.camel.tests.mock-javamail_1.7 + ${project.version} + + + org.apache.camel + spi-annotations + ${project.version} + - - - org.apache.commons - commons-pool2 - ${commons-pool2-version} - + + + org.apache.camel + camel-core + ${project.version} + test-jar + + + org.apache.camel + camel-management + ${project.version} + test-jar + - - - org.apache.cxf - cxf-core - ${cxf-version} - - - org.apache.cxf - cxf-rt-bindings-soap - ${cxf-version} - - - org.apache.cxf - cxf-rt-bindings-xml - ${cxf-version} - - - org.apache.cxf - cxf-rt-databinding-jaxb - ${cxf-version} - - - org.apache.cxf - cxf-rt-features-clustering - ${cxf-version} - - - org.apache.cxf - cxf-rt-features-logging - ${cxf-version} - - - org.apache.cxf - cxf-rt-frontend-jaxrs - ${cxf-version} - - - org.apache.cxf - cxf-rt-frontend-jaxws - ${cxf-version} - - - org.apache.cxf - cxf-rt-frontend-simple - ${cxf-version} - - - org.apache.cxf - cxf-rt-management - ${cxf-version} - - - org.apache.cxf - cxf-rt-rs-client - ${cxf-version} - - - org.apache.cxf - cxf-rt-rs-service-description-swagger - ${cxf-version} - - - org.apache.cxf - cxf-rt-rs-extension-providers - ${cxf-version} - - - org.apache.cxf - cxf-rt-rs-security-oauth2 - ${cxf-version} - - - org.apache.cxf - cxf-rt-transports-local - ${cxf-version} - - - org.apache.cxf - cxf-rt-transports-http - ${cxf-version} - - - org.apache.cxf - cxf-rt-transports-http-jetty - ${cxf-version} - - - org.apache.cxf - cxf-rt-transports-jms - ${cxf-version} - - - org.apache.cxf - cxf-rt-wsdl - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-addr - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-mex - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-policy - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-rm - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-security - ${cxf-version} - - - org.apache.cxf - cxf-rt-ws-security-oauth2 - ${cxf-version} - - - org.apache.cxf - cxf-testutils - ${cxf-version} - - - org.apache.cxf.services.sts - cxf-services-sts-core - ${cxf-version} - - - org.apache.cxf.services.ws-discovery - cxf-services-ws-discovery-api - ${cxf-version} - - - org.apache.kafka - kafka-clients - ${kafka-version} - + + + org.apache.cassandra + cassandra-all + ${cassandra-version} + + + com.datastax.oss + java-driver-core + ${cassandra-driver-version} + + + com.datastax.oss + java-driver-query-builder + ${cassandra-driver-version} + + + org.cassandraunit + cassandra-unit + ${cassandra-unit-version} + + + org.apache.cassandra + cassandra-all + + + - - - com.github.ben-manes.caffeine - caffeine - ${caffeine-version} - - - org.checkerframework - checker-qual - - - com.google.errorprone - error_prone_annotations - - - + + com.fasterxml.jackson.core + jackson-annotations + ${jackson2-version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson2-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson2-version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-cbor + ${jackson2-version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-smile + ${jackson2-version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + ${jackson2-version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${jackson2-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson2-version} + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-base + ${jackson2-version} + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson2-version} + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + ${jackson2-version} + + + com.fasterxml.jackson.module + jackson-module-jsonSchema + ${jackson2-version} + + + com.fasterxml.jackson.jr + jackson-jr-objects + ${jackson2-version} + + + com.github.jasminb + jsonapi-converter + ${jasminb-jsonapi-version} + + + net.corda + corda-rpc + ${corda-version} + + + co.paralleluniverse + quasar-core + + + org.hibernate + hibernate-core + + + org.hibernate.javax.persistence + hibernate-jpa-2.1-api + + + - - - stax - stax-api - ${stax-api-version} - - - com.sun.xml.bind - jaxb-impl - ${jaxb-version} - - - javax.jws - jsr181-api - - - - - com.sun.xml.bind - jaxb-core - ${jaxb-version} - - - com.sun.xml.bind - jaxb-jxc - ${jaxb-version} - - - com.sun.xml.parsers - jaxp-ri - 1.4.5 - + + com.alibaba + fastjson + ${fastjson-version} + - - - org.slf4j - slf4j-api - ${slf4j-api-version} - - - org.slf4j - slf4j-log4j12 - ${slf4j-version} - - - org.slf4j - jul-to-slf4j - ${slf4j-version} - - - org.slf4j - log4j-over-slf4j - ${slf4j-version} - - - log4j - log4j - ${log4j-version} - - - org.apache.logging.log4j - log4j-api - ${log4j2-version} - - - org.apache.logging.log4j - log4j-core - ${log4j2-version} - - - org.apache.logging.log4j - log4j-slf4j-impl - ${log4j2-version} - - - org.apache.logging.log4j - log4j-1.2-api - ${log4j2-version} - - - org.apache.logging.log4j - log4j-jcl - ${log4j2-version} - - - org.apache.logging.log4j - log4j-jul - ${log4j2-version} - - - org.apache.logging.log4j - log4j-web - ${log4j2-version} - - - - commons-logging - commons-logging - ${commons-logging-version} - + + org.knowm.xchange + xchange-core + ${xchange-version} + - - commons-codec - commons-codec - ${commons-codec-version} - + + + org.apache.abdera + abdera-core + ${abdera-version} + - - - org.osgi - osgi.core - ${osgi-version} - - - org.osgi - osgi.cmpn - ${osgi-version} - + + + org.apache.commons + commons-pool2 + ${commons-pool2-version} + - - - org.apache.activemq - activemq-broker - ${activemq-version} - - - org.apache.activemq - activemq-kahadb-store - ${activemq-version} - - - org.apache.activemq - activemq-client - ${activemq-version} - - - org.apache.activemq - activemq-spring - ${activemq-version} - - - org.apache.activemq - activemq-camel - ${activemq-version} - - - org.apache.activemq - activemq-pool - ${activemq-version} - - - org.apache.activemq - activemq-rar - ${activemq-version} - rar - - - org.apache.activemq - activemq-all - ${activemq-version} - - - org.apache.activemq - activemq-amqp - ${activemq-version} - - - org.apache.activemq - activemq-openwire-legacy - ${activemq-version} - - - org.apache.activemq - activemq-jaas - ${activemq-version} - - - org.apache.activemq - activemq-mqtt - ${activemq-version} - + + + org.apache.cxf + cxf-core + ${cxf-version} + + + org.apache.cxf + cxf-rt-bindings-soap + ${cxf-version} + + + org.apache.cxf + cxf-rt-bindings-xml + ${cxf-version} + + + org.apache.cxf + cxf-rt-databinding-jaxb + ${cxf-version} + + + org.apache.cxf + cxf-rt-features-clustering + ${cxf-version} + + + org.apache.cxf + cxf-rt-features-logging + ${cxf-version} + + + org.apache.cxf + cxf-rt-frontend-jaxrs + ${cxf-version} + + + org.apache.cxf + cxf-rt-frontend-jaxws + ${cxf-version} + + + org.apache.cxf + cxf-rt-frontend-simple + ${cxf-version} + + + org.apache.cxf + cxf-rt-management + ${cxf-version} + + + org.apache.cxf + cxf-rt-rs-client + ${cxf-version} + + + org.apache.cxf + cxf-rt-rs-service-description-swagger + ${cxf-version} + + + org.apache.cxf + cxf-rt-rs-extension-providers + ${cxf-version} + + + org.apache.cxf + cxf-rt-rs-security-oauth2 + ${cxf-version} + + + org.apache.cxf + cxf-rt-transports-local + ${cxf-version} + + + org.apache.cxf + cxf-rt-transports-http + ${cxf-version} + + + org.apache.cxf + cxf-rt-transports-http-jetty + ${cxf-version} + + + org.apache.cxf + cxf-rt-transports-jms + ${cxf-version} + + + org.apache.cxf + cxf-rt-wsdl + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-addr + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-mex + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-policy + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-rm + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-security + ${cxf-version} + + + org.apache.cxf + cxf-rt-ws-security-oauth2 + ${cxf-version} + + + org.apache.cxf + cxf-testutils + ${cxf-version} + + + org.apache.cxf.services.sts + cxf-services-sts-core + ${cxf-version} + + + org.apache.cxf.services.ws-discovery + cxf-services-ws-discovery-api + ${cxf-version} + + + org.apache.kafka + kafka-clients + ${kafka-version} + - - org.apache.xbean - xbean-spring - ${xbean-spring-version} - + + + com.github.ben-manes.caffeine + caffeine + ${caffeine-version} + + + org.checkerframework + checker-qual + + + com.google.errorprone + error_prone_annotations + + + - - - org.apache.geronimo.specs - geronimo-j2ee-connector_1.5_spec - ${geronimo-j2ee-connector-spec-version} - - - org.apache.geronimo.specs - geronimo-j2ee-jacc_1.0_spec - ${geronimo-j2ee-jacc-spec-version} - - - org.apache.geronimo.specs - geronimo-j2ee-management_1.0_spec - ${geronimo-j2ee-management-spec-version} - - - org.apache.geronimo.specs - geronimo-jms_1.1_spec - ${geronimo-jms-spec-version} - - - org.apache.geronimo.specs - geronimo-jms_2.0_spec - ${geronimo-jms2-spec-version} - - - org.apache.geronimo.specs - geronimo-jpa_2.1_spec - ${geronimo-jpa-spec-version} - - - org.apache.geronimo.specs - geronimo-jta_1.1_spec - ${geronimo-jta-spec-version} - - - javax.servlet - javax.servlet-api - ${javax-servlet-api-version} - - - - org.springframework - spring-context - ${spring-version} - - - org.springframework - spring-test - ${spring-version} - - - org.springframework - spring-core - ${spring-version} - - - org.springframework - spring-beans - ${spring-version} - - - org.springframework - spring-web - ${spring-version} - - - org.springframework - spring-aop - ${spring-version} - - - org.springframework - spring-jdbc - ${spring-version} - - - org.springframework - spring-orm - ${spring-version} - - - org.springframework - spring-jms - ${spring-version} - - - org.springframework - spring-context-support - ${spring-version} - - - org.springframework - spring-tx - ${spring-version} - - - org.springframework - spring-expression - ${spring-version} - - - org.springframework.security - spring-security-config - ${spring-security-version} - - - org.springframework.security - spring-security-core - ${spring-security-version} - + + + stax + stax-api + ${stax-api-version} + + + com.sun.xml.bind + jaxb-impl + ${jaxb-version} + + + javax.jws + jsr181-api + + + + + com.sun.xml.bind + jaxb-core + ${jaxb-version} + + + com.sun.xml.bind + jaxb-jxc + ${jaxb-version} + + + com.sun.xml.parsers + jaxp-ri + 1.4.5 + - - org.scala-lang - scala-library - ${scala-version} - + + + org.slf4j + slf4j-api + ${slf4j-api-version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + + + org.slf4j + jul-to-slf4j + ${slf4j-version} + + + org.slf4j + log4j-over-slf4j + ${slf4j-version} + + + log4j + log4j + ${log4j-version} + + + org.apache.logging.log4j + log4j-api + ${log4j2-version} + + + org.apache.logging.log4j + log4j-core + ${log4j2-version} + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j2-version} + + + org.apache.logging.log4j + log4j-1.2-api + ${log4j2-version} + + + org.apache.logging.log4j + log4j-jcl + ${log4j2-version} + + + org.apache.logging.log4j + log4j-jul + ${log4j2-version} + + + org.apache.logging.log4j + log4j-web + ${log4j2-version} + + + + commons-logging + commons-logging + ${commons-logging-version} + - - org.yaml - snakeyaml - ${snakeyaml-version} - + + commons-codec + commons-codec + ${commons-codec-version} + - - javax.annotation - jsr250-api - 1.0 - + + + org.osgi + osgi.core + ${osgi-version} + + + org.osgi + osgi.cmpn + ${osgi-version} + - - com.google.guava - guava - ${google-guava-version} - + + + org.apache.activemq + activemq-broker + ${activemq-version} + + + org.apache.activemq + activemq-kahadb-store + ${activemq-version} + + + org.apache.activemq + activemq-client + ${activemq-version} + + + org.apache.activemq + activemq-spring + ${activemq-version} + + + org.apache.activemq + activemq-camel + ${activemq-version} + + + org.apache.activemq + activemq-pool + ${activemq-version} + + + org.apache.activemq + activemq-rar + ${activemq-version} + rar + + + org.apache.activemq + activemq-all + ${activemq-version} + + + org.apache.activemq + activemq-amqp + ${activemq-version} + + + org.apache.activemq + activemq-openwire-legacy + ${activemq-version} + + + org.apache.activemq + activemq-jaas + ${activemq-version} + + + org.apache.activemq + activemq-mqtt + ${activemq-version} + - - - ca.uhn.hapi - hapi-structures-v21 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v22 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v23 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v231 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v24 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v25 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v251 - ${hapi-version} - - - ca.uhn.hapi - hapi-structures-v26 - ${hapi-version} - + + org.apache.xbean + xbean-spring + ${xbean-spring-version} + - - - com.lmax - disruptor - ${disruptor-version} - + + + org.apache.geronimo.specs + geronimo-j2ee-connector_1.5_spec + ${geronimo-j2ee-connector-spec-version} + + + org.apache.geronimo.specs + geronimo-j2ee-jacc_1.0_spec + ${geronimo-j2ee-jacc-spec-version} + + + org.apache.geronimo.specs + geronimo-j2ee-management_1.0_spec + ${geronimo-j2ee-management-spec-version} + + + org.apache.geronimo.specs + geronimo-jms_1.1_spec + ${geronimo-jms-spec-version} + + + org.apache.geronimo.specs + geronimo-jms_2.0_spec + ${geronimo-jms2-spec-version} + + + org.apache.geronimo.specs + geronimo-jpa_2.1_spec + ${geronimo-jpa-spec-version} + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + ${geronimo-jta-spec-version} + + + javax.servlet + javax.servlet-api + ${javax-servlet-api-version} + + + + org.springframework + spring-context + ${spring-version} + + + org.springframework + spring-test + ${spring-version} + + + org.springframework + spring-core + ${spring-version} + + + org.springframework + spring-beans + ${spring-version} + + + org.springframework + spring-web + ${spring-version} + + + org.springframework + spring-aop + ${spring-version} + + + org.springframework + spring-jdbc + ${spring-version} + + + org.springframework + spring-orm + ${spring-version} + + + org.springframework + spring-jms + ${spring-version} + + + org.springframework + spring-context-support + ${spring-version} + + + org.springframework + spring-tx + ${spring-version} + + + org.springframework + spring-expression + ${spring-version} + + + org.springframework.security + spring-security-config + ${spring-security-version} + + + org.springframework.security + spring-security-core + ${spring-security-version} + - - - com.github.dozermapper - dozer-core - ${dozer-version} - + + org.scala-lang + scala-library + ${scala-version} + - - - com.dropbox.core - dropbox-core-sdk - ${dropbox-version} - + + org.yaml + snakeyaml + ${snakeyaml-version} + - - - org.apache.mina - mina-core - ${mina-version} - + + javax.annotation + jsr250-api + 1.0 + - - org.slf4j - slf4j-simple - ${slf4j-version} - + + com.google.guava + guava + ${google-guava-version} + - - - org.apache.httpcomponents - httpcore - ${httpcore4-version} - - - org.apache.httpcomponents - httpcore-nio - ${httpcore4-version} - + + + ca.uhn.hapi + hapi-structures-v21 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v22 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v23 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v231 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v24 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v25 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v251 + ${hapi-version} + + + ca.uhn.hapi + hapi-structures-v26 + ${hapi-version} + - - - org.apache.httpcomponents - httpclient - ${httpclient4-version} - - - org.apache.httpcomponents - httpclient-cache - ${httpclient4-version} - - - org.apache.httpcomponents - httpclient-osgi - ${httpclient4-version} - - - org.apache.httpcomponents - httpmime - ${httpclient4-version} - + + + com.lmax + disruptor + ${disruptor-version} + - - - org.apache.httpcomponents - httpasyncclient - ${httpasyncclient-version} - + + + com.github.dozermapper + dozer-core + ${dozer-version} + + + + com.dropbox.core + dropbox-core-sdk + ${dropbox-version} + - - - org.codehaus.groovy - groovy - ${groovy-version} - - - org.codehaus.groovy - groovy-xml - ${groovy-version} - - - org.codehaus.groovy - groovy-ant - ${groovy-version} - - - org.codehaus.groovy - groovy-jsr223 - ${groovy-version} - + + + org.apache.mina + mina-core + ${mina-version} + - - - ognl - ognl - ${ognl-version} - + + org.slf4j + slf4j-simple + ${slf4j-version} + - - - net.sf.saxon - Saxon-HE - ${saxon-version} - + + + org.apache.httpcomponents + httpcore + ${httpcore4-version} + + + org.apache.httpcomponents + httpcore-nio + ${httpcore4-version} + - - - junit - junit - ${junit-version} - - - org.junit - junit-bom - ${junit-jupiter-version} - pom - import - - - org.awaitility - awaitility - ${awaitility-version} - - - org.assertj - assertj-core - ${assertj-version} - - - org.hamcrest - hamcrest - ${hamcrest-version} - - - org.mockito - mockito-core - ${mockito-version} - - - org.mockito - mockito-junit-jupiter - ${mockito-version} - - - httpunit - httpunit - ${httpunit-version} - - - org.testcontainers - junit-jupiter - ${testcontainers-version} - + + + org.apache.httpcomponents + httpclient + ${httpclient4-version} + + + org.apache.httpcomponents + httpclient-cache + ${httpclient4-version} + + + org.apache.httpcomponents + httpclient-osgi + ${httpclient4-version} + + + org.apache.httpcomponents + httpmime + ${httpclient4-version} + - - - org.apache.openjpa - openjpa-persistence-jdbc - ${openjpa-version} - + + + org.apache.httpcomponents + httpasyncclient + ${httpasyncclient-version} + - - - org.hibernate - hibernate-entitymanager - ${hibernate-version} - - - javax.transaction - jta - - - - - org.apache.derby - derby - ${derby-version} - - - org.hsqldb - hsqldb - ${hsqldb-version} - test - - - - org.apache.servicemix.bundles - org.apache.servicemix.bundles.snmp4j - ${snmp4j-version} - + + + org.codehaus.groovy + groovy + ${groovy-version} + + + org.codehaus.groovy + groovy-xml + ${groovy-version} + + + org.codehaus.groovy + groovy-ant + ${groovy-version} + + + org.codehaus.groovy + groovy-jsr223 + ${groovy-version} + - - - com.thoughtworks.xstream - xstream - ${xstream-version} - + + + ognl + ognl + ${ognl-version} + - - - org.codehaus.jettison - jettison - ${jettison-version} - + + + net.sf.saxon + Saxon-HE + ${saxon-version} + - - - org.ccil.cowan.tagsoup - tagsoup - ${tagsoup-version} - + + + junit + junit + ${junit-version} + + + org.junit + junit-bom + ${junit-jupiter-version} + pom + import + + + org.awaitility + awaitility + ${awaitility-version} + + + org.assertj + assertj-core + ${assertj-version} + + + org.hamcrest + hamcrest + ${hamcrest-version} + + + org.mockito + mockito-core + ${mockito-version} + + + org.mockito + mockito-junit-jupiter + ${mockito-version} + + + httpunit + httpunit + ${httpunit-version} + + + org.testcontainers + junit-jupiter + ${testcontainers-version} + - - - org.apache.any23 - apache-any23-core - ${apache-any23-version} - + + + org.apache.openjpa + openjpa-persistence-jdbc + ${openjpa-version} + - - - org.eclipse.rdf4j - rdf4j-model - ${rdf4j-model-version} - + + + org.hibernate + hibernate-entitymanager + ${hibernate-version} + + + javax.transaction + jta + + + + + org.apache.derby + derby + ${derby-version} + + + org.hsqldb + hsqldb + ${hsqldb-version} + test + - - org.eclipse.rdf4j - rdf4j-rio-api - ${rdf4j-rio-version} - + + + org.apache.servicemix.bundles + org.apache.servicemix.bundles.snmp4j + ${snmp4j-version} + - - - org.apache.ws.commons.axiom - axiom-api - ${axiom-version} - - - org.apache.ws.commons.axiom - axiom-impl - ${axiom-version} - + + + com.thoughtworks.xstream + xstream + ${xstream-version} + - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin-version} - + + + org.codehaus.jettison + jettison + ${jettison-version} + - - - com.cloudbees.thirdparty - zendesk-java-client - ${zendesk-client-version} - + + + org.ccil.cowan.tagsoup + tagsoup + ${tagsoup-version} + - - - org.python - jython - ${jython-version} - - - org.mozilla - rhino - ${rhino-version} - - - rhino - js - ${rhino-js-version} - - - commons-dbcp - commons-dbcp - ${commons-dbcp-version} - - - org.apache.commons - commons-dbcp2 - ${commons-dbcp2-version} - - - commons-pool - commons-pool - ${commons-pool-version} - - - commons-collections - commons-collections - ${commons-collections-version} - - - commons-io - commons-io - ${commons-io-version} - - - xalan - xalan - ${xalan-version} - - - xerces - xercesImpl - ${xerces-version} - - - xml-apis - xml-apis - ${xml-apis-version} - - - org.codehaus.woodstox - woodstox-core-asl - ${woodstox-version} - - - javax.xml.stream - stax-api - - - + + + org.apache.any23 + apache-any23-core + ${apache-any23-version} + - - - org.apache.avro - avro - ${avro-version} - - - org.apache.avro - avro-ipc - ${avro-version} - + + + org.eclipse.rdf4j + rdf4j-model + ${rdf4j-model-version} + - - - org.apache.ftpserver - ftpserver-core - ${ftpserver-version} - - - org.apache.ftpserver - ftplet-api - ${ftpserver-version} - + + org.eclipse.rdf4j + rdf4j-rio-api + ${rdf4j-rio-version} + - - - org.apache.zookeeper - zookeeper - ${zookeeper-version} - + + + org.apache.ws.commons.axiom + axiom-api + ${axiom-version} + + + org.apache.ws.commons.axiom + axiom-impl + ${axiom-version} + - - - org.optaplanner - optaplanner-bom - ${optaplanner-version} - pom - import - + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin-version} + - - - org.dizitart - nitrite - ${nitrite-version} - - - - org.apache.aries.blueprint - org.apache.aries.blueprint.api - ${aries-blueprint-api-version} - - - org.apache.aries.blueprint - org.apache.aries.blueprint.core - ${aries-blueprint-core-version} - - - org.apache.aries.blueprint - org.apache.aries.blueprint.cm - ${aries-blueprint-cm-version} - + + + com.cloudbees.thirdparty + zendesk-java-client + ${zendesk-client-version} + - - - org.apache.felix - org.apache.felix.configadmin - ${felix-configadmin-version} - + + + org.python + jython + ${jython-version} + + + org.mozilla + rhino + ${rhino-version} + + + rhino + js + ${rhino-js-version} + + + commons-dbcp + commons-dbcp + ${commons-dbcp-version} + + + org.apache.commons + commons-dbcp2 + ${commons-dbcp2-version} + + + commons-pool + commons-pool + ${commons-pool-version} + + + commons-collections + commons-collections + ${commons-collections-version} + + + commons-io + commons-io + ${commons-io-version} + + + xalan + xalan + ${xalan-version} + + + xerces + xercesImpl + ${xerces-version} + + + xml-apis + xml-apis + ${xml-apis-version} + + + org.codehaus.woodstox + woodstox-core-asl + ${woodstox-version} + + + javax.xml.stream + stax-api + + + - - - org.apache.maven.archetype - archetype-packaging - ${maven-archetype-packaging-version} - + + + org.apache.avro + avro + ${avro-version} + + + org.apache.avro + avro-ipc + ${avro-version} + - - - org.apache.pdfbox - fontbox - ${pdfbox-version} - - - org.apache.pdfbox - pdfbox - ${pdfbox-version} - - - org.apache.pdfbox - pdfbox-tools - ${pdfbox-version} - - - org.apache.pdfbox - pdfbox-debugger - ${pdfbox-version} - + + + org.apache.ftpserver + ftpserver-core + ${ftpserver-version} + + + org.apache.ftpserver + ftplet-api + ${ftpserver-version} + - - io.nessus - nessus-ipfs-client - ${nessus-ipfs-version} - + + + org.apache.zookeeper + zookeeper + ${zookeeper-version} + - - - org.apache.pulsar - pulsar-client - ${pulsar-version} - - - org.apache.pulsar - pulsar-client-admin - ${pulsar-version} - + + + org.optaplanner + optaplanner-bom + ${optaplanner-version} + pom + import + - - - io.apicurio - apicurio-data-models - ${apicurio-version} - + + + org.dizitart + nitrite + ${nitrite-version} + + + + org.apache.aries.blueprint + org.apache.aries.blueprint.api + ${aries-blueprint-api-version} + + + org.apache.aries.blueprint + org.apache.aries.blueprint.core + ${aries-blueprint-core-version} + + + org.apache.aries.blueprint + org.apache.aries.blueprint.cm + ${aries-blueprint-cm-version} + + + + org.apache.felix + org.apache.felix.configadmin + ${felix-configadmin-version} + - - - io.krakens - java-grok - ${java-grok-version} - + + + org.apache.maven.archetype + archetype-packaging + ${maven-archetype-packaging-version} + - - - io.methvin - directory-watcher - ${directory-watcher-version} - - - + + + org.apache.pdfbox + fontbox + ${pdfbox-version} + + + org.apache.pdfbox + pdfbox + ${pdfbox-version} + + + org.apache.pdfbox + pdfbox-tools + ${pdfbox-version} + + + org.apache.pdfbox + pdfbox-debugger + ${pdfbox-version} + - - install - - - - org.apache.camel - camel-package-maven-plugin - ${project.version} - - - org.apache.camel - camel-javadoc-plugin - ${project.version} - - - org.codehaus.mojo - jaxb2-maven-plugin - ${jaxb2-maven-plugin-version} - - - org.apache.maven.plugins - maven-plugin-plugin - ${maven-plugin-plugin-version} - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin-version} - - - ${camel.osgi.manifest} - - - - - org.apache.cxf - cxf-codegen-plugin - ${cxf-codegen-plugin-version} - - once - - true - 1 - - true - - - - - xerces - xercesImpl - ${xerces-version} - - - - - org.apache.maven.plugins - maven-antrun-plugin - ${maven-antrun-plugin-version} - - - com.sun.xml.bind - jaxb-impl - ${jaxb-version} - - - com.sun.xml.bind - jaxb-jxc - ${jaxb-version} - - - ant-contrib - ant-contrib - 1.0b3 - - - ant - ant - - - - - org.apache.ant - ant-trax - 1.8.0 - - - org.apache.ant - ant-nodeps - 1.8.1 - - - org.apache.openjpa - openjpa-persistence-jdbc - ${openjpa-version} - - - ant - ant - - - - - - - org.apache.maven.plugins - maven-archetype-plugin - ${maven-archetype-plugin-version} - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${maven-checkstyle-plugin-version} - - - org.apache.camel - camel-buildtools - ${project.version} - - - com.puppycrawl.tools - checkstyle - ${maven-checkstyle-version} - - - - - default-cli - validate - - false - camel-checkstyle.xml - true - ${checkstyle.failOnViolation} - false - camel-checkstyle-suppressions.xml - UTF-8 - - ${basedir}/src - - header-java.txt - **/*.java,**/*.groovy,**/*.scala,**/*.properties,**/*.xml,**/*.xsd - - **/archetype-resources/**/*.java,**/archetype-resources/**/*.groovy,**/archetype-resources/**/*.scala,**/archetype-resources/**/*.xml,**/org/json/simple/**/*.java - - - - checkstyle - - - - - - org.apache.maven.plugins - maven-clean-plugin - - - - - activemq-data - false - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin-version} - - ${jdk.version} - ${jdk.version} - 512M - ${compiler.fork} - true - true - - - -parameters - - - - - org.apache.maven.plugins - maven-eclipse-plugin - - - org.eclipse.jdt.core.javabuilder - net.sf.eclipsecs.core.CheckstyleBuilder - - - org.eclipse.jdt.core.javanature - net.sf.eclipsecs.core.CheckstyleNature - - - - .checkstyle - /camel-eclipse-checkstyle - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - true - ${jdk.version} - true - Apache Camel - false - 1.8.0 - UTF-8 - - - - org.apache.maven.plugins - maven-resources-plugin - ${maven-resources-plugin-version} - - UTF-8 - - - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin-version} - - - org.apache.maven.plugins - maven-source-plugin - - - - ${project.groupId}.${project.artifactId}.source - - ${camel.osgi.version.clean} - - ${project.groupId}.${project.artifactId};version="${camel.osgi.version.clean}" - - - - - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin-version} - - - - - ${project.build.outputDirectory} - - META-INF/LICENSE* - META-INF/NOTICE* - META-INF/DEPENDENCIES* - - - - - - - org.apache.maven.plugins - maven-surefire-report-plugin - ${maven-surefire-report-plugin-version} - - - org.apache.servicemix.tooling - depends-maven-plugin - 1.2 - - - org.apache.tomcat.maven - tomcat7-maven-plugin - 2.1 - - / - true - - - - org.codehaus.mojo - build-helper-maven-plugin - ${build-helper-maven-plugin-version} - - - org.codehaus.mojo - cobertura-maven-plugin - ${cobertura-maven-plugin-version} - - - 85 - 85 - false - 85 - 85 - 85 - 85 - - - org.apache.camel.impl.* - 90 - 80 - - - org.apache.camel.builder.* - 40 - 30 - - - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin-version} - - - org.codehaus.mojo - findbugs-maven-plugin - ${findbugs-maven-plugin-version} - - - org.codehaus.mojo - properties-maven-plugin - ${properties-maven-plugin-version} - - - org.codehaus.mojo - tomcat-maven-plugin - 1.1 - - / - - - - org.jvnet.jaxb2.maven2 - maven-jaxb2-plugin - 0.8.3 - - - - generate - - - - - false - true - - -Xfluent-api - - - - net.java.dev.jaxb2-commons - jaxb-fluent-api - 2.1.8 - - - - - - xerces - xercesImpl - ${xerces-version} - - - - - ${jetty-runner-groupId} - jetty-maven-plugin - ${jetty-plugin-version} - - - org.owasp - dependency-check-maven - ${maven-owasp-plugin-version} - - 16 - false - false - true - true - ALL - - - - validate - - aggregate - - - - - - - org.eclipse.m2e - lifecycle-mapping - ${lifecycle-mapping-version} - - - - - - org.apache.maven.plugins - maven-remote-resources-plugin - ${maven-remote-resources-plugin-version} - - process - - - - - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin-version} - - - - - - - org.apache.maven.plugins - maven-site-plugin - - - attach-descriptor - - - - - - - org.apache.maven.plugins - maven-enforcer-plugin - - - enforce-maven-version - - - - + + io.nessus + nessus-ipfs-client + ${nessus-ipfs-version} + - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin-version} - - -XX:+ExitOnOutOfMemoryError - - 300 - false - true - false - alphabetical - - 2 - - file,http,https - file,http - target/derby.log - ${java.awt.headless} - ${basedir}/target/test-classes/logging.properties - - target/ - - - - **/*Test.java - - - **/*IntegrationTest.java - **/*XXXTest.* - - - - - + + + org.apache.pulsar + pulsar-client + ${pulsar-version} + + + org.apache.pulsar + pulsar-client-admin + ${pulsar-version} + - - - - org.codehaus.mojo - cobertura-maven-plugin - ${cobertura-maven-plugin-version} - - - html - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${maven-checkstyle-plugin-version} - - - org.apache.maven.plugins - maven-surefire-report-plugin - ${maven-surefire-report-plugin-version} - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven-javadoc-plugin-version} - - - http://docs.oracle.com/javase/8/docs/api/ - http://docs.oracle.com/javaee/7/api/ - http://docs.spring.io/spring/docs/${spring-version}/javadoc-api/ - - ${basedir}/../../etc/css/stylesheet.css - true - 500m - ${jdk.version} - - - - org.codehaus.mojo - findbugs-maven-plugin - ${findbugs-maven-plugin-version} - - - org.owasp - dependency-check-maven - ${maven-owasp-plugin-version} - - - + + + io.apicurio + apicurio-data-models + ${apicurio-version} + - - - nochecks - - true - - + + + io.krakens + java-grok + ${java-grok-version} + - - fastinstall - - - fastinstall - - - - true - true - true - true - - + + + io.methvin + directory-watcher + ${directory-watcher-version} + + + - - impsort - + + install + + + + org.apache.camel + camel-package-maven-plugin + ${project.version} + + + org.apache.camel + camel-javadoc-plugin + ${project.version} + + + org.codehaus.mojo + jaxb2-maven-plugin + ${jaxb2-maven-plugin-version} + + + org.apache.maven.plugins + maven-plugin-plugin + ${maven-plugin-plugin-version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin-version} + + + ${camel.osgi.manifest} + + + + + org.apache.cxf + cxf-codegen-plugin + ${cxf-codegen-plugin-version} + + once + + true + 1 + + true + + + + + xerces + xercesImpl + ${xerces-version} + + + + + org.apache.maven.plugins + maven-antrun-plugin + ${maven-antrun-plugin-version} + + + com.sun.xml.bind + jaxb-impl + ${jaxb-version} + + + com.sun.xml.bind + jaxb-jxc + ${jaxb-version} + + + ant-contrib + ant-contrib + 1.0b3 + + + ant + ant + + + + + org.apache.ant + ant-trax + 1.8.0 + + + org.apache.ant + ant-nodeps + 1.8.1 + + + org.apache.openjpa + openjpa-persistence-jdbc + ${openjpa-version} + + + ant + ant + + + + + + + org.apache.maven.plugins + maven-archetype-plugin + ${maven-archetype-plugin-version} + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven-checkstyle-plugin-version} + + + org.apache.camel + camel-buildtools + ${project.version} + + + com.puppycrawl.tools + checkstyle + ${maven-checkstyle-version} + + + + + default-cli + validate + + false + camel-checkstyle.xml + true + ${checkstyle.failOnViolation} + false + camel-checkstyle-suppressions.xml + UTF-8 + + ${basedir}/src + + header-java.txt + **/*.java,**/*.groovy,**/*.scala,**/*.properties,**/*.xml,**/*.xsd + + **/archetype-resources/**/*.java,**/archetype-resources/**/*.groovy,**/archetype-resources/**/*.scala,**/archetype-resources/**/*.xml,**/org/json/simple/**/*.java + + + + checkstyle + + + + + + org.apache.maven.plugins + maven-clean-plugin + + + + + activemq-data + false + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin-version} + + ${jdk.version} + ${jdk.version} + 512M + ${compiler.fork} + true + true + + + -parameters + + + + + org.apache.maven.plugins + maven-eclipse-plugin + + + org.eclipse.jdt.core.javabuilder + net.sf.eclipsecs.core.CheckstyleBuilder + + + org.eclipse.jdt.core.javanature + net.sf.eclipsecs.core.CheckstyleNature + + + + .checkstyle + /camel-eclipse-checkstyle + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + ${jdk.version} + true + Apache Camel + false + 1.8.0 + UTF-8 + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin-version} + + UTF-8 + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade-plugin-version} + + + org.apache.maven.plugins + maven-source-plugin + + + + ${project.groupId}.${project.artifactId}.source + + ${camel.osgi.version.clean} + + ${project.groupId}.${project.artifactId};version="${camel.osgi.version.clean}" + + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin-version} + + + + + ${project.build.outputDirectory} + + META-INF/LICENSE* + META-INF/NOTICE* + META-INF/DEPENDENCIES* + + + + + + + org.apache.maven.plugins + maven-surefire-report-plugin + ${maven-surefire-report-plugin-version} + + + org.apache.servicemix.tooling + depends-maven-plugin + 1.2 + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.1 + + / + true + + + + org.codehaus.mojo + build-helper-maven-plugin + ${build-helper-maven-plugin-version} + + + org.codehaus.mojo + cobertura-maven-plugin + ${cobertura-maven-plugin-version} + + + 85 + 85 + false + 85 + 85 + 85 + 85 + + + org.apache.camel.impl.* + 90 + 80 + + + org.apache.camel.builder.* + 40 + 30 + + + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin-version} + + + org.codehaus.mojo + findbugs-maven-plugin + ${findbugs-maven-plugin-version} + + + org.codehaus.mojo + properties-maven-plugin + ${properties-maven-plugin-version} + + + org.codehaus.mojo + tomcat-maven-plugin + 1.1 + + / + + + + org.jvnet.jaxb2.maven2 + maven-jaxb2-plugin + 0.8.3 + + + + generate + + + + + false + true + + -Xfluent-api + + + + net.java.dev.jaxb2-commons + jaxb-fluent-api + 2.1.8 + + + + + + xerces + xercesImpl + ${xerces-version} + + + + + ${jetty-runner-groupId} + jetty-maven-plugin + ${jetty-plugin-version} + + + org.owasp + dependency-check-maven + ${maven-owasp-plugin-version} + + 16 + false + false + true + true + ALL + + + + validate + + aggregate + + + + + + + org.eclipse.m2e + lifecycle-mapping + ${lifecycle-mapping-version} + + + + + + org.apache.maven.plugins + maven-remote-resources-plugin + ${maven-remote-resources-plugin-version} + + process + + + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin-version} + + + - - net.revelc.code - impsort-maven-plugin - ${impsort-maven-plugin-version} - - - sort-imports - - sort - - process-sources + + + org.apache.maven.plugins + maven-site-plugin + + + attach-descriptor + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + enforce-maven-version + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin-version} - java.,javax.,org.w3c.,org.xml.,junit.,* - **/package-info.java - true - true + -XX:+ExitOnOutOfMemoryError + + 300 + false + true + false + alphabetical + + 2 + + file,http,https + file,http + target/derby.log + ${java.awt.headless} + ${basedir}/target/test-classes/logging.properties + + target/ + + + + **/*Test.java + + + **/*IntegrationTest.java + **/*XXXTest.* + - - - + - - + - - sourcecheck - + - - org.apache.maven.plugins - maven-checkstyle-plugin - + + org.codehaus.mojo + cobertura-maven-plugin + ${cobertura-maven-plugin-version} + + + html + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven-checkstyle-plugin-version} + + + org.apache.maven.plugins + maven-surefire-report-plugin + ${maven-surefire-report-plugin-version} + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin-version} + + + http://docs.oracle.com/javase/8/docs/api/ + http://docs.oracle.com/javaee/7/api/ + http://docs.spring.io/spring/docs/${spring-version}/javadoc-api/ + + ${basedir}/../../etc/css/stylesheet.css + true + 500m + ${jdk.version} + + + + org.codehaus.mojo + findbugs-maven-plugin + ${findbugs-maven-plugin-version} + + + org.owasp + dependency-check-maven + ${maven-owasp-plugin-version} + - - + - - revapi - - - - org.revapi - revapi-maven-plugin - ${revapi-maven-plugin-version} - - - org.revapi - revapi-java - ${revapi-java-version} - - - - - ${project.basedir}/src/revapi/ignore.json - - - - - - check - - - - - - - + - - dependencycheck - - - - org.owasp - dependency-check-maven - - - - + + nochecks + + true + + - - errorprone - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin-version} - - ${jdk.version} - ${jdk.version} - 512M - ${compiler.fork} - javac-with-errorprone - true - - - - org.codehaus.plexus - plexus-compiler-javac-errorprone - ${errorprone-version} - - - - - - + + fastinstall + + + fastinstall + + + + true + true + true + true + + - - cleanrepo - - build-helper:remove-project-artifact - - + + impsort + + + + net.revelc.code + impsort-maven-plugin + ${impsort-maven-plugin-version} + + + sort-imports + + sort + + process-sources + + java.,javax.,org.w3c.,org.xml.,junit.,* + **/package-info.java + true + true + + + + + + + - - setup.eclipse - - process-test-sources - - - org.apache.maven.plugins - maven-eclipse-plugin - true - - - org.apache.camel - camel-buildtools - ${project.version} - - - - - setup.eclipse.project - process-test-sources - - eclipse - - - - - - - + + sourcecheck + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + + - - integration - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin-version} - - 300 - false - true - false - alphabetical - 0 - - target/derby.log - ${java.awt.headless} - - - **/*Test.* - **/*IntegrationTest.* - - - **/*XXXTest.* - - - - - - + + revapi + + + + org.revapi + revapi-maven-plugin + ${revapi-maven-plugin-version} + + + org.revapi + revapi-java + ${revapi-java-version} + + + + + ${project.basedir}/src/revapi/ignore.json + + + + + + check + + + + + + + - - partial-build - - - partial-build - - + + dependencycheck + + + + org.owasp + dependency-check-maven + + + + + + errorprone + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin-version} + + ${jdk.version} + ${jdk.version} + 512M + ${compiler.fork} + javac-with-errorprone + true + + + + org.codehaus.plexus + plexus-compiler-javac-errorprone + ${errorprone-version} + + + + + + - - - - com.lesfurets - partial-build-plugin - ${partial-build-plugin-version} - true - - - - + + cleanrepo + + build-helper:remove-project-artifact + + - - - - Linux - - - - - - maven-surefire-plugin - ${maven-surefire-plugin-version} - - - - file:///dev/urandom - - - - - - + + setup.eclipse + + process-test-sources + + + org.apache.maven.plugins + maven-eclipse-plugin + true + + + org.apache.camel + camel-buildtools + ${project.version} + + + + + setup.eclipse.project + process-test-sources + + eclipse + + + + + + + - - jdk9+-build - - [9,) - - - true - - - - - - org.codehaus.mojo - jaxb2-maven-plugin - + + integration + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin-version} + + 300 + false + true + false + alphabetical + 0 + + target/derby.log + ${java.awt.headless} + + + **/*Test.* + **/*IntegrationTest.* + + + **/*XXXTest.* + + + + + + + + + partial-build + + + partial-build + + + + + + + + com.lesfurets + partial-build-plugin + ${partial-build-plugin-version} + true + + + + + + + + + Linux + + + + + + maven-surefire-plugin + ${maven-surefire-plugin-version} + + + + file:///dev/urandom + + + + + + + + + jdk9+-build + + [9,) + + + true + + + + + + org.codehaus.mojo + jaxb2-maven-plugin + + + jakarta.xml.bind + jakarta.xml.bind-api + ${jakarta-jaxb-version} + + + + + org.apache.camel + camel-package-maven-plugin + + + jakarta.xml.bind + jakarta.xml.bind-api + ${jakarta-jaxb-version} + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin-version} + + ${jdk.version} + ${jdk.version} + 512M + true + true + true + + + + maven-surefire-plugin + + + ${camel.surefire.fork.vmargs} + + + + + + - jakarta.xml.bind - jakarta.xml.bind-api - ${jakarta-jaxb-version} + javax.annotation + javax.annotation-api + ${javax-annotation-api-version} - - - - org.apache.camel - camel-package-maven-plugin - - jakarta.xml.bind - jakarta.xml.bind-api - ${jakarta-jaxb-version} + javax.xml.ws + jaxws-api + 2.3.0 + + + javax.xml.bind + jaxb-api + + - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin-version} - - ${jdk.version} - ${jdk.version} - 512M - true - true - true - - - - maven-surefire-plugin - - - ${camel.surefire.fork.vmargs} - - - - - - - - javax.annotation - javax.annotation-api - ${javax-annotation-api-version} - - - javax.xml.ws - jaxws-api - 2.3.0 - - - javax.xml.bind - jaxb-api - - - - - jakarta.xml.bind - jakarta.xml.bind-api - ${jakarta-jaxb-version} - - - org.apache.geronimo.specs - geronimo-ws-metadata_2.0_spec - ${geronimo-ws-metadata-spec-version} - - - com.sun.xml.messaging.saaj - saaj-impl - 1.3.28 - - - javax.xml.soap - javax.xml.soap-api - - - - org.jvnet.staxex - stax-ex - - - - - org.apache.geronimo.specs - geronimo-jta_1.1_spec - - - org.jboss.spec.javax.rmi - jboss-rmi-api_1.0_spec - 1.0.6.Final - - - org.glassfish.jaxb - jaxb-runtime - ${glassfish-jaxb-runtime-version} - - - javax.xml.soap - javax.xml.soap-api - 1.4.0 - - - - + + jakarta.xml.bind + jakarta.xml.bind-api + ${jakarta-jaxb-version} + + + org.apache.geronimo.specs + geronimo-ws-metadata_2.0_spec + ${geronimo-ws-metadata-spec-version} + + + com.sun.xml.messaging.saaj + saaj-impl + 1.3.28 + + + javax.xml.soap + javax.xml.soap-api + + + + org.jvnet.staxex + stax-ex + + + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + + + org.jboss.spec.javax.rmi + jboss-rmi-api_1.0_spec + 1.0.6.Final + + + org.glassfish.jaxb + jaxb-runtime + ${glassfish-jaxb-runtime-version} + + + javax.xml.soap + javax.xml.soap-api + 1.4.0 + + + + From 3bae0052d78ef2858bcd328d7268baf3a7e98b3a Mon Sep 17 00:00:00 2001 From: Ruben Date: Sun, 26 Jul 2020 23:59:32 -0500 Subject: [PATCH 3/4] opentracing basic tests Signed-off-by: Ruben --- .../camel/opentelemetry/ABCRouteTest.java | 69 +++++++ .../CamelOpenTelemetryTestSupport.java | 178 ++++++++++++++++++ .../ClientRecipientListRouteTest.java | 67 +++++++ .../CustomComponentNameRouteTest.java | 72 +++++++ .../MulticastParallelRouteTest.java | 69 +++++++ .../opentelemetry/MulticastRouteTest.java | 71 +++++++ .../opentelemetry/RouteConcurrentTest.java | 80 ++++++++ .../camel/opentelemetry/SpanTestData.java | 105 +++++++++++ .../opentelemetry/TestSEDASpanDecorator.java | 38 ++++ .../camel/opentelemetry/TwoServiceTest.java | 59 ++++++ .../TwoServiceWithExcludeTest.java | 64 +++++++ .../src/test/resources/log4j2.properties | 6 +- .../OpenTelemetrySimpleRouteTest.xml | 2 +- 13 files changed, 876 insertions(+), 4 deletions(-) create mode 100644 components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/ABCRouteTest.java create mode 100644 components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/CamelOpenTelemetryTestSupport.java create mode 100644 components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/ClientRecipientListRouteTest.java create mode 100644 components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/CustomComponentNameRouteTest.java create mode 100644 components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/MulticastParallelRouteTest.java create mode 100644 components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/MulticastRouteTest.java create mode 100644 components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/RouteConcurrentTest.java create mode 100644 components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/SpanTestData.java create mode 100644 components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TestSEDASpanDecorator.java create mode 100644 components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TwoServiceTest.java create mode 100644 components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TwoServiceWithExcludeTest.java diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/ABCRouteTest.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/ABCRouteTest.java new file mode 100644 index 0000000000000..7498323e21389 --- /dev/null +++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/ABCRouteTest.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import io.opentelemetry.trace.SpanId; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class ABCRouteTest extends CamelOpenTelemetryTestSupport { + private static SpanTestData[] testdata = { + new SpanTestData().setLabel("seda:b server").setUri("seda://b").setOperation("b") + .setParentId(2).addLogMessage("routing at b"), + new SpanTestData().setLabel("seda:c server").setUri("seda://c").setOperation("c") + .setParentId(2).addLogMessage("Exchange[ExchangePattern: InOut, BodyType: String, Body: Hello]"), + new SpanTestData().setLabel("seda:a server").setUri("seda://a").setOperation("a") + .setParentId(3).addLogMessage("routing at a").addLogMessage("End of routing"), + new SpanTestData().setLabel("direct:start server").setUri("direct://start").setOperation("start") + }; + + public ABCRouteTest() { + super(testdata); + } + + @Test + public void testRoute() throws Exception { + template.requestBody("direct:start", "Hello"); + verify(); + } + + @Override + protected RoutesBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start").to("seda:a").routeId("start"); + + from("seda:a").routeId("a") + .log("routing at ${routeId}") + .to("seda:b") + .delay(2000) + .to("seda:c") + .log("End of routing"); + + from("seda:b").routeId("b") + .log("routing at ${routeId}") + .delay(simple("${random(1000,2000)}")); + + from("seda:c").routeId("c") + .to("log:test") + .delay(simple("${random(0,100)}")); + } + }; + } +} diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/CamelOpenTelemetryTestSupport.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/CamelOpenTelemetryTestSupport.java new file mode 100644 index 0000000000000..44b987a85e639 --- /dev/null +++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/CamelOpenTelemetryTestSupport.java @@ -0,0 +1,178 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import io.opentelemetry.exporters.inmemory.InMemoryTracing; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.TracerSdkProvider; +import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.trace.TraceId; +import io.opentelemetry.trace.Tracer; +import org.apache.camel.CamelContext; +import org.apache.camel.test.junit5.CamelTestSupport; +import org.apache.camel.tracing.SpanDecorator; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class CamelOpenTelemetryTestSupport extends CamelTestSupport { + + InMemoryTracing inMemorytracing; + private SpanTestData[] testdata; + private Tracer tracer; + private OpenTelemetryTracer ottracer; + + public CamelOpenTelemetryTestSupport(SpanTestData[] testdata) { + this.testdata = testdata; + } + + @Override + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + ottracer = new OpenTelemetryTracer(); + TracerSdkProvider provider = OpenTelemetrySdk.getTracerProvider().builder().build(); + inMemorytracing = InMemoryTracing.builder().setTracerProvider(provider).build(); + tracer = provider.get("tracerTest"); + ottracer.setTracer(tracer); + ottracer.setExcludePatterns(getExcludePatterns()); + ottracer.addDecorator(new TestSEDASpanDecorator()); + ottracer.init(context); + return context; + } + + protected Set getExcludePatterns() { + return new HashSet<>(); + } + + protected void verify() { + verify(false); + } + + protected void verify(boolean async) { + List spans = inMemorytracing.getSpanExporter().getFinishedSpanItems(); + spans.forEach(mockSpan -> { + System.out.println("Span: " + mockSpan); + System.out.println("\tComponent: " + mockSpan.getAttributes().get("component")); + System.out.println("\tTags: " + mockSpan.getAttributes()); + System.out.println("\tLogs: "); + + }); + assertEquals(testdata.length, spans.size(), "Incorrect number of spans"); + verifySameTrace(); + + if (async) { + final List unsortedSpans = spans; + spans = Arrays.stream(testdata) + .map(td -> findSpan(td, unsortedSpans)).distinct().collect(Collectors.toList()); + assertEquals(testdata.length, spans.size(), "Incorrect number of spans after sorting"); + } + + for (int i = 0; i < testdata.length; i++) { + verifySpan(i, testdata, spans); + } + } + + protected SpanData findSpan(SpanTestData testdata, List spans) { + return spans.stream().filter(s -> { + boolean matched = s.getName().equals(testdata.getOperation()); + if (s.getAttributes().get("camel-uri") != null) { + matched = matched && s.getAttributes().get("camel.uri").equals(testdata.getUri()); + } + matched = matched && s.getKind().equals(testdata.getKind()); + return matched; + }).findFirst().orElse(null); + } + + protected Tracer getTracer() { + return tracer; + } + + protected void verifyTraceSpanNumbers(int numOfTraces, int numSpansPerTrace) { + Map> traces = new HashMap<>(); + + List finishedSpans = inMemorytracing.getSpanExporter().getFinishedSpanItems(); + // Sort spans into separate traces + for (int i = 0; i < finishedSpans.size(); i++) { + List spans = traces.get(finishedSpans.get(i).getTraceId()); + if (spans == null) { + spans = new ArrayList<>(); + traces.put(finishedSpans.get(i).getTraceId(), spans); + } + spans.add(finishedSpans.get(i)); + } + + assertEquals(numOfTraces, traces.size()); + + for (Map.Entry> spans : traces.entrySet()) { + assertEquals(numSpansPerTrace, spans.getValue().size()); + } + } + + protected void verifySpan(int index, SpanTestData[] testdata, List spans) { + SpanData span = spans.get(index); + SpanTestData td = testdata[index]; + + String component = span.getAttributes().get("component").getStringValue(); + assertNotNull(component); + + if (td.getUri() != null) { + assertEquals(SpanDecorator.CAMEL_COMPONENT + URI.create(td.getUri()).getScheme(), component, td.getLabel()); + } + + if ("camel-seda".equals(component)) { + assertNotNull(span.getAttributes().get("pre")); + assertNotNull(span.getAttributes().get("post")); + } + + assertEquals(td.getOperation(), span.getName(), td.getLabel()); + + assertEquals(td.getKind(), span.getKind(), td.getLabel()); + + if (!td.getLogMessages().isEmpty()) { + assertEquals(td.getLogMessages().size(), span.getEvents().size(), td.getLabel()); + for (int i = 0; i < td.getLogMessages().size(); i++) { + assertEquals(td.getLogMessages().get(i), span.getEvents().get(i).getAttributes().get("message").getStringValue()); + } + } + + if (td.getParentId() != -1) { + assertEquals(spans.get(td.getParentId()).getSpanId(), span.getParentSpanId(), td.getLabel()); + } + if (!td.getTags().isEmpty()) { + for (Map.Entry entry : td.getTags().entrySet()) { + assertEquals(entry.getValue(), span.getAttributes().get(entry.getKey())); + } + } + + } + + protected void verifySameTrace() { + assertEquals(1, inMemorytracing.getSpanExporter().getFinishedSpanItems().stream().map(s -> s.getTraceId()).distinct().count()); + } + + +} diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/ClientRecipientListRouteTest.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/ClientRecipientListRouteTest.java new file mode 100644 index 0000000000000..bb9b22cade2ca --- /dev/null +++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/ClientRecipientListRouteTest.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + + +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class ClientRecipientListRouteTest extends CamelOpenTelemetryTestSupport { + + private static SpanTestData[] testdata = { + new SpanTestData().setLabel("seda:a server").setUri("seda://a").setOperation("a") + .setParentId(3), + new SpanTestData().setLabel("seda:b server").setUri("seda://b").setOperation("b") + .setParentId(3), + new SpanTestData().setLabel("seda:c server").setUri("seda://c").setOperation("c") + .setParentId(3), + new SpanTestData().setLabel("direct:start server").setUri("direct://start").setOperation("start") + }; + + public ClientRecipientListRouteTest() { + super(testdata); + } + + @Test + public void testRoute() throws Exception { + template.requestBody("direct:start", "Hello"); + + verify(); + } + + @Override + protected RoutesBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start").recipientList(constant("seda:a,seda:b,seda:c")).routeId("start"); + + from("seda:a").routeId("a") + .log("routing at ${routeId}"); + + from("seda:b").routeId("b") + .log("routing at ${routeId}") + .delay(simple("${random(1000,2000)}")); + + from("seda:c").routeId("c") + .log("routing at ${routeId}") + .delay(simple("${random(0,100)}")); + } + }; + } +} diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/CustomComponentNameRouteTest.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/CustomComponentNameRouteTest.java new file mode 100644 index 0000000000000..1ab6012d3b5ee --- /dev/null +++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/CustomComponentNameRouteTest.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class CustomComponentNameRouteTest extends CamelOpenTelemetryTestSupport { + + private static SpanTestData[] testdata = { + new SpanTestData().setLabel("myseda:b server").setUri("myseda://b").setOperation("b") + .setParentId(2).addLogMessage("routing at b"), + new SpanTestData().setLabel("myseda:c server").setUri("myseda://c").setOperation("c") + .setParentId(2).addLogMessage("Exchange[ExchangePattern: InOut, BodyType: String, Body: Hello]"), + new SpanTestData().setLabel("myseda:a server").setUri("myseda://a").setOperation("a") + .setParentId(3).addLogMessage("routing at a").addLogMessage("End of routing"), + new SpanTestData().setLabel("direct:start server").setUri("direct://start").setOperation("start") + }; + + public CustomComponentNameRouteTest() { + super(testdata); + } + + @Test + public void testRoute() throws Exception { + template.requestBody("direct:start", "Hello"); + + verify(); + } + + @Override + protected RoutesBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + context.addComponent("myseda", context.getComponent("seda")); + + from("direct:start").to("myseda:a").routeId("start"); + + from("myseda:a").routeId("a") + .log("routing at ${routeId}") + .to("myseda:b") + .delay(2000) + .to("myseda:c") + .log("End of routing"); + + from("myseda:b").routeId("b") + .log("routing at ${routeId}") + .delay(simple("${random(1000,2000)}")); + + from("myseda:c").routeId("c") + .to("log:test") + .delay(simple("${random(0,100)}")); + } + }; + } +} diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/MulticastParallelRouteTest.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/MulticastParallelRouteTest.java new file mode 100644 index 0000000000000..c74a5d4fb8e5f --- /dev/null +++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/MulticastParallelRouteTest.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class MulticastParallelRouteTest extends CamelOpenTelemetryTestSupport { + + private static SpanTestData[] testdata = { + new SpanTestData().setLabel("seda:b server").setUri("seda://b").setOperation("b") + .setParentId(2).addLogMessage("routing at b"), + new SpanTestData().setLabel("seda:c server").setUri("seda://c").setOperation("c") + .setParentId(2).addLogMessage("routing at c"), + new SpanTestData().setLabel("seda:a server").setUri("seda://a").setOperation("a") + .setParentId(3).addLogMessage("routing at a").addLogMessage("End of routing"), + new SpanTestData().setLabel("direct:start server").setUri("direct://start").setOperation("start") + }; + + public MulticastParallelRouteTest() { + super(testdata); + } + + @Test + public void testRoute() throws Exception { + template.requestBody("direct:start", "Hello"); + verify(true); + } + + @Override + protected RoutesBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start").to("seda:a").routeId("start"); + + from("seda:a").routeId("a") + .log("routing at ${routeId}") + .multicast().parallelProcessing() + .to("seda:b", "seda:c") + .end() + .log("End of routing"); + + from("seda:b").routeId("b") + .log("routing at ${routeId}") + .delay(simple("${random(1000,2000)}")); + + from("seda:c").routeId("c") + .log("routing at ${routeId}") + .delay(simple("${random(0,100)}")); + } + }; + } +} diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/MulticastRouteTest.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/MulticastRouteTest.java new file mode 100644 index 0000000000000..2562e0999c9b4 --- /dev/null +++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/MulticastRouteTest.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class MulticastRouteTest extends CamelOpenTelemetryTestSupport { + + private static SpanTestData[] testdata = { + new SpanTestData().setLabel("seda:b server").setUri("seda://b").setOperation("b") + .setParentId(2), + new SpanTestData().setLabel("seda:c server").setUri("seda://c").setOperation("c") + .setParentId(2), + new SpanTestData().setLabel("seda:a server").setUri("seda://a").setOperation("a") + .setParentId(3), + new SpanTestData().setLabel("direct:start server").setUri("direct://start").setOperation("start") + }; + + public MulticastRouteTest() { + super(testdata); + } + + @Test + public void testRoute() throws Exception { + template.requestBody("direct:start", "Hello"); + + verify(); + } + + @Override + protected RoutesBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start").to("seda:a").routeId("start"); + + from("seda:a").routeId("a") + .log("routing at ${routeId}") + .multicast() + .to("seda:b") + .to("seda:c") + .end() + .log("End of routing"); + + from("seda:b").routeId("b") + .log("routing at ${routeId}") + .delay(simple("${random(1000,2000)}")); + + from("seda:c").routeId("c") + .log("routing at ${routeId}") + .delay(simple("${random(0,100)}")); + } + }; + } +} diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/RouteConcurrentTest.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/RouteConcurrentTest.java new file mode 100644 index 0000000000000..28b350c6e928d --- /dev/null +++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/RouteConcurrentTest.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import java.util.concurrent.TimeUnit; + +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.NotifyBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class RouteConcurrentTest extends CamelOpenTelemetryTestSupport { + + private static SpanTestData[] testdata = { + new SpanTestData().setLabel("seda:foo server").setUri("seda://foo?concurrentConsumers=5").setOperation("foo"), + new SpanTestData().setLabel("seda:bar server").setUri("seda://bar?concurrentConsumers=5").setOperation("bar") + .setParentId(0) + }; + + public RouteConcurrentTest() { + super(testdata); + } + + @Test + public void testSingleInvocationsOfRoute() throws Exception { + NotifyBuilder notify = new NotifyBuilder(context).whenDone(2).create(); + + template.sendBody("seda:foo", "Hello World"); + + assertTrue(notify.matches(30, TimeUnit.SECONDS)); + + verify(); + } + + @Test + public void testConcurrentInvocationsOfRoute() throws Exception { + NotifyBuilder notify = new NotifyBuilder(context).whenDone(10).create(); + + for (int i = 0; i < 5; i++) { + template.sendBody("seda:foo", "Hello World"); + } + + assertTrue(notify.matches(30, TimeUnit.SECONDS)); + + verifyTraceSpanNumbers(5, testdata.length); + } + + @Override + protected RoutesBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("seda:foo?concurrentConsumers=5").routeId("foo") + .log("routing at ${routeId}") + .delay(simple("${random(1000,2000)}")) + .to("seda:bar"); + + from("seda:bar?concurrentConsumers=5").routeId("bar") + .log("routing at ${routeId}") + .delay(simple("${random(0,500)}")); + } + }; + } +} diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/SpanTestData.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/SpanTestData.java new file mode 100644 index 0000000000000..937e87ba2840c --- /dev/null +++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/SpanTestData.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.opentelemetry.trace.Span; + +public class SpanTestData { + + private String label; + private String uri; + private String operation; + private Span.Kind kind = Span.Kind.INTERNAL; + private int parentId = -1; + private List logMessages = new ArrayList<>(); + private Map tags = new HashMap<>(); + private ArrayList childs = new ArrayList<>(); + + public String getLabel() { + return label; + } + + public SpanTestData setLabel(String label) { + this.label = label; + return this; + } + + public String getUri() { + return uri; + } + + public SpanTestData setUri(String uri) { + this.uri = uri; + return this; + } + + public String getOperation() { + return operation; + } + + public SpanTestData setOperation(String operation) { + this.operation = operation; + return this; + } + + public Span.Kind getKind() { + return kind; + } + + public SpanTestData setKind(Span.Kind kind) { + this.kind = kind; + return this; + } + + public int getParentId() { + return parentId; + } + + public SpanTestData setParentId(int parentId) { + this.parentId = parentId; + return this; + } + + public SpanTestData addLogMessage(String mesg) { + logMessages.add(mesg); + return this; + } + + public List getLogMessages() { + return logMessages; + } + + public SpanTestData addTag(String key, String val) { + tags.put(key, val); + return this; + } + + public Map getTags() { + return tags; + } + + public SpanTestData setChilds(SpanTestData[] childs) { + Collections.addAll(this.childs, childs); + return this; + } +} diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TestSEDASpanDecorator.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TestSEDASpanDecorator.java new file mode 100644 index 0000000000000..5d02fde26d073 --- /dev/null +++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TestSEDASpanDecorator.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.decorators.SedaSpanDecorator; + +public class TestSEDASpanDecorator extends SedaSpanDecorator { + + @Override + public void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint) { + super.pre(span, exchange, endpoint); + span.setTag("pre", "test"); + } + + @Override + public void post(SpanAdapter span, Exchange exchange, Endpoint endpoint) { + super.post(span, exchange, endpoint); + span.setTag("post", "test"); + } + +} \ No newline at end of file diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TwoServiceTest.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TwoServiceTest.java new file mode 100644 index 0000000000000..3b04ea777e6f6 --- /dev/null +++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TwoServiceTest.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class TwoServiceTest extends CamelOpenTelemetryTestSupport { + + private static SpanTestData[] testdata = { + new SpanTestData().setLabel("ServiceB server").setUri("direct://ServiceB").setOperation("ServiceB") + .setParentId(1), + new SpanTestData().setLabel("ServiceA server").setUri("direct://ServiceA").setOperation("ServiceA") + }; + + public TwoServiceTest() { + super(testdata); + } + + @Test + public void testRoute() throws Exception { + template.requestBody("direct:ServiceA", "Hello"); + + verify(); + } + + @Override + protected RoutesBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:ServiceA") + .log("ServiceA has been called") + .delay(simple("${random(1000,2000)}")) + .to("direct:ServiceB"); + + from("direct:ServiceB") + .log("ServiceB has been called") + .delay(simple("${random(0,500)}")); + } + }; + } +} + diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TwoServiceWithExcludeTest.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TwoServiceWithExcludeTest.java new file mode 100644 index 0000000000000..3dfe12c0e7f47 --- /dev/null +++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/TwoServiceWithExcludeTest.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.opentelemetry; + +import java.util.Collections; +import java.util.Set; + +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class TwoServiceWithExcludeTest extends CamelOpenTelemetryTestSupport { + + private static SpanTestData[] testdata = { + new SpanTestData().setLabel("ServiceA server").setUri("direct://ServiceA").setOperation("ServiceA") + }; + + public TwoServiceWithExcludeTest() { + super(testdata); + } + + @Override + protected Set getExcludePatterns() { + return Collections.singleton("direct:ServiceB"); + } + + @Test + public void testRoute() throws Exception { + template.requestBody("direct:ServiceA", "Hello"); + + verify(); + } + + @Override + protected RoutesBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:ServiceA") + .log("ServiceA has been called") + .delay(simple("${random(1000,2000)}")) + .to("direct:ServiceB"); + + from("direct:ServiceB") + .log("ServiceB has been called") + .delay(simple("${random(0,500)}")); + } + }; + } +} diff --git a/components/camel-opentelemetry/src/test/resources/log4j2.properties b/components/camel-opentelemetry/src/test/resources/log4j2.properties index ae9e53005926f..89ff53a8dd57b 100644 --- a/components/camel-opentelemetry/src/test/resources/log4j2.properties +++ b/components/camel-opentelemetry/src/test/resources/log4j2.properties @@ -16,14 +16,14 @@ ## --------------------------------------------------------------------------- appender.file.type=File appender.file.name=file -appender.file.fileName=target/camel-opentracing-test.log +appender.file.fileName=target/camel-opentelemetry-test.log appender.file.layout.type=PatternLayout appender.file.layout.pattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n appender.out.type=Console appender.out.name=out appender.out.layout.type=PatternLayout appender.out.layout.pattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n -logger.opentracing.name=org.apache.camel.opentracing -logger.opentracing.level=INFO +logger.opentelemetry.name=org.apache.camel.opentelemetry +logger.opentelemetry.level=INFO rootLogger.level=INFO rootLogger.appenderRef.file.ref=file diff --git a/components/camel-opentelemetry/src/test/resources/org/apache/camel/opentelemetry/OpenTelemetrySimpleRouteTest.xml b/components/camel-opentelemetry/src/test/resources/org/apache/camel/opentelemetry/OpenTelemetrySimpleRouteTest.xml index ab190dc8178a5..953fbd293fdab 100644 --- a/components/camel-opentelemetry/src/test/resources/org/apache/camel/opentelemetry/OpenTelemetrySimpleRouteTest.xml +++ b/components/camel-opentelemetry/src/test/resources/org/apache/camel/opentelemetry/OpenTelemetrySimpleRouteTest.xml @@ -27,7 +27,7 @@ - + From 0e091236b335abf90fc5eb4f577b239c7b64d6be Mon Sep 17 00:00:00 2001 From: Ruben Date: Tue, 28 Jul 2020 09:48:52 -0500 Subject: [PATCH 4/4] Fix tracing log messages, some improvments on code style Signed-off-by: Ruben --- .../apache/camel/catalog/others.properties | 2 -- .../apache/camel/catalog/others/tracing.json | 4 ++-- components/camel-opentelemetry/pom.xml | 2 +- .../OpenTelemetrySpanAdapter.java | 1 - .../propagators/OpenTelemetryGetter.java | 4 +--- .../java/org/apache/camel/tracing/Tracer.java | 20 +++++++++---------- 6 files changed, 14 insertions(+), 19 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties index f4a9fc2e0e9d6..73a6af4a43ff7 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties @@ -12,7 +12,6 @@ microprofile-config microprofile-fault-tolerance microprofile-health openapi-java -opentelemetry opentracing platform-http-vertx reactive-executor-vertx @@ -35,6 +34,5 @@ testcontainers-junit5 testcontainers-spring testcontainers-spring-junit5 threadpoolfactory-vertx -tracing undertow-spring-security zipkin diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/tracing.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/tracing.json index 27d17605f8030..6b36673be3b7a 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/tracing.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/tracing.json @@ -5,8 +5,8 @@ "title": "Tracing", "description": "Distributed tracing common interfaces", "deprecated": false, - "firstVersion": "2.9.0", - "supportLevel": "Stable", + "firstVersion": "3.5.0", + "supportLevel": "Preview", "groupId": "org.apache.camel", "artifactId": "camel-tracing", "version": "3.5.0-SNAPSHOT" diff --git a/components/camel-opentelemetry/pom.xml b/components/camel-opentelemetry/pom.xml index 5fb6c075a997e..0e9ee1e8e620e 100644 --- a/components/camel-opentelemetry/pom.xml +++ b/components/camel-opentelemetry/pom.xml @@ -81,7 +81,7 @@ io.opentelemetry opentelemetry-exporters-inmemory - 0.6.0 + ${opentelemetry-version} diff --git a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanAdapter.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanAdapter.java index b6243c30b1704..63228995f0766 100644 --- a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanAdapter.java +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanAdapter.java @@ -82,7 +82,6 @@ io.opentelemetry.trace.Span getOpenTelemetrySpan() { @Override public void log(Map fields) { span.addEvent(getEventNameFromFields(fields), convertToAttributes(fields)); - } String getEventNameFromFields(Map fields) { diff --git a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java index 3193b590e36e8..3cf8abe7203af 100644 --- a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.java @@ -16,14 +16,12 @@ */ package org.apache.camel.opentelemetry.propagators; -import javax.annotation.Nullable; - import io.opentelemetry.context.propagation.HttpTextFormat; import org.apache.camel.tracing.ExtractAdapter; public class OpenTelemetryGetter implements HttpTextFormat.Getter { - @Nullable @Override public String get(ExtractAdapter adapter, String key) { + @Override public String get(ExtractAdapter adapter, String key) { return (String) adapter.get(key); } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java index b825f700ce6e7..116aa67caf786 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java @@ -95,7 +95,7 @@ public InterceptStrategy getTracingStrategy() { } /** - * Specifies the instance responsible for tracking invoked EIP and beans with OpenTracing. + * Specifies the instance responsible for tracking invoked EIP and beans with Tracing. * * @param tracingStrategy The instance which tracks invoked EIP and beans */ @@ -245,7 +245,7 @@ public void notify(CamelEvent event) throws Exception { inject(span, sd.getInjectAdapter(ese.getExchange().getIn().getHeaders(), encoding)); ActiveSpanManager.activate(ese.getExchange(), span); if (LOG.isTraceEnabled()) { - LOG.trace("OpenTracing: start client span={}", span); + LOG.trace("Tracing: start client span={}", span); } } else if (event instanceof CamelEvent.ExchangeSentEvent) { CamelEvent.ExchangeSentEvent ese = (CamelEvent.ExchangeSentEvent) event; @@ -256,7 +256,7 @@ public void notify(CamelEvent event) throws Exception { SpanAdapter span = ActiveSpanManager.getSpan(ese.getExchange()); if (span != null) { if (LOG.isTraceEnabled()) { - LOG.trace("OpenTracing: start client span={}", span); + LOG.trace("Tracing: start client span={}", span); } sd.post(span, ese.getExchange(), ese.getEndpoint()); finishSpan(span); @@ -267,7 +267,7 @@ public void notify(CamelEvent event) throws Exception { } } catch (Throwable t) { // This exception is ignored - LOG.warn("OpenTracing: Failed to capture tracing data", t); + LOG.warn("Tracing: Failed to capture tracing data", t); } } } @@ -291,11 +291,11 @@ public void onExchangeBegin(Route route, Exchange exchange) { sd.pre(span, exchange, route.getEndpoint()); ActiveSpanManager.activate(exchange, span); if (LOG.isTraceEnabled()) { - LOG.trace("OpenTracing: start server span={}", span); + LOG.trace("Tracing: start server span={}", span); } } catch (Throwable t) { // This exception is ignored - LOG.warn("OpenTracing: Failed to capture tracing data", t); + LOG.warn("Tracing: Failed to capture tracing data", t); } } @@ -308,18 +308,18 @@ public void onExchangeDone(Route route, Exchange exchange) { SpanAdapter span = ActiveSpanManager.getSpan(exchange); if (span != null) { if (LOG.isTraceEnabled()) { - LOG.trace("OpenTracing: finish server span={}", span); + LOG.trace("Tracing: finish server span={}", span); } SpanDecorator sd = getSpanDecorator(route.getEndpoint()); sd.post(span, exchange, route.getEndpoint()); finishSpan(span); ActiveSpanManager.deactivate(exchange); } else { - LOG.warn("OpenTracing: could not find managed span for exchange={}", exchange); + LOG.warn("Tracing: could not find managed span for exchange={}", exchange); } } catch (Throwable t) { // This exception is ignored - LOG.warn("OpenTracing: Failed to capture tracing data", t); + LOG.warn("Tracing: Failed to capture tracing data", t); } } } @@ -337,7 +337,7 @@ public String onLog(Exchange exchange, CamelLogger camelLogger, String message) } } catch (Throwable t) { // This exception is ignored - LOG.warn("OpenTracing: Failed to capture tracing data", t); + LOG.warn("Tracing: Failed to capture tracing data", t); } return message; }