.docker/observability/README.md
This directory contains the comprehensive observability stack for RustFS, designed to provide deep insights into application performance, logs, and traces.
The stack is composed of the following best-in-class open-source components:
By default, this stack uses Tempo in single-binary mode and does not require Kafka/Redpanda.
If you want the Kafka-backed HA Tempo path, use docker-compose-example-for-rustfs.yml together with docker-compose-tempo-ha-override.yml.
Run the following command to start the entire stack:
docker compose up -d
The default docker-compose.yml is the single-node stack.
If you need the Kafka-backed HA Tempo configuration, start it with:
docker compose -f docker-compose-example-for-rustfs.yml -f docker-compose-tempo-ha-override.yml up -d
| Service | URL | Credentials | Description |
|---|---|---|---|
| Grafana | http://localhost:3000 | admin / admin | Main visualization hub. |
| Prometheus | http://localhost:9090 | - | Metric queries and status. |
| Jaeger UI | http://localhost:16686 | - | Secondary trace visualization. |
| Tempo | http://localhost:3200 | - | Tempo status/metrics. |
Data is stored in the following Docker volumes:
prometheus-data: Prometheus metricstempo-data: Tempo traces (WAL and Blocks)loki-data: Loki logs (Chunks and Rules)jaeger-data: Jaeger traces (Badger DB)To clear all data:
docker compose down -v
prometheus.yml to add scrape targets or alerting rules.grafana/ directory.otel-collector-config.yaml to modify pipelines, processors, or exporters.When RustFS points RUSTFS_OBS_ENDPOINT at this stack, treat the value as the
OTLP/HTTP base URL, for example:
export RUSTFS_OBS_ENDPOINT=http://host.docker.internal:4318
RustFS automatically expands that base URL to:
/v1/traces/v1/metrics/v1/logsImportant behavior notes:
RUSTFS_OBS_LOGGER_LEVEL=info keeps the top-level request span but filters
many nested debug spans. If Tempo or Jaeger looks sparse, retry with
RUSTFS_OBS_LOGGER_LEVEL=debug before suspecting collector or Tempo issues.Minimal validation flow:
# 1. Start this observability stack.
docker compose up -d
# 2. Start RustFS with OTLP/HTTP export and richer span visibility.
export RUSTFS_OBS_ENDPOINT=http://host.docker.internal:4318
export RUSTFS_OBS_LOGGER_LEVEL=debug
# 3. Generate real request traffic.
curl -I http://127.0.0.1:9000/health
curl -I http://127.0.0.1:9000/health/ready
# 4. Inspect Grafana or Jaeger.
# Grafana: http://localhost:3000
# Jaeger: http://localhost:16686
If logs and metrics are present but traces are sparse, the most common cause is
"no real request traffic yet" or "info level filtered nested spans", not an
OTLP routing failure.
docker compose ps.docker compose logs -f <service_name>.http://localhost:13133 for health status and http://localhost:1888/debug/pprof/ for profiling.