Skip to main content
Cloud DevOps Solutions
Get a quote Talk to an engineer

Logging & Tracing

Storing and Searching Traces with Grafana Tempo or Jaeger

Traces need a backend that stores them cheaply and finds them fast. Grafana Tempo keeps traces in object storage and looks them up by ID or TraceQL, while Jaeger offers a mature UI and stores in Elasticsearch, OpenSearch or Cassandra. We deploy, size and operate whichever fits your stack.

Key takeaways

  • Tempo is built around object storage and low cost, and fits teams already using Grafana, Loki and Prometheus.
  • Jaeger has a dedicated trace UI and long production history, but needs a searchable database behind it.
  • Trace volume, retention and sampling set the cost far more than the choice of tool.
  • Search by service, duration and attributes is the feature to test, not just lookup by trace ID.
  • Either backend should be reachable from Grafana so traces connect to logs and metrics.

Producing traces is half the job

Once services emit spans, they have to land somewhere that is reliable, searchable and affordable. This is where tracing projects often stall. The instrumentation works in a demo, then volume grows, the backend struggles, someone turns sampling down to protect it, and the traces that explain incidents are the ones missing.

Trace storage is therefore a capacity and cost design problem as much as a tool choice. It follows the instrumentation described on our OpenTelemetry tracing page and sits inside the wider logging, ELK, Loki and OpenTelemetry service.

What good looks like

  • A trace found by ID in seconds, and searchable by service, status, duration and key attributes.
  • Retention short enough to be affordable and long enough to cover real investigations.
  • Ingestion survives bursts through queueing and horizontal scale.
  • The query interface sits behind single sign-on and respects team boundaries.
  • Traces open from dashboards, alerts and log lines, not only from a separate tool.

Tempo and Jaeger compared

AspectGrafana TempoJaeger
StorageObject storage (S3, GCS, Azure Blob)Elasticsearch, OpenSearch or Cassandra (and others)
IndexingMinimal index, columnar blocks, TraceQLIndex in the database, tag search
Cost profileLow storage cost, compute for queriesDatabase cost grows with volume
UIInside GrafanaDedicated Jaeger UI
Best fitGrafana, Loki, Prometheus usersTeams with existing Elasticsearch or a preference for its UI
Operational weightSeveral stateless components plus object storeCollector, query and a database to operate

Both can ingest OTLP. Neither requires different application instrumentation, which is an advantage of using OpenTelemetry. Many teams on Grafana choose Tempo because trace-to-log links in Grafana are simplest when everything shares one interface.

How it works in practice

Tempo

Tempo has a distributor, ingesters, a compactor, queriers and a query frontend, usually deployed with the official Helm chart in a distributed or simplified mode, depending on scale. Blocks are written to the bucket, and retention is configured in the compactor.

# Tempo configuration fragment (illustrative)
storage:
  trace:
    backend: s3
    s3:
      bucket: example-tempo-traces
      endpoint: s3.eu-west-1.amazonaws.com
      region: eu-west-1
compactor:
  compaction:
    block_retention: 168h
distributor:
  receivers:
    otlp:
      protocols:
        grpc: {}

Check key names against the Tempo version you deploy. The bucket, its IAM role and lifecycle rules are created with Terraform, and workloads authenticate using IAM roles for service accounts rather than static keys, which fits well on EKS.

A TraceQL query to find slow failing checkout spans looks like this:

{ resource.service.name = "checkout-api" && status = error && duration > 2s }

Jaeger

Production Jaeger runs collectors, query service and a storage backend. With Elasticsearch or OpenSearch it creates daily indices, so the retention and index management considerations from our ILM page apply. Version and storage support change over time, so we confirm the current options and the status of any in-memory or Badger storage, which are not suitable for production at scale.

Connecting to the rest of your stack

Grafana can query Tempo or Jaeger as a data source. We add trace links from error panels, exemplars from Prometheus metrics where supported, and trace-to-logs settings so a span opens the matching log lines. Details are on the trace and log correlation page.

Sizing and retention

Estimate from requests per second, spans per request, average span size and sampling ratio. The result is storage per day. We build a simple spreadsheet with your numbers and agree a retention that matches how people debug. Often a week of detailed traces, plus metrics derived from spans, is a better balance than a month of everything. The Collector’s span metrics connector can produce RED style metrics from traces, which keeps long-term trends cheap.

Decisions and trade-offs

Object storage or database. Object storage is cheaper and simpler to scale. Databases allow richer ad hoc search but add an operational burden.

