global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: # ── Docker SD: containers with prometheus.io/scrape=true are auto-discovered ── - job_name: 'docker' docker_sd_configs: - host: unix:///var/run/docker.sock refresh_interval: 15s filters: - name: label values: - prometheus.io/scrape=true relabel_configs: # Address: use container name + label port (Docker DNS resolves names) - source_labels: [__meta_docker_container_name, __meta_docker_container_label_prometheus_io_port] regex: '/(.*);(\d+)' replacement: '${1}:${2}' target_label: __address__ # Metrics path from label (default /metrics) - source_labels: [__meta_docker_container_label_prometheus_io_path] regex: '(.+)' target_label: __metrics_path__ replacement: '${1}' # Container name label - source_labels: [__meta_docker_container_name] regex: '/(.*)' replacement: '${1}' target_label: container # ── OTel Collector ── - job_name: 'otel-collector' scrape_interval: 10s metrics_path: /metrics static_configs: - targets: ['otel-collector:8889'] labels: service: otel-collector # ── Node Exporter ── - job_name: 'node' scrape_interval: 15s static_configs: - targets: ['node-exporter:9100']