# Optional overlay for the existing EC2 production Compose topology: # docker compose -f docker-compose.prod.yml -f docker-compose.observability.yml up -d # The base production file remains unchanged and does not require this stack. services: ai-service: environment: OTEL_ENABLED: "true" OTEL_SERVICE_NAME: ai-service OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4318/v1/traces ENVIRONMENT: compose depends_on: - otel-collector prometheus: image: prom/prometheus:v3.3.0 command: - --config.file=/etc/prometheus/prometheus.yml - --storage.tsdb.path=/prometheus - --enable-feature=exemplar-storage volumes: - ./prometheus/prometheus-compose.yml:/etc/prometheus/prometheus.yml:ro - prometheus-data:/prometheus restart: unless-stopped tempo: image: grafana/tempo:2.7.2 command: ["-config.file=/etc/tempo/tempo.yml"] volumes: - ./tempo/tempo.yml:/etc/tempo/tempo.yml:ro - tempo-data:/var/tempo restart: unless-stopped otel-collector: image: otel/opentelemetry-collector-contrib:0.123.0 command: ["--config=/etc/otelcol/config.yml"] volumes: - ./otel/collector.yml:/etc/otelcol/config.yml:ro depends_on: - tempo restart: unless-stopped grafana: image: grafana/grafana:11.5.2 ports: - "3002:3000" environment: GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin} GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:-change-me} GF_AUTH_ANONYMOUS_ENABLED: "false" volumes: - ./grafana/provisioning:/etc/grafana/provisioning:ro - ./grafana/dashboards:/var/lib/grafana/dashboards:ro - grafana-data:/var/lib/grafana depends_on: - prometheus - tempo restart: unless-stopped volumes: prometheus-data: tempo-data: grafana-data: