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