# Docker Compose stack for xrpld OpenTelemetry observability. # # Provides services for local development: # - otel-collector: receives OTLP traces from xrpld, batches and # forwards them to Tempo. Listens on ports 4317 (gRPC) # and 4318 (HTTP). # - tempo: Grafana Tempo tracing backend, queryable via Grafana Explore # on port 3000. Recommended for production (S3/GCS storage, TraceQL). # - grafana: dashboards on port 3000, pre-configured with Tempo # datasource. # # Usage: # docker compose -f docker/telemetry/docker-compose.yml up -d # # Configure xrpld to export traces by adding to xrpld.cfg: # [telemetry] # enabled=1 # endpoint=http://localhost:4318/v1/traces services: # OpenTelemetry Collector: receives spans from xrpld via OTLP protocol, # batches them for efficiency, and forwards to Tempo for storage. otel-collector: image: otel/opentelemetry-collector-contrib:0.121.0 command: ["--config=/etc/otel-collector-config.yaml"] ports: - "4317:4317" # OTLP gRPC receiver - "4318:4318" # OTLP HTTP receiver (xrpld sends traces here) - "13133:13133" # Health check endpoint volumes: # Mount collector pipeline config (receivers → processors → exporters) - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml:ro depends_on: - tempo networks: - xrpld-telemetry # Grafana Tempo: distributed tracing backend that stores and indexes # spans. Queryable via TraceQL in Grafana Explore. tempo: image: grafana/tempo:2.7.2 command: ["-config.file=/etc/tempo.yaml"] ports: - "3200:3200" # Tempo HTTP API (health check, query) volumes: # Mount Tempo storage and ingestion config - ./tempo.yaml:/etc/tempo.yaml:ro # Persistent volume for trace data (WAL + blocks) - tempo-data:/var/tempo networks: - xrpld-telemetry # Grafana: visualization UI with Tempo pre-configured as a datasource. # Anonymous admin access enabled for local development convenience. grafana: image: grafana/grafana:11.5.2 environment: - GF_AUTH_ANONYMOUS_ENABLED=true # No login required for local dev - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin # Full access without auth ports: - "3000:3000" # Grafana web UI volumes: # Auto-provision Tempo datasource and search filters on startup - ./grafana/provisioning:/etc/grafana/provisioning:ro depends_on: - tempo networks: - xrpld-telemetry # Named volume for Tempo trace storage (WAL and compacted blocks). # Data persists across container restarts. Remove with: # docker compose -f docker/telemetry/docker-compose.yml down -v volumes: tempo-data: # Isolated bridge network so services communicate by container name # (e.g., the collector reaches Tempo at http://tempo:4317). networks: xrpld-telemetry: driver: bridge