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 2023/11/05 11:33:21 UTC

(camel) branch otel created (now 96efe1fe317)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a change to branch otel
in repository https://gitbox.apache.org/repos/asf/camel.git


      at 96efe1fe317 CAMEL-20083: camel-opentelemtry - Make it easier to configure for camel-main

This branch includes the following new commits:

     new 3399f9fe529 CAMEL-20083: camel-opentelemtry - Make it easier to configure for camel-main
     new dda8534dad8 CAMEL-20083: camel-opentelemtry - Make it easier to configure for camel-main
     new 96efe1fe317 CAMEL-20083: camel-opentelemtry - Make it easier to configure for camel-main

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(camel) 03/03: CAMEL-20083: camel-opentelemtry - Make it easier to configure for camel-main

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch otel
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 96efe1fe31765b4ae8a8b6cee96e6e8b067da74e
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Nov 5 12:33:09 2023 +0100

    CAMEL-20083: camel-opentelemtry - Make it easier to configure for camel-main
---
 .../main/camel-main-configuration-metadata.json     |  4 ++++
 .../src/main/docs/opentelemetry.adoc                | 21 +++++++++++++++++++--
 .../camel/opentelemetry/OpenTelemetryTracer.java    |  4 ++++
 .../META-INF/camel-main-configuration-metadata.json |  2 +-
 core/camel-main/src/main/docs/main.adoc             |  5 ++++-
 .../java/org/apache/camel/main/BaseMainSupport.java |  2 +-
 .../camel/maven/packaging/PrepareCamelMainMojo.java |  2 +-
 7 files changed, 34 insertions(+), 6 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 3235de257b0..3a89ff173c1 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
@@ -10,6 +10,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.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" },
     { "name": "camel.lra", "description": "Camel Saga EIP (Long Running Actions) configurations", "sourceType": "org.apache.camel.main.LraConfigurationProperties" }
