# Grafana Tempo — single-binary, all-in-one, local storage (S-16a, ADR-0023). # Ingests OTLP directly (services export straight to Tempo; no collector hop). # Storage is ephemeral container fs — this is a local/CI demo backplane, not a # retention target. ponytail: local backend, swap for object storage if traces # must outlive the stack. server: http_listen_port: 3200 distributor: receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 ingester: max_block_duration: 5m storage: trace: backend: local local: path: /var/tempo/blocks wal: path: /var/tempo/wal # #156: don't let the distributor evict its own ingester. Tempo runs single-binary here, so the # distributor and the ingester are the same process and the "pool" holds exactly one, in-process, # member. dskit still health-checks it over loopback gRPC with a 1s deadline (checkinterval 15s); # on the shared CI runner a transient stall blows that deadline, the only ingester is dropped from # the pool ("removing distributor_pool failing healthcheck"), and every push then fails ("pusher # failed to consume trace data", err="context canceled") until the next check — silently losing # spans, which is how verify-tracing flaked. With one in-process ingester the check can never route # around a failure, so it can only ever discard data. Turn it off. ingester_client: pool_config: healthcheckenabled: false