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 5959d840d2b2074e463f87ff6154fddd91e84718 Author: Stanislav Deviatov <[email protected]> AuthorDate: Wed May 17 12:22:01 2023 +0200 Add documentation and fix logging --- .../java/com/example/demo/MySimpleCamelRouter.java | 3 +- .../CarBooking/src/main/resources/logback.xml | 2 +- .../java/com/example/demo/MySimpleCamelRouter.java | 3 +- .../FlightBooking/src/main/resources/logback.xml | 2 +- .../java/com/example/demo/MySimpleCamelRouter.java | 4 +- .../HotelBooking/src/main/resources/logback.xml | 2 +- opentelemetry/README.adoc | 155 +++++++++++++++++++++ .../java/com/example/demo/MySimpleCamelRouter.java | 2 +- .../TripBooking/src/main/resources/logback.xml | 2 +- opentelemetry/adoc/img/metrics.png | Bin 0 -> 301663 bytes opentelemetry/adoc/img/trace-async-dag.png | Bin 0 -> 114031 bytes opentelemetry/adoc/img/trace-async.png | Bin 0 -> 166886 bytes opentelemetry/adoc/img/trace-sync-dag.png | Bin 0 -> 83823 bytes opentelemetry/adoc/img/trace-sync.png | Bin 0 -> 145216 bytes pom.xml | 1 + 15 files changed, 164 insertions(+), 12 deletions(-) diff --git a/opentelemetry/CarBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java b/opentelemetry/CarBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java index 4e4415c..d98a53c 100644 --- a/opentelemetry/CarBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java +++ b/opentelemetry/CarBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java @@ -18,14 +18,13 @@ public class MySimpleCamelRouter extends RouteBuilder { .to("direct:bookCar"); from("direct:bookCar").routeId("bookCar-http") - .log(LoggingLevel.INFO, "New book car request with traceId=${header.x-b3-traceid}") + .log(LoggingLevel.INFO, "New book car request with trace=${header.traceparent}") .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"); diff --git a/opentelemetry/CarBooking/src/main/resources/logback.xml b/opentelemetry/CarBooking/src/main/resources/logback.xml index e566426..ff3668d 100644 --- a/opentelemetry/CarBooking/src/main/resources/logback.xml +++ b/opentelemetry/CarBooking/src/main/resources/logback.xml @@ -6,7 +6,7 @@ <!-- 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> + <pattern>%d{HH:mm:ss.SSS} %-5level [%X{trace_id:-},%X{span_id:-}] %logger{36} - %msg%n</pattern> </encoder> </appender> diff --git a/opentelemetry/FlightBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java b/opentelemetry/FlightBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java index ec74462..8b9edbb 100644 --- a/opentelemetry/FlightBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java +++ b/opentelemetry/FlightBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java @@ -19,14 +19,13 @@ public class MySimpleCamelRouter extends RouteBuilder { .to("direct:bookFlight"); from("direct:bookFlight").routeId("bookFlight-http") - .log(LoggingLevel.INFO, "New book flight request with traceId=${header.x-b3-traceid}") + .log(LoggingLevel.INFO, "New book flight request with trace=${header.traceparent}") .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"); diff --git a/opentelemetry/FlightBooking/src/main/resources/logback.xml b/opentelemetry/FlightBooking/src/main/resources/logback.xml index e566426..ff3668d 100644 --- a/opentelemetry/FlightBooking/src/main/resources/logback.xml +++ b/opentelemetry/FlightBooking/src/main/resources/logback.xml @@ -6,7 +6,7 @@ <!-- 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> + <pattern>%d{HH:mm:ss.SSS} %-5level [%X{trace_id:-},%X{span_id:-}] %logger{36} - %msg%n</pattern> </encoder> </appender> diff --git a/opentelemetry/HotelBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java b/opentelemetry/HotelBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java index 189a0ae..5c84edf 100644 --- a/opentelemetry/HotelBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java +++ b/opentelemetry/HotelBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java @@ -18,15 +18,13 @@ public class MySimpleCamelRouter extends RouteBuilder { .to("direct:bookHotel"); from("direct:bookHotel").routeId("bookHotel-http") - .log(LoggingLevel.INFO, "New book hotel request with traceId=${header.x-b3-traceid}") + .log(LoggingLevel.INFO, "New book hotel request with trace=${header.traceparent}") .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"); } diff --git a/opentelemetry/HotelBooking/src/main/resources/logback.xml b/opentelemetry/HotelBooking/src/main/resources/logback.xml index 61b3d74..9399031 100644 --- a/opentelemetry/HotelBooking/src/main/resources/logback.xml +++ b/opentelemetry/HotelBooking/src/main/resources/logback.xml @@ -7,7 +7,7 @@ <!-- 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> + <pattern>%d{HH:mm:ss.SSS} %-5level [%X{trace_id:-},%X{span_id:-}] %logger{36} - %msg%n</pattern> </encoder> </appender> diff --git a/opentelemetry/README.adoc b/opentelemetry/README.adoc new file mode 100644 index 0000000..ab6efab --- /dev/null +++ b/opentelemetry/README.adoc @@ -0,0 +1,155 @@ +== OpenTelemetry example + +== Introduction + +This example shows how to use Camel with OpenTelemetry standard: +image:./adoc/img/example.jpeg?raw=true[example] + +The environment is the following: + +* Demo apps: +** link:TripBooking[Trip booking app] +** link:FlightBooking[Flight booking app] +** link:HotelBooking[Hotel booking app] +** link:CarBooking[Car booking app] +* OpenTelemetry Collector +* Jaeger +* Prometheus +* Apache Kafka _(for async communication between apps cases)_ + +=== Build + +You will need to compile this example first: + +[source,sh] +---- +$ mvn compile +---- + +All the following docker-compose commands should be run from this directory. + +=== Run the example + +You may want to remove any old containers to start clean: + +[source,sh] +---- +$ docker rm -f kafka zookeeper prometheus jaeger otel-collector +---- + +We suggest using multiple terminal windows to start the following components: + +* Infrastructure components +* Demo apps +** TripBooking +** FlightBooking +** HotelBooking +** CarBooking +* Testing for sending HTTP requests + +==== Startup infrastructure components + +[source,sh] +---- +$ docker-compose -f containers/docker-compose.xml up +---- + +==== Startup demo apps +Please use four different shells for each application: + +===== CarBooking +[source,sh] +---- +$ mvn compile spring-boot:run -f CarBooking/pom.xml +---- + +===== HotelBooking +[source,sh] +---- +$ mvn compile spring-boot:run -f HotelBooking/pom.xml +---- + +===== FlightBooking +[source,sh] +---- +$ mvn compile spring-boot:run -f FlightBooking/pom.xml +---- + +===== TripBooking +[source,sh] +---- +$ mvn compile spring-boot:run -f TripBooking/pom.xml +---- + +==== Testing + +You can use any HTTP client (web browser, curl, httpie, postman etc.) for testing purposes. + +===== cURL + +Sync communication (over HTTP): + +[source,sh] +---- +$ curl http://127.0.0.1:8080/camel/bookTrip +---- + +Async communication (over Kafka): + +[source,sh] +---- +$ curl http://127.0.0.1:8080/camel/asyncBookTrip +---- + +==== Links + +* Prometheus UI: http://localhost:9090/graph +* Jaeger UI: http://localhost:16686 + +=== Outcome +==== Tracing +===== Sync case +You should get a trace view similar to this one: + +image::adoc/img/trace-sync.png[] + +DAG is the following: + +image::adoc/img/trace-sync-dag.png[] + +===== Async case +You should get a trace view similar to this one: + +image::adoc/img/trace-async.png[] + +DAG is the following: + +image::adoc/img/trace-async-dag.png[] + +==== Metrics + +You will get Camel related metrics similar to these: + +image::adoc/img/metrics.png[] + +==== Logging + +MDC Logging is enabled, and tracing information printing into the logs to find corresponding trace logs entries. For example: + +[source,sh] +---- +... +11:52:18.923 INFO [d02a363f16e88d9f012a36563b5464f5,9a328d33319645ab] bookTrip-http - New book trip request with trace=00-d02a363f16e88d9f012a36563b5464f5-9570717e10d38afa-01 +11:52:18.931 INFO [d02a363f16e88d9f012a36563b5464f5,9a328d33319645ab] bookTrip-http - Response: [{"bookingId":82,"car":"Volkswagen Jetta","startDate":"12-11-2018","endDate":"15-11-2018","price":152}, {"bookingId":907,"flight":"China Eastern Airlines 2782","startDate":"12-11-2018","endDate":"15-11-2018","price":133}, {"bookingId":926,"hotel":"Sheraton","startDate":"12-11-2018","endDate":"15-11-2018","price":200}] +... +---- + +=== Help and contributions + +If you hit any problem using Camel or have some feedback, then please +https://camel.apache.org/community/support/[let us know]. + +We also love contributors, so +https://camel.apache.org/community/contributing/[get involved] :-) + +The Camel riders! \ No newline at end of file diff --git a/opentelemetry/TripBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java b/opentelemetry/TripBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java index 00d822f..ea8e7b0 100644 --- a/opentelemetry/TripBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java +++ b/opentelemetry/TripBooking/src/main/java/com/example/demo/MySimpleCamelRouter.java @@ -21,7 +21,7 @@ public class MySimpleCamelRouter extends RouteBuilder { 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}") + .log(LoggingLevel.INFO, "New book trip request with trace=${header.traceparent}") .multicast(new MergeAggregationStrategy()).parallelProcessing() .to("http://localhost:8081/camel/bookCar?bridgeEndpoint=true") .to("http://localhost:8082/camel/bookFlight?bridgeEndpoint=true") diff --git a/opentelemetry/TripBooking/src/main/resources/logback.xml b/opentelemetry/TripBooking/src/main/resources/logback.xml index e566426..ff3668d 100644 --- a/opentelemetry/TripBooking/src/main/resources/logback.xml +++ b/opentelemetry/TripBooking/src/main/resources/logback.xml @@ -6,7 +6,7 @@ <!-- 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> + <pattern>%d{HH:mm:ss.SSS} %-5level [%X{trace_id:-},%X{span_id:-}] %logger{36} - %msg%n</pattern> </encoder> </appender> diff --git a/opentelemetry/adoc/img/metrics.png b/opentelemetry/adoc/img/metrics.png new file mode 100644 index 0000000..d1a9c99 Binary files /dev/null and b/opentelemetry/adoc/img/metrics.png differ diff --git a/opentelemetry/adoc/img/trace-async-dag.png b/opentelemetry/adoc/img/trace-async-dag.png new file mode 100644 index 0000000..494acb6 Binary files /dev/null and b/opentelemetry/adoc/img/trace-async-dag.png differ diff --git a/opentelemetry/adoc/img/trace-async.png b/opentelemetry/adoc/img/trace-async.png new file mode 100644 index 0000000..053b11d Binary files /dev/null and b/opentelemetry/adoc/img/trace-async.png differ diff --git a/opentelemetry/adoc/img/trace-sync-dag.png b/opentelemetry/adoc/img/trace-sync-dag.png new file mode 100644 index 0000000..573d725 Binary files /dev/null and b/opentelemetry/adoc/img/trace-sync-dag.png differ diff --git a/opentelemetry/adoc/img/trace-sync.png b/opentelemetry/adoc/img/trace-sync.png new file mode 100644 index 0000000..5f97ad9 Binary files /dev/null and b/opentelemetry/adoc/img/trace-sync.png differ diff --git a/pom.xml b/pom.xml index 0b21ae0..29bd6d9 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,7 @@ <module>master</module> <module>metrics</module> <module>observation</module> + <module>opentelemetry</module> <module>paho-mqtt5-shared-subscriptions</module> <module>platform-http</module> <module>pojo</module>
