version: '3.8'

services:
  # OpenTelemetry Collector
  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.91.0
    container_name: expanso-otel-collector
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./otel-collector/config.yaml:/etc/otel-collector-config.yaml
    ports:
      - "4317:4317"   # OTLP gRPC
      - "4318:4318"   # OTLP HTTP
      - "9090:9090"   # Prometheus exporter
    networks:
      - expanso-monitoring
    restart: unless-stopped

  # Prometheus
  prometheus:
    image: prom/prometheus:v2.48.0
    container_name: expanso-prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=30d'
      - '--web.enable-lifecycle'
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/alerts:/etc/prometheus/alerts
      - prometheus-data:/prometheus
    ports:
      - "9091:9090"   # Prometheus web UI (avoiding conflict with OTLP)
    networks:
      - expanso-monitoring
    restart: unless-stopped

  # Grafana
  grafana:
    image: grafana/grafana:10.2.2
    container_name: expanso-grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_USERS_ALLOW_SIGN_UP=false
      - GF_AUTH_ANONYMOUS_ENABLED=false
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
    ports:
      - "3000:3000"
    networks:
      - expanso-monitoring
    depends_on:
      - prometheus
    restart: unless-stopped

networks:
  expanso-monitoring:
    driver: bridge

volumes:
  prometheus-data:
  grafana-data:
