- CI/CD GitLab (.gitlab-ci.yml): verify -> test -> build -> publish -> deploy cu health-gate (/api/v3/health/all) + rollback manual - Publicare pe retele sociale (LinkedIn/Facebook) din Analysis History (social.ts, linkedin.ts, facebook.ts, SocialPostModal) - Specificatii OpenAPI: agent-v3 (87 op.) si didi-framework (287 op.) - Matrice testare acceptanta beneficiar + script dovezi API - Fix nginx SSL: redirect port 3001 (error_page 497, absolute_redirect off) - Adrese interne inlocuite cu hostname-uri generice (.local)
183 lines
5.6 KiB
YAML
183 lines
5.6 KiB
YAML
# 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
|