version: '3.8' services: # Core Services redis: image: redis:latest container_name: devserver_redis volumes: - redis_data:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 10s retries: 5 start_period: 30s networks: - devserver_network logging: driver: "json-file" options: max-size: "10m" max-file: "3" rabbitmq: image: rabbitmq:3-management container_name: devserver_rabbitmq ports: - "5672:5672" # RabbitMQ main port - "15672:15672" # RabbitMQ management UI networks: - devserver_network logging: driver: "json-file" options: max-size: "10m" max-file: "3" # Application Services celery_worker: build: . container_name: devserver_celery_worker command: ["uv", "run", "opentelemetry-instrument", "--service_name", "devserver.celery.worker", "celery", "-A", "app.worker", "worker", "--loglevel=info", "--concurrency=4"] env_file: .env environment: OTEL_TRACES_EXPORTER: otlp OTEL_METRICS_EXPORTER: otlp OTEL_LOGS_EXPORTER: otlp OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc OTEL_SERVICE_NAME: devserver.celery.worker OTEL_TRACES_SAMPLER: always_on OTEL_METRICS_INTERVAL: 5000 volumes: - ./logs:/app/logs networks: - devserver_network depends_on: - redis - rabbitmq - otel-collector logging: driver: "json-file" options: max-size: "10m" max-file: "3" devserver: build: . container_name: devserver_backend # Removed opentelemetry-instrument wrapper - using explicit instrumentation in code command: ["uv", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"] env_file: .env environment: OTEL_TRACES_EXPORTER: otlp OTEL_METRICS_EXPORTER: otlp OTEL_LOGS_EXPORTER: otlp OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc OTEL_SERVICE_NAME: devserver.api.fastapi OTEL_TRACES_SAMPLER: always_on OTEL_METRICS_INTERVAL: 5000 ports: - "8000:8000" volumes: - ./logs:/app/logs depends_on: redis: condition: service_healthy otel-collector: condition: service_started networks: - devserver_network logging: driver: "json-file" options: max-size: "10m" max-file: "3" # Observability Stack otel-collector: image: otel/opentelemetry-collector-contrib:latest container_name: devserver_otel_collector command: ["--config=/etc/otel-collector-config.yaml"] environment: OTEL_METRIC_EXPORT_INTERVAL: "15000" volumes: - ./monitoring/otel-collector-config.yaml:/etc/otel-collector-config.yaml ports: - "1888:1888" # pprof extension - "8888:8888" # Prometheus metrics exposed by the collector - "8889:8889" # Prometheus exporter metrics - "13133:13133" # health_check extension - "4317:4317" # OTLP gRPC receiver - "4318:4318" # OTLP HTTP receiver - "55679:55679" # zpages extension networks: - devserver_network logging: driver: "json-file" options: max-size: "10m" max-file: "3" jaeger: image: jaegertracing/all-in-one:latest container_name: devserver_jaeger ports: - "16686:16686" # Jaeger UI - "14268:14268" # Jaeger HTTP collector (thrift) environment: COLLECTOR_OTLP_ENABLED: true SPAN_STORAGE_TYPE: memory MEMORY_MAX_TRACES: 50000 networks: - devserver_network logging: driver: "json-file" options: max-size: "10m" max-file: "3" loki: image: grafana/loki:latest container_name: devserver_loki ports: - "3100:3100" volumes: - ./monitoring/loki-config.yaml:/etc/loki/local-config.yaml - loki_data:/loki command: -config.file=/etc/loki/local-config.yaml networks: - devserver_network logging: driver: "json-file" options: max-size: "10m" max-file: "3" promtail: image: grafana/promtail:latest container_name: devserver_promtail volumes: - ./monitoring/promtail-config.yaml:/etc/promtail/config.yml - ./logs:/var/log/devserver command: -config.file=/etc/promtail/config.yml networks: - devserver_network logging: driver: "json-file" options: max-size: "10m" max-file: "3" prometheus: image: prom/prometheus:latest container_name: devserver_prometheus ports: - "9090:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--storage.tsdb.retention.time=200h' - '--web.enable-lifecycle' - '--web.enable-admin-api' - '--web.enable-remote-write-receiver' networks: - devserver_network logging: driver: "json-file" options: max-size: "10m" max-file: "3" grafana: image: grafana/grafana:latest container_name: devserver_grafana ports: - "3000:3000" environment: GF_SECURITY_ADMIN_PASSWORD: admin GF_USERS_ALLOW_SIGN_UP: false GF_INSTALL_PLUGINS: grafana-piechart-panel,grafana-worldmap-panel volumes: - ./monitoring/grafana/provisioning:/etc/grafana/provisioning - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards - grafana_data:/var/lib/grafana networks: - devserver_network depends_on: - prometheus - loki logging: driver: "json-file" options: max-size: "10m" max-file: "3" cadvisor: image: gcr.io/cadvisor/cadvisor:latest container_name: devserver_cadvisor ports: - "8080:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro privileged: true networks: - devserver_network logging: driver: "json-file" options: max-size: "10m" max-file: "3" volumes: redis_data: prometheus_data: grafana_data: loki_data: networks: devserver_network: driver: bridge