Практическая настройка Prometheus и Grafana в Docker Compose, базовая конфигурация
«Лучше один раз запустить, чем сто раз прочитать»
Можно установить Prometheus напрямую на сервер через apt или brew. Но мы будем использовать Docker, и вот почему:
Требования:
Создадим директорию для нашего проекта мониторинга:
monitoring/
├── docker-compose.yml
├── prometheus/
│ └── prometheus.yml
└── grafana/
└── provisioning/
└── datasources/
└── prometheus.yml
Создадим файл prometheus/prometheus.yml:
global:
scrape_interval: 15s # Как часто опрашивать цели
evaluation_interval: 15s # Как часто вычислять правила
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']Разбираем:
scrape_interval — глобальная частота опроса целей (15 секунд по умолчанию). Можно переопределить для каждой job отдельно.evaluation_interval — как часто вычислять правила алертинга и recording rules.job_name — имя логической группы целей. Prometheus автоматически добавит лейбл job="prometheus" ко всем метрикам от этой job.targets — список адресов для опроса. localhost:9090 — это сам Prometheus (он отдаёт метрики о себе).Важный момент: Prometheus использует pull-модель. Он сам забирает метрики с целей. Поэтому target должен быть доступен из контейнера Prometheus.
Создадим docker-compose.yml:
version: '3.8'
services:
prometheus:
image: prom/prometheus:v2.52.0
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=15d'
restart: unless-stopped
grafana:
image: grafana/grafana:10.4.0
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-piechart-panel
restart: unless-stopped
volumes:
prometheus_data:
grafana_data:Разбираем ключевые моменты:
image: prom/prometheus:v2.52.0 — официальный образ Prometheus. Всегда фиксируйте версию в production — не используйте latest.ports: "9090:9090" — пробрасываем порт 9090 на хост. Web UI Prometheus будет доступен по адресу http://localhost:9090.volumes — монтируем:
prometheus.yml) в /etc/prometheus/prometheus_data (сохраняется после перезапуска)command — аргументы командной строки:
--config.file — путь к конфигу--storage.tsdb.path — где хранить данные--storage.tsdb.retention.time — сколько хранить данные (15 дней)restart: unless-stopped — автоматически перезапускать при паденииimage: grafana/grafana:10.4.0 — официальный образ Grafana.ports: "3000:3000" — Grafana будет доступна по http://localhost:3000.volumes — монтируем:
grafana_dataenvironment — переменные окружения:
GF_SECURITY_ADMIN_USER/PASSWORD — логин/пароль администратораGF_INSTALL_PLUGINS — плагины для установкиrestart: unless-stopped — автоперезапускprometheus_data — хранение метрик Prometheusgrafana_data — хранение дашбордов и настроек GrafanaВажно: без volumes данные потеряются при удалении контейнеров.
Запускаем стек:
cd monitoring
docker compose up -dПроверяем статус:
docker compose psДолжны увидеть два запущенных контейнера:
NAME STATUS PORTS
prometheus Up (healthy) 0.0.0.0:9090->9090/tcp
grafana Up (healthy) 0.0.0.0:3000->3000/tcp
Откройте http://localhost:9090.
Вы увидите web-интерфейс Prometheus. Вверху есть строка для PromQL-запросов.
Проверочный запрос: введите promhttp_metric_handler_requests_total и нажмите Execute.
Вы должны увидеть метрики — количество обработанных запросов самого Prometheus.
Что вы видите:
code="200", instance="localhost:9090")Откройте http://localhost:3000.
Логин: admin, пароль: admin (или те, что указали в docker-compose.yml).
Проверка источника данных:
http://prometheus:9090Важный момент: Grafana обращается к Prometheus по имени сервиса Docker Compose (http://prometheus:9090), а не по localhost. Это работает благодаря Docker network.
Создадим простой дашборд для мониторинга самого Prometheus:
rate(promhttp_metric_handler_requests_total[5m])
Что означает запрос:
promhttp_metric_handler_requests_total — counter обработанных запросовrate(...[5m]) — скорость изменения за последние 5 минут (запросов в секунду)Сохраните дашборд (Ctrl+S или кнопка Save).
Хотите мониторить не только Prometheus, но и Docker? Добавьте cAdvisor.
cAdvisor (Container Advisor) собирает метрики о контейнерах Docker.
Обновите docker-compose.yml:
services:
prometheus:
# ... (без изменений)
grafana:
# ... (без изменений)
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.47.0
container_name: cadvisor
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
restart: unless-stoppedОбновите prometheus/prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']Важно: target — cadvisor:8080, а не localhost:8080. Prometheus работает в отдельном контейнере и обращается к cAdvisor через Docker network.
docker compose down
docker compose up -dОткройте Prometheus UI (http://localhost:9090) и выполните запрос:
container_cpu_usage_seconds_total
Должны увидеть метрики CPU для всех контейнеров (включая сам Prometheus и Grafana).
Симптом: Prometheus не может подключиться к target.
Причины:
localhost вместо имени сервиса)Решение:
docker compose ps — все ли контейнеры запущеныcadvisor:8080, а не localhost:8080)curl http://cadvisor:8080/metrics из контейнера PrometheusСимптом: Запросы возвращают пустые результаты.
Причины:
Решение:
{job="cadvisor"}Симптом: Prometheus не может записать данные.
Причины:
Решение:
df -hprometheus_data существуетstorage.tsdb.retention.time или уменьшите scrape_intervalТеперь у вас есть работающий стек мониторинга. Но пока вы мониторите только Prometheus и Docker. В следующих темах вы научитесь:
up — показывает статус всех targets (1 = доступен, 0 = недоступен)prometheus_tsdb_head_samples_appended_total — сколько метрик записаноscrape_configs, определяющий, какие цели опрашивать.http://prometheus:9090).up, rate(), базовые метрики Prometheus.Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.