Self-hosted or managed. Managed tracing (from Grafana Cloud or other vendors) removes cluster work. It makes sense for small teams, and the price per GB will decide. OpenTelemetry means you can move later.

Multi-tenancy. If several teams or customers share a backend, tenant IDs and per-tenant limits prevent one noisy service starving another.

When not to run your own. If you trace only a handful of services with modest volume, a managed tier is likely cheaper than the time to operate a distributed backend.

Common failure modes

  • Ingesters out of memory during bursts. We set limits, autoscale distributors and use Collector queues.
  • Search too slow on large time windows. Query frontends, sensible time ranges and attribute choices help.
  • Retention mismatch between compactor and bucket lifecycle rules.
  • Trace IDs not found because sampling discarded them. Logs referencing unsampled traces need an explanation in the UI, so we align sampling with logging.
  • Open query endpoint. Authentication is applied before anything else.

Cost control: what we do before it becomes a problem

Trace storage grows with traffic and with how many spans each request produces, so cost surprises usually trace back to a few chatty services. Our first step is a span-volume breakdown by service, taken from the Collector’s own exported metrics. A health check endpoint or a polling loop that emits a span every second can account for a large share of storage while providing almost no debugging value.

The usual remedies are in this order. Drop spans for health checks and readiness probes at the Collector. Reduce the sampling rate for high-volume, low-risk routes while keeping every error and slow trace. Trim oversized attributes such as full request bodies, which belong in logs, not spans. Only after those do we consider shortening retention.

We write these decisions down per service, so a later rise in cost can be compared with a known baseline rather than argued from memory.

Delivery and handover

You receive deployment code, sizing assumptions, dashboards for backend health, and a runbook for upgrades and scaling. We test failure cases: restart an ingester, throttle the bucket, drop the Collector link. If you want us to operate it, that is part of Managed DevOps.

How to tell it is working

Ingest and query latency stay within targets, dropped spans are near zero, the monthly cost matches the model, and engineers choose to open a trace first when debugging latency. To compare options for your volume, contact us.

References

How we deliver it

  1. 01

    Estimate trace volume

    From request rate, spans per request and sampling policy we estimate spans per second and daily storage.

  2. 02

    Choose the backend

    We compare Tempo and Jaeger against your search needs, storage preferences and existing Grafana or Elasticsearch use.

  3. 03

    Deploy the backend

    Helm-based deployment with replication, object storage or database provisioning, and network policy as code.

  4. 04

    Wire up ingestion

    The OpenTelemetry Collector exports OTLP to the backend, with queueing and retry tuned for bursts.

  5. 05

    Configure retention and access

    Block or index retention, multi-tenancy where needed, and single sign-on for the query interface.

  6. 06

    Test search and load

    We replay representative traces, test TraceQL or Jaeger search, and verify limits before sign-off.

Tools and technologies

Grafana TempoJaegerTraceQLOpenTelemetry CollectorAmazon S3Google Cloud StorageAzure Blob StorageElasticsearchOpenSearchCassandraGrafanaHelm

Frequently asked questions

Should I choose Tempo or Jaeger?
Choose Tempo if you run Grafana already and want cheap object storage with simple operations. Choose Jaeger if you want its dedicated UI, or already operate Elasticsearch or OpenSearch. Both accept OpenTelemetry data, so the instrumentation work is the same either way.
Where does Tempo store traces?
Tempo writes trace data as blocks into object storage such as Amazon S3, Google Cloud Storage or Azure Blob. Short-lived data sits on ingesters before being flushed. Because there is no heavy index database, storage is inexpensive, and search relies on block metadata and the columnar format.
Can I search traces by attributes, not only by trace ID?
Yes. Tempo supports TraceQL for filtering spans by attributes, status and duration, and Jaeger supports tag and duration search. The practical limit is cost and speed over long time ranges, so we test the queries your engineers will actually run.
How long should we keep traces?
Usually a short time. Traces are most valuable in the hours and days after an incident or release. Many teams keep a week or two. For longer analysis, derived metrics are cheaper than raw traces. We set retention from your debugging habits and budget.
Is Jaeger still a good choice with OpenTelemetry?
Yes. Jaeger accepts OTLP, and many teams run it happily. The older Jaeger client libraries are deprecated in favour of OpenTelemetry SDKs, which is why we instrument with OTel regardless of backend. Verify the current Jaeger version's storage options before designing.

Talk to an engineer about grafana tempo vs jaeger

Book a free 30-minute call. We review your current setup and tell you honestly whether and how we can help.

Written by Saddique Khan, DevOps / SRE / Cloud Consultant Engineer. Last updated 2026-10-08.