@@ -177,6 +178,9 @@
     { "name": "camel.lra.coordinatorUrl", "description": "The URL for the LRA coordinator service that orchestrates the transactions", "sourceType": "org.apache.camel.main.LraConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
     { "name": "camel.lra.localParticipantContextPath", "description": "The context-path for the local participant. Is default \/lra-participant", "sourceType": "org.apache.camel.main.LraConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "\/lra-participant" },
     { "name": "camel.lra.localParticipantUrl", "description": "The URL for the local participant", "sourceType": "org.apache.camel.main.LraConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
+    { "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.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/main/docs/opentelemetry.adoc b/components/camel-opentelemetry/src/main/docs/opentelemetry.adoc
index c61cdd1bde8..c8768469cd2 100644
--- a/components/camel-opentelemetry/src/main/docs/opentelemetry.adoc
+++ b/components/camel-opentelemetry/src/main/docs/opentelemetry.adoc
@@ -24,7 +24,7 @@ The configuration properties for the OpenTelemetry tracer are:
 [width="100%",cols="10%,10%,80%",options="header",]
 |=======================================================================
 |Option |Default |Description
-
+|instrumentationName| camel | A name uniquely identifying the instrumentation scope, such as the instrumentation library, package, or fully qualified class name. Must not be null.
 |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.
@@ -34,7 +34,7 @@ Dashes need for instances to be encoded for JMS property keys.
 |=======================================================================
 
 
-=== Configuration
+== Using Camel OpenTelemetry
 
 Include the `camel-opentelemetry` component in your POM, along with any specific dependencies associated with the
 chosen OpenTelemetry compliant Tracer.
@@ -52,6 +52,23 @@ otelTracer.setTracer(...);
 otelTracer.init(camelContext);
 --------------------------------------------------------------------------------------------------
 
+You would still need OpenTelemetry to instrument your code, which can be done via a Java agent (see further below).
+
+=== Using with standalone Camel
+
+If you use `camel-main` as standalone Camel, then you can enable and use OpenTelemetry without Java code.
+
+Add `camel-opentelemetry` component in your POM, and configure in `application.properties`:
+
+[source,properties]
+----
+camel.opentelemetry.enabled = true
+# you can confiure the other options
+# camel.opentelemetry.instrumentationName = myApp
+----
+
+You would still need OpenTelemetry to instrument your code, which can be done via a Java agent (see further below).
+
 == Spring Boot
 
 If you are using Spring Boot then you can add
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 ebacbe6f93f..6858d20e819 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
@@ -64,6 +64,10 @@ public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer {
         return instrumentationName;
     }
 
+    /**
+     * A name uniquely identifying the instrumentation scope, such as the instrumentation library, package, or fully
+     * qualified class name. Must not be null.
+     */
     public void setInstrumentationName(String instrumentationName) {
         this.instrumentationName = instrumentationName;
     }
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 3bad1d9d302..3a89ff173c1 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
@@ -10,7 +10,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.otel", "description": "Camel OpenTelemtry configurations", "sourceType": "org.apache.camel.main.OtelConfigurationProperties" },
+    { "name": "camel.opentelemetry", "description": "Camel OpenTelemtry configurations", "sourceType": "org.apache.camel.main.OtelConfigurationProperties" },
     { "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" },
     { "name": "camel.lra", "description": "Camel Saga EIP (Long Running Actions) configurations", "sourceType": "org.apache.camel.main.LraConfigurationProperties" }
diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc
index 0ffc03e6ce2..3dee56918ae 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -333,11 +333,14 @@ The camel.vault.azure supports 11 options, which are listed below.
 
 
 === Camel OpenTelemtry configurations
-The camel.otel supports 0 options, which are listed below.
+The camel.opentelemetry supports 3 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
+| *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
 |===
 
 
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index f00d66c107e..05944c46592 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -57,6 +57,7 @@ import org.apache.camel.spi.AutowiredLifecycleStrategy;
 import org.apache.camel.spi.BacklogDebugger;
 import org.apache.camel.spi.CamelBeanPostProcessor;
 import org.apache.camel.spi.CamelEvent;
+import org.apache.camel.spi.CamelTracingService;
 import org.apache.camel.spi.ContextReloadStrategy;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.Language;
@@ -84,7 +85,6 @@ import org.apache.camel.support.scan.PackageScanHelper;
 import org.apache.camel.support.service.BaseService;
 import org.apache.camel.support.startup.BacklogStartupStepRecorder;
 import org.apache.camel.support.startup.LoggingStartupStepRecorder;
-import org.apache.camel.spi.CamelTracingService;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.OrderedLocationProperties;
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 7d8299bffe9..e5d80ece234 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
@@ -319,7 +319,7 @@ public class PrepareCamelMainMojo extends AbstractGeneratorMojo {
                             "org.apache.camel.vault.AzureVaultConfiguration"));
             // TODO: add more vault providers here
             model.getGroups().add(new MainGroupModel(
-                    "camel.otel", "Camel OpenTelemtry configurations",
+                    "camel.opentelemetry", "Camel OpenTelemtry configurations",
                     "org.apache.camel.main.OtelConfigurationProperties"));
             model.getGroups()
                     .add(new MainGroupModel(


(camel) 01/03: CAMEL-20083: camel-opentelemtry - Make it easier to configure for camel-main

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch otel
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 3399f9fe52961f5ff366603e71c3fa34f021a5be
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Nov 5 11:33:01 2023 +0100

    CAMEL-20083: camel-opentelemtry - Make it easier to configure for camel-main
---
 .../OpenTelemetryTracerConfigurer.java             |  94 +++++++++++++++++
 ....apache.camel.opentelemetry.OpenTelemetryTracer |   2 +
 .../services/org/apache/camel/opentelemetry-tracer |   2 +
 .../camel/opentelemetry/OpenTelemetryTracer.java   |  36 ++++---
 .../OtelConfigurationPropertiesConfigurer.java     |  61 +++++++++++
 .../camel-main-configuration-metadata.json         |   4 +
 ...g.apache.camel.main.OtelConfigurationProperties |   2 +
 core/camel-main/src/main/docs/main.adoc            |   9 ++
 .../org/apache/camel/main/BaseMainSupport.java     |  55 +++++++++-
 .../camel/main/MainConfigurationProperties.java    |  22 ++++
 .../camel/main/OtelConfigurationProperties.java    | 112 +++++++++++++++++++++
 .../maven/packaging/PrepareCamelMainMojo.java      |   5 +
 12 files changed, 388 insertions(+), 16 deletions(-)

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
new file mode 100644
index 00000000000..0cd14dce133
--- /dev/null
+++ b/components/camel-opentelemetry/src/generated/java/org/apache/camel/opentelemetry/OpenTelemetryTracerConfigurer.java
@@ -0,0 +1,94 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.opentelemetry;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.opentelemetry.OpenTelemetryTracer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class OpenTelemetryTracerConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        org.apache.camel.opentelemetry.OpenTelemetryTracer target = (org.apache.camel.opentelemetry.OpenTelemetryTracer) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "camelcontext":
+        case "CamelContext": target.setCamelContext(property(camelContext, org.apache.camel.CamelContext.class, value)); return true;
+        case "contextpropagators":
+        case "ContextPropagators": target.setContextPropagators(property(camelContext, io.opentelemetry.context.propagation.ContextPropagators.class, value)); return true;
+        case "encoding":
+        case "Encoding": target.setEncoding(property(camelContext, boolean.class, value)); return true;
+        case "excludepatterns":
+        case "ExcludePatterns": target.setExcludePatterns(property(camelContext, java.util.Set.class, value)); return true;
+        case "instrumentationname":
+        case "InstrumentationName": target.setInstrumentationName(property(camelContext, java.lang.String.class, value)); return true;
+        case "tracer":
+        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;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "camelcontext":
+        case "CamelContext": return org.apache.camel.CamelContext.class;
+        case "contextpropagators":
+        case "ContextPropagators": return io.opentelemetry.context.propagation.ContextPropagators.class;
+        case "encoding":
+        case "Encoding": return boolean.class;
+        case "excludepatterns":
+        case "ExcludePatterns": return java.util.Set.class;
+        case "instrumentationname":
+        case "InstrumentationName": return java.lang.String.class;
+        case "tracer":
+        case "Tracer": return io.opentelemetry.api.trace.Tracer.class;
+        case "tracingstrategy":
+        case "TracingStrategy": return org.apache.camel.spi.InterceptStrategy.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        org.apache.camel.opentelemetry.OpenTelemetryTracer target = (org.apache.camel.opentelemetry.OpenTelemetryTracer) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "camelcontext":
+        case "CamelContext": return target.getCamelContext();
+        case "contextpropagators":
+        case "ContextPropagators": return target.getContextPropagators();
+        case "encoding":
+        case "Encoding": return target.isEncoding();
+        case "excludepatterns":
+        case "ExcludePatterns": return target.getExcludePatterns();
+        case "instrumentationname":
+        case "InstrumentationName": return target.getInstrumentationName();
+        case "tracer":
+        case "Tracer": return target.getTracer();
+        case "tracingstrategy":
+        case "TracingStrategy": return target.getTracingStrategy();
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "excludepatterns":
+        case "ExcludePatterns": return java.lang.String.class;
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-opentelemetry/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.opentelemetry.OpenTelemetryTracer b/components/camel-opentelemetry/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.opentelemetry.OpenTelemetryTracer
new file mode 100644
index 00000000000..bfc37ca1862
--- /dev/null
+++ b/components/camel-opentelemetry/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.opentelemetry.OpenTelemetryTracer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.opentelemetry.OpenTelemetryTracerConfigurer
diff --git a/components/camel-opentelemetry/src/generated/resources/META-INF/services/org/apache/camel/opentelemetry-tracer b/components/camel-opentelemetry/src/generated/resources/META-INF/services/org/apache/camel/opentelemetry-tracer
new file mode 100644
index 00000000000..2482cc2f2ed
--- /dev/null
+++ b/components/camel-opentelemetry/src/generated/resources/META-INF/services/org/apache/camel/opentelemetry-tracer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.opentelemetry.OpenTelemetryTracer
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 2d8fe70a54a..ebacbe6f93f 100644
--- a/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java
+++ b/components/camel-opentelemetry/src/main/java/org/apache/camel/opentelemetry/OpenTelemetryTracer.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.opentelemetry;
 
-import java.util.Set;
-
 import io.opentelemetry.api.GlobalOpenTelemetry;
 import io.opentelemetry.api.baggage.Baggage;
 import io.opentelemetry.api.trace.Span;
@@ -27,18 +25,28 @@ import io.opentelemetry.api.trace.Tracer;
 import io.opentelemetry.context.Context;
 import io.opentelemetry.context.propagation.ContextPropagators;
 import org.apache.camel.Exchange;
+import org.apache.camel.api.management.ManagedAttribute;
 import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.opentelemetry.propagators.OpenTelemetryGetter;
 import org.apache.camel.opentelemetry.propagators.OpenTelemetrySetter;
+import org.apache.camel.spi.Configurer;
+import org.apache.camel.spi.annotations.JdkService;
+import org.apache.camel.support.CamelContextHelper;
 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.decorators.AbstractInternalSpanDecorator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+@JdkService("opentelemetry-tracer")
+@Configurer
 @ManagedResource(description = "OpenTelemetryTracer")
 public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer {
 
+    private static final Logger LOG = LoggerFactory.getLogger(OpenTelemetryTracer.class);
+
     private Tracer tracer;
     private String instrumentationName = "camel";
     private ContextPropagators contextPropagators;
@@ -51,6 +59,11 @@ public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer {
         this.tracer = tracer;
     }
 
+    @ManagedAttribute
+    public String getInstrumentationName() {
+        return instrumentationName;
+    }
+
     public void setInstrumentationName(String instrumentationName) {
         this.instrumentationName = instrumentationName;
     }
@@ -81,12 +94,8 @@ public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer {
     @Override
     protected void initTracer() {
         if (tracer == null) {
-            Set<Tracer> tracers = getCamelContext().getRegistry().findByType(Tracer.class);
-            if (tracers.size() == 1) {
-                tracer = tracers.iterator().next();
-            }
+            tracer = CamelContextHelper.findSingleByType(getCamelContext(), Tracer.class);
         }
-
         if (tracer == null) {
             // GlobalOpenTelemetry.get() is always NotNull, falls back to OpenTelemetry.noop()
             tracer = GlobalOpenTelemetry.get().getTracer(instrumentationName);
@@ -96,13 +105,8 @@ public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer {
     @Override
     protected void initContextPropagators() {
         if (contextPropagators == null) {
-            Set<ContextPropagators> contextPropagatorsSet
-                    = getCamelContext().getRegistry().findByType(ContextPropagators.class);
-            if (contextPropagatorsSet.size() == 1) {
-                contextPropagators = contextPropagatorsSet.iterator().next();
-            }
+            contextPropagators = CamelContextHelper.findSingleByType(getCamelContext(), ContextPropagators.class);
         }
-
         if (contextPropagators == null) {
             // GlobalOpenTelemetry.get() is always NotNull, falls back to OpenTelemetry.noop()
             contextPropagators = GlobalOpenTelemetry.get().getPropagators();
@@ -169,4 +173,10 @@ public class OpenTelemetryTracer extends org.apache.camel.tracing.Tracer {
         GlobalOpenTelemetry.get().getPropagators().getTextMapPropagator().inject(ctx, adapter, new OpenTelemetrySetter());
     }
 
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+
+        LOG.info("OpenTelemetryTracer enabled using instrumentation-name: {}", instrumentationName);
+    }
 }
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
new file mode 100644
index 00000000000..2cd0234490c
--- /dev/null
+++ b/core/camel-main/src/generated/java/org/apache/camel/main/OtelConfigurationPropertiesConfigurer.java
@@ -0,0 +1,61 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.main;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.main.OtelConfigurationProperties;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class OtelConfigurationPropertiesConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        org.apache.camel.main.OtelConfigurationProperties target = (org.apache.camel.main.OtelConfigurationProperties) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "encoding":
+        case "Encoding": target.setEncoding(property(camelContext, boolean.class, value)); return true;
+        case "excludepatterns":
+        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;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "encoding":
+        case "Encoding": return boolean.class;
+        case "excludepatterns":
+        case "ExcludePatterns": return java.lang.String.class;
+        case "instrumentationname":
+        case "InstrumentationName": return java.lang.String.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        org.apache.camel.main.OtelConfigurationProperties target = (org.apache.camel.main.OtelConfigurationProperties) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "encoding":
+        case "Encoding": return target.isEncoding();
+        case "excludepatterns":
+        case "ExcludePatterns": return target.getExcludePatterns();
+        case "instrumentationname":
+        case "InstrumentationName": return target.getInstrumentationName();
+        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 3235de257b0..3bad1d9d302 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
@@ -10,6 +10,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.otel", "description": "Camel OpenTelemtry configurations", "sourceType": "org.apache.camel.main.OtelConfigurationProperties" },
     { "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" },
     { "name": "camel.lra", "description": "Camel Saga EIP (Long Running Actions) configurations", "sourceType": "org.apache.camel.main.LraConfigurationProperties" }
@@ -177,6 +178,9 @@
     { "name": "camel.lra.coordinatorUrl", "description": "The URL for the LRA coordinator service that orchestrates the transactions", "sourceType": "org.apache.camel.main.LraConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
     { "name": "camel.lra.localParticipantContextPath", "description": "The context-path for the local participant. Is default \/lra-participant", "sourceType": "org.apache.camel.main.LraConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "\/lra-participant" },
     { "name": "camel.lra.localParticipantUrl", "description": "The URL for the local participant", "sourceType": "org.apache.camel.main.LraConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
+    { "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.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/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.main.OtelConfigurationProperties b/core/camel-main/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.main.OtelConfigurationProperties
new file mode 100644
index 00000000000..91c564399fe
--- /dev/null
+++ b/core/camel-main/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.main.OtelConfigurationProperties
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.main.OtelConfigurationPropertiesConfigurer
diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc
index bd0442cc8b0..0ffc03e6ce2 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -332,6 +332,15 @@ The camel.vault.azure supports 11 options, which are listed below.
 |===
 
 
+=== Camel OpenTelemtry configurations
+The camel.otel supports 0 options, which are listed below.
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+|===
+
+
 === Fault Tolerance EIP Circuit Breaker configurations
 The camel.faulttolerance supports 13 options, which are listed below.
 
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index e3fc6bcdead..734356576c6 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -950,6 +950,7 @@ public abstract class BaseMainSupport extends BaseService {
         OrderedLocationProperties threadPoolProperties = new OrderedLocationProperties();
         OrderedLocationProperties healthProperties = new OrderedLocationProperties();
         OrderedLocationProperties lraProperties = new OrderedLocationProperties();
+        OrderedLocationProperties otelProperties = new OrderedLocationProperties();
         OrderedLocationProperties routeTemplateProperties = new OrderedLocationProperties();
         OrderedLocationProperties beansProperties = new OrderedLocationProperties();
         OrderedLocationProperties devConsoleProperties = new OrderedLocationProperties();
@@ -1007,6 +1008,12 @@ public abstract class BaseMainSupport extends BaseService {
                 String option = key.substring(10);
                 validateOptionAndValue(key, option, value);
                 lraProperties.put(loc, optionKey(option), value);
+            } else if (key.startsWith("camel.opentelemetry.")) {
+                // grab the value
+                String value = prop.getProperty(key);
+                String option = key.substring(20);
+                validateOptionAndValue(key, option, value);
+                otelProperties.put(loc, optionKey(option), value);
             } else if (key.startsWith("camel.routeTemplate")) {
                 // grab the value
                 String value = prop.getProperty(key);
@@ -1114,6 +1121,11 @@ public abstract class BaseMainSupport extends BaseService {
             setLraCheckProperties(camelContext, lraProperties, mainConfigurationProperties.isAutoConfigurationFailFast(),
                     autoConfiguredProperties);
         }
+        if (!otelProperties.isEmpty() || mainConfigurationProperties.hasOtelConfiguration()) {
+            LOG.debug("Auto-configuring OpenTelemetry from loaded properties: {}", otelProperties.size());
+            setOtelProperties(camelContext, otelProperties, mainConfigurationProperties.isAutoConfigurationFailFast(),
+                    autoConfiguredProperties);
+        }
         if (!devConsoleProperties.isEmpty()) {
             LOG.debug("Auto-configuring Dev Console from loaded properties: {}", devConsoleProperties.size());
             setDevConsoleProperties(camelContext, devConsoleProperties,
@@ -1198,6 +1210,11 @@ public abstract class BaseMainSupport extends BaseService {
                 LOG.warn("Property not auto-configured: camel.lra.{}={}", k, v);
             });
         }
+        if (!otelProperties.isEmpty()) {
+            otelProperties.forEach((k, v) -> {
+                LOG.warn("Property not auto-configured: camel.opentelemetry.{}={}", k, v);
+            });
+        }
         if (!httpServerProperties.isEmpty()) {
             httpServerProperties.forEach((k, v) -> {
                 LOG.warn("Property not auto-configured: camel.server.{}={}", k, v);
@@ -1342,15 +1359,37 @@ public abstract class BaseMainSupport extends BaseService {
             boolean failIfNotSet, OrderedLocationProperties autoConfiguredProperties)
             throws Exception {
 
+        String loc = lraProperties.getLocation("enabled");
         Object obj = lraProperties.remove("enabled");
         if (ObjectHelper.isNotEmpty(obj)) {
-            String loc = lraProperties.getLocation("enabled");
             autoConfiguredProperties.put(loc, "camel.lra.enabled", obj.toString());
         }
         boolean enabled = obj != null ? CamelContextHelper.parseBoolean(camelContext, obj.toString()) : true;
         if (enabled) {
             CamelSagaService css = resolveLraSagaService(camelContext);
             setPropertiesOnTarget(camelContext, css, lraProperties, "camel.lra.", failIfNotSet, true, autoConfiguredProperties);
+            // add as service so saga can be active
+            camelContext.addService(css, true, true);
+        }
+    }
+
+    private void setOtelProperties(
+            CamelContext camelContext, OrderedLocationProperties otelProperties,
+            boolean failIfNotSet, OrderedLocationProperties autoConfiguredProperties)
+            throws Exception {
+
+        String loc = otelProperties.getLocation("enabled");
+        Object obj = otelProperties.remove("enabled");
+        if (ObjectHelper.isNotEmpty(obj)) {
+            autoConfiguredProperties.put(loc, "camel.opentelemetry.enabled", obj.toString());
+        }
+        boolean enabled = obj != null ? CamelContextHelper.parseBoolean(camelContext, obj.toString()) : true;
+        if (enabled) {
+            Service otel = resolveOtelService(camelContext);
+            setPropertiesOnTarget(camelContext, otel, otelProperties, "camel.opentelemetry.", failIfNotSet, true,
+                    autoConfiguredProperties);
+            // add as service so tracing can be active
+            camelContext.addService(otel, true, true);
         }
     }
 
@@ -1989,9 +2028,19 @@ public abstract class BaseMainSupport extends BaseService {
                     .newInstance("lra-saga-service", CamelSagaService.class)
                     .orElseThrow(() -> new IllegalArgumentException(
                             "Cannot find LRASagaService on classpath. Add camel-lra to classpath."));
+        }
+        return answer;
+    }
 
-            // add as service so its discover by saga eip
-            camelContext.addService(answer, true, false);
+    private static Service resolveOtelService(CamelContext camelContext) throws Exception {
+        // lookup in service registry first
+        // TODO: We need a Tracing SPI to be able to identify this (lookup in registry / service on camel context)
+        Service answer = camelContext.getRegistry().lookupByNameAndType("OpenTelemetryTracer", Service.class);
+        if (answer == null) {
+            answer = camelContext.getCamelContextExtension().getBootstrapFactoryFinder()
+                    .newInstance("opentelemetry-tracer", Service.class)
+                    .orElseThrow(() -> new IllegalArgumentException(
+                            "Cannot find OpenTelemetryTracer on classpath. Add camel-opentelemetry to classpath."));
         }
         return answer;
     }
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java
index ea12f3631bf..79273789d92 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java
@@ -53,6 +53,7 @@ public class MainConfigurationProperties extends DefaultConfigurationProperties<
     // extended configuration
     private HealthConfigurationProperties healthConfigurationProperties;
     private LraConfigurationProperties lraConfigurationProperties;
+    private OtelConfigurationProperties otelConfigurationProperties;
     private ThreadPoolConfigurationProperties threadPoolProperties;
     private Resilience4jConfigurationProperties resilience4jConfigurationProperties;
     private FaultToleranceConfigurationProperties faultToleranceConfigurationProperties;
@@ -72,6 +73,10 @@ public class MainConfigurationProperties extends DefaultConfigurationProperties<
             lraConfigurationProperties.close();
             lraConfigurationProperties = null;
         }
+        if (otelConfigurationProperties != null) {
+            otelConfigurationProperties.close();
+            otelConfigurationProperties = null;
+        }
         if (threadPoolProperties != null) {
             threadPoolProperties.close();
             threadPoolProperties = null;
@@ -151,6 +156,23 @@ public class MainConfigurationProperties extends DefaultConfigurationProperties<
         return lraConfigurationProperties != null;
     }
 
+    /**
+     * To configure OpenTelemetry.
+     */
+    public OtelConfigurationProperties otel() {
+        if (otelConfigurationProperties == null) {
+            otelConfigurationProperties = new OtelConfigurationProperties(this);
+        }
+        return otelConfigurationProperties;
+    }
+
+    /**
+     * Whether there has been any OpenTelemetry configuration specified
+     */
+    public boolean hasOtelConfiguration() {
+        return otelConfigurationProperties != null;
+    }
+
     /**
      * To configure embedded HTTP server (for standalone applications; not Spring Boot or Quarkus)
      */
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
new file mode 100644
index 00000000000..a41c23a1694
--- /dev/null
+++ b/core/camel-main/src/main/java/org/apache/camel/main/OtelConfigurationProperties.java
@@ -0,0 +1,112 @@
+/*
+ * 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.main;
+
+import org.apache.camel.spi.BootstrapCloseable;
+import org.apache.camel.spi.Configurer;
+import org.apache.camel.spi.Metadata;
+
+/**
+ * Global configuration for OpenTelemetry
+ */
+@Configurer(bootstrap = true)
+public class OtelConfigurationProperties implements BootstrapCloseable {
+
+    private MainConfigurationProperties parent;
+
+    @Metadata(defaultValue = "camel", required = true)
+    private String instrumentationName = "camel";
+    private boolean encoding;
+    private String excludePatterns;
+
+    public OtelConfigurationProperties(MainConfigurationProperties parent) {
+        this.parent = parent;
+    }
+
+    public MainConfigurationProperties end() {
+        return parent;
+    }
+
+    @Override
+    public void close() {
+        parent = null;
+    }
+
+    public String getInstrumentationName() {
+        return instrumentationName;
+    }
+
+    /**
+     * A name uniquely identifying the instrumentation scope, such as the instrumentation library, package, or fully
+     * qualified class name. Must not be null.
+     */
+    public void setInstrumentationName(String instrumentationName) {
+        this.instrumentationName = instrumentationName;
+    }
+
+    public boolean isEncoding() {
+        return 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.
+     */
+    public void setEncoding(boolean encoding) {
+        this.encoding = encoding;
+    }
+
+    public String getExcludePatterns() {
+        return excludePatterns;
+    }
+
+    /**
+     * Adds an exclude pattern that will disable tracing for Camel messages that matches the pattern. Multiple patterns
+     * can be separated by comma.
+     */
+    public void setExcludePatterns(String excludePatterns) {
+        this.excludePatterns = excludePatterns;
+    }
+
+    /**
+     * A name uniquely identifying the instrumentation scope, such as the instrumentation library, package, or fully
+     * qualified class name. Must not be null.
+     */
+    public OtelConfigurationProperties withInstrumentationName(String instrumentationName) {
+        this.instrumentationName = instrumentationName;
+        return this;
+    }
+
+    /**
+     * 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.
+     */
+    public OtelConfigurationProperties withEncoding(boolean encoding) {
+        this.encoding = encoding;
+        return this;
+    }
+
+    /**
+     * Adds an exclude pattern that will disable tracing for Camel messages that matches the pattern. Multiple patterns
+     * can be separated by comma.
+     */
+    public OtelConfigurationProperties withExcludePatterns(String excludePatterns) {
+        this.excludePatterns = excludePatterns;
+        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 3ac979cc46e..7d8299bffe9 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
@@ -204,6 +204,8 @@ public class PrepareCamelMainMojo extends AbstractGeneratorMojo {
                     prefix = "camel.health.";
                 } else if (file.getName().contains("Lra")) {
                     prefix = "camel.lra.";
+                } else if (file.getName().contains("Otel")) {
+                    prefix = "camel.opentelemetry.";
                 } else if (file.getName().contains("HttpServer")) {
                     prefix = "camel.server.";
                 } else if (file.getName().contains("ThreadPoolProfileConfigurationProperties")) {
@@ -316,6 +318,9 @@ public class PrepareCamelMainMojo extends AbstractGeneratorMojo {
                             "camel.vault.azure", "Camel Azure Key Vault configurations",
                             "org.apache.camel.vault.AzureVaultConfiguration"));
             // TODO: add more vault providers here
+            model.getGroups().add(new MainGroupModel(
+                    "camel.otel", "Camel OpenTelemtry configurations",
+                    "org.apache.camel.main.OtelConfigurationProperties"));
             model.getGroups()
                     .add(new MainGroupModel(
                             "camel.faulttolerance", "Fault Tolerance EIP Circuit Breaker configurations",


(camel) 02/03: CAMEL-20083: camel-opentelemtry - Make it easier to configure for camel-main

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch otel
in repository https://gitbox.apache.org/repos/asf/camel.git

commit dda8534dad84858511735588b14f23725ccd62af
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Nov 5 11:48:34 2023 +0100

    CAMEL-20083: camel-opentelemtry - Make it easier to configure for camel-main
---
 .../camel/observation/AttributeProcessor.java      | 12 +---------
 .../observation/MicrometerObservationTracer.java   |  2 +-
 .../SetCorrelationContextProcessor.java            |  3 ---
 .../main/java/org/apache/camel/tracing/Tracer.java |  4 ++--
 .../org/apache/camel/spi/CamelTracingService.java  | 27 ++++++++++++++++++++++
 .../org/apache/camel/main/BaseMainSupport.java     | 14 +++++++----
 6 files changed, 41 insertions(+), 21 deletions(-)

diff --git a/components/camel-observation/src/main/java/org/apache/camel/observation/AttributeProcessor.java b/components/camel-observation/src/main/java/org/apache/camel/observation/AttributeProcessor.java
index c551908aa4a..cdca8f440ca 100644
--- a/components/camel-observation/src/main/java/org/apache/camel/observation/AttributeProcessor.java
+++ b/components/camel-observation/src/main/java/org/apache/camel/observation/AttributeProcessor.java
@@ -30,7 +30,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * A processor which adds a attribute on the active {@link Observation} with an {@link org.apache.camel.Expression}
+ * A processor which adds an attribute on the active {@link Observation} with an {@link org.apache.camel.Expression}
  */
 public class AttributeProcessor extends AsyncProcessorSupport implements Traceable, IdAware, RouteIdAware {
 
@@ -99,16 +99,6 @@ public class AttributeProcessor extends AsyncProcessorSupport implements Traceab
         return expression;
     }
 
-    @Override
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-        // noop
-    }
-
     @Override
     public String toString() {
         return id;
diff --git a/components/camel-observation/src/main/java/org/apache/camel/observation/MicrometerObservationTracer.java b/components/camel-observation/src/main/java/org/apache/camel/observation/MicrometerObservationTracer.java
index aa5baec9d4f..74f90818965 100644
--- a/components/camel-observation/src/main/java/org/apache/camel/observation/MicrometerObservationTracer.java
+++ b/components/camel-observation/src/main/java/org/apache/camel/observation/MicrometerObservationTracer.java
@@ -160,7 +160,7 @@ public class MicrometerObservationTracer extends org.apache.camel.tracing.Tracer
 
     @Override
     protected void initContextPropagators() {
-
+        // noop
     }
 
     private static Observation getParentObservation(SpanAdapter parentObservation) {
diff --git a/components/camel-observation/src/main/java/org/apache/camel/observation/SetCorrelationContextProcessor.java b/components/camel-observation/src/main/java/org/apache/camel/observation/SetCorrelationContextProcessor.java
index 80d329ffafa..9d2d86cde84 100644
--- a/components/camel-observation/src/main/java/org/apache/camel/observation/SetCorrelationContextProcessor.java
+++ b/components/camel-observation/src/main/java/org/apache/camel/observation/SetCorrelationContextProcessor.java
@@ -28,9 +28,6 @@ import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/**
- * @author rvargasp
- */
 public class SetCorrelationContextProcessor extends AsyncProcessorSupport implements Traceable, IdAware, RouteIdAware {
 
     private static final Logger LOG = LoggerFactory.getLogger(SetCorrelationContextProcessor.class);
diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java
index 1b9c5297112..3afbeae663f 100644
--- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java
+++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/Tracer.java
@@ -23,7 +23,6 @@ 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;
@@ -33,6 +32,7 @@ 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.CamelTracingService;
 import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.spi.LogListener;
 import org.apache.camel.spi.RoutePolicy;
@@ -48,7 +48,7 @@ import org.apache.camel.util.StringHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class Tracer extends ServiceSupport implements RoutePolicyFactory, StaticService, CamelContextAware {
+public abstract class Tracer extends ServiceSupport implements CamelTracingService, RoutePolicyFactory, StaticService {
     protected static final Map<String, SpanDecorator> DECORATORS = new HashMap<>();
     static final AutoCloseable NOOP_CLOSEABLE = () -> {
     };
diff --git a/core/camel-api/src/generated/java/org/apache/camel/spi/CamelTracingService.java b/core/camel-api/src/generated/java/org/apache/camel/spi/CamelTracingService.java
new file mode 100644
index 00000000000..e71ebc047fe
--- /dev/null
+++ b/core/camel-api/src/generated/java/org/apache/camel/spi/CamelTracingService.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.spi;
+
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.Service;
+
+/**
+ * A Camel tracing service is a factory for telemetry tracers.
+ */
+public interface CamelTracingService extends Service, CamelContextAware {
+
+}
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index 734356576c6..f00d66c107e 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -84,6 +84,7 @@ import org.apache.camel.support.scan.PackageScanHelper;
 import org.apache.camel.support.service.BaseService;
 import org.apache.camel.support.startup.BacklogStartupStepRecorder;
 import org.apache.camel.support.startup.LoggingStartupStepRecorder;
+import org.apache.camel.spi.CamelTracingService;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.OrderedLocationProperties;
@@ -2023,6 +2024,9 @@ public abstract class BaseMainSupport extends BaseService {
     private static CamelSagaService resolveLraSagaService(CamelContext camelContext) throws Exception {
         // lookup in service registry first
         CamelSagaService answer = camelContext.getRegistry().findSingleByType(CamelSagaService.class);
+        if (answer == null) {
+            answer = camelContext.hasService(CamelSagaService.class);
+        }
         if (answer == null) {
             answer = camelContext.getCamelContextExtension().getBootstrapFactoryFinder()
                     .newInstance("lra-saga-service", CamelSagaService.class)
@@ -2032,13 +2036,15 @@ public abstract class BaseMainSupport extends BaseService {
         return answer;
     }
 
-    private static Service resolveOtelService(CamelContext camelContext) throws Exception {
+    private static CamelTracingService resolveOtelService(CamelContext camelContext) throws Exception {
         // lookup in service registry first
-        // TODO: We need a Tracing SPI to be able to identify this (lookup in registry / service on camel context)
-        Service answer = camelContext.getRegistry().lookupByNameAndType("OpenTelemetryTracer", Service.class);
+        CamelTracingService answer = camelContext.getRegistry().findSingleByType(CamelTracingService.class);
+        if (answer == null) {
+            answer = camelContext.hasService(CamelTracingService.class);
+        }
         if (answer == null) {
             answer = camelContext.getCamelContextExtension().getBootstrapFactoryFinder()
-                    .newInstance("opentelemetry-tracer", Service.class)
+                    .newInstance("opentelemetry-tracer", CamelTracingService.class)
                     .orElseThrow(() -> new IllegalArgumentException(
                             "Cannot find OpenTelemetryTracer on classpath. Add camel-opentelemetry to classpath."));
         }