name: personal-lifecycle-observability
services:
otel-collector:
image: otel/opentelemetry-collector-contrib:0.95.0
container_name: ${OTEL_COLLECTOR_CONTAINER_NAME:-personal-lifecycle-otel-collector}
command: ["--config=/etc/otel-collector-config.yaml"]
volumes:
- ./otel-collector-config.yaml:/etc/otel-collector-config.yaml:ro
ports:
- "${OTEL_GRPC_PORT:-4327}:4317" # OTLP gRPC receiver
- "${OTEL_HTTP_PORT:-4328}:4318" # OTLP HTTP receiver
- "${OTEL_METRICS_PORT:-8899}:8889" # Prometheus metrics exporter
networks:
observability-net:
aliases:
- otel-collector
- personal-lifecycle-otel-collector
depends_on:
- tempo
- loki
- prometheus
restart: unless-stopped
prometheus:
image: prom/prometheus:v2.51.0
container_name: ${PROMETHEUS_CONTAINER_NAME:-personal-lifecycle-prometheus}
command:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
- --web.enable-lifecycle
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./alert_rules.yml:/etc/prometheus/alert_rules.yml:ro
- prometheus_data:/prometheus
ports:
- "${PROMETHEUS_PORT:-9091}:9090"
networks:
- observability-net
restart: unless-stopped
loki:
image: grafana/loki:2.9.4
container_name: ${LOKI_CONTAINER_NAME:-personal-lifecycle-loki}
command: -config.file=/etc/loki/local-config.yaml
volumes:
- ./loki-config.yaml:/etc/loki/local-config.yaml:ro
- loki_data:/loki
ports:
- "${LOKI_PORT:-3101}:3100"
networks:
- observability-net
restart: unless-stopped
tempo:
image: grafana/tempo:2.4.1
container_name: ${TEMPO_CONTAINER_NAME:-personal-lifecycle-tempo}
command: ["-config.file=/etc/tempo.yaml"]
volumes:
- ./tempo-config.yaml:/etc/tempo.yaml:ro
- tempo_data:/var/tempo
ports:
- "${TEMPO_PORT:-3201}:3200"
networks:
- observability-net
restart: unless-stopped
grafana:
image: grafana/grafana:10.4.0
container_name: ${GRAFANA_CONTAINER_NAME:-personal-lifecycle-grafana}
environment:
- GF_SECURITY_ADMIN_USER=${GRAFANA_USER:-admin}
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin}
- GF_USERS_ALLOW_SIGN_UP=false
- GF_FEATURE_TOGGLES_ENABLE=traceqlEditor
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning:ro
- ./grafana/dashboards:/etc/grafana/dashboards:ro
- grafana_data:/var/lib/grafana
ports:
- "${GRAFANA_PORT:-3004}:3000"
networks:
- observability-net
depends_on:
- prometheus
- loki
- tempo
restart: unless-stopped
networks:
observability-net:
name: ${OBSERVABILITY_NET:-personal-lifecycle-observability-net}
driver: bridge
volumes:
prometheus_data:
loki_data:
tempo_data:
grafana_data: