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>
