<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/observability-on-kubernetes-opentelemetry-camel-quarkus-q9gx7ah7s" -->

---
title: Observability on Kubernetes: OpenTelemetry, Camel & Quarkus
description: A hands-on walkthrough shows how to build a distributed tracing and metrics stack on OpenShift using Grafana Tempo, an OpenTelemetry Collector, and the Cluster...
canonical: https://daily.dev/posts/observability-on-kubernetes-opentelemetry-camel-quarkus-q9gx7ah7s
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Observability on Kubernetes: OpenTelemetry, Camel & Quarkus | daily.dev
og:description: A hands-on walkthrough shows how to build a distributed tracing and metrics stack on OpenShift using Grafana Tempo, an OpenTelemetry Collector, and the Cluster...
og:url: https://daily.dev/posts/observability-on-kubernetes-opentelemetry-camel-quarkus-q9gx7ah7s
og:image: https://api.daily.dev/og/posts/Q9gX7Ah7S.png
og:image:alt: Observability on Kubernetes: OpenTelemetry, Camel & Quarkus
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Observability on Kubernetes: OpenTelemetry, Camel & Quarkus

**[Piotr Minkowski TechBlog](https://daily.dev/sources/piotr-minkowski)** · 17 min read · 5 upvotes · 1 comments

## Summary

A hands-on walkthrough shows how to build a distributed tracing and metrics stack on OpenShift using Grafana Tempo, an OpenTelemetry Collector, and the Cluster Observability Operator, backed by Azure Blob Storage. It then connects a Quarkus application built with Apache Camel routes, demonstrating how the camel-quarkus-opentelemetry2 extension turns each direct: route into its own trace span. Advanced steps cover injecting artificial latency, running the Grafana LGTM stack locally via Quarkus Dev Services, configuring OTEL Collector tail-based sampling to keep only error or slow traces, and building a Perses dashboard for request metrics.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://piotrminkowski.com/2026/09/25/observability-on-kubernetes-with-opentelemetry-camel-and-quarkus>

## Questions this post answers

### How do I trace individual Apache Camel routes using OpenTelemetry in a Quarkus application?

Add the camel-quarkus-opentelemetry2 extension alongside quarkus-opentelemetry, then set camel.opentelemetry2.enabled=true in application.properties. This turns each direct: route into its own named span, while quarkus-opentelemetry wires the OTLP exporter and W3C Trace Context propagation and auto-instruments inbound HTTP calls, giving a full trace across the route pipeline.

_daily.dev surfaces practical guides like this for developers wiring tracing into Camel-based microservices._

### How can I configure an OpenTelemetry Collector to only keep slow or error traces instead of all traces?

Use the tail_sampling processor in the OpenTelemetryCollector config with policies based on status_code and latency. A policy named 'errors' filters on status_codes ERROR, and a policy named 'slow' uses a latency threshold_ms of 2500, so only traces with errors or requests slower than 2.5 seconds get forwarded and stored, cutting ingestion and storage costs.

_Developers tuning trace sampling costs can find configuration walkthroughs like this via daily.dev._

### What is the recommended storage backend for Grafana Tempo when running distributed tracing on OpenShift on Azure?

The Tempo operator requires S3-compatible storage, and on Azure this means configuring an Azure Storage account and blob container, then authenticating via an Azure managed identity with a federated credential tied to the OpenShift service account and OIDC issuer URL, granting it the Storage Blob Data Contributor role.

_Teams setting up Tempo storage on Azure-hosted OpenShift can track setup guides like this on daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@pdfopsdev** · 1 upvotes

> tail-based sampling in the collector is the part people underestimate, if your buffer/timeout window is too tight you end up dropping the exact slow traces you wanted to keep. did they say what timeout they landed on for the error-or-slow policy?

## Similar posts on daily.dev

- [Complete Observability for Java: Spring Boot and Kubernetes with Dash0](https://daily.dev/posts/complete-observability-for-java-spring-boot-and-kubernetes-with-dash0-ak4svyfqx) · Foojay.io · 0 upvotes · 0 comments
- [OpenTelemetry Metrics in Quarkus Explained](https://daily.dev/posts/opentelemetry-metrics-in-quarkus-explained-xw4mqpvjx) · Last9 · 1 upvotes · 0 comments
- [An End-to-End Cloud Native Observability Framework](https://daily.dev/posts/an-end-to-end-cloud-native-observability-framework-4gzq4zqow) · The New Stack · 0 upvotes · 0 comments
- [A Guide to Camel Observability Services](https://daily.dev/posts/a-guide-to-camel-observability-services-3tla3m9a8) · Baeldung · 2 upvotes · 0 comments

---

Tags: [#kubernetes](https://daily.dev/tags/kubernetes), [#observability](https://daily.dev/tags/observability), [#opentelemetry](https://daily.dev/tags/opentelemetry), [#quarkus](https://daily.dev/tags/quarkus), [#apache-camel](https://daily.dev/tags/apache-camel)

[View this post on daily.dev](https://daily.dev/posts/observability-on-kubernetes-opentelemetry-camel-quarkus-q9gx7ah7s)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Observability on Kubernetes: OpenTelemetry, Camel & Quarkus","url":"https://daily.dev/posts/observability-on-kubernetes-opentelemetry-camel-quarkus-q9gx7ah7s","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/observability-on-kubernetes-opentelemetry-camel-quarkus-q9gx7ah7s"},"datePublished":"2026-09-25T13:39:08.958Z","dateModified":"2026-09-25T13:59:40.650Z","description":"A hands-on walkthrough shows how to build a distributed tracing and metrics stack on OpenShift using Grafana Tempo, an OpenTelemetry Collector, and the Cluster...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/1a6955b93e6dac6074feda44a30dc64d?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/1a6955b93e6dac6074feda44a30dc64d?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Piotr Minkowski TechBlog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Piotr Minkowski TechBlog","logo":"https://media.daily.dev/image/upload/s--776ytlEM--/f_auto,q_auto/v1773648765/logos/piotr-minkowski?_a=BAMAMiiu0","url":"https://daily.dev/sources/piotr-minkowski"},"commentCount":1,"discussionUrl":"https://daily.dev/posts/observability-on-kubernetes-opentelemetry-camel-quarkus-q9gx7ah7s","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":5},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":1}],"keywords":"kubernetes,observability,opentelemetry,quarkus,apache-camel","timeRequired":"PT17M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Piotr Minkowski TechBlog","item":"https://daily.dev/sources/piotr-minkowski"},{"@type":"ListItem","position":3,"name":"Observability on Kubernetes: OpenTelemetry, Camel & Quarkus"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/observability-on-kubernetes-opentelemetry-camel-quarkus-q9gx7ah7s","comment":[{"@type":"Comment","text":"tail-based sampling in the collector is the part people underestimate, if your buffer/timeout window is too tight you end up dropping the exact slow traces you wanted to keep. did they say what timeout they landed on for the error-or-slow policy?","datePublished":"2026-09-25T18:08:34.740Z","url":"https://daily.dev/posts/Q9gX7Ah7S#c-ka5HAaKV9","author":{"@type":"Person","name":"PDFops","url":"https://daily.dev/pdfopsdev","image":"https://media.daily.dev/image/upload/s---8isRBKc--/f_auto/v1782922291/avatars/avatar_orjMeK8QKaaVZwGq7ScPz?_a=BAMAMicg0"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/observability-on-kubernetes-opentelemetry-camel-quarkus-q9gx7ah7s#faq","mainEntity":[{"@type":"Question","name":"How do I trace individual Apache Camel routes using OpenTelemetry in a Quarkus application?","acceptedAnswer":{"@type":"Answer","text":"Add the camel-quarkus-opentelemetry2 extension alongside quarkus-opentelemetry, then set camel.opentelemetry2.enabled=true in application.properties. This turns each direct: route into its own named span, while quarkus-opentelemetry wires the OTLP exporter and W3C Trace Context propagation and auto-instruments inbound HTTP calls, giving a full trace across the route pipeline. daily.dev surfaces practical guides like this for developers wiring tracing into Camel-based microservices."}},{"@type":"Question","name":"How can I configure an OpenTelemetry Collector to only keep slow or error traces instead of all traces?","acceptedAnswer":{"@type":"Answer","text":"Use the tail_sampling processor in the OpenTelemetryCollector config with policies based on status_code and latency. A policy named 'errors' filters on status_codes ERROR, and a policy named 'slow' uses a latency threshold_ms of 2500, so only traces with errors or requests slower than 2.5 seconds get forwarded and stored, cutting ingestion and storage costs. Developers tuning trace sampling costs can find configuration walkthroughs like this via daily.dev."}},{"@type":"Question","name":"What is the recommended storage backend for Grafana Tempo when running distributed tracing on OpenShift on Azure?","acceptedAnswer":{"@type":"Answer","text":"The Tempo operator requires S3-compatible storage, and on Azure this means configuring an Azure Storage account and blob container, then authenticating via an Azure managed identity with a federated credential tied to the OpenShift service account and OIDC issuer URL, granting it the Storage Blob Data Contributor role. Teams setting up Tempo storage on Azure-hosted OpenShift can track setup guides like this on daily.dev."}}]}
```

