This example illustrates how to use Spring Boot with Camel to demonstrate observability capabilities. It implements a REST service that generates random numbers with variable response times, showcasing distributed tracing, metrics collection, and monitoring through OpenTelemetry.
The project uses camel-observability-services-starter component for automatic instrumentation, camel-platform-http-starter for REST endpoints, and integrates with OpenTelemetry Java agent for comprehensive observability.
For additional information there is blog post
To run the complete observability stack with Jaeger and Prometheus:
docker-compose upThis will start:
-
OpenTelemetry Collector (ports 4317/4318) - collects traces and metrics
-
Jaeger UI (http://localhost:16686) - distributed tracing visualization
-
Prometheus (http://localhost:9090) - metrics collection and storage
The application, using agent, sends telemetry data to the OpenTelemetry Collector, which exports traces to Jaeger and metrics to Prometheus.
You can run this example using:
mvn spring-boot:runAfter the Spring Boot application is started, you can execute the following HTTP requests:
curl http://localhost:8080/api/randomThe command will call the random number generator endpoint. Each call will: - Generate a random number between 1-1000 - Simulate a random delay between 100-2000ms - Return the number as response body - Create traces and metrics for observability
You should see output similar to:
INFO 101511 --- [ task-1] generate-random-number : Generated random number: 742 with delay: 1250ms
The camel-observability-services-starter will configure the application and overrides the actuator setup so the health and metrics (in prometheus format) endpoints will be
http://localhost:9876/observe/health
http://localhost:9876/observe/metricseven if in this example the metrics will be distributed using OpenTelemetry agent and not scraping the /observe/metrics endpoint
-
Generate some traffic:
for i in {1..10}; do curl http://localhost:8080/api/random; echo; sleep 1; done
-
View traces in Jaeger:
-
Select service and search for traces
-
View metrics in Prometheus:
-
Query metrics like
camel_route_exchange_completed_total
The Spring Boot application can be stopped pressing [CTRL] + [C] in the shell.
-
occlient installed (guide) -
already logged in into cluster (running
oc login) -
destination project already created (running
oc new-project obs-example)
Create tempo monolithic named monolitic-example as distributed tracing storage:
oc apply -f ocp/tempo.yamlCreate roles to send traces via Collector, to the Tempo
oc apply -f ocp/roles.yamlCreate opentelemetry collector named obs-example used to collect everything coming from the agent on the applications and exporting the traces into the tempo storage and the metrics in a prometheus format:
oc apply -f ocp/otel-collector.yamlCreate the opentelementry instrumentation to allow to inject the agent parameter into the startup command in the application
oc apply -f ocp/otel-instrumentation.yamlInstall the distributed tracing UI plugin to show the traces on the OCP console doc
oc apply -f ocp/ui-plugin.yamlCreate the service monitor to allow the prometheus metrics exposed by the opentelemetry collector be scraped by the OpenShift metrics storage
oc apply -f ocp/service-monitor.yamlmvn clean install -Popenshiftnow once the pods are ready it is possible to call the service
curl http://$(oc get route camel-example-spring-boot-observability-services -o go-template --template='{{.spec.host}}')/api/randomThe Distributed Tracing console is available on the OpenShift console in the Observe → Traces item
echo $(oc whoami --show-console)/observe/tracesTo query the metrics it is possible to use the integrated OpenShift monitoring console in the Observe → Metrics item
echo $(oc whoami --show-console)/monitoring/query-browserexample query
camel_route_exchange_completed_total{service="obs-example-collector-headless", context="camel-observability-services"}If you hit any problem using Camel or have some feedback, then please let us know.
We also love contributors, so get involved :-)
The Camel riders!