Install Tempo or Jaeger
Pick a trace backend to store spans and search them. Tempo keeps traces cheap on object storage and lives inside Grafana beside your metrics and logs; Jaeger is a standalone tracing system with its own UI. If you already run Grafana and Loki here, Tempo is the natural fit. Either way, the Application Alloy exports to it, so switching backends is a change to one exporter block rather than to any service.
Tempo stores trace blocks on object storage and needs no separate index, which keeps it cheap:
$ helm repo add grafana https://grafana.github.io/helm-charts
$ helm install tempo grafana/tempo \
--namespace monitoring --create-namespace \
--set storage.trace.backend=s3 \
--set storage.trace.s3.bucket=my-tempo-bucket
Point it at a native bucket or JuiceFS over object storage , and set a block retention period. Tempo writes traces into blocks on that storage; leave the block sizing at its defaults to start, and revisit it only if trace volume is high enough to need larger blocks. Add it as a Grafana data source (http://tempo.monitoring.svc.cluster.local:3200) and query with TraceQL, which filters traces by duration, attributes, and span structure (for example, slow traces that touched the checkout service).
Jaeger needs a storage backend chosen up front. The Jaeger Operator or Helm chart installs the collector, query, and UI; wire it to Cassandra or Elasticsearch for production (Badger is single-node, for trials only). Point the Application Alloy's OTLP exporter at Jaeger's OTLP endpoint, and search traces through the Jaeger UI's own query page.
When each fits#
| Tempo | Jaeger | |
|---|---|---|
| Storage | Object storage only, no index database | Its own backend (Cassandra, Elasticsearch, or Badger) |
| UI | Inside Grafana, queried with TraceQL | Its own Jaeger UI |
| Fits when | You run Grafana and want traces beside metrics and logs, cheaply | You want a dedicated tracing UI, or already run Jaeger |
Secure the query path#
Traces contain request paths and sometimes payload attributes, so the query UI is not something to expose openly. Put Grafana (for Tempo) or the Jaeger UI behind authenticated ingress with OIDC, the same as Grafana . Do not put a Jaeger UI on a type: LoadBalancer Service with no auth.
With a backend running, link traces to the logs and metrics behind them: Correlate traces, metrics, and logs .
Ingest OTLP traces
Your services export spans in OTLP to the Application Alloy, which batches them, derives span metrics, samples what you keep, and forwards to Tempo or Jaeger.
Instrument a workload
Add OpenTelemetry to your service, with SDK code or zero-code auto-instrumentation, and point it at the collector so traces start flowing.