You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2024/05/31 11:36:42 UTC
(camel) 01/01: CAMEL-20821: camel-opentelemetry - Add traceProcessors boolean option
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch ot-main
in repository https://gitbox.apache.org/repos/asf/camel.git
commit e73e17708fabe009a8b4d5bd3e288070edc85bdb
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri May 31 13:36:18 2024 +0200
CAMEL-20821: camel-opentelemetry - Add traceProcessors boolean option
---
.../main/camel-main-configuration-metadata.json | 3 +-
.../OpenTelemetryTracerConfigurer.java | 6 +
.../src/main/docs/opentelemetry.adoc | 5 +-
.../camel/opentelemetry/OpenTelemetryTracer.java | 21 +++-
.../CamelOpenTelemetryTestSupport.java | 22 ++--
.../OpenTelemetryPropagateContextTest.java | 138 +++++++++++++++++++++
.../OtelConfigurationPropertiesConfigurer.java | 6 +
.../camel-main-configuration-metadata.json | 3 +-
core/camel-main/src/main/docs/main.adoc | 5 +-
.../camel/main/OtelConfigurationProperties.java | 22 ++++
.../maven/packaging/PrepareCamelMainMojo.java | 2 +-
11 files changed, 216 insertions(+), 17 deletions(-)
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
index 964dbe9396f..73d756eee1e 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
@@ -12,7 +12,7 @@
{ "name": "camel.vault.aws", "description": "Camel AWS Vault configurations", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration" },
{ "name": "camel.vault.gcp", "description": "Camel GCP Vault configurations", "sourceType": "org.apache.camel.vault.GcpVaultConfiguration" },
{ "name": "camel.vault.azure", "description": "Camel Azure Key Vault configurations", "sourceType": "org.apache.camel.vault.AzureVaultConfiguration" },
- { "name": "camel.opentelemetry", "description": "Camel OpenTelemtry configurations", "sourceType": "org.apache.camel.main.OtelConfigurationProperties" },
+ { "name": "camel.opentelemetry", "description": "Camel OpenTelemetry configurations", "sourceType": "org.apache.camel.main.OtelConfigurationProperties" },
{ "name": "camel.metrics", "description": "Camel Micrometer Metrics configurations", "sourceType": "org.apache.camel.main.MetricsConfigurationProperties" },
{ "name": "camel.faulttolerance", "description": "Fault Tolerance EIP Circuit Breaker configurations", "sourceType": "org.apache.camel.main.FaultToleranceConfigurationProperties" },
{ "name": "camel.resilience4j", "description": "Resilience4j EIP Circuit Breaker configurations", "sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties" },
@@ -191,6 +191,7 @@
{ "name": "camel.opentelemetry.encoding", "description": "Sets whether the header keys need to be encoded (connector specific) or not. The value is a boolean. Dashes need for instances to be encoded for JMS property keys.", "sourceType": "org.apache.camel.main.OtelConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
{ "name": "camel.opentelemetry.excludePatterns", "description": "Adds an exclude pattern that will disable tracing for Camel messages that matches the pattern. Multiple patterns can be separated by comma.", "sourceType": "org.apache.camel.main.OtelConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.opentelemetry.instrumentationName", "description": "A name uniquely identifying the instrumentation scope, such as the instrumentation library, package, or fully qualified class name. Must not be null.", "sourceType": "org.apache.camel.main.OtelConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "camel" },
+ { "name": "camel.opentelemetry.traceProcessors", "description": "Setting this to true will create new OpenTelemetry Spans for each Camel Processors. Use the excludePattern property to filter out Processors.", "sourceType": "org.apache.camel.main.OtelConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
{ "name": "camel.resilience4j.automaticTransitionFromOpenToHalfOpenEnabled", "description": "Enables automatic transition from OPEN to HALF_OPEN state once the waitDurationInOpenState has passed.", "sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties", "type": "boolean", "javaType": "java.lang.Boolean", "defaultValue": "false" },
{ "name": "camel.resilience4j.bulkheadEnabled", "description": "Whether bulkhead is enabled or not on the circuit breaker.", "sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties", "type": "boolean", "javaType": "java.lang.Boolean", "defaultValue": false },
{ "name": "camel.resilience4j.bulkheadMaxConcurrentCalls", "description": "Configures the max amount of concurrent calls the bulkhead will support.", "sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties", "type": "integer", "javaType": "java.lang.Integer" },
diff --git a/components/camel-opentelemetry/src/generated/java/org/apache/camel/opentelemetry/OpenTelemetryTracerConfigurer.java b/components/camel-opentelemetry/src/generated/java/org/apache/camel/opentelemetry/OpenTelemetryTracerConfigurer.java
index e70b4d68c4c..c78f23d0d79 100644
--- a/components/camel-opentelemetry/src/generated/java/org/apache/camel/opentelemetry/OpenTelemetryTracerConfigurer.java
+++ b/components/camel-opentelemetry/src/generated/java/org/apache/camel/opentelemetry/OpenTelemetryTracerConfigurer.java
@@ -32,6 +32,8 @@ public class OpenTelemetryTracerConfigurer extends org.apache.camel.support.comp
case "excludePatterns": target.setExcludePatterns(property(camelContext, java.lang.String.class, value)); return true;
case "instrumentationname":
case "instrumentationName": target.setInstrumentationName(property(camelContext, java.lang.String.class, value)); return true;
+ case "traceprocessors":
+ case "traceProcessors": target.setTraceProcessors(property(camelContext, boolean.class, value)); return true;
case "tracer": target.setTracer(property(camelContext, io.opentelemetry.api.trace.Tracer.class, value)); return true;
case "tracingstrategy":
case "tracingStrategy": target.setTracingStrategy(property(camelContext, org.apache.camel.spi.InterceptStrategy.class, value)); return true;
@@ -51,6 +53,8 @@ public class OpenTelemetryTracerConfigurer extends org.apache.camel.support.comp
case "excludePatterns": return java.lang.String.class;
case "instrumentationname":
case "instrumentationName": return java.lang.String.class;
+ case "traceprocessors":
+ case "traceProcessors": return boolean.class;
case "tracer": return io.opentelemetry.api.trace.Tracer.class;
case "tracingstrategy":
case "tracingStrategy": return org.apache.camel.spi.InterceptStrategy.class;
@@ -71,6 +75,8 @@ public class OpenTelemetryTracerConfigurer extends org.apache.camel.support.comp
case "excludePatterns": return target.getExcludePatterns();
case "instrumentationname":
case "instrumentationName": return target.getInstrumentationName();
+ case "traceprocessors":
+ case "traceProcessors": return target.isTraceProcessors();
case "tracer": return target.getTracer();
case "tracingstrategy":
case "tracingStrategy": return target.getTracingStrategy();
diff --git a/components/camel-opentelemetry/src/main/docs/opentelemetry.adoc b/components/camel-opentelemetry/src/main/docs/opentelemetry.adoc
index c027f07886a..30d8fd322de 100644
--- a/components/camel-opentelemetry/src/main/docs/opentelemetry.adoc
+++ b/components/camel-opentelemetry/src/main/docs/opentelemetry.adoc
@@ -28,9 +28,10 @@ The configuration properties for the OpenTelemetry tracer are:
|excludePatterns | | Sets exclude pattern(s) that will disable tracing for Camel
messages that matches the pattern. The content is a Set<String> where the key is a pattern. The pattern
uses the rules from Intercept.
-|encoding |false| Sets whether the header keys need to be encoded (connector specific) or not. The value is a boolean.
+|encoding | false | Sets whether the header keys need to be encoded (connector specific) or not. The value is a boolean.
Dashes are required for instances to be encoded for JMS property keys.
-
+|traceProcessors | false | Setting this to true will create new OpenTelemetry Spans for each Camel Processors.
+Use the excludePattern property to filter out Processors
|=======================================================================
diff --git a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java
index 6858d20e819..86cfaa56cc2 100644
--- a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java
+++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java
@@ -50,6 +50,7 @@ public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer {
private Tracer tracer;
private String instrumentationName = "camel";
private ContextPropagators contextPropagators;
+ private boolean traceProcessors;
public Tracer getTracer() {
return tracer;
@@ -59,7 +60,7 @@ public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer {
this.tracer = tracer;
}
- @ManagedAttribute
+ @ManagedAttribute(description = "A name uniquely identifying the instrumentation scope, such as the instrumentation library, package, or fully qualified class name")
public String getInstrumentationName() {
return instrumentationName;
}
@@ -72,6 +73,19 @@ public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer {
this.instrumentationName = instrumentationName;
}
+ @ManagedAttribute(description = "Setting this to true will create new OpenTelemetry Spans for each Camel Processors")
+ public boolean isTraceProcessors() {
+ return traceProcessors;
+ }
+
+ /**
+ * Setting this to true will create new OpenTelemetry Spans for each Camel Processors. Use the excludePattern
+ * property to filter out Processors.
+ */
+ public void setTraceProcessors(boolean traceProcessors) {
+ this.traceProcessors = traceProcessors;
+ }
+
public ContextPropagators getContextPropagators() {
return contextPropagators;
}
@@ -104,6 +118,11 @@ public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer {
// GlobalOpenTelemetry.get() is always NotNull, falls back to OpenTelemetry.noop()
tracer = GlobalOpenTelemetry.get().getTracer(instrumentationName);
}
+ if (traceProcessors && (getTracingStrategy() == null || getTracingStrategy().getClass().isAssignableFrom(NoopTracingStrategy.class))) {
+ OpenTelemetryTracingStrategy tracingStrategy = new OpenTelemetryTracingStrategy(this);
+ tracingStrategy.setPropagateContext(true);
+ setTracingStrategy(tracingStrategy);
+ }
}
@Override
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
index 05d369a2584..572f67c8f0f 100644
--- 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
@@ -57,11 +57,11 @@ class CamelOpenTelemetryTestSupport extends CamelTestSupport {
private static final Logger LOG = LoggerFactory.getLogger(CamelOpenTelemetryTestSupport.class);
- private InMemorySpanExporter inMemorySpanExporter = InMemorySpanExporter.create();
- private SpanTestData[] expected;
- private Tracer tracer;
- private OpenTelemetryTracer ottracer;
- private SdkTracerProvider tracerFactory;
+ InMemorySpanExporter inMemorySpanExporter = InMemorySpanExporter.create();
+ SpanTestData[] expected;
+ Tracer tracer;
+ OpenTelemetryTracer ottracer;
+ SdkTracerProvider tracerFactory;
CamelOpenTelemetryTestSupport(SpanTestData[] expected) {
this.expected = expected;
@@ -72,9 +72,7 @@ class CamelOpenTelemetryTestSupport extends CamelTestSupport {
Assertions.assertSame(Context.root(), Context.current(), "There must be no leaking span after test");
}
- @Override
- protected CamelContext createCamelContext() throws Exception {
- CamelContext context = super.createCamelContext();
+ protected void initTracer(CamelContext context) {
ottracer = new OpenTelemetryTracer();
tracerFactory = SdkTracerProvider.builder()
@@ -87,6 +85,12 @@ class CamelOpenTelemetryTestSupport extends CamelTestSupport {
ottracer.addDecorator(new TestSEDASpanDecorator());
ottracer.setTracingStrategy(getTracingStrategy().apply(ottracer));
ottracer.init(context);
+ }
+
+ @Override
+ protected CamelContext createCamelContext() throws Exception {
+ CamelContext context = super.createCamelContext();
+ initTracer(context);
return context;
}
@@ -219,7 +223,7 @@ class CamelOpenTelemetryTestSupport extends CamelTestSupport {
return ottracer -> new NoopTracingStrategy();
}
- private static class LoggingSpanProcessor implements SpanProcessor {
+ static class LoggingSpanProcessor implements SpanProcessor {
private static final Logger LOG = LoggerFactory.getLogger(LoggingSpanProcessor.class);
@Override
diff --git a/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/OpenTelemetryPropagateContextTest.java b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/OpenTelemetryPropagateContextTest.java
new file mode 100644
index 00000000000..557117d9d04
--- /dev/null
+++ b/components/camel-opentelemetry/src/test/java/org/apache/camel/opentelemetry/OpenTelemetryPropagateContextTest.java
@@ -0,0 +1,138 @@
+/*
+ * 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.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.concurrent.TimeUnit;
+
+import io.opentelemetry.api.trace.Span;
+import io.opentelemetry.api.trace.SpanBuilder;
+import io.opentelemetry.api.trace.SpanKind;
+import io.opentelemetry.context.Context;
+import io.opentelemetry.context.Scope;
+import io.opentelemetry.sdk.trace.SdkTracerProvider;
+import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
+import org.apache.camel.CamelContext;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.NotifyBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import static org.apache.camel.test.junit5.TestSupport.fileUri;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class OpenTelemetryPropagateContextTest extends CamelOpenTelemetryTestSupport {
+
+ @TempDir
+ private static Path tempDirectory;
+
+ private final static SpanTestData[] testdata = {
+ new SpanTestData().setLabel("camel-process").setOperation("delayed")
+ .setParentId(2),
+ new SpanTestData().setLabel("camel-process").setOperation("WithSpan.secondMethod")
+ .setParentId(2),
+ new SpanTestData().setLabel("camel-process").setOperation("file").setKind(SpanKind.SERVER)
+ };
+
+ OpenTelemetryPropagateContextTest() {
+ super(testdata);
+ }
+
+ @Override
+ protected void initTracer(CamelContext context) {
+ ottracer = new OpenTelemetryTracer();
+
+ tracerFactory = SdkTracerProvider.builder()
+ .addSpanProcessor(new LoggingSpanProcessor())
+ .addSpanProcessor(SimpleSpanProcessor.create(inMemorySpanExporter)).build();
+
+ tracer = tracerFactory.get("tracerTest");
+ ottracer.setTracer(tracer);
+ ottracer.setExcludePatterns(getExcludePatterns());
+ ottracer.addDecorator(new TestSEDASpanDecorator());
+ ottracer.setTraceProcessors(true);
+ ottracer.initTracer();
+ ottracer.init(context);
+ }
+
+ @BeforeAll
+ public static void createFile() throws IOException {
+ Files.createFile(tempDirectory.resolve("file.txt"));
+ }
+
+ @Test
+ void testTracingOfProcessors() throws IOException, InterruptedException {
+ NotifyBuilder notify = new NotifyBuilder(context).whenDone(1).create();
+ assertTrue(notify.matches(30, TimeUnit.SECONDS));
+ verify(true);
+ }
+
+ @Override
+ protected String getExcludePatterns() {
+ return "longRunningProcess";
+ }
+
+ @Override
+ protected RoutesBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from(fileUri(tempDirectory)).routeId("serviceA")
+ .process(exchange -> {
+ longRunningProcess();
+ }).id("longRunningProcess")
+ .delay(simple("${random(0,500)}")).id("delayed");
+ }
+
+ private void longRunningProcess() {
+ firstMethod();
+ secondMethod();
+ }
+
+ private void firstMethod() {
+ // no Span created by Camel
+ }
+
+ // Simulate io.opentelemetry.instrumentation.annotations.@WithSpan
+ // in order to avoid having to start an HTTP sever just to collect the Spans
+ // see https://github.com/open-telemetry/opentelemetry-java-examples/tree/main/telemetry-testing
+ //@WithSpan
+ public void secondMethod() {
+ // The Context should be propagated
+ Assertions.assertNotSame(Context.root(), Context.current(), "OpenTelemetry was not propagated !");
+ // build and start a custom Span similar to what @WithSpan would do
+ SpanBuilder builder = getOttracer().getTracer().spanBuilder("WithSpan.secondMethod");
+ Span span = builder.setParent(Context.current())
+ .setAttribute(COMPONENT_KEY, "custom")
+ .startSpan();
+ //noinspection EmptyTryBlock
+ try (Scope ignored = span.makeCurrent()) {
+ // do work
+ } finally {
+ span.end();
+ }
+
+ }
+ };
+ }
+
+}
diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/OtelConfigurationPropertiesConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/OtelConfigurationPropertiesConfigurer.java
index 172245c1385..0c19a619add 100644
--- a/core/camel-main/src/generated/java/org/apache/camel/main/OtelConfigurationPropertiesConfigurer.java
+++ b/core/camel-main/src/generated/java/org/apache/camel/main/OtelConfigurationPropertiesConfigurer.java
@@ -29,6 +29,8 @@ public class OtelConfigurationPropertiesConfigurer extends org.apache.camel.supp
case "excludePatterns": target.setExcludePatterns(property(camelContext, java.lang.String.class, value)); return true;
case "instrumentationname":
case "instrumentationName": target.setInstrumentationName(property(camelContext, java.lang.String.class, value)); return true;
+ case "traceprocessors":
+ case "traceProcessors": target.setTraceProcessors(property(camelContext, boolean.class, value)); return true;
default: return false;
}
}
@@ -42,6 +44,8 @@ public class OtelConfigurationPropertiesConfigurer extends org.apache.camel.supp
case "excludePatterns": return java.lang.String.class;
case "instrumentationname":
case "instrumentationName": return java.lang.String.class;
+ case "traceprocessors":
+ case "traceProcessors": return boolean.class;
default: return null;
}
}
@@ -56,6 +60,8 @@ public class OtelConfigurationPropertiesConfigurer extends org.apache.camel.supp
case "excludePatterns": return target.getExcludePatterns();
case "instrumentationname":
case "instrumentationName": return target.getInstrumentationName();
+ case "traceprocessors":
+ case "traceProcessors": return target.isTraceProcessors();
default: return null;
}
}
diff --git a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index 964dbe9396f..73d756eee1e 100644
--- a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -12,7 +12,7 @@
{ "name": "camel.vault.aws", "description": "Camel AWS Vault configurations", "sourceType": "org.apache.camel.vault.AwsVaultConfiguration" },
{ "name": "camel.vault.gcp", "description": "Camel GCP Vault configurations", "sourceType": "org.apache.camel.vault.GcpVaultConfiguration" },
{ "name": "camel.vault.azure", "description": "Camel Azure Key Vault configurations", "sourceType": "org.apache.camel.vault.AzureVaultConfiguration" },
- { "name": "camel.opentelemetry", "description": "Camel OpenTelemtry configurations", "sourceType": "org.apache.camel.main.OtelConfigurationProperties" },
+ { "name": "camel.opentelemetry", "description": "Camel OpenTelemetry configurations", "sourceType": "org.apache.camel.main.OtelConfigurationProperties" },
{ "name": "camel.metrics", "description": "Camel Micrometer Metrics configurations", "sourceType": "org.apache.camel.main.MetricsConfigurationProperties" },
{ "name": "camel.faulttolerance", "description": "Fault Tolerance EIP Circuit Breaker configurations", "sourceType": "org.apache.camel.main.FaultToleranceConfigurationProperties" },
{ "name": "camel.resilience4j", "description": "Resilience4j EIP Circuit Breaker configurations", "sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties" },
@@ -191,6 +191,7 @@
{ "name": "camel.opentelemetry.encoding", "description": "Sets whether the header keys need to be encoded (connector specific) or not. The value is a boolean. Dashes need for instances to be encoded for JMS property keys.", "sourceType": "org.apache.camel.main.OtelConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
{ "name": "camel.opentelemetry.excludePatterns", "description": "Adds an exclude pattern that will disable tracing for Camel messages that matches the pattern. Multiple patterns can be separated by comma.", "sourceType": "org.apache.camel.main.OtelConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.opentelemetry.instrumentationName", "description": "A name uniquely identifying the instrumentation scope, such as the instrumentation library, package, or fully qualified class name. Must not be null.", "sourceType": "org.apache.camel.main.OtelConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "camel" },
+ { "name": "camel.opentelemetry.traceProcessors", "description": "Setting this to true will create new OpenTelemetry Spans for each Camel Processors. Use the excludePattern property to filter out Processors.", "sourceType": "org.apache.camel.main.OtelConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
{ "name": "camel.resilience4j.automaticTransitionFromOpenToHalfOpenEnabled", "description": "Enables automatic transition from OPEN to HALF_OPEN state once the waitDurationInOpenState has passed.", "sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties", "type": "boolean", "javaType": "java.lang.Boolean", "defaultValue": "false" },
{ "name": "camel.resilience4j.bulkheadEnabled", "description": "Whether bulkhead is enabled or not on the circuit breaker.", "sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties", "type": "boolean", "javaType": "java.lang.Boolean", "defaultValue": false },
{ "name": "camel.resilience4j.bulkheadMaxConcurrentCalls", "description": "Configures the max amount of concurrent calls the bulkhead will support.", "sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties", "type": "integer", "javaType": "java.lang.Integer" },
diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc
index 18de5cf72e7..47828c66429 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -376,8 +376,8 @@ The camel.vault.azure supports 12 options, which are listed below.
|===
-=== Camel OpenTelemtry configurations
-The camel.opentelemetry supports 4 options, which are listed below.
+=== Camel OpenTelemetry configurations
+The camel.opentelemetry supports 5 options, which are listed below.
[width="100%",cols="2,5,^1,2",options="header"]
|===
@@ -386,6 +386,7 @@ The camel.opentelemetry supports 4 options, which are listed below.
| *camel.opentelemetry.encoding* | Sets whether the header keys need to be encoded (connector specific) or not. The value is a boolean. Dashes need for instances to be encoded for JMS property keys. | false | boolean
| *camel.opentelemetry.exclude{zwsp}Patterns* | Adds an exclude pattern that will disable tracing for Camel messages that matches the pattern. Multiple patterns can be separated by comma. | | String
| *{zwsp}camel.opentelemetry.instrumentation{zwsp}Name* | A name uniquely identifying the instrumentation scope, such as the instrumentation library, package, or fully qualified class name. Must not be null. | camel | String
+| *camel.opentelemetry.trace{zwsp}Processors* | Setting this to true will create new OpenTelemetry Spans for each Camel Processors. Use the excludePattern property to filter out Processors. | false | boolean
|===
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/OtelConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/OtelConfigurationProperties.java
index 567356d5d02..7848d9f9d5d 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/OtelConfigurationProperties.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/OtelConfigurationProperties.java
@@ -33,6 +33,7 @@ public class OtelConfigurationProperties implements BootstrapCloseable {
private String instrumentationName = "camel";
private boolean encoding;
private String excludePatterns;
+ private boolean traceProcessors;
public OtelConfigurationProperties(MainConfigurationProperties parent) {
this.parent = parent;
@@ -94,6 +95,18 @@ public class OtelConfigurationProperties implements BootstrapCloseable {
this.excludePatterns = excludePatterns;
}
+ public boolean isTraceProcessors() {
+ return traceProcessors;
+ }
+
+ /**
+ * Setting this to true will create new OpenTelemetry Spans for each Camel Processors. Use the excludePattern
+ * property to filter out Processors.
+ */
+ public void setTraceProcessors(boolean traceProcessors) {
+ this.traceProcessors = traceProcessors;
+ }
+
/**
* A name uniquely identifying the instrumentation scope, such as the instrumentation library, package, or fully
* qualified class name. Must not be null.
@@ -129,4 +142,13 @@ public class OtelConfigurationProperties implements BootstrapCloseable {
return this;
}
+ /**
+ * Setting this to true will create new OpenTelemetry Spans for each Camel Processors. Use the excludePattern
+ * property to filter out Processors.
+ */
+ public OtelConfigurationProperties withTraceProcessors(boolean traceProcessors) {
+ this.traceProcessors = traceProcessors;
+ return this;
+ }
+
}
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
index 715af3e6ae8..3565e44fc3d 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
@@ -333,7 +333,7 @@ public class PrepareCamelMainMojo extends AbstractGeneratorMojo {
"org.apache.camel.vault.AzureVaultConfiguration"));
// TODO: add more vault providers here
model.getGroups().add(new MainGroupModel(
- "camel.opentelemetry", "Camel OpenTelemtry configurations",
+ "camel.opentelemetry", "Camel OpenTelemetry configurations",
"org.apache.camel.main.OtelConfigurationProperties"));
model.getGroups().add(new MainGroupModel(
"camel.metrics", "Camel Micrometer Metrics configurations",