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 <[email protected]>
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>

Reply via email to