services: # OpenTelemetry Collector: receives traces from Plano, derives Prometheus # metrics via the spanmetrics connector, and forwards traces to Tempo. otel-collector: image: otel/opentelemetry-collector-contrib:0.102.0 command: ["--config=/etc/otel-collector-config.yaml"] volumes: - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml:ro ports: - "9317:4317" # OTLP gRPC (Plano sends traces here) - "8889:8889" # Prometheus metrics endpoint (spanmetrics) depends_on: - tempo tempo: image: grafana/tempo:2.5.0 command: ["-config.file=/etc/tempo.yaml"] volumes: - ./tempo.yaml:/etc/tempo.yaml:ro ports: - "9200:3200" # Tempo HTTP API prometheus: image: prom/prometheus:v2.53.0 command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.retention.time=7d" volumes: - ./prometheus.yaml:/etc/prometheus/prometheus.yml:ro ports: - "9190:9090" extra_hosts: - "host.docker.internal:host-gateway" depends_on: - otel-collector grafana: image: grafana/grafana:11.1.0 environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin - GF_USERS_ALLOW_SIGN_UP=false volumes: - ./grafana/provisioning:/etc/grafana/provisioning:ro - ./grafana/dashboards:/var/lib/grafana/dashboards:ro ports: - "9000:3000" depends_on: - prometheus - tempo