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..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 @@ -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..7e62ff9615bdf 100644 --- a/camel-dependencies/pom.xml +++ b/camel-dependencies/pom.xml @@ -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/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..6b36673be3b7a --- /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": "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 new file mode 100644 index 0000000000000..0e9ee1e8e620e --- /dev/null +++ b/components/camel-opentelemetry/pom.xml @@ -0,0 +1,89 @@ + + + + 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 + ${grpc-version} + + + io.opentelemetry + opentelemetry-sdk + ${opentelemetry-version} + + + io.opentelemetry + opentelemetry-api + ${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 + ${opentelemetry-version} + + + + + \ 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/OpenTelemetrySpanAdapter.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanAdapter.java new file mode 100644 index 0000000000000..63228995f0766 --- /dev/null +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetrySpanAdapter.java @@ -0,0 +1,120 @@ +/* + * 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.EnumMap; +import java.util.Map; + +import io.opentelemetry.common.AttributeValue; +import io.opentelemetry.common.Attributes; +import io.opentelemetry.trace.attributes.SemanticAttributes; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.Tag; + +public class OpenTelemetrySpanAdapter implements SpanAdapter { + private static final String DEFAULT_EVENT_NAME = "log"; + + private static EnumMap tagMap = new EnumMap<>(Tag.class); + + 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"); + } + + + io.opentelemetry.trace.Span span; + + OpenTelemetrySpanAdapter(io.opentelemetry.trace.Span span) { + this.span = span; + } + + io.opentelemetry.trace.Span getOpenTelemetrySpan() { + return this.span; + } + + @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 setTag(Tag key, String value) { + this.span.setAttribute(tagMap.get(key), value); + } + + @Override public void setTag(Tag key, Number value) { + this.span.setAttribute(tagMap.get(key), value.intValue()); + } + + @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..3decb8f403e4f --- /dev/null +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java @@ -0,0 +1,100 @@ +/* + * 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.Set; + +import io.grpc.Context; +import io.opentelemetry.OpenTelemetry; +import io.opentelemetry.trace.DefaultTracer; +import io.opentelemetry.trace.Span; +import io.opentelemetry.trace.Tracer; +import org.apache.camel.api.management.ManagedResource; +import org.apache.camel.opentelemetry.propagators.OpenTelemetrySetter; +import org.apache.camel.tracing.InjectAdapter; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.SpanKind; + +@ManagedResource(description = "OpenTelemetryTracer") +public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer { + + private Tracer tracer; + + public Tracer getTracer() { + return tracer; + } + + public void setTracer(Tracer tracer) { + this.tracer = tracer; + } + + private Span.Kind mapToSpanKind(SpanKind kind) { + if (kind == SpanKind.SPAN_KIND_CLIENT) { + return Span.Kind.CLIENT; + } + return Span.Kind.SERVER; + } + + @Override + protected void initTracer() { + if (tracer == null) { + Set tracers = getCamelContext().getRegistry().findByType(Tracer.class); + if (tracers.size() == 1) { + tracer = tracers.iterator().next(); + } + } + + if (tracer == null) { + // No tracer is available, so setup NoopTracer + tracer = DefaultTracer.getInstance(); + } + } + + @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()); + } + + @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()); + } + + return new OpenTelemetrySpanAdapter(builder.startSpan()); + } + + @Override + protected void finishSpan(SpanAdapter span) { + OpenTelemetrySpanAdapter openTracingSpanWrapper = (OpenTelemetrySpanAdapter) span; + openTracingSpanWrapper.getOpenTelemetrySpan().end(); + } + + @Override + protected void inject(SpanAdapter span, InjectAdapter adapter) { + OpenTelemetry.getPropagators().getHttpTextFormat().inject(Context.current(), adapter, new OpenTelemetrySetter()); + } + +} 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 new file mode 100644 index 0000000000000..3cf8abe7203af --- /dev/null +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetryGetter.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.opentelemetry.propagators; + +import io.opentelemetry.context.propagation.HttpTextFormat; +import org.apache.camel.tracing.ExtractAdapter; + +public class OpenTelemetryGetter implements HttpTextFormat.Getter { + + @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 new file mode 100644 index 0000000000000..1ad5a5f981af8 --- /dev/null +++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/propagators/OpenTelemetrySetter.java @@ -0,0 +1,28 @@ +/* + * 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.propagators; + +import javax.annotation.Nullable; + +import io.opentelemetry.context.propagation.HttpTextFormat; +import org.apache.camel.tracing.InjectAdapter; + +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/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 new file mode 100644 index 0000000000000..89ff53a8dd57b --- /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-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.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 new file mode 100644 index 0000000000000..953fbd293fdab --- /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 df3e2e600cf05..f8907963a419b 100644 --- a/components/camel-opentracing/pom.xml +++ b/components/camel-opentracing/pom.xml @@ -52,6 +52,10 @@ provided + + org.apache.camel + camel-tracing + io.opentracing 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 new file mode 100644 index 0000000000000..d1bd9950acca5 --- /dev/null +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingExtractAdapter.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.opentracing; + +import java.util.*; + +import io.opentracing.propagation.TextMap; +import org.apache.camel.tracing.ExtractAdapter; + +public class OpenTracingExtractAdapter implements TextMap { + ExtractAdapter adapter; + + OpenTracingExtractAdapter(ExtractAdapter adapter) { + this.adapter = adapter; + } + + @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/main/java/org/apache/camel/opentracing/OpenTracingInjectAdapter.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingInjectAdapter.java new file mode 100644 index 0000000000000..f29b4a420b71e --- /dev/null +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingInjectAdapter.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.opentracing; + +import java.util.*; + +import io.opentracing.propagation.TextMap; +import org.apache.camel.tracing.InjectAdapter; + +public class OpenTracingInjectAdapter implements TextMap { + private final InjectAdapter adapter; + + OpenTracingInjectAdapter(final InjectAdapter adapter) { + this.adapter = adapter; + } + + @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/OpenTracingSpanAdapter.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanAdapter.java new file mode 100644 index 0000000000000..d15a9cfa559e9 --- /dev/null +++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingSpanAdapter.java @@ -0,0 +1,85 @@ +/* + * 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.EnumMap; +import java.util.Map; + +import io.opentracing.tag.AbstractTag; +import io.opentracing.tag.Tags; +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); + } + + private io.opentracing.Span span; + + OpenTracingSpanAdapter(io.opentracing.Span span) { + this.span = span; + } + + public io.opentracing.Span getOpenTracingSpan() { + return this.span; + } + + @Override public void setComponent(String component) { + span.setTag(Tags.COMPONENT.getKey(), component); + } + + @Override public void setError(boolean error) { + span.setTag(Tags.ERROR, error); + } + + @Override public void setTag(Tag key, String value) { + span.setTag(tagMap.get(key), value); + } + + @Override public void setTag(Tag key, Number value) { + span.setTag(tagMap.get(key), value); + } + + @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 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 5e3b259241129..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,47 +16,20 @@ */ 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 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.opentracing.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.util.ObjectHelper; -import org.apache.camel.util.StringHelper; +import org.apache.camel.tracing.InjectAdapter; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.SpanKind; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,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<>(); - 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()); - // 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); - } - }); - } + 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(); } @@ -223,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); @@ -234,188 +88,38 @@ protected void doInit() throws Exception { } } - @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; + @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 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; - } - } + @Override protected SpanAdapter startExchangeBeginSpan(String operationName, SpanKind kind, SpanAdapter parent) { + SpanBuilder spanBuilder = tracer.buildSpan(operationName); + if (parent != null) { + spanBuilder.asChildOf(((OpenTracingSpanAdapter) parent).getOpenTracingSpan()); } - return false; + return new OpenTracingSpanAdapter(spanBuilder.start()); } - 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(), - 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)); - 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(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 Tracer getTracer() { + return 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(), sd.getReceiverSpanKind()); - } - - 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; - } - 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(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); - } - } + public void setTracer(Tracer tracer) { + this.tracer = tracer; } - private final class OpenTracingLogListener implements LogListener { + protected void finishSpan(SpanAdapter span) { + OpenTracingSpanAdapter openTracingSpanWrapper = (OpenTracingSpanAdapter) span; + openTracingSpanWrapper.getOpenTracingSpan().finish(); + } - @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/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..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,6 +34,7 @@ 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; @@ -64,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; } @@ -139,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 e23f9f920e12c..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.opentracing.decorators.SedaSpanDecorator; +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.opentracing.SpanDecorator b/components/camel-opentracing/src/test/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator deleted file mode 100644 index 403bde45a36e7..0000000000000 --- a/components/camel-opentracing/src/test/resources/META-INF/services/org.apache.camel.opentracing.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 new file mode 100644 index 0000000000000..6138e19e8fce6 --- /dev/null +++ b/components/camel-tracing/pom.xml @@ -0,0 +1,62 @@ + + + + + 4.0.0 + + + org.apache.camel + components + 3.5.0-SNAPSHOT + + + + 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 + + + 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..6b36673be3b7a --- /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": "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 50be44dded8c7..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,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 io.opentracing.Span; import org.apache.camel.Exchange; /** * Utility class for managing active spans as a stack associated with * an exchange. - * */ public final class ActiveSpanManager { @@ -38,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(); @@ -54,7 +52,7 @@ public static Span getSpan(Exchange exchange) { * @param exchange The exchange * @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)); } @@ -83,18 +81,18 @@ public static void deactivate(Exchange exchange) { */ public static class Holder { private Holder parent; - private Span span; - - public Holder(Holder parent, Span span) { + private SpanAdapter span; + + public Holder(Holder parent, SpanAdapter span) { this.parent = parent; this.span = span; } - + 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/ExtractAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/ExtractAdapter.java new file mode 100644 index 0000000000000..0cd426df58e41 --- /dev/null +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/ExtractAdapter.java @@ -0,0 +1,25 @@ +/* + * 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.Iterator; +import java.util.Map; + +public interface ExtractAdapter { + Iterator> iterator(); + Object get(String key); +} diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/InjectAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/InjectAdapter.java new file mode 100644 index 0000000000000..72f27dad39ee8 --- /dev/null +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/InjectAdapter.java @@ -0,0 +1,21 @@ +/* + * 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 interface InjectAdapter { + void put(String key, String value); +} diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanAdapter.java new file mode 100644 index 0000000000000..fae4f07bf2eaa --- /dev/null +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanAdapter.java @@ -0,0 +1,30 @@ +/* + * 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; + +public interface SpanAdapter { + void setComponent(String component); + void setError(boolean error); + 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); + void log(Map log); +} 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 86% 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..1ac91c8662392 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 @@ -87,7 +85,7 @@ public String getComponentClassName() { * @param exchange The exchange * @param endpoint The endpoint */ - void pre(Span span, Exchange exchange, Endpoint endpoint); + void pre(SpanAdapter span, Exchange exchange, Endpoint endpoint); /** * This method adds appropriate details (tags/logs) to the supplied span @@ -97,7 +95,7 @@ public String getComponentClassName() { * @param exchange The exchange * @param endpoint The endpoint */ - void post(Span 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 @@ -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,7 +111,7 @@ public String getComponentClassName() { * * @return The kind */ - String getReceiverSpanKind(); + SpanKind getReceiverSpanKind(); /** * This method returns the map to be used for headers extraction @@ -123,16 +121,16 @@ public String getComponentClassName() { * @param encoding whether the headers are encoded * @return The extraction map */ - TextMap 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. + * when the component is receiving a communication. * * @param map a map containing the objects * @param encoding whether the headers are encoded * @return The injection map */ - TextMap 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 new file mode 100644 index 0000000000000..f2afa79518815 --- /dev/null +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/SpanKind.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; + +public enum SpanKind { + SPAN_KIND_CLIENT, + SPAN_KIND_SERVER, + CONSUMER, + PRODUCER, +} 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..116aa67caf786 --- /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 Tracing. + * + * @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("Tracing: 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("Tracing: 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("Tracing: 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("Tracing: start server span={}", span); + } + } catch (Throwable t) { + // This exception is ignored + LOG.warn("Tracing: 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("Tracing: finish server span={}", span); + } + SpanDecorator sd = getSpanDecorator(route.getEndpoint()); + sd.post(span, exchange, route.getEndpoint()); + finishSpan(span); + ActiveSpanManager.deactivate(exchange); + } else { + LOG.warn("Tracing: could not find managed span for exchange={}", exchange); + } + } catch (Throwable t) { + // This exception is ignored + LOG.warn("Tracing: 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("Tracing: Failed to capture tracing data", t); + } + return message; + } + } +} 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 86% 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..cbdc67b1f0bcd 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,30 +14,24 @@ * 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.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. @@ -60,15 +54,20 @@ public static String getHttpMethod(Exchange exchange, Endpoint endpoint) { } @Override - public void pre(Span 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.setTag(Tags.HTTP_URL.getKey(), httpUrl); + span.setTag(Tag.HTTP_URL, httpUrl); } - - span.setTag(Tags.HTTP_METHOD.getKey(), getHttpMethod(exchange, endpoint)); + span.setTag(Tag.HTTP_METHOD, getHttpMethod(exchange, endpoint)); } protected String getHttpURL(Exchange exchange, Endpoint endpoint) { @@ -91,14 +90,14 @@ protected String getHttpURL(Exchange exchange, Endpoint endpoint) { } @Override - public void post(Span 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.setTag(Tags.HTTP_STATUS.getKey(), responseCode); + span.setTag(Tag.HTTP_STATUS, 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 70% 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..976580fbd262e 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,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.tracing.decorators; -import java.util.Map; +import java.util.*; -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.ExtractAdapter; +import org.apache.camel.tracing.InjectAdapter; +import org.apache.camel.tracing.SpanAdapter; +import org.apache.camel.tracing.SpanKind; +import org.apache.camel.tracing.Tag; +import org.apache.camel.tracing.propagation.CamelMessagingHeadersExtractAdapter; +import org.apache.camel.tracing.propagation.CamelMessagingHeadersInjectAdapter; public abstract class AbstractMessagingSpanDecorator extends AbstractSpanDecorator { @@ -37,10 +39,9 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @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(Tags.MESSAGE_BUS_DESTINATION.getKey(), getDestination(exchange, endpoint)); + span.setTag(Tag.MESSAGE_BUS_DESTINATION, 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 ExtractAdapter getExtractAdapter(final Map map, final boolean jmsEncoding) { return new CamelMessagingHeadersExtractAdapter(map, jmsEncoding); } @Override - public TextMap 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-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..5a80df243a43b 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,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.tracing.decorators; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import java.util.*; -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.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.propagation.CamelHeadersExtractAdapter; +import org.apache.camel.tracing.propagation.CamelHeadersInjectAdapter; import org.apache.camel.util.StringHelper; import org.apache.camel.util.URISupport; @@ -36,21 +35,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 +54,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(SpanAdapter 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 +106,9 @@ public void pre(Span span, Exchange exchange, Endpoint endpoint) { } @Override - public void post(Span span, Exchange exchange, Endpoint endpoint) { + public void post(SpanAdapter 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 +120,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 ExtractAdapter 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 InjectAdapter 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..e4a5a9c3eb125 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,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.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.SpanAdapter; +import org.apache.camel.tracing.Tag; public class CqlSpanDecorator extends AbstractSpanDecorator { @@ -41,24 +41,22 @@ public String getComponentClassName() { } @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(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.setTag(Tags.DB_INSTANCE.getKey(), 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.setTag(Tags.DB_STATEMENT.getKey(), cql.toString()); + span.setTag(Tag.DB_STATEMENT, cql.toString()); } else { Map queryParameters = toQueryParameters(endpoint.getEndpointUri()); if (queryParameters.containsKey("cql")) { - span.setTag(Tags.DB_STATEMENT.getKey(), queryParameters.get("cql")); + span.setTag(Tag.DB_STATEMENT, 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 86% 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..fec79cac2bd6b 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,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.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.SpanAdapter; +import org.apache.camel.tracing.Tag; public class ElasticsearchSpanDecorator extends AbstractSpanDecorator { @@ -47,14 +47,13 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @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(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.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-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..8b1a197166bef 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,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.tracing.SpanAdapter; +import org.apache.camel.tracing.Tag; public class JdbcSpanDecorator extends AbstractSpanDecorator { @@ -34,14 +34,14 @@ public String getComponentClassName() { } @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(Tags.DB_TYPE.getKey(), "sql"); + span.setTag(Tag.DB_TYPE, "sql"); Object body = exchange.getIn().getBody(); if (body instanceof String) { - span.setTag(Tags.DB_STATEMENT.getKey(), (String)body); + span.setTag(Tag.DB_STATEMENT, (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..1900b7abb93f2 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.SpanAdapter; 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(SpanAdapter 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 82% 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..31add1d1e76b7 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,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.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.SpanAdapter; +import org.apache.camel.tracing.Tag; public class MongoDBSpanDecorator extends AbstractSpanDecorator { @@ -46,17 +46,16 @@ public String getOperationName(Exchange exchange, Endpoint endpoint) { } @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(Tags.DB_TYPE.getKey(), getComponent()); - + span.setTag(Tag.DB_TYPE, getComponent()); Map queryParameters = toQueryParameters(endpoint.getEndpointUri()); String database = queryParameters.get("database"); if (database != null) { - span.setTag(Tags.DB_INSTANCE.getKey(), database); + span.setTag(Tag.DB_INSTANCE, database); } - span.setTag(Tags.DB_STATEMENT.getKey(), queryParameters.toString()); + span.setTag(Tag.DB_STATEMENT, 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..6bbdd95ac20f1 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.SpanAdapter; 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(SpanAdapter 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 81% 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..c21be7ee9ae8a 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,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.tracing.SpanAdapter; +import org.apache.camel.tracing.Tag; public class SqlSpanDecorator extends AbstractSpanDecorator { @@ -36,14 +36,13 @@ public String getComponentClassName() { } @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(Tags.DB_TYPE.getKey(), "sql"); + span.setTag(Tag.DB_TYPE, "sql"); Object sqlquery = exchange.getIn().getHeader(CAMEL_SQL_QUERY); if (sqlquery instanceof String) { - span.setTag(Tags.DB_STATEMENT.getKey(), (String) sqlquery); + span.setTag(Tag.DB_STATEMENT, (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..a4c36a538d66c 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.ExtractAdapter; -public final class CamelHeadersExtractAdapter implements TextMap { +public final class CamelHeadersExtractAdapter implements ExtractAdapter { 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..70a3f3f101e16 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.InjectAdapter; -public final class CamelHeadersInjectAdapter implements TextMap { +public final class CamelHeadersInjectAdapter implements InjectAdapter { 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..c7a5b8b8a1b38 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.ExtractAdapter; -public final class CamelMessagingHeadersExtractAdapter implements TextMap { +public final class CamelMessagingHeadersExtractAdapter implements ExtractAdapter { 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..7057b339b6170 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.InjectAdapter; -public final class CamelMessagingHeadersInjectAdapter implements TextMap { +public final class CamelMessagingHeadersInjectAdapter implements InjectAdapter { // 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/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-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecoratorTest.java similarity index 93% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecoratorTest.java index 566cfbab4fbe5..56825db84a60d 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractHttpSpanDecoratorTest.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 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.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; @@ -144,13 +143,12 @@ public String getComponentClassName() { } }; - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); decorator.pre(span, exchange, endpoint); - assertEquals(TEST_URI, span.tags().get(Tags.HTTP_URL.getKey())); - assertTrue(span.tags().containsKey(Tags.HTTP_METHOD.getKey())); + assertEquals(TEST_URI, span.tags().get(Tag.HTTP_URL.name())); + assertTrue(span.tags().containsKey(Tag.HTTP_METHOD.name())); } @Test @@ -259,7 +257,7 @@ public void testPostResponseCode() { 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() { @@ -272,12 +270,11 @@ public String getComponentClassName() { } }; - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); decorator.post(span, exchange, null); - assertEquals(200, span.tags().get(Tags.HTTP_STATUS.getKey())); + assertEquals(200, span.tags().get(Tag.HTTP_STATUS.name())); } } diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractMessagingSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecoratorTest.java similarity index 85% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractMessagingSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecoratorTest.java index de1fb93cdedcf..3c9ee24bc6d83 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractMessagingSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractMessagingSpanDecoratorTest.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 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.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; @@ -68,12 +67,11 @@ public String getComponentClassName() { } }; - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); decorator.pre(span, null, endpoint); - assertEquals("MyQueue", span.tags().get(Tags.MESSAGE_BUS_DESTINATION.getKey())); + assertEquals("MyQueue", span.tags().get(Tag.MESSAGE_BUS_DESTINATION.name())); } @Test @@ -101,8 +99,7 @@ public String getMessageId(Exchange exchange) { } }; - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); decorator.pre(span, exchange, endpoint); diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractSpanDecoratorTest.java similarity index 87% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractSpanDecoratorTest.java index 222668d25d2b6..452768e3d3dcd 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AbstractSpanDecoratorTest.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 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.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; @@ -72,12 +71,11 @@ public String getComponentClassName() { } }; - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); decorator.pre(span, null, endpoint); - assertEquals("camel-test", span.tags().get(Tags.COMPONENT.getKey())); + assertEquals("camel-test", span.tags().get(Tag.COMPONENT.name())); } @Test @@ -85,7 +83,7 @@ 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); @@ -101,12 +99,11 @@ public String getComponentClassName() { } }; - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); decorator.post(span, exchange, null); - assertEquals(true, span.tags().get(Tags.ERROR.getKey())); + 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")); diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSnsSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSnsSpanDecoratorTest.java similarity index 96% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSnsSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSnsSpanDecoratorTest.java index 7906befce6a57..87bd1a498a6a4 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSnsSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSnsSpanDecoratorTest.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; import org.apache.camel.Message; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSqsSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSqsSpanDecoratorTest.java similarity index 96% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSqsSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSqsSpanDecoratorTest.java index 7d70ef66ad57b..819e0971f1f44 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AwsSqsSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/AwsSqsSpanDecoratorTest.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; import org.apache.camel.Message; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CometdSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CometdSpanDecoratorTest.java similarity index 96% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CometdSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CometdSpanDecoratorTest.java index 1800f9a5184e3..bc3e18fd80c74 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CometdSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CometdSpanDecoratorTest.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.junit.jupiter.api.Test; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CqlSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CqlSpanDecoratorTest.java similarity index 76% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CqlSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CqlSpanDecoratorTest.java index cb83bfdb53b90..cead7b81b3ff4 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/CqlSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/CqlSpanDecoratorTest.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 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.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; @@ -46,14 +45,13 @@ public void testPreCqlFromUri() { SpanDecorator decorator = new CqlSpanDecorator(); - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); 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())); + 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 @@ -70,14 +68,13 @@ public void testPreCqlFromHeader() { SpanDecorator decorator = new CqlSpanDecorator(); - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); 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())); + 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-opentracing/src/test/java/org/apache/camel/opentracing/decorators/ElasticsearchSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecoratorTest.java similarity index 84% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/ElasticsearchSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecoratorTest.java index 13f2b6b60fe04..76858b0c59ba4 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/ElasticsearchSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/ElasticsearchSpanDecoratorTest.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 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.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; @@ -58,13 +57,12 @@ public void testPre() { SpanDecorator decorator = new ElasticsearchSpanDecorator(); - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); 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(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-opentracing/src/test/java/org/apache/camel/opentracing/decorators/IronmqSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/IronmqSpanDecoratorTest.java similarity index 96% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/IronmqSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/IronmqSpanDecoratorTest.java index 0b385a3b03fe8..72000ac8c4b59 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/IronmqSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/IronmqSpanDecoratorTest.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; import org.apache.camel.Message; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JdbcSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JdbcSpanDecoratorTest.java similarity index 78% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JdbcSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JdbcSpanDecoratorTest.java index a860fe429e5fc..e3162a8bd623b 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JdbcSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JdbcSpanDecoratorTest.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 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.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; @@ -44,13 +43,12 @@ public void testPre() { SpanDecorator decorator = new JdbcSpanDecorator(); - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); decorator.pre(span, exchange, endpoint); - assertEquals("sql", span.tags().get(Tags.DB_TYPE.getKey())); - assertEquals(SQL_STATEMENT, span.tags().get(Tags.DB_STATEMENT.getKey())); + assertEquals("sql", span.tags().get(Tag.DB_TYPE.name())); + assertEquals(SQL_STATEMENT, span.tags().get(Tag.DB_STATEMENT.name())); } } diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JmsSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JmsSpanDecoratorTest.java similarity index 96% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JmsSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JmsSpanDecoratorTest.java index afcab81ff0b2d..6081438a600ea 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JmsSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/JmsSpanDecoratorTest.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; import org.apache.camel.Message; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/KafkaSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/KafkaSpanDecoratorTest.java similarity index 92% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/KafkaSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/KafkaSpanDecoratorTest.java index 870a39dd5f8b0..abf7ec97b16d3 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/KafkaSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/KafkaSpanDecoratorTest.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 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.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -77,8 +76,7 @@ public void testPreOffsetAndPartitionAsStringHeader() { SpanDecorator decorator = new KafkaSpanDecorator(); - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); decorator.pre(span, exchange, endpoint); @@ -104,8 +102,7 @@ public void testPrePartitionAsIntegerHeaderAndOffsetAsLongHeader() { SpanDecorator decorator = new KafkaSpanDecorator(); - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); decorator.pre(span, exchange, endpoint); diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/MongoDBSpanDecoratorTest.java similarity index 80% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/MongoDBSpanDecoratorTest.java index 2041857a35f3b..8023a8c4a378e 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/MongoDBSpanDecoratorTest.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.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.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; @@ -62,14 +61,13 @@ public void testPre() { SpanDecorator decorator = new MongoDBSpanDecorator(); - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); 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())); + 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-opentracing/src/test/java/org/apache/camel/opentracing/decorators/RestSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/RestSpanDecoratorTest.java similarity index 92% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/RestSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/RestSpanDecoratorTest.java index 377e1064eccd5..54ba0f2961eab 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/RestSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/RestSpanDecoratorTest.java @@ -14,16 +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.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.apache.camel.tracing.MockSpanAdapter; +import org.apache.camel.tracing.SpanDecorator; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -85,8 +84,7 @@ protected void testParameter(String paramName, Object paramValue) { SpanDecorator decorator = new RestSpanDecorator(); - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); decorator.pre(span, exchange, endpoint); diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/SqlSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/SqlSpanDecoratorTest.java similarity index 78% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/SqlSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/SqlSpanDecoratorTest.java index f695dfda32dfd..697a8effb9b97 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/SqlSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/SqlSpanDecoratorTest.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 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.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; @@ -44,13 +43,12 @@ public void testPre() { SpanDecorator decorator = new SqlSpanDecorator(); - MockTracer tracer = new MockTracer(); - MockSpan span = tracer.buildSpan("TestSpan").start(); + MockSpanAdapter span = new MockSpanAdapter(); decorator.pre(span, exchange, endpoint); - assertEquals("sql", span.tags().get(Tags.DB_TYPE.getKey())); - assertEquals(SQL_STATEMENT, span.tags().get(Tags.DB_STATEMENT.getKey())); + assertEquals("sql", span.tags().get(Tag.DB_TYPE.name())); + assertEquals(SQL_STATEMENT, span.tags().get(Tag.DB_STATEMENT.name())); } } diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/StompSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/StompSpanDecoratorTest.java similarity index 96% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/StompSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/StompSpanDecoratorTest.java index 4412537ef8781..3c63879b1b08b 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/StompSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/StompSpanDecoratorTest.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.junit.jupiter.api.Test; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/TimerSpanDecoratorTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/TimerSpanDecoratorTest.java similarity index 93% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/TimerSpanDecoratorTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/TimerSpanDecoratorTest.java index ecfb8ccd44aa1..e26eec72d86c4 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/TimerSpanDecoratorTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/decorators/TimerSpanDecoratorTest.java @@ -14,10 +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 org.apache.camel.Exchange; -import org.apache.camel.opentracing.SpanDecorator; +import org.apache.camel.tracing.SpanDecorator; import org.junit.jupiter.api.Test; import org.mockito.Mockito; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersExtractAdapterTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapterTest.java similarity index 95% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersExtractAdapterTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapterTest.java index 980a5463c8e38..7868118d5fb89 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersExtractAdapterTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersExtractAdapterTest.java @@ -14,7 +14,7 @@ * 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; @@ -23,7 +23,7 @@ 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.apache.camel.tracing.propagation.CamelMessagingHeadersInjectAdapter.JMS_DASH; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; diff --git a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersInjectAdapterTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapterTest.java similarity index 84% rename from components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersInjectAdapterTest.java rename to components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapterTest.java index 5b8326d6d0a6f..b80c79f45fee3 100644 --- a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/propagation/CamelMessagingHeadersInjectAdapterTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapterTest.java @@ -14,7 +14,7 @@ * 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.Map; @@ -22,7 +22,7 @@ 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.apache.camel.tracing.propagation.CamelMessagingHeadersInjectAdapter.JMS_DASH; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -35,13 +35,6 @@ 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); diff --git a/components/pom.xml b/components/pom.xml index bb8a568fc518b..97b592a17274a 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -235,6 +235,7 @@ camel-jbpm camel-jcache camel-jclouds + camel-tracing camel-jcr camel-jdbc camel-jgroups-raft @@ -291,6 +292,7 @@ camel-olingo4 camel-openstack camel-opentracing + camel-opentelemetry camel-optaplanner camel-paho camel-pdf diff --git a/parent/pom.xml b/parent/pom.xml index 20374383ba1e3..68a91849a0bfa 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -447,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 @@ -1944,6 +1945,11 @@ camel-openstack ${project.version} + + org.apache.camel + camel-opentelemetry + ${project.version} + org.apache.camel camel-opentracing @@ -2394,6 +2400,11 @@ camel-timer ${project.version} + + org.apache.camel + camel-tracing + ${project.version} + org.apache.camel camel-twilio