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](/docs/hetzner/apalla/observability/collection/deploy-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: ```console $ 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](/docs/hetzner/apalla/concepts/internals/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](/docs/hetzner/apalla/observability/dashboards/set-up-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](/docs/hetzner/apalla/observability/traces/correlate-traces-metrics-and-logs).