Initial commit: Complete DevServer monitoring framework
- FastAPI application with OpenTelemetry instrumentation - Redis caching and Celery task processing - Docker Compose setup with monitoring stack - Grafana dashboards and Prometheus metrics - Jaeger distributed tracing - Comprehensive documentation in docs/ folder - Monitoring configuration and troubleshooting guides
This commit is contained in:
251
docker-compose.yml
Normal file
251
docker-compose.yml
Normal file
@@ -0,0 +1,251 @@
|
||||
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
|
||||
Reference in New Issue
Block a user