diff --git a/messaging-modules/camel-observability/camel-observability-spring/pom.xml b/messaging-modules/camel-observability/camel-observability-spring/pom.xml
new file mode 100644
index 000000000000..968793323d98
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-spring/pom.xml
@@ -0,0 +1,107 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ camel-observability
+ 0.0.1-SNAPSHOT
+
+
+ camel-observability-spring
+
+
+ 17
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.5.11
+ import
+ pom
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.apache.camel.springboot
+ camel-spring-boot-starter
+ 4.18.0
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.boot
+ spring-boot-actuator-autoconfigure
+
+
+ org.apache.camel.springboot
+ camel-observation-starter
+ 4.18.0
+
+
+
+ io.micrometer
+ micrometer-tracing
+ 1.5.0
+
+
+ io.micrometer
+ micrometer-tracing-bridge-brave
+ 1.5.0
+
+
+ io.zipkin.reporter2
+ zipkin-reporter-brave
+
+
+
+ io.micrometer
+ micrometer-core
+ 1.15.9
+
+
+
+ ch.qos.logback
+ logback-core
+ 1.5.32
+
+
+ ch.qos.logback
+ logback-classic
+ 1.5.32
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/messaging-modules/camel-observability/camel-observability-spring/src/data/message1.xml b/messaging-modules/camel-observability/camel-observability-spring/src/data/message1.xml
new file mode 100644
index 000000000000..2b6d64c2daaa
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-spring/src/data/message1.xml
@@ -0,0 +1,6 @@
+
+
+ James
+ Strachan
+ London
+
\ No newline at end of file
diff --git a/messaging-modules/camel-observability/camel-observability-spring/src/data/message2.xml b/messaging-modules/camel-observability/camel-observability-spring/src/data/message2.xml
new file mode 100644
index 000000000000..dce1d94206d8
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-spring/src/data/message2.xml
@@ -0,0 +1,6 @@
+
+
+ Hiram
+ Chirino
+ Tampa
+
\ No newline at end of file
diff --git a/messaging-modules/camel-observability/camel-observability-spring/src/main/java/com/baeldung/camel/observability/FirstCamelSpringBootApplication.java b/messaging-modules/camel-observability/camel-observability-spring/src/main/java/com/baeldung/camel/observability/FirstCamelSpringBootApplication.java
new file mode 100644
index 000000000000..13a1e799e918
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-spring/src/main/java/com/baeldung/camel/observability/FirstCamelSpringBootApplication.java
@@ -0,0 +1,27 @@
+package com.baeldung.camel.observability;
+
+import org.apache.camel.observation.starter.CamelObservation;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+
+@CamelObservation
+@SpringBootApplication
+public class FirstCamelSpringBootApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(FirstCamelSpringBootApplication.class, args);
+ }
+
+ @Bean
+ SimpleProcessor simpleProcessor() {
+ return new SimpleProcessor();
+ }
+
+ @Bean
+ SimpleRouteBuilder simpleRouteBuilder(SimpleProcessor simpleProcessor) {
+ return new SimpleRouteBuilder(simpleProcessor);
+ }
+
+}
diff --git a/messaging-modules/camel-observability/camel-observability-spring/src/main/java/com/baeldung/camel/observability/SimpleProcessor.java b/messaging-modules/camel-observability/camel-observability-spring/src/main/java/com/baeldung/camel/observability/SimpleProcessor.java
new file mode 100644
index 000000000000..5d927f7b1573
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-spring/src/main/java/com/baeldung/camel/observability/SimpleProcessor.java
@@ -0,0 +1,42 @@
+package com.baeldung.camel.observability;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+
+public class SimpleProcessor implements Processor {
+
+ private static final DocumentBuilderFactory factory = DocumentBuilderFactory.newDefaultInstance();
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ String body = exchange.getMessage().getBody(String.class);
+ String processedAt = LocalDateTime.now().toString();
+ InputStream stream = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));
+ Document document = factory.newDocumentBuilder().parse(stream);
+ Element root = document.getDocumentElement();
+ Element newElemeent = document.createElement("processed");
+ newElemeent.setTextContent(processedAt);
+ root.appendChild(newElemeent);
+ TransformerFactory transformerFactory = TransformerFactory.newInstance();
+ Transformer transformer = transformerFactory.newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ StringWriter stringWriter = new StringWriter();
+ transformer.transform(new DOMSource(document), new StreamResult(stringWriter));
+ String newBody = stringWriter.toString();
+ exchange.getMessage().setBody(newBody);
+ }
+}
diff --git a/messaging-modules/camel-observability/camel-observability-spring/src/main/java/com/baeldung/camel/observability/SimpleRouteBuilder.java b/messaging-modules/camel-observability/camel-observability-spring/src/main/java/com/baeldung/camel/observability/SimpleRouteBuilder.java
new file mode 100644
index 000000000000..c5f64eb53f25
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-spring/src/main/java/com/baeldung/camel/observability/SimpleRouteBuilder.java
@@ -0,0 +1,32 @@
+package com.baeldung.camel.observability;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class SimpleRouteBuilder extends RouteBuilder {
+
+ private final SimpleProcessor simpleProcessor;
+
+ @Autowired
+ public SimpleRouteBuilder(SimpleProcessor simpleProcessor) {
+ this.simpleProcessor = simpleProcessor;
+ }
+
+ public void configure() {
+ from("file://src/data?noop=true")
+ .process(simpleProcessor)
+ .choice()
+ .when(xpath("/person/city = 'London'"))
+ .log("UK message")
+ .to("file:target/messages/uk")
+ .log("UK message 2")
+ .to("file:target/messages/general-sink")
+ .otherwise()
+ .log("Other message")
+ .to("file:target/messages/others")
+ .log("Other message 2")
+ .to("file:target/messages/general-sink");
+
+ }
+
+}
diff --git a/messaging-modules/camel-observability/camel-observability-spring/src/main/resources/application.yml b/messaging-modules/camel-observability/camel-observability-spring/src/main/resources/application.yml
new file mode 100644
index 000000000000..e75edaf7c770
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-spring/src/main/resources/application.yml
@@ -0,0 +1,20 @@
+spring:
+ application:
+ name: first-camel-spring-boot
+camel:
+ main:
+ run-controller: true
+ opentelemetry2:
+ enabled: true
+ trace-processors: true
+ trace-headers-inclusion: true
+management:
+ tracing:
+ sampling:
+ probability: 1.0
+ endpoints:
+ web:
+ exposure:
+ include: health,metrics,prometheus
+ server:
+ port: 7654
\ No newline at end of file
diff --git a/messaging-modules/camel-observability/camel-observability-standalone/pom.xml b/messaging-modules/camel-observability/camel-observability-standalone/pom.xml
new file mode 100644
index 000000000000..5a9d7aa9b593
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-standalone/pom.xml
@@ -0,0 +1,101 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ camel-observability
+ 0.0.1-SNAPSHOT
+
+
+ camel-observability-standalone
+
+
+ UTF-8
+ UTF-8
+
+
+
+
+
+
+ org.apache.camel
+ camel-bom
+ 4.17.0
+ import
+ pom
+
+
+
+
+
+
+
+ org.apache.camel
+ camel-core
+
+
+ org.apache.camel
+ camel-main
+
+
+ org.apache.camel
+ camel-observability-services
+
+
+ org.apache.camel
+ camel-opentelemetry2
+
+
+ ch.qos.logback
+ logback-classic
+ 1.5.29
+ compile
+
+
+
+
+ org.apache.camel
+ camel-test
+ 3.22.4
+ test
+
+
+
+
+ install
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.10.1
+
+ 11
+
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+ 3.2.0
+
+ UTF-8
+
+
+
+
+
+ org.apache.camel
+ camel-maven-plugin
+ 3.18.4
+
+ true
+ com.baeldung.camel.observability.MainApp
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/messaging-modules/camel-observability/camel-observability-standalone/src/data/message1.xml b/messaging-modules/camel-observability/camel-observability-standalone/src/data/message1.xml
new file mode 100644
index 000000000000..2b6d64c2daaa
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-standalone/src/data/message1.xml
@@ -0,0 +1,6 @@
+
+
+ James
+ Strachan
+ London
+
\ No newline at end of file
diff --git a/messaging-modules/camel-observability/camel-observability-standalone/src/data/message2.xml b/messaging-modules/camel-observability/camel-observability-standalone/src/data/message2.xml
new file mode 100644
index 000000000000..dce1d94206d8
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-standalone/src/data/message2.xml
@@ -0,0 +1,6 @@
+
+
+ Hiram
+ Chirino
+ Tampa
+
\ No newline at end of file
diff --git a/messaging-modules/camel-observability/camel-observability-standalone/src/main/java/com/baeldung/camel/observability/MainApp.java b/messaging-modules/camel-observability/camel-observability-standalone/src/main/java/com/baeldung/camel/observability/MainApp.java
new file mode 100644
index 000000000000..3ac5c949f6c0
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-standalone/src/main/java/com/baeldung/camel/observability/MainApp.java
@@ -0,0 +1,15 @@
+package com.baeldung.camel.observability;
+
+import org.apache.camel.main.Main;
+
+public class MainApp {
+
+ public static void main(String... args) throws Exception {
+ Main main = new Main();
+ main.configure().addRoutesBuilder(new SimpleRouteBuilder());
+ main.bind("SimpleProcessor", new SimpleProcessor());
+ main.run(args);
+ }
+
+}
+
diff --git a/messaging-modules/camel-observability/camel-observability-standalone/src/main/java/com/baeldung/camel/observability/SimpleProcessor.java b/messaging-modules/camel-observability/camel-observability-standalone/src/main/java/com/baeldung/camel/observability/SimpleProcessor.java
new file mode 100644
index 000000000000..5d927f7b1573
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-standalone/src/main/java/com/baeldung/camel/observability/SimpleProcessor.java
@@ -0,0 +1,42 @@
+package com.baeldung.camel.observability;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+
+public class SimpleProcessor implements Processor {
+
+ private static final DocumentBuilderFactory factory = DocumentBuilderFactory.newDefaultInstance();
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ String body = exchange.getMessage().getBody(String.class);
+ String processedAt = LocalDateTime.now().toString();
+ InputStream stream = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));
+ Document document = factory.newDocumentBuilder().parse(stream);
+ Element root = document.getDocumentElement();
+ Element newElemeent = document.createElement("processed");
+ newElemeent.setTextContent(processedAt);
+ root.appendChild(newElemeent);
+ TransformerFactory transformerFactory = TransformerFactory.newInstance();
+ Transformer transformer = transformerFactory.newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ StringWriter stringWriter = new StringWriter();
+ transformer.transform(new DOMSource(document), new StreamResult(stringWriter));
+ String newBody = stringWriter.toString();
+ exchange.getMessage().setBody(newBody);
+ }
+}
diff --git a/messaging-modules/camel-observability/camel-observability-standalone/src/main/java/com/baeldung/camel/observability/SimpleRouteBuilder.java b/messaging-modules/camel-observability/camel-observability-standalone/src/main/java/com/baeldung/camel/observability/SimpleRouteBuilder.java
new file mode 100644
index 000000000000..a476daf442c0
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-standalone/src/main/java/com/baeldung/camel/observability/SimpleRouteBuilder.java
@@ -0,0 +1,27 @@
+package com.baeldung.camel.observability;
+
+import org.apache.camel.BeanInject;
+import org.apache.camel.builder.RouteBuilder;
+
+public class SimpleRouteBuilder extends RouteBuilder {
+
+ @BeanInject("SimpleProcessor")
+ SimpleProcessor simpleProcessor;
+
+ public void configure() {
+ from("file:src/data?noop=true")
+ .process(simpleProcessor)
+ .choice()
+ .when(xpath("/person/city = 'London'"))
+ .log("UK message")
+ .to("file:target/messages/uk")
+ .log("UK message 2")
+ .to("file:target/messages/general-sink")
+ .otherwise()
+ .log("Other message")
+ .to("file:target/messages/others")
+ .log("Other message 2")
+ .to("file:target/messages/general-sink");
+ }
+
+}
diff --git a/messaging-modules/camel-observability/camel-observability-standalone/src/main/resources/application.properties b/messaging-modules/camel-observability/camel-observability-standalone/src/main/resources/application.properties
new file mode 100644
index 000000000000..90b9e6bd8c23
--- /dev/null
+++ b/messaging-modules/camel-observability/camel-observability-standalone/src/main/resources/application.properties
@@ -0,0 +1 @@
+camel.opentelemetry2.enabled=true
\ No newline at end of file
diff --git a/messaging-modules/camel-observability/pom.xml b/messaging-modules/camel-observability/pom.xml
new file mode 100644
index 000000000000..880b54d9705d
--- /dev/null
+++ b/messaging-modules/camel-observability/pom.xml
@@ -0,0 +1,20 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ messaging-modules
+ 0.0.1-SNAPSHOT
+
+
+ camel-observability
+
+ pom
+
+ camel-observability-spring
+ camel-observability-standalone
+
+
+
\ No newline at end of file
diff --git a/messaging-modules/pom.xml b/messaging-modules/pom.xml
index 6275e9eec574..6cd272c9f361 100644
--- a/messaging-modules/pom.xml
+++ b/messaging-modules/pom.xml
@@ -28,6 +28,7 @@
postgres-notify
ibm-mq
dapr
+ camel-observability
allegro-hermes