You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2023/05/25 13:47:03 UTC
[camel-spring-boot-examples] 01/06: Add OpenTelemetry example
This is an automated email from the ASF dual-hosted git repository.
acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot-examples.git
commit 4bafae184989fc28ee8e146eae760fc3c921ffed
Author: Stanislav Deviatov <de...@gmail.com>
AuthorDate: Wed May 17 10:35:48 2023 +0200
Add OpenTelemetry example
The source codes added
---
opentelemetry/.gitignore | 29 ++++
opentelemetry/CarBooking/pom.xml | 154 +++++++++++++++++++++
.../src/main/java/com/example/demo/AppConfig.java | 30 ++++
.../main/java/com/example/demo/AvailableCars.java | 39 ++++++
.../java/com/example/demo/DemoApplication.java | 15 ++
.../java/com/example/demo/MySimpleCamelRouter.java | 33 +++++
.../src/main/resources/application.properties | 8 ++
.../CarBooking/src/main/resources/logback.xml | 18 +++
.../com/example/demo/DemoApplicationTests.java | 13 ++
opentelemetry/FlightBooking/pom.xml | 146 +++++++++++++++++++
.../src/main/java/com/example/demo/AppConfig.java | 30 ++++
.../java/com/example/demo/AvailableFlights.java | 40 ++++++
.../java/com/example/demo/DemoApplication.java | 15 ++
.../java/com/example/demo/MySimpleCamelRouter.java | 34 +++++
.../src/main/resources/application.properties | 8 ++
.../FlightBooking/src/main/resources/logback.xml | 18 +++
.../com/example/demo/DemoApplicationTests.java | 13 ++
opentelemetry/HotelBooking/pom.xml | 144 +++++++++++++++++++
.../src/main/java/com/example/demo/AppConfig.java | 30 ++++
.../java/com/example/demo/AvailableHotels.java | 33 +++++
.../java/com/example/demo/DemoApplication.java | 15 ++
.../java/com/example/demo/MySimpleCamelRouter.java | 33 +++++
.../src/main/resources/application.properties | 8 ++
.../HotelBooking/src/main/resources/logback.xml | 18 +++
.../com/example/demo/DemoApplicationTests.java | 13 ++
opentelemetry/TripBooking/pom.xml | 144 +++++++++++++++++++
.../src/main/java/com/example/demo/AppConfig.java | 30 ++++
.../java/com/example/demo/DemoApplication.java | 15 ++
.../com/example/demo/MergeAggregationStrategy.java | 25 ++++
.../java/com/example/demo/MySimpleCamelRouter.java | 55 ++++++++
.../src/main/resources/application.properties | 8 ++
.../TripBooking/src/main/resources/logback.xml | 18 +++
opentelemetry/adoc/img/example.jpeg | Bin 0 -> 139280 bytes
opentelemetry/containers/docker-compose.yml | 59 ++++++++
.../containers/docker/otel-collector-config.yaml | 66 +++++++++
.../containers/docker/prometheusConfig.yml | 14 ++
opentelemetry/pom.xml | 48 +++++++
37 files changed, 1419 insertions(+)
diff --git a/opentelemetry/.gitignore b/opentelemetry/.gitignore
new file mode 100644
index 0000000..f68d109
--- /dev/null
+++ b/opentelemetry/.gitignore
@@ -0,0 +1,29 @@
+### IntelliJ IDEA ###
+out/
+!**/src/main/**/out/
+!**/src/test/**/out/
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+bin/
+!**/src/main/**/bin/
+!**/src/test/**/bin/
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/opentelemetry/CarBooking/pom.xml b/opentelemetry/CarBooking/pom.xml
new file mode 100644
index 0000000..04fd73f
--- /dev/null
+++ b/opentelemetry/CarBooking/pom.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.camel.springboot.example</groupId>
+ <artifactId>camel-example-spring-boot-opentelemetry</artifactId>
+ <version>4.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-example-spring-boot-opentelemetry-carbooking</artifactId>
+ <name>Camel SB Examples :: OpenTelemetry :: CarBooking</name>
+ <description>An example showing how to use Camel with OpenTelemetry</description>
+
+ <properties>
+ <io.opentracing.contrib.version>3.3.1</io.opentracing.contrib.version>
+ <opentelemetry-agent.version>1.25.1</opentelemetry-agent.version>
+ </properties>
+
+ <!-- import Spring-Boot and Camel BOM -->
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-dependencies</artifactId>
+ <version>${spring-boot-version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-spring-boot-bom</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <!-- Spring Boot dependancies -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-actuator</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.micrometer</groupId>
+ <artifactId>micrometer-registry-prometheus</artifactId>
+ </dependency>
+ <!-- Apache Camel dependancides-->
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-spring-boot-starter</artifactId>
+
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-rest-starter</artifactId>
+
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-servlet-starter</artifactId>
+
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-jackson-starter</artifactId>
+
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-micrometer-starter</artifactId>
+
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-seda-starter</artifactId>
+
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-http-starter</artifactId>
+
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-kafka-starter</artifactId>
+
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-bean-starter</artifactId>
+
+ </dependency>
+
+ <!-- OpenTelemetry -->
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-opentelemetry-starter</artifactId>
+
+ </dependency>
+
+ <!-- Testing -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-javaagent</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>io.opentelemetry.javaagent</groupId>
+ <artifactId>opentelemetry-javaagent</artifactId>
+ <version>${opentelemetry-agent.version}</version>
+ <overWrite>true</overWrite>
+ <outputDirectory>${project.build.directory}/javaagents</outputDirectory>
+ <destFileName>javaagent.jar</destFileName>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <configuration>
+ <agents>
+ <agent>${project.build.directory}/javaagents/javaagent.jar</agent>
+ </agents>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
diff --git a/opentelemetry/CarBooking/src/main/java/com/example/demo/AppConfig.java b/opentelemetry/CarBooking/src/main/java/com/example/demo/AppConfig.java
new file mode 100644
index 0000000..7e76a67
--- /dev/null
+++ b/opentelemetry/CarBooking/src/main/java/com/example/demo/AppConfig.java
@@ -0,0 +1,30 @@
+package com.example.demo;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryFactory;
+import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory;
+import org.apache.camel.spring.boot.CamelContextConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AppConfig {
+
+ @Bean
+ public CamelContextConfiguration camelContextConfiguration() {
+
+ return new CamelContextConfiguration() {
+ @Override
+ public void beforeApplicationStart(CamelContext camelContext) {
+ camelContext.addRoutePolicyFactory(new MicrometerRoutePolicyFactory());
+ camelContext.setMessageHistoryFactory(new MicrometerMessageHistoryFactory());
+ }
+
+ @Override
+ public void afterApplicationStart(CamelContext camelContext) {
+
+ }
+ };
+ }
+
+}
diff --git a/opentelemetry/CarBooking/src/main/java/com/example/demo/AvailableCars.java b/opentelemetry/CarBooking/src/main/java/com/example/demo/AvailableCars.java
new file mode 100644
index 0000000..97aecfa
--- /dev/null
+++ b/opentelemetry/CarBooking/src/main/java/com/example/demo/AvailableCars.java
@@ -0,0 +1,39 @@
+package com.example.demo;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+import org.apache.camel.Handler;
+
+public class AvailableCars {
+ private List<String> cars = Arrays.asList(
+ "Toyota Corolla",
+ "Honda Civic",
+ "Mazda 3",
+ "Hyundai Elantra",
+ "Subaru Impreza",
+ "Volkswagen Jetta",
+ "Volkswagen Golf",
+ "Ford Fiesta",
+ "Ford Focus",
+ "Chevrolet Cruze",
+ "Kia Ceed",
+ "Skoda Octavia",
+ "Citroen C4",
+ "Peugeot 308"
+ );
+
+ @Handler
+ public String getAvailableCar(){
+ int index = (new Random()).nextInt(cars.size());
+ String jsonResult= "{"+
+ " \"bookingId\": "+(new Random()).nextInt(1000)+"," +
+ " \"car\": \""+cars.get(index)+"\"," +
+ " \"startDate\": \"12-11-2018\"," +
+ " \"endDate\": \"15-11-2018\"," +
+ " \"price\": "+((new Random()).nextInt(25) + 140) +
+ " }";
+ return jsonResult;
+ }
+}
diff --git a/opentelemetry/CarBooking/src/main/java/com/example/demo/DemoApplication.java b/opentelemetry/CarBooking/src/main/java/com/example/demo/DemoApplication.java
new file mode 100644
index 0000000..764e68c
--- /dev/null
+++ b/opentelemetry/CarBooking/src/main/java/com/example/demo/DemoApplication.java
@@ -0,0 +1,15 @@
+package com.example.demo;
+
+import org.apache.camel.opentelemetry.starter.CamelOpenTelemetry;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@CamelOpenTelemetry
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/opentelemetry/CarBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java b/opentelemetry/CarBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java
new file mode 100644
index 0000000..4e4415c
--- /dev/null
+++ b/opentelemetry/CarBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java
@@ -0,0 +1,33 @@
+package com.example.demo;
+
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.dataformat.JsonLibrary;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MySimpleCamelRouter extends RouteBuilder {
+ @Override
+ public void configure() throws Exception {
+ restConfiguration()
+ .component("servlet")
+ .bindingMode(RestBindingMode.json);
+
+ rest().get("/bookCar")
+ .to("direct:bookCar");
+
+ from("direct:bookCar").routeId("bookCar-http")
+ .log(LoggingLevel.INFO, "New book car request with traceId=${header.x-b3-traceid}")
+ .bean(new AvailableCars(),"getAvailableCar")
+ .unmarshal().json(JsonLibrary.Jackson);
+
+ // kafka based
+ from("kafka:car_input?brokers=kafka:9092").routeId("bookCar-kafka")
+ .log(LoggingLevel.INFO, "New book car request via Kafka topic")
+ // .to("log:debug?showAll=true&multiline=true")
+ .bean(new AvailableCars(),"getAvailableCar")
+ .to("kafka:car_output?brokers=kafka:9092");
+
+ }
+}
\ No newline at end of file
diff --git a/opentelemetry/CarBooking/src/main/resources/application.properties b/opentelemetry/CarBooking/src/main/resources/application.properties
new file mode 100644
index 0000000..aacebe8
--- /dev/null
+++ b/opentelemetry/CarBooking/src/main/resources/application.properties
@@ -0,0 +1,8 @@
+camel.springboot.main-run-controller=true
+camel.springboot.use-mdc-logging = true
+camel.component.micrometer.enabled=true
+camel.component.metrics.metric-registry=prometheusMeterRegistry
+management.endpoint.metrics.enabled=true
+management.endpoints.web.exposure.include=*
+spring.application.name=CarBooking
+server.port=8081
\ No newline at end of file
diff --git a/opentelemetry/CarBooking/src/main/resources/logback.xml b/opentelemetry/CarBooking/src/main/resources/logback.xml
new file mode 100644
index 0000000..e566426
--- /dev/null
+++ b/opentelemetry/CarBooking/src/main/resources/logback.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xml>
+<configuration>
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <!-- encoders are assigned the type
+ ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} %-5level [%X{traceId:-},%X{spanId:-}] %logger{36} - %msg%n</pattern>
+ </encoder>
+ </appender>
+
+
+ <root level="info">
+ <appender-ref ref="STDOUT" />
+ </root>
+
+</configuration>
\ No newline at end of file
diff --git a/opentelemetry/CarBooking/src/test/java/com/example/demo/DemoApplicationTests.java b/opentelemetry/CarBooking/src/test/java/com/example/demo/DemoApplicationTests.java
new file mode 100644
index 0000000..a8de38b
--- /dev/null
+++ b/opentelemetry/CarBooking/src/test/java/com/example/demo/DemoApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.demo;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DemoApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/opentelemetry/FlightBooking/pom.xml b/opentelemetry/FlightBooking/pom.xml
new file mode 100644
index 0000000..35cabbc
--- /dev/null
+++ b/opentelemetry/FlightBooking/pom.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.camel.springboot.example</groupId>
+ <artifactId>camel-example-spring-boot-opentelemetry</artifactId>
+ <version>4.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-example-spring-boot-opentelemetry-flightbooking</artifactId>
+ <name>Camel SB Examples :: OpenTelemetry :: FlightBooking</name>
+ <description>An example showing how to use Camel with OpenTelemetry</description>
+
+ <properties>
+ <java.version>11</java.version>
+ <camel.version>3.14.1</camel.version>
+ <jaeger.version>1.6.0</jaeger.version>
+ <io.opentracing.contrib.version>3.3.1</io.opentracing.contrib.version>
+ <opentelemetry-agent.version>1.25.1</opentelemetry-agent.version>
+ </properties>
+
+ <!-- import Spring-Boot and Camel BOM -->
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-dependencies</artifactId>
+ <version>${spring-boot-version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-spring-boot-bom</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <!-- Spring Boot dependancies -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-actuator</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.micrometer</groupId>
+ <artifactId>micrometer-registry-prometheus</artifactId>
+ </dependency>
+ <!-- Apache Camel dependancides-->
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-spring-boot-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-rest-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-servlet-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-jackson-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-micrometer-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-seda-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-http-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-kafka-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-bean-starter</artifactId>
+ </dependency>
+
+ <!-- OpenTelemetry -->
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-opentelemetry-starter</artifactId>
+ </dependency>
+
+ <!-- Testing -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-javaagent</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>io.opentelemetry.javaagent</groupId>
+ <artifactId>opentelemetry-javaagent</artifactId>
+ <version>${opentelemetry-agent.version}</version>
+ <overWrite>true</overWrite>
+ <outputDirectory>${project.build.directory}/javaagents</outputDirectory>
+ <destFileName>javaagent.jar</destFileName>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <configuration>
+ <agents>
+ <agent>${project.build.directory}/javaagents/javaagent.jar</agent>
+ </agents>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
diff --git a/opentelemetry/FlightBooking/src/main/java/com/example/demo/AppConfig.java b/opentelemetry/FlightBooking/src/main/java/com/example/demo/AppConfig.java
new file mode 100644
index 0000000..7e76a67
--- /dev/null
+++ b/opentelemetry/FlightBooking/src/main/java/com/example/demo/AppConfig.java
@@ -0,0 +1,30 @@
+package com.example.demo;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryFactory;
+import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory;
+import org.apache.camel.spring.boot.CamelContextConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AppConfig {
+
+ @Bean
+ public CamelContextConfiguration camelContextConfiguration() {
+
+ return new CamelContextConfiguration() {
+ @Override
+ public void beforeApplicationStart(CamelContext camelContext) {
+ camelContext.addRoutePolicyFactory(new MicrometerRoutePolicyFactory());
+ camelContext.setMessageHistoryFactory(new MicrometerMessageHistoryFactory());
+ }
+
+ @Override
+ public void afterApplicationStart(CamelContext camelContext) {
+
+ }
+ };
+ }
+
+}
diff --git a/opentelemetry/FlightBooking/src/main/java/com/example/demo/AvailableFlights.java b/opentelemetry/FlightBooking/src/main/java/com/example/demo/AvailableFlights.java
new file mode 100644
index 0000000..8f27d4b
--- /dev/null
+++ b/opentelemetry/FlightBooking/src/main/java/com/example/demo/AvailableFlights.java
@@ -0,0 +1,40 @@
+package com.example.demo;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+import org.apache.camel.Handler;
+
+public class AvailableFlights {
+ private List<String> flights = Arrays.asList(
+ "American Airlines",
+ "Delta Air Lines",
+ "Lufthansa",
+ "United Airlines",
+ "Air France–KLM",
+ "IAG",
+ "Southwest Airlines",
+ "China Southern Airlines",
+ "All Nippon Airways",
+ "China Eastern Airlines",
+ "Ryanair",
+ "Air China",
+ "British Airways",
+ "Emirates",
+ "Turkish Airlines",
+ "Qatar Airways"
+ );
+ @Handler
+ public String getAvailableFlight(){
+ int index = (new Random()).nextInt(flights.size());
+ String jsonResult= "{"+
+ " \"bookingId\": "+(new Random()).nextInt(1000)+"," +
+ " \"flight\": \""+flights.get(index)+" "+((new Random()).nextInt(10000))+"\"," +
+ " \"startDate\": \"12-11-2018\"," +
+ " \"endDate\": \"15-11-2018\"," +
+ " \"price\": "+((new Random()).nextInt(100) + 100) +
+ " }";
+ return jsonResult;
+ }
+}
diff --git a/opentelemetry/FlightBooking/src/main/java/com/example/demo/DemoApplication.java b/opentelemetry/FlightBooking/src/main/java/com/example/demo/DemoApplication.java
new file mode 100644
index 0000000..9b4bc7f
--- /dev/null
+++ b/opentelemetry/FlightBooking/src/main/java/com/example/demo/DemoApplication.java
@@ -0,0 +1,15 @@
+package com.example.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.apache.camel.opentelemetry.starter.CamelOpenTelemetry;
+
+@CamelOpenTelemetry
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/opentelemetry/FlightBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java b/opentelemetry/FlightBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java
new file mode 100644
index 0000000..ec74462
--- /dev/null
+++ b/opentelemetry/FlightBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java
@@ -0,0 +1,34 @@
+package com.example.demo;
+
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.dataformat.JsonLibrary;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MySimpleCamelRouter extends RouteBuilder {
+ @Override
+ public void configure() throws Exception {
+ restConfiguration()
+ .component("servlet")
+ .port(8080).host("localhost")
+ .bindingMode(RestBindingMode.json);
+
+ rest().get("/bookFlight")
+ .to("direct:bookFlight");
+
+ from("direct:bookFlight").routeId("bookFlight-http")
+ .log(LoggingLevel.INFO, "New book flight request with traceId=${header.x-b3-traceid}")
+ .bean(new AvailableFlights(),"getAvailableFlight")
+ .unmarshal().json(JsonLibrary.Jackson);
+
+ // kafka based
+ from("kafka:flight_input?brokers=kafka:9092").routeId("bookFlight-kafka")
+ .log(LoggingLevel.INFO, "New book flight request via Kafka topic")
+ // .to("log:debug?showAll=true&multiline=true")
+ .bean(new AvailableFlights(),"getAvailableFlight")
+ .to("kafka:flight_output?brokers=kafka:9092");
+
+ }
+}
\ No newline at end of file
diff --git a/opentelemetry/FlightBooking/src/main/resources/application.properties b/opentelemetry/FlightBooking/src/main/resources/application.properties
new file mode 100644
index 0000000..2ba962e
--- /dev/null
+++ b/opentelemetry/FlightBooking/src/main/resources/application.properties
@@ -0,0 +1,8 @@
+camel.springboot.main-run-controller=true
+camel.springboot.use-mdc-logging = true
+camel.component.micrometer.enabled=true
+camel.component.metrics.metric-registry=prometheusMeterRegistry
+management.endpoint.metrics.enabled=true
+management.endpoints.web.exposure.include=*
+spring.application.name=FlightBooking
+server.port=8082
\ No newline at end of file
diff --git a/opentelemetry/FlightBooking/src/main/resources/logback.xml b/opentelemetry/FlightBooking/src/main/resources/logback.xml
new file mode 100644
index 0000000..e566426
--- /dev/null
+++ b/opentelemetry/FlightBooking/src/main/resources/logback.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xml>
+<configuration>
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <!-- encoders are assigned the type
+ ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} %-5level [%X{traceId:-},%X{spanId:-}] %logger{36} - %msg%n</pattern>
+ </encoder>
+ </appender>
+
+
+ <root level="info">
+ <appender-ref ref="STDOUT" />
+ </root>
+
+</configuration>
\ No newline at end of file
diff --git a/opentelemetry/FlightBooking/src/test/java/com/example/demo/DemoApplicationTests.java b/opentelemetry/FlightBooking/src/test/java/com/example/demo/DemoApplicationTests.java
new file mode 100644
index 0000000..a8de38b
--- /dev/null
+++ b/opentelemetry/FlightBooking/src/test/java/com/example/demo/DemoApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.demo;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DemoApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/opentelemetry/HotelBooking/pom.xml b/opentelemetry/HotelBooking/pom.xml
new file mode 100644
index 0000000..8f56f1b
--- /dev/null
+++ b/opentelemetry/HotelBooking/pom.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.camel.springboot.example</groupId>
+ <artifactId>camel-example-spring-boot-opentelemetry</artifactId>
+ <version>4.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-example-spring-boot-opentelemetry-hotelbooking</artifactId>
+ <name>Camel SB Examples :: OpenTelemetry :: HotelBooking</name>
+ <description>An example showing how to use Camel with OpenTelemetry</description>
+
+ <properties>
+ <io.opentracing.contrib.version>3.3.1</io.opentracing.contrib.version>
+ <opentelemetry-agent.version>1.25.1</opentelemetry-agent.version>
+ </properties>
+
+ <!-- import Spring-Boot and Camel BOM -->
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-dependencies</artifactId>
+ <version>${spring-boot-version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-spring-boot-bom</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <!-- Spring Boot dependancies -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-actuator</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.micrometer</groupId>
+ <artifactId>micrometer-registry-prometheus</artifactId>
+ </dependency>
+ <!-- Apache Camel dependancides-->
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-spring-boot-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-rest-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-servlet-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-jackson-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-micrometer-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-seda-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-http-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-kafka-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-bean-starter</artifactId>
+ </dependency>
+
+ <!-- OpenTelemetry -->
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-opentelemetry-starter</artifactId>
+ </dependency>
+
+ <!-- Testing -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-javaagent</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>io.opentelemetry.javaagent</groupId>
+ <artifactId>opentelemetry-javaagent</artifactId>
+ <version>${opentelemetry-agent.version}</version>
+ <overWrite>true</overWrite>
+ <outputDirectory>${project.build.directory}/javaagents</outputDirectory>
+ <destFileName>javaagent.jar</destFileName>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <configuration>
+ <agents>
+ <agent>${project.build.directory}/javaagents/javaagent.jar</agent>
+ </agents>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
diff --git a/opentelemetry/HotelBooking/src/main/java/com/example/demo/AppConfig.java b/opentelemetry/HotelBooking/src/main/java/com/example/demo/AppConfig.java
new file mode 100644
index 0000000..7e76a67
--- /dev/null
+++ b/opentelemetry/HotelBooking/src/main/java/com/example/demo/AppConfig.java
@@ -0,0 +1,30 @@
+package com.example.demo;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryFactory;
+import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory;
+import org.apache.camel.spring.boot.CamelContextConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AppConfig {
+
+ @Bean
+ public CamelContextConfiguration camelContextConfiguration() {
+
+ return new CamelContextConfiguration() {
+ @Override
+ public void beforeApplicationStart(CamelContext camelContext) {
+ camelContext.addRoutePolicyFactory(new MicrometerRoutePolicyFactory());
+ camelContext.setMessageHistoryFactory(new MicrometerMessageHistoryFactory());
+ }
+
+ @Override
+ public void afterApplicationStart(CamelContext camelContext) {
+
+ }
+ };
+ }
+
+}
diff --git a/opentelemetry/HotelBooking/src/main/java/com/example/demo/AvailableHotels.java b/opentelemetry/HotelBooking/src/main/java/com/example/demo/AvailableHotels.java
new file mode 100644
index 0000000..a2b2e00
--- /dev/null
+++ b/opentelemetry/HotelBooking/src/main/java/com/example/demo/AvailableHotels.java
@@ -0,0 +1,33 @@
+package com.example.demo;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+import org.apache.camel.Handler;
+
+public class AvailableHotels {
+ private List<String> hotels = Arrays.asList(
+ "Four Seasons",
+ "Sheraton",
+ "The Ritz",
+ "Marriott",
+ "Hilton",
+ "Accor",
+ "Hyatt",
+ "Radisson"
+ );
+
+ @Handler
+ public String getAvailableHotel(){
+ int index = (new Random()).nextInt(hotels.size());
+ String jsonResult= "{"+
+ " \"bookingId\": "+(new Random()).nextInt(1000)+"," +
+ " \"hotel\": \""+hotels.get(index)+"\"," +
+ " \"startDate\": \"12-11-2018\"," +
+ " \"endDate\": \"15-11-2018\"," +
+ " \"price\": "+((new Random()).nextInt(150) + 150) +
+ " }";
+ return jsonResult;
+ }
+}
diff --git a/opentelemetry/HotelBooking/src/main/java/com/example/demo/DemoApplication.java b/opentelemetry/HotelBooking/src/main/java/com/example/demo/DemoApplication.java
new file mode 100644
index 0000000..9b4bc7f
--- /dev/null
+++ b/opentelemetry/HotelBooking/src/main/java/com/example/demo/DemoApplication.java
@@ -0,0 +1,15 @@
+package com.example.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.apache.camel.opentelemetry.starter.CamelOpenTelemetry;
+
+@CamelOpenTelemetry
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/opentelemetry/HotelBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java b/opentelemetry/HotelBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java
new file mode 100644
index 0000000..189a0ae
--- /dev/null
+++ b/opentelemetry/HotelBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java
@@ -0,0 +1,33 @@
+package com.example.demo;
+
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.dataformat.JsonLibrary;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MySimpleCamelRouter extends RouteBuilder {
+ @Override
+ public void configure() throws Exception {
+ restConfiguration()
+ .component("servlet")
+ .bindingMode(RestBindingMode.json);
+
+ rest().get("/bookHotel")
+ .to("direct:bookHotel");
+
+ from("direct:bookHotel").routeId("bookHotel-http")
+ .log(LoggingLevel.INFO, "New book hotel request with traceId=${header.x-b3-traceid}")
+ .bean(new AvailableHotels(),"getAvailableHotel")
+ .unmarshal().json(JsonLibrary.Jackson);
+
+
+ // kafka based
+ from("kafka:hotel_input?brokers=kafka:9092").routeId("bookHotel-kafka")
+ .log(LoggingLevel.INFO, "New book hotel request via Kafka topic")
+ // .to("log:debug?showAll=true&multiline=true")
+ .bean(new AvailableHotels(),"getAvailableHotel")
+ .to("kafka:hotel_output?brokers=kafka:9092");
+ }
+}
\ No newline at end of file
diff --git a/opentelemetry/HotelBooking/src/main/resources/application.properties b/opentelemetry/HotelBooking/src/main/resources/application.properties
new file mode 100644
index 0000000..4831aa2
--- /dev/null
+++ b/opentelemetry/HotelBooking/src/main/resources/application.properties
@@ -0,0 +1,8 @@
+camel.springboot.main-run-controller=true
+camel.springboot.use-mdc-logging = true
+camel.component.micrometer.enabled=true
+camel.component.metrics.metric-registry=prometheusMeterRegistry
+management.endpoint.metrics.enabled=true
+management.endpoints.web.exposure.include=*
+spring.application.name=HotelBooking
+server.port=8083
\ No newline at end of file
diff --git a/opentelemetry/HotelBooking/src/main/resources/logback.xml b/opentelemetry/HotelBooking/src/main/resources/logback.xml
new file mode 100644
index 0000000..61b3d74
--- /dev/null
+++ b/opentelemetry/HotelBooking/src/main/resources/logback.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xml>
+<configuration>
+ <springProperty scope="context" name="appName" source="camel.zipkin.service-name"/>
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <!-- encoders are assigned the type
+ ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} %-5level [%X{traceId:-},%X{spanId:-}] %logger{36} - %msg%n</pattern>
+ </encoder>
+ </appender>
+
+ <root level="info">
+ <appender-ref ref="STDOUT" />
+ </root>
+
+</configuration>
\ No newline at end of file
diff --git a/opentelemetry/HotelBooking/src/test/java/com/example/demo/DemoApplicationTests.java b/opentelemetry/HotelBooking/src/test/java/com/example/demo/DemoApplicationTests.java
new file mode 100644
index 0000000..a8de38b
--- /dev/null
+++ b/opentelemetry/HotelBooking/src/test/java/com/example/demo/DemoApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.demo;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DemoApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/opentelemetry/TripBooking/pom.xml b/opentelemetry/TripBooking/pom.xml
new file mode 100644
index 0000000..36aafb2
--- /dev/null
+++ b/opentelemetry/TripBooking/pom.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.camel.springboot.example</groupId>
+ <artifactId>camel-example-spring-boot-opentelemetry</artifactId>
+ <version>4.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-example-spring-boot-opentelemetry-tripbooking</artifactId>
+ <name>Camel SB Examples :: OpenTelemetry :: TripBooking</name>
+ <description>An example showing how to use Camel with OpenTelemetry</description>
+
+ <properties>
+ <io.opentracing.contrib.version>3.3.1</io.opentracing.contrib.version>
+ <opentelemetry-agent.version>1.25.1</opentelemetry-agent.version>
+ </properties>
+
+ <!-- import Spring-Boot and Camel BOM -->
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-dependencies</artifactId>
+ <version>${spring-boot-version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-spring-boot-bom</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <!-- Spring Boot dependencies -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-actuator</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.micrometer</groupId>
+ <artifactId>micrometer-registry-prometheus</artifactId>
+ </dependency>
+ <!-- Apache Camel dependancides-->
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-rest-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-servlet-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-jackson-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-micrometer-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-seda-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-http-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-kafka-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-bean-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-direct-starter</artifactId>
+ </dependency>
+
+ <!-- OpenTelemetry -->
+ <dependency>
+ <groupId>org.apache.camel.springboot</groupId>
+ <artifactId>camel-opentelemetry-starter</artifactId>
+ </dependency>
+
+ <!-- Testing -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-javaagent</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>io.opentelemetry.javaagent</groupId>
+ <artifactId>opentelemetry-javaagent</artifactId>
+ <version>${opentelemetry-agent.version}</version>
+ <overWrite>true</overWrite>
+ <outputDirectory>${project.build.directory}/javaagents</outputDirectory>
+ <destFileName>javaagent.jar</destFileName>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <configuration>
+ <agents>
+ <agent>${project.build.directory}/javaagents/javaagent.jar</agent>
+ </agents>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
diff --git a/opentelemetry/TripBooking/src/main/java/com/example/demo/AppConfig.java b/opentelemetry/TripBooking/src/main/java/com/example/demo/AppConfig.java
new file mode 100644
index 0000000..7e76a67
--- /dev/null
+++ b/opentelemetry/TripBooking/src/main/java/com/example/demo/AppConfig.java
@@ -0,0 +1,30 @@
+package com.example.demo;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryFactory;
+import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory;
+import org.apache.camel.spring.boot.CamelContextConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AppConfig {
+
+ @Bean
+ public CamelContextConfiguration camelContextConfiguration() {
+
+ return new CamelContextConfiguration() {
+ @Override
+ public void beforeApplicationStart(CamelContext camelContext) {
+ camelContext.addRoutePolicyFactory(new MicrometerRoutePolicyFactory());
+ camelContext.setMessageHistoryFactory(new MicrometerMessageHistoryFactory());
+ }
+
+ @Override
+ public void afterApplicationStart(CamelContext camelContext) {
+
+ }
+ };
+ }
+
+}
diff --git a/opentelemetry/TripBooking/src/main/java/com/example/demo/DemoApplication.java b/opentelemetry/TripBooking/src/main/java/com/example/demo/DemoApplication.java
new file mode 100644
index 0000000..9b4bc7f
--- /dev/null
+++ b/opentelemetry/TripBooking/src/main/java/com/example/demo/DemoApplication.java
@@ -0,0 +1,15 @@
+package com.example.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.apache.camel.opentelemetry.starter.CamelOpenTelemetry;
+
+@CamelOpenTelemetry
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/opentelemetry/TripBooking/src/main/java/com/example/demo/MergeAggregationStrategy.java b/opentelemetry/TripBooking/src/main/java/com/example/demo/MergeAggregationStrategy.java
new file mode 100644
index 0000000..29f5a6b
--- /dev/null
+++ b/opentelemetry/TripBooking/src/main/java/com/example/demo/MergeAggregationStrategy.java
@@ -0,0 +1,25 @@
+package com.example.demo;
+
+import org.apache.camel.Exchange;
+
+public class MergeAggregationStrategy implements org.apache.camel.AggregationStrategy {
+ @Override
+ public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
+ if (oldExchange == null)
+ {
+ return newExchange;
+ }
+ String oldPayload = oldExchange.getIn().getBody(String.class);
+ String newPayload = newExchange.getIn().getBody(String.class);
+ String result = oldPayload + ", " + newPayload;
+ oldExchange.getIn().setBody(result);
+ return oldExchange;
+ }
+
+ @Override
+ public void onCompletion(Exchange exchange) {
+ String payload = exchange.getIn().getBody(String.class);
+ String result = "["+payload+"]";
+ exchange.getIn().setBody(result);
+ }
+}
diff --git a/opentelemetry/TripBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java b/opentelemetry/TripBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java
new file mode 100644
index 0000000..00d822f
--- /dev/null
+++ b/opentelemetry/TripBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java
@@ -0,0 +1,55 @@
+package com.example.demo;
+
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.dataformat.JsonLibrary;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MySimpleCamelRouter extends RouteBuilder {
+ @Override
+ public void configure() throws Exception {
+ restConfiguration()
+ .component("servlet")
+ .bindingMode(RestBindingMode.json);
+
+ rest()
+ .get("/bookTrip").to("direct:bookTrip")
+ .get("/asyncBookTrip").to("direct:asyncBookTrip");
+
+ from("direct:bookTrip")
+ .routeId("bookTrip-http")
+ .routeDescription("This is demo service for demonstration telemetry aspects")
+ .log(LoggingLevel.INFO, "New book trip request with traceId=${header.x-b3-traceid}")
+ .multicast(new MergeAggregationStrategy()).parallelProcessing()
+ .to("http://localhost:8081/camel/bookCar?bridgeEndpoint=true")
+ .to("http://localhost:8082/camel/bookFlight?bridgeEndpoint=true")
+ .to("http://localhost:8083/camel/bookHotel?bridgeEndpoint=true")
+ .end()
+ .log(LoggingLevel.INFO,"Response: ${body}")
+ .unmarshal().json(JsonLibrary.Jackson);
+
+ // kafka based
+ from("direct:asyncBookTrip")
+ .routeId("bookTrip-kafka-request")
+ .routeDescription("This is demo service for demonstration telemetry aspects via Kafka")
+ .log(LoggingLevel.INFO, "New book trip request via Kafka")
+ // .to("log:debug?showAll=true&multiline=true")
+ .setBody(simple("New async request ${header.x-b3-traceid}"))
+ .multicast().parallelProcessing()
+ .to("kafka:car_input?brokers=kafka:9092")
+ .to("kafka:flight_input?brokers=kafka:9092")
+ .to("kafka:hotel_input?brokers=kafka:9092")
+ .end();
+
+ from("kafka:car_output?brokers=kafka:9092").to("seda:tripAggregator");
+ from("kafka:flight_output?brokers=kafka:9092").to("seda:tripAggregator");
+ from("kafka:hotel_output?brokers=kafka:9092").to("seda:tripAggregator");
+
+ from("seda:tripAggregator").routeId("bookTrip-kafka-response")
+ .aggregate(constant(true), new MergeAggregationStrategy())
+ .completionSize(3)
+ .log(LoggingLevel.INFO, "New book trip response: ${body}");
+ }
+}
\ No newline at end of file
diff --git a/opentelemetry/TripBooking/src/main/resources/application.properties b/opentelemetry/TripBooking/src/main/resources/application.properties
new file mode 100644
index 0000000..aed1e16
--- /dev/null
+++ b/opentelemetry/TripBooking/src/main/resources/application.properties
@@ -0,0 +1,8 @@
+camel.springboot.main-run-controller=true
+camel.springboot.use-mdc-logging = true
+camel.component.micrometer.enabled=true
+camel.component.metrics.metric-registry=prometheusMeterRegistry
+management.endpoint.metrics.enabled=true
+management.endpoints.web.exposure.include=*
+spring.application.name=TripBooking
+server.port=8080
\ No newline at end of file
diff --git a/opentelemetry/TripBooking/src/main/resources/logback.xml b/opentelemetry/TripBooking/src/main/resources/logback.xml
new file mode 100644
index 0000000..e566426
--- /dev/null
+++ b/opentelemetry/TripBooking/src/main/resources/logback.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xml>
+<configuration>
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <!-- encoders are assigned the type
+ ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} %-5level [%X{traceId:-},%X{spanId:-}] %logger{36} - %msg%n</pattern>
+ </encoder>
+ </appender>
+
+
+ <root level="info">
+ <appender-ref ref="STDOUT" />
+ </root>
+
+</configuration>
\ No newline at end of file
diff --git a/opentelemetry/adoc/img/example.jpeg b/opentelemetry/adoc/img/example.jpeg
new file mode 100644
index 0000000..6874ded
Binary files /dev/null and b/opentelemetry/adoc/img/example.jpeg differ
diff --git a/opentelemetry/containers/docker-compose.yml b/opentelemetry/containers/docker-compose.yml
new file mode 100644
index 0000000..86482ab
--- /dev/null
+++ b/opentelemetry/containers/docker-compose.yml
@@ -0,0 +1,59 @@
+version: '3.8'
+
+services:
+
+ zookeeper:
+ image: confluentinc/cp-zookeeper:7.2.5
+ container_name: zookeeper
+ environment:
+ - ZOOKEEPER_CLIENT_PORT=2181
+ - ZOOKEEPER_TICK_TIME=2000
+ - ZOOKEEPER_SYNC_LIMIT=2
+ ports:
+ - 2181:2181
+ kafka:
+ image: confluentinc/cp-kafka:7.2.5
+ container_name: kafka
+ depends_on:
+ - zookeeper
+ ports:
+ - 9092:9092
+ environment:
+ - KAFKA_BROKER_ID=1
+ - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
+ - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
+ - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
+ jaeger:
+ image: jaegertracing/all-in-one:1.25
+ container_name: jaeger
+ ports:
+ - 5775:5775/udp
+ - 6831:6831/udp
+ - 6832:6832/udp
+ - 5778:5778
+ - 9411:9411
+ - 16686:16686
+ - 14268:14268
+ - 14269:14269
+ - 14250:14250
+ otel-collector:
+ image: otel/opentelemetry-collector:0.75.0
+ container_name: otel-collector
+ command: [ "--config=/etc/otel-collector-config.yaml" ]
+ volumes:
+ - ./docker/otel-collector-config.yaml:/etc/otel-collector-config.yaml
+ ports:
+ - "1888:1888" # pprof extension
+ - "8888:8888" # Prometheus metrics exposed by the collector
+ - "8889:8889" # Prometheus exporter metrics
+ - "13133:13133" # health_check extension
+ - "4317:4317" # OTLP gRPC receiver
+ - "55670:55679" # zpages extension
+ prometheus:
+ image: prom/prometheus:v2.37.6
+ container_name: prometheus
+ restart: unless-stopped
+ volumes:
+ - ./docker/prometheusConfig.yml:/etc/prometheus/prometheus.yml
+ ports:
+ - 9090:9090
\ No newline at end of file
diff --git a/opentelemetry/containers/docker/otel-collector-config.yaml b/opentelemetry/containers/docker/otel-collector-config.yaml
new file mode 100644
index 0000000..d018b6b
--- /dev/null
+++ b/opentelemetry/containers/docker/otel-collector-config.yaml
@@ -0,0 +1,66 @@
+receivers:
+ otlp:
+ protocols:
+ grpc:
+ endpoint: "0.0.0.0:4317"
+ http:
+ endpoint: "0.0.0.0:4318"
+
+ prometheus:
+ config:
+ scrape_configs:
+ - job_name: 'BookingTripService'
+ metrics_path: '/actuator/prometheus'
+ scrape_interval: 5s
+ static_configs:
+ - targets: ['host.docker.internal:8080']
+ - job_name: 'BookingCarService'
+ metrics_path: '/actuator/prometheus'
+ scrape_interval: 5s
+ static_configs:
+ - targets: ['host.docker.internal:8081']
+ - job_name: 'BookingHotelService'
+ metrics_path: '/actuator/prometheus'
+ scrape_interval: 5s
+ static_configs:
+ - targets: ['host.docker.internal:8083']
+ - job_name: 'BookingFlightService'
+ metrics_path: '/actuator/prometheus'
+ scrape_interval: 5s
+ static_configs:
+ - targets: ['host.docker.internal:8082']
+
+exporters:
+ prometheus:
+ endpoint: "0.0.0.0:8889"
+ const_labels:
+ label1: value1
+
+ logging:
+
+ jaeger:
+ endpoint: jaeger:14250
+ tls:
+ insecure: true
+
+processors:
+ batch:
+
+extensions:
+ health_check:
+ pprof:
+ endpoint: :1888
+ zpages:
+ endpoint: :55679
+
+service:
+ extensions: [pprof, zpages, health_check]
+ pipelines:
+ traces:
+ receivers: [otlp]
+ processors: [batch]
+ exporters: [logging, jaeger]
+ metrics:
+ receivers: [otlp,prometheus]
+ processors: [batch]
+ exporters: [logging, prometheus]
\ No newline at end of file
diff --git a/opentelemetry/containers/docker/prometheusConfig.yml b/opentelemetry/containers/docker/prometheusConfig.yml
new file mode 100644
index 0000000..629a3c2
--- /dev/null
+++ b/opentelemetry/containers/docker/prometheusConfig.yml
@@ -0,0 +1,14 @@
+#Global configurations
+global:
+ scrape_interval: 5s # Set the scrape interval to every 5 seconds.
+ evaluation_interval: 5s # Evaluate rules every 5 seconds.
+scrape_configs:
+ - job_name: 'jaeger'
+ metrics_path: '/metrics'
+ static_configs:
+ - targets: ['jaeger:14269']
+ - job_name: 'otel-collector'
+ scrape_interval: 10s
+ static_configs:
+ - targets: ['otel-collector:8889']
+ - targets: ['otel-collector:8888']
\ No newline at end of file
diff --git a/opentelemetry/pom.xml b/opentelemetry/pom.xml
new file mode 100644
index 0000000..4b141d9
--- /dev/null
+++ b/opentelemetry/pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ 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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.camel.springboot.example</groupId>
+ <artifactId>examples</artifactId>
+ <version>4.0.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-example-spring-boot-opentelemetry</artifactId>
+ <packaging>pom</packaging>
+ <name>Camel SB Examples :: OpenTelemetry</name>
+ <description>An example showing how to use Camel with OpenTelemetry
+ </description>
+
+ <properties>
+ <category>Management and Monitoring</category>
+ <title>OpenTelemetry</title>
+ </properties>
+
+ <modules>
+ <module>CarBooking</module>
+ <module>FlightBooking</module>
+ <module>HotelBooking</module>
+ <module>TripBooking</module>
+ </modules>
+
+</project>