Skip to content

[Bug]: Query returns empty results for flushed S3 blocks in Standalone mode (v2.10.0) despite correct retention and search config #6436

@furkantarikgocmen

Description

@furkantarikgocmen

Describe the bug
We are running Grafana Tempo v2.10.0 in Docker Standalone (monolithic) mode using an S3-compatible backend (RustFS). We are experiencing an issue where traces that have been successfully flushed to the S3 backend are not retrievable via search or direct trace ID lookup.

We can only see "live" traces that are currently in the Ingester (last ~30 minutes). Once the data is flushed to S3 (verified by existence of .parquet files and meta.json in the bucket), it becomes unsearchable via Grafana/Tempo.

We have attempted to tune query_backend_after and query_ingesters_until to bridge the gap between Ingester and Storage, but queries for older time ranges (e.g., last 6 hours) consistently return results only for the recent in-memory period.

To Reproduce
Steps to reproduce the behavior:

  1. Start Tempo v2.10.0 using the Docker Compose configuration below.
  2. Send traces via OTLP HTTP (port 4318).
  3. Wait for max_block_duration (1h) or trigger a flush. Verify data.parquet exists in the S3 bucket.
  4. Query Tempo (via Grafana) for a time range covering "Last 3 Hours".
  5. Result: Only the last ~30 minutes of traces are returned. Older data, although physically present in S3, is not returned.

Expected behavior
Tempo should seamlessly return traces from both the Ingester (RAM) and the S3 Backend. With query_backend_after: 30m, Tempo should query the S3 backend for any trace older than 30 minutes.

Environment:

  • Tempo Version: grafana/tempo:2.10.0
  • Deployment: Docker Compose (Standalone / Single Binary)
  • Storage Backend: S3 Compatible (RustFS)
  • Operating System: Linux

Additional Context

docker-compose.yml:

services:
  tempo:
    image: grafana/tempo:2.10.0
    container_name: tempo
    restart: unless-stopped
    command: ["-config.file=/etc/tempo/config.yml", "-config.expand-env=true"]
    env_file:
      - /etc/docker/envs/infradata/tempo-server.env
    ports:
      - "4318:4318"
      - "3200:3200"
    volumes:
      - ./config.yml:/etc/tempo/config.yml:ro
      - tempo_data:/var/tempo
    # ... networks and labels omitted for brevity

volumes:
  tempo_data:
    name: tempo_data

tempo config:

server:
  http_listen_port: 3200

distributor:
  receivers:
    otlp:
      protocols:
        http:
          endpoint: 0.0.0.0:4318

ingester:
  max_block_duration: 1h
  trace_idle_period: 10s
  flush_check_period: 10s

compactor:
  compaction:
    compaction_window: 24h
    max_block_bytes: 107374182400
    block_retention: 8760h
    compacted_block_retention: 1h

storage:
  trace:
    backend: s3
    wal:
      path: /var/tempo/wal
    blocklist_poll: 10s
    pool:
      max_workers: 100
    s3:
      endpoint: rustfs:9000
      bucket: tempo-traces
      access_key: ${RUSTFS_ROOT_USER}
      secret_key: ${RUSTFS_ROOT_PASSWORD}
      insecure: true
      forcepathstyle: true

metrics_generator:
  registry:
    external_labels:
      source: tempo
      cluster: infra
  storage:
    path: /tmp/tempo/generator/wal
    remote_write:
      - url: http://mimir:8080/api/v1/push
        send_exemplars: true
  traces_storage:
    path: /var/tempo/wal

overrides:
  defaults:
    global:
      max_bytes_per_trace: 500000000
    ingestion:
      rate_limit_bytes: 150000000
      burst_size_bytes: 300000000
    metrics_generator:
      processors: [service-graphs, span-metrics, local-blocks]

query_frontend:
  search:
    query_backend_after: 30m
    query_ingesters_until: 30m
    max_duration: 720h
  metrics:
    max_duration: 24h
    query_backend_after: 30m
    concurrent_jobs: 1000
    interval: 30m0s

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions