-
Notifications
You must be signed in to change notification settings - Fork 667
Description
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:
- Start Tempo v2.10.0 using the Docker Compose configuration below.
- Send traces via OTLP HTTP (port 4318).
- Wait for max_block_duration (1h) or trigger a flush. Verify data.parquet exists in the S3 bucket.
- Query Tempo (via Grafana) for a time range covering "Last 3 Hours".
- 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