# DiDi Observability Stack # ======================== # Implements LOT 2 modul 8 (Observabilitate & Logging) conform oferta EVOTECH §A.9: # - Prometheus — metrics scraping # - Grafana — dashboards # - Loki — log aggregation # - Promtail — log shipper (Docker logs → Loki) # - Jaeger — distributed tracing UI # - OTel Collector — receives traces from services, forwards to Jaeger # - Alertmanager — alert routing (email, Slack/Teams, PagerDuty) # # Network: didi-network (shared cu DIDI + AI platform stacks) # Storage: volumes locale persistente # # Quick start: # cd /home/admin365/didi_mono/didi_mono/backend/observability # docker compose up -d # # UI access: # Grafana: http://didi.local:3030 (admin / GRAFANA_ADMIN_PASSWORD) # Prometheus: http://didi.local:9090 # Jaeger UI: http://didi.local:16686 # Alertmanager: http://didi.local:9093 services: prometheus: image: prom/prometheus:v2.55.0 container_name: didi-prometheus restart: unless-stopped user: "65534:65534" # nobody:nobody (avoids root warnings) volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./prometheus/rules:/etc/prometheus/rules:ro - prometheus-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=30d' - '--storage.tsdb.retention.size=20GB' - '--web.enable-lifecycle' - '--web.enable-admin-api' ports: - "0.0.0.0:9090:9090" networks: - didi-network healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:9090/-/healthy"] interval: 30s timeout: 5s retries: 3 grafana: image: grafana/grafana:11.3.0 container_name: didi-grafana restart: unless-stopped depends_on: prometheus: condition: service_healthy environment: GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:-admin} GF_USERS_ALLOW_SIGN_UP: "false" GF_AUTH_ANONYMOUS_ENABLED: "false" GF_INSTALL_PLUGINS: "grafana-piechart-panel,grafana-clock-panel" GF_FEATURE_TOGGLES_ENABLE: "traceqlEditor" volumes: - ./grafana/provisioning:/etc/grafana/provisioning:ro - ./grafana/dashboards:/var/lib/grafana/dashboards:ro - grafana-data:/var/lib/grafana ports: - "0.0.0.0:3030:3000" networks: - didi-network healthcheck: test: ["CMD-SHELL", "wget --quiet --tries=1 --spider http://localhost:3000/api/health || exit 1"] interval: 30s timeout: 5s retries: 3 loki: image: grafana/loki:3.2.0 container_name: didi-loki restart: unless-stopped volumes: - ./loki/loki-config.yaml:/etc/loki/local-config.yaml:ro - loki-data:/loki command: -config.file=/etc/loki/local-config.yaml ports: - "0.0.0.0:3100:3100" networks: - didi-network healthcheck: test: ["CMD-SHELL", "wget --quiet --tries=1 --spider http://localhost:3100/ready || exit 1"] interval: 30s timeout: 5s retries: 3 start_period: 30s promtail: image: grafana/promtail:3.2.0 container_name: didi-promtail restart: unless-stopped depends_on: loki: condition: service_healthy volumes: - ./promtail/promtail-config.yaml:/etc/promtail/config.yaml:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock:ro - promtail-data:/tmp command: -config.file=/etc/promtail/config.yaml networks: - didi-network jaeger: image: jaegertracing/all-in-one:1.62.0 container_name: didi-jaeger restart: unless-stopped environment: COLLECTOR_OTLP_ENABLED: "true" SPAN_STORAGE_TYPE: memory BADGER_EPHEMERAL: "false" BADGER_DIRECTORY_VALUE: /badger/data BADGER_DIRECTORY_KEY: /badger/key volumes: - jaeger-data:/badger ports: - "0.0.0.0:16686:16686" # Jaeger UI - "0.0.0.0:14250:14250" # gRPC collector (legacy) - "0.0.0.0:14268:14268" # HTTP collector (legacy) - "0.0.0.0:4317:4317" # OTLP gRPC - "0.0.0.0:4318:4318" # OTLP HTTP networks: - didi-network otel-collector: image: otel/opentelemetry-collector-contrib:0.110.0 container_name: didi-otel-collector restart: unless-stopped depends_on: - jaeger - prometheus volumes: - ./otel-collector/otel-collector.yaml:/etc/otelcol-contrib/config.yaml:ro command: ["--config=/etc/otelcol-contrib/config.yaml"] ports: - "0.0.0.0:4319:4317" # OTLP gRPC (services push traces here) - "0.0.0.0:4320:4318" # OTLP HTTP - "0.0.0.0:8888:8888" # collector self-metrics - "0.0.0.0:8889:8889" # prometheus exporter networks: - didi-network alertmanager: image: prom/alertmanager:v0.27.0 container_name: didi-alertmanager restart: unless-stopped volumes: - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro - alertmanager-data:/alertmanager command: - '--config.file=/etc/alertmanager/alertmanager.yml' - '--storage.path=/alertmanager' ports: - "0.0.0.0:9093:9093" networks: - didi-network healthcheck: test: ["CMD-SHELL", "wget --quiet --tries=1 --spider http://localhost:9093/-/healthy || exit 1"] interval: 30s timeout: 5s retries: 3 volumes: prometheus-data: {} grafana-data: {} loki-data: {} promtail-data: {} jaeger-data: {} alertmanager-data: {} networks: didi-network: external: true