В данной инструкции мы рассмотрим пример docker-compose файла для организации системы мониторинга на базе Prometheus. Мы получим:
- Базу данных Prometheus и интерфейс для выполнения PromQL.
- Визуализацию с помощью Grafana.
- Сбор метрик через Node Exporter.
- Мониторинг HTTP с использованием Blackbox.
- Отправку уведомлений в Telegram с помощью Alertmanager.
Мы будем работать в среде Linux, хотя полученный файл docker-compose можно применять где угодно. Останавливаться подробно на описании docker-compose мы не будем.
Подготовка системы
Подразумевается, что у нас установлен Docker и docker-compose
Создаем каталоги, где будем создавать наши файлы:
mkdir -p /opt/prometheus_stack/{prometheus,grafana,alertmanager,blackbox}
Создаем файл:
touch /opt/prometheus_stack/docker-compose.yml
Переходим в каталог prometheus_stack:
cd /opt/prometheus_stack
Дальше будем работать относительно него.
Prometheus + Node Exporter
Открываем файл:
vi docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
version: '3.9' services: prometheus: image: prom/prometheus:latest volumes: - ./prometheus:/etc/prometheus/ container_name: prometheus hostname: prometheus command: - --config.file=/etc/prometheus/prometheus.yml ports: - 9090:9090 restart: unless-stopped environment: TZ: "Europe/Moscow" networks: - default node-exporter: image: prom/node-exporter volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro container_name: exporter hostname: exporter command: - --path.procfs=/host/proc - --path.sysfs=/host/sys - --collector.filesystem.ignored-mount-points - ^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/) ports: - 9100:9100 restart: unless-stopped environment: TZ: "Europe/Moscow" networks: - default networks: default: ipam: driver: default config: - subnet: 172.28.0.0/16 |
* в данном примере мы создаем 2 сервиса — prometheus и node-exporter. Также мы отдельно определили подсеть 172.28.0.0/16, в которой будут находиться наши контейнеры docker.
Создаем конфигурационный файл для prometheus:
vi prometheus/prometheus.yml
1 2 3 4 5 |
scrape_configs: - job_name: node scrape_interval: 5s static_configs: - targets: ['node-exporter:9100'] |
* в данном примере мы прописываем наш node-exporter в качестве таргета.
Запускаем контейнеры:
docker-compose up -d
Ждем несколько секунд и можно пробовать подключиться. Открываем браузер и переходим по адресу http://<IP-адрес сервера>:9090 — мы должны увидеть страницу Prometheus:
Переходим по адресу http://<IP-адрес сервера>:9100 — мы должны увидеть страницу Node Exporter:
Grafana
Добавим к нашему стеку графану.
Открываем файл:
vi docker-compose.yml
Добавляем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
version: '3.9' services: ... grafana: image: grafana/grafana user: root depends_on: - prometheus ports: - 3000:3000 volumes: - ./grafana:/var/lib/grafana - ./grafana/provisioning/:/etc/grafana/provisioning/ container_name: grafana hostname: grafana restart: unless-stopped environment: TZ: "Europe/Moscow" networks: - default |
* по аналогии с другими сервисами, мы добавили сервис для графаны.
Перезапустим контейнеры:
docker-compose up -d
Открываем браузер и переходим по адресу http://<IP-адрес сервера>:3000 — мы должны увидеть стартовую страницу Grafana.
Для авторизации вводим admin / admin. После система потребует ввести новый пароль.
Настроим связку с Prometheus. Кликаем по иконке Configuration - Data Sources:
Переходим к добавлению источника, нажав по Add data source:
Среди списка источников данных находим и выбираем Prometheus, кликнув по Select:
Задаем параметры для подключения к Prometheus:
Сохраняем настройки, кликнув по Save & Test:
Добавим дашборд для мониторинга с node exporter. Для этого уже есть готовый вариант.
Кликаем по изображению плюса и выбираем Import:
Вводим идентификатор дашборда. Для Node Exporter это 1860:
Кликаем Load — Grafana подгрузит дашборд из своего репозитория — выбираем в разделе Prometheus наш источник данных и кликаем по Import:
Мы увидим страницу с настроенными показателями метрик. Можно пользоваться.
Настройка оповещений с AlertManager
В нашем примере мы настроим отправку уведомлений на телеграм бот. Само оповещение будет выполнять AlertManager, который интегрируется с Prometheus.
Для начала подготовим наш бот телеграм. Создадим нового — для этого открываем телеграм и ищем @my_id_bot:
Приложение покажет наш идентификатор. Записываем — он нам потребуется позже.
Теперь создаем бота. Ищем @BotFather:
Переходим в чат с найденным BotFather и запускаем бота:
Создаем бота, последовательно введя команду /newbot и отвечая на запросы мастера:
* в нашем примере мы создаем бота prometheus_alert с именем учетной записи test.
Переходим в чат с созданным ботом, кликнув по его названию:
Запускаем бота:
С ботом мы закончили. Переходим к docker.
Открываем наш файл docker-compose:
vi docker-compose.yml
И добавляем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
version: '3.9' ... alertmanager-bot: command: - --alertmanager.url=http://alertmanager:9093 - --log.level=info - --store=bolt - --bolt.path=/data/bot.db - --telegram.admin=573454381 - --telegram.token=5472129845:AAFTQRdujqIHgWHbbVtfYWQQvzvIN98KBqg image: metalmatze/alertmanager-bot:0.4.3 user: root ports: - 8080:8080 container_name: alertmanager-bot hostname: alertmanager-bot environment: TZ: "Europe/Moscow" restart: unless-stopped volumes: - ./data:/data networks: - default alertmanager: image: prom/alertmanager:v0.21.0 user: root ports: - 127.0.0.1:9093:9093 volumes: - ./alertmanager/:/etc/alertmanager/ container_name: alertmanager hostname: alertmanager environment: TZ: "Europe/Moscow" restart: unless-stopped command: - '--config.file=/etc/alertmanager/config.yml' - '--storage.path=/etc/alertmanager/data' networks: - default ... |
* мы добавили два сервиса — alertmanager-bot (телеграм бот для prometheus alertmanager) и alertmanager (система оповещений в prometheus).
Теперь открываем конфигурационный файл для prometheus:
vi prometheus/prometheus.yml
И добавим строки:
1 2 3 4 5 6 7 8 9 10 11 |
... rule_files: - 'alert.rules' alerting: alertmanagers: - scheme: http static_configs: - targets: - "alertmanager:9093" |
* в данном примере мы указали, что наш сервер мониторинга должен использовать в качестве системы оповещения alertmanager, который доступен по адресу alertmanager:9093. Также мы добавили файл alert.rules с описанием правил оповещения.
Создаем файл с правилами оповещения:
vi prometheus/alert.rules
1 2 3 4 5 6 7 8 9 10 11 |
groups: - name: test rules: - alert: PrometheusTargetMissing expr: up == 0 for: 0m labels: severity: critical annotations: summary: "Prometheus target missing (instance {{ $labels.instance }})" description: "A Prometheus target has disappeared. An exporter might be crashed. VALUE = {{ $value }} LABELS: {{ $labels }}" |
* в данном примере мы добавили правило, которое будет срабатывать при недоступности узла (node-exporter).
Переходим к конфигурированию alertmanager:
vi alertmanager/config.yml
1 2 3 4 5 6 7 8 |
route: receiver: 'alertmanager-bot' receivers: - name: 'alertmanager-bot' webhook_configs: - send_resolved: true url: 'http://alertmanager-bot:8080' |
* данная конфигурация позволяет отправлять оповещения с помощью webhook на сервис alertmanager-bot:8080 (наш телеграм бот для alertmanager).
Запускаем новые сервисы docker:
docker-compose up -d
Открываем браузер и переходим по адресу http://<IP-адрес сервера>:9090 — на вкладке Alerts мы должны увидеть нашу настройку:
Попробуем проверить работу оповещения. Отключаем наш node exporter:
docker stop exporter
На телеграм должно прийти оповещение:
Отправка уведомлений настроена.
Blackbox exporter
Переходим к настройке мониторинга http сервисов. В нашем примере мы будем проверять работу сайта test.ru.
Открываем наш файл docker-compose:
vi docker-compose.yml
Добавим в него:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
version: '3.9' services: ... blackbox: image: prom/blackbox-exporter container_name: blackbox hostname: blackbox ports: - 9115:9115 restart: unless-stopped command: - "--config.file=/etc/blackbox/blackbox.yml" volumes: - ./blackbox:/etc/blackbox environment: TZ: "Europe/Moscow" networks: - default ... |
* сервис blackbox является компонентом Prometheus для мониторинга сетевых сервисов по различным протоколам.
Открываем конфигурационный файл prometheus:
vi prometheus/prometheus.yml
И дописываем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
scrape_configs: ... - job_name: 'blackbox' metrics_path: /probe params: module: [http_2xx] static_configs: - targets: - https://www.test.ru relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: blackbox:9115 ... |
* подобная конфигурация позволит создать дополнительное задание мониторинга сайта https://www.test.ru.
Создаем конфигурационный файл blackbox:
vi blackbox/blackbox.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
modules: http_2xx: prober: http timeout: 5s http: valid_http_versions: ["HTTP/1.1", "HTTP/2.0"] valid_status_codes: [200] method: GET no_follow_redirects: true fail_if_ssl: false fail_if_not_ssl: false fail_if_body_matches_regexp: - "Could not connect to database" fail_if_body_not_matches_regexp: - "Download the latest version here" fail_if_header_matches: # Verifies that no cookies are set - header: Set-Cookie allow_missing: true regexp: '.*' fail_if_header_not_matches: - header: Access-Control-Allow-Origin regexp: '(\*|example\.com)' tls_config: insecure_skip_verify: false preferred_ip_protocol: "ip4" ip_protocol_fallback: false |
* во многом, данный пример взят с официальной страницы на Github.
Теперь откроем конфигурационный файл с описанием правил для предупреждений:
vi prometheus/alert.rules
Добавим:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
... - alert: BlackboxSlowProbe expr: avg_over_time(probe_duration_seconds[1m]) > 5 for: 1m labels: severity: warning annotations: summary: Blackbox slow probe (instance {{ $labels.instance }}) description: "Blackbox probe took more than 1s to complete\n VALUE = {{ $value }}\n LABELS = {{ $labels }}" - alert: BlackboxProbeHttpFailure expr: probe_http_status_code <= 199 OR probe_http_status_code >= 400 for: 0m labels: severity: critical annotations: summary: Blackbox probe HTTP failure (instance {{ $labels.instance }}) description: "HTTP status code is not 200-399\n VALUE = {{ $value }}\n LABELS = {{ $labels }}" |
* в данном примере мы создали два правила:
- BlackboxSlowProbe — предупреждать, если сайт открывается дольше 5 секунд.
- BlackboxProbeHttpFailure — реагировать, в случае получения кода ответа с ошибкой работы сайта (более 400).
Запускаем добавленный в докер сервис:
docker-compose up -d
Для визуализации мониторинга с помощью blackbox есть готовый дашборд в графане. Снова открываем страницу импорта:
Вводим идентификатор 7587 и выбираем источник (как делали при добавлении дашборда node exporter).