Prometheus — система мониторинга и база данных временных рядов с открытым исходным кодом. Собирает метрики с целевых хостов по модели pull (сам опрашивает экспортёры), хранит их и предоставляет язык запросов PromQL. Чаще всего используется в связке с Grafana для визуализации.

Возможности

  • Сбор метрик по HTTP (pull-модель)
  • Хранение временных рядов с метками (labels)
  • Мощный язык запросов PromQL
  • Встроенные алерты через Alertmanager
  • Большая экосистема экспортёров: node_exporter, cAdvisor, blackbox_exporter и др.

Установка через Docker Compose

mkdir -p /opt/monitoring/prometheus && cd /opt/monitoring

Файл конфигурации /opt/monitoring/prometheus/prometheus.yml:

global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - job_name: "node" static_configs: - targets: ["node-exporter:9100"] - job_name: "cadvisor" static_configs: - targets: ["cadvisor:8080"]

Файл /opt/monitoring/docker-compose.yml (стек мониторинга целиком):

services: prometheus: image: prom/prometheus:latest container_name: prometheus restart: unless-stopped command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--storage.tsdb.retention.time=30d" volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus_data:/prometheus networks: - monitoring node-exporter: image: prom/node-exporter:latest container_name: node-exporter restart: unless-stopped pid: host volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - "--path.procfs=/host/proc" - "--path.sysfs=/host/sys" - "--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)" networks: - monitoring cadvisor: image: gcr.io/cadvisor/cadvisor:latest container_name: cadvisor restart: unless-stopped privileged: true volumes: - /:/rootfs:ro - /var/run:/var/run:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro networks: - monitoring grafana: image: grafana/grafana:latest container_name: grafana restart: unless-stopped environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=ChangeMe123 volumes: - grafana_data:/var/lib/grafana networks: - monitoring - traefik_proxy labels: - "traefik.enable=true" - "traefik.http.routers.grafana.rule=Host(`example.com`) && PathPrefix(`/grafana`)" - "traefik.http.routers.grafana.entrypoints=websecure" - "traefik.http.routers.grafana.tls.certresolver=letsencrypt" - "traefik.http.services.grafana.loadbalancer.server.port=3000" volumes: prometheus_data: grafana_data: networks: monitoring: driver: bridge traefik_proxy: external: true

Запуск

docker compose up -d

Проверка

Targets (список опрашиваемых хостов) доступны по адресу: http://localhost:9090/targets

Пример PromQL-запроса — загрузка CPU:

100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

Полезные экспортёры

  • node_exporter — метрики хоста: CPU, RAM, диск, сеть
  • cAdvisor — метрики Docker-контейнеров
  • blackbox_exporter — проверка доступности URL, TCP-портов
  • mysqld_exporter — метрики MySQL / MariaDB

Обновление

docker compose pull && docker compose up -d

Примечания

  • По умолчанию данные хранятся 15 дней. Параметр --storage.tsdb.retention.time=30d увеличивает срок хранения до 30 дней.
  • Prometheus не имеет встроенной авторизации — не открывайте порт 9090 наружу. Используйте Traefik с basic auth или оставьте во внутренней сети.
  • Для визуализации установите Grafana и подключите Prometheus как источник данных.