Пример установки и настройки минимального мониторинга, чисто ознакомительного.
Используем Pormetheus для сбора метрик, Alertmanager для отправки сообщений о проблемах, cAdvisor для сбора метрик из Docker, node-exporter для сбора метрик с виртуальной машины и Grafana — для визуализации собранных данных, а запускать всё будем из Docker Compose.
Все получившиеся в результате конфиги можно посмотреть в репозитории.
На хосте мониторинга, prometheus-server, будут:
- сам promeheus сервер
- grafana
- node-exporter
- cadvisor
- alertmanager
Хост, который будем мониторить, prometheus-client:
- node-exporter
- cadvisor
Далее выполним настройку первого стека для Prometheus:
- запустим две ВМ — сервер и «клиент»
- на сервере выполним установку NGINX
- установку Docker и Docker Compose
- создадим Compose файл для запуска Prometheus сервера
- добавим Grafana
- настроим NGINX для проксирования трафика к Grafana и Prometheus
- добавим node-exporter, cAdvisor и Alertmanager
- добавим дашборды в Grafana
- и алерты в Alertmanager с отправкой уведомлений на почту
Второй Compose для клиента будет включать в себя:
- cAdvisor
- node-exporter
Вроде всё? Поехали.
Содержание
Virtualbox
Делать всё будем в Virtualbox, запускаем две машины, сначала сервер:
[simterm]
$ VBoxManage createvm --name "prometheus-server" --register Virtual machine 'prometheus-server' is created and registered. UUID: 351d503f-3790-4d94-be12-6cf0c295234d Settings file: '/home/setevoy/VirtualBox VMs/prometheus-server/prometheus-server.vbox'
[/simterm]
Меняем настройки сети машины — устанавливаем сетевой интерфейс в bridge и включаем его:
[simterm]
$ VBoxManage modifyvm "prometheus-server" --nic1 bridged --bridgeadapter1 enp0s25 --nictype1 82540EM --cableconnected1 on
[/simterm]
Указываем тип ОС:
[simterm]
$ VBoxManage modifyvm "prometheus-server" --ostype Debian_64
[/simterm]
Создаём диск:
[simterm]
$ cd /home/setevoy/VirtualBox\ VMs/prometheus-server/ $ VBoxManage createhd --filename prometheus-server.vdi --size 10000
[/simterm]
Добавляем IDE контроллер к машине:
[simterm]
$ VBoxManage storagectl "prometheus-server" --name "IDE Controller" --add ide
[/simterm]
Подключаем диск:
[simterm]
$ VBoxManage storageattach "prometheus-server" --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium prometheus-server.vdi
[/simterm]
Устанавливем 2 гига памяти:
[simterm]
$ VBoxManage modifyvm prometheus-server --memory 2048
[/simterm]
Подключаем ISO с Debian:
[simterm]
$ VBoxManage storageattach "prometheus-server" --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium /home/setevoy/OS/debian-9.2.1-amd64-netinst.iso
[/simterm]
Запускаем машину:
[simterm]
$ VBoxManage startvm prometheus-server
[/simterm]
Аналогично — создаём машину prometheus-client, устанавливаем ОС:
Подготовка
Обвновляем всё на обоих хостах, сервере и клиенте:
[simterm]
# apt update && apt upgrade
[/simterm]
На сервере устанавливаем NGINX:
[simterm]
# apt install -y nginx curl vim
[/simterm]
На сервере и клиенте устанавливаем Docker:
[simterm]
# curl https://get.docker.com/ | bash
[/simterm]
И Docker Compose:
[simterm]
# curl -o /usr/local/bin/docker-compose -L "https://github.com/docker/compose/releases/download/1.17.1/docker-compose-$(uname -s)-$(uname -m)" # chmod +x /usr/local/bin/docker-compose
[/simterm]
На хосте, на котором запущены обе виртуальные машины (рабочий ноут) — добавим две записи в /etc/hosts:
[simterm]
13:08:58 [setevoy@setevoy-arch-work ~] $ sudo sh -c "echo '10.11.100.166 prometheus-server.local' >> /etc/hosts" 13:10:12 [setevoy@setevoy-arch-work ~] $ sudo sh -c "echo '10.11.100.167 prometheus-client.local' >> /etc/hosts"
[/simterm]
Prometheus стек
Prometheus сервер
Теперь можно приступать к запуску сервисов, начинаем с хоста prometheus-server.local, клиент настроим в самом конце.
Создаём каталоги для хранения данных:
[simterm]
# mkdir -p /data/monitoring/{prometheus-server,grafana}
[/simterm]
Первым запустим сам Prometheus сервер, создаём Compose файл:
version: '3.3'
networks:
prometheus:
services:
prometheus:
image: prom/prometheus
volumes:
- /data/monitoring/prometheus-server/:/prometheus/
networks:
- prometheus
restart: always
Запускаем его:
[simterm]
# docker-compose -f prometheus-server.yml up -d
[/simterm]
С хоста проверяем:
[simterm]
$ curl -s prometheus-server.local:9090/metrics | head -5
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 1.1956e-05
go_gc_duration_seconds{quantile="0.25"} 1.4028e-05
go_gc_duration_seconds{quantile="0.5"} 1.9393e-05
[/simterm]
Grafana
В этот же compose файл добавляем Grafana:
version: '3.3'
networks:
prometheus:
services:
prometheus:
image: prom/prometheus
ports:
- 9090:9090
volumes:
- /data/monitoring/prometheus-server:/prometheus
networks:
- prometheus
restart: always
grafana:
image: grafana/grafana
ports:
- 3000:3000
volumes:
- /data/monitoring/grafana:/var/lib/grafana
depends_on:
- prometheus
environment:
- GF_SECURITY_ADMIN_PASSWORD=password
- GF_SECURITY_ADMIN_USER=admin
networks:
- prometheus
restart: always
Запускаем:
[simterm]
# docker-compose -f prometheus-server.yml up -d
[/simterm]
Проверяем данные в каталогах:
[simterm]
root@prometheus-server:/home/setevoy# ls -l /data/monitoring/prometheus-server/ total 8 -rw------- 1 nobody nogroup 2 Dec 6 06:51 lock drwxr-xr-x 2 nobody nogroup 4096 Dec 6 06:51 wal root@prometheus-server:/home/setevoy# ls -l /data/monitoring/grafana/ total 116 -rw-r--r-- 1 _apt crontab 109568 Dec 6 06:51 grafana.db drwxr-xr-x 2 _apt crontab 4096 Dec 6 06:51 plugins
[/simterm]
Проверяем Grafana:
[simterm]
$ curl -s prometheus-server.local:3000 <a href="/login">Found</a>.
[/simterm]
И проверяем в браузере:
Настройка NGINX
Создаём файл настроек для NGINX — /etc/nginx/conf.d/prometheus-server.local.conf:
upstream prometheus {
server 127.0.0.1:9090;
}
upstream grafana {
server 127.0.0.1:3000;
}
server {
server_name prometheus-server.local;
access_log /var/log/nginx/prometheus-server.local-access.log;
error_log /var/log/nginx/prometheus-server.local-error.log notice;
root /var/www/prometheus-server.local;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://grafana$request_uri;
}
location /prometheus {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://prometheus$request_uri;
}
}
Перезапускаем NGINX:
[simterm]
# nginx -t && systemctl reload nginx.service nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
[/simterm]
Проверяем:
[simterm]
$ curl -IL prometheus-server.local HTTP/1.1 302 Found Server: nginx/1.10.3 Date: Wed, 06 Dec 2017 12:09:40 GMT Content-Type: text/plain; charset=utf-8 Connection: keep-alive Location: /login Set-Cookie: grafana_sess=46ed2a5654376404; Path=/; HttpOnly Set-Cookie: redirect_to=%252F; Path=/ HTTP/1.1 200 OK Server: nginx/1.10.3 Date: Wed, 06 Dec 2017 12:09:40 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive Set-Cookie: grafana_sess=8058cc8cff393de5; Path=/; HttpOnly
[/simterm]
Что бы получить доступ к Prometheus — обновляем его параметры в Compose файле и добавляем два параметра — --config.file и --web.external-url:
...
prometheus:
image: prom/prometheus
ports:
- 9090:9090
volumes:
- /data/monitoring/prometheus-server:/prometheus
networks:
- prometheus
restart: always
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--web.external-url=http://prometheus-server.local/prometheus'
...
Перезапускаем сервисы, проверяем доступ к Prometheus:
[simterm]
$ curl -L prometheus-server.local/prometheus/
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Prometheus Time Series Collection and Processing Server</title>
...
[/simterm]
конфиг prometheus.yml
Добавляем файл настроек для Prometheus.
Создаём файл на хосте, и мапим его в контейнер.
Добавляем каталог:
[simterm]
# mkdir /etc/prometheus
[/simterm]
Создаём файл /etc/prometheus/prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'monitoring'
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
Пока мы тут собираем метрики только с самого Prometheus сервера, позже добавим сбор с node-exporter и cAdvisor.
Обновляем Compose файл — добавляем маппинг файла в контейнер:
...
prometheus:
image: prom/prometheus
ports:
- 9090:9090
volumes:
- /data/monitoring/prometheus-server:/prometheus
- /etc/prometheus/:/etc/prometheus/
...
Перезапускаем сервисы, и получаем ошибку 404 в Targets:
[simterm]
# curl http://127.0.0.1:9090/metrics 404 page not found
[/simterm]
То ошибка воспроизводится.
Почему? Потому что в NGINX путь проксируется через location /prometheus:
...
location /prometheus {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://prometheus$request_uri;
}
...
Соответственно, что бы получить доступ к метрикам самого Prometheus сервера — необходимо добавить этот location в URL:
[simterm]
# curl -s http://127.0.0.1:9090/prometheus/metrics | head -5
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 1.0783e-05
go_gc_duration_seconds{quantile="0.25"} 1.4825e-05
go_gc_duration_seconds{quantile="0.5"} 1.6093e-05
[/simterm]
Что бы реализовать это обновление URL с метриками — используем relabeling.
Обновляем /etc/prometheus/prometheus.yml и добавляем relabel_configs:
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'monitoring'
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets:
- 127.0.0.1:9090
relabel_configs:
- target_label: __metrics_path__
replacement: /prometheus/metrics
Тут мы меняем значение __metrics_path__ со значения по умолчанию (/metrics) на /prometheus/metrics. Хорошая схема того, как применяются лейблы есть тут>>>.
Перезапускаем — всё ОК:
Другой способ переопределить __metrics_path__ — указать его в labels самого target, а не выносить в relabel_configs:
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'monitoring'
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets:
- 127.0.0.1:9090
labels:
__metrics_path__: /prometheus/metrics
node-exporter
Прежде чем приступить к добавлению дашбордов в Grafana — добавим node-exporter в стек Prometheus, что бы получать метрики о работе самого хоста мониторинга.
Возвращемся к compose-файлу, и добавляем експортёр:
...
node-exporter:
image: prom/node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
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
networks:
- prometheus
restart: always
Перезапускаем сервисы, проверяем:
[simterm]
# curl -s localhost:9100/metrics | head
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0
go_gc_duration_seconds{quantile="0.25"} 0
go_gc_duration_seconds{quantile="0.5"} 0
go_gc_duration_seconds{quantile="0.75"} 0
go_gc_duration_seconds{quantile="1"} 0
go_gc_duration_seconds_sum 0
go_gc_duration_seconds_count 0
# HELP go_goroutines Number of goroutines that currently exist.
[/simterm]
Заодно — обновим имена контейнеров в prometheus-server.yml, полностью сейчас он выглядит так:
version: '3.3'
networks:
prometheus:
services:
prometheus-server:
image: prom/prometheus
ports:
- 9090:9090
volumes:
- /data/monitoring/prometheus-server:/prometheus
- /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
depends_on:
- node-exporter
networks:
- prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--web.external-url=http://prometheus-server.local/prometheus'
restart: always
grafana:
image: grafana/grafana
ports:
- 3000:3000
volumes:
- /data/monitoring/grafana:/var/lib/grafana
depends_on:
- prometheus-server
environment:
- GF_SECURITY_ADMIN_PASSWORD=password
- GF_SECURITY_ADMIN_USER=admin
networks:
- prometheus
restart: always
node-exporter:
image: prom/node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
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
networks:
- prometheus
restart: always
Обновляем /etc/prometheus/prometheus.yml и добавляем ещё один таргет в job-name "prometheus":
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'monitoring'
scrape_configs:
- job_name: 'prometheus-server'
static_configs:
- targets:
- prometheus-server:9090
labels:
__metrics_path__: /prometheus/metrics
name: prometheus-server
- targets:
- node-exporter:9100
labels:
name: node-exporter
Запускаем стек — проверяем:
[simterm]
# docker-compose -f prometheus-server.yml up -d Starting setevoy_node-exporter_1 ... Starting setevoy_node-exporter_1 ... done Creating setevoy_prometheus-server_1 ... Creating setevoy_prometheus-server_1 ... done Recreating setevoy_grafana_1 ... Recreating setevoy_grafana_1 ... done
[/simterm]
Настройка Grafana
Основные моменты описаны в посте Prometheus: Ansible, NGINX и Grafana dashboard — и тут особо ничего не меняется (кроме того, что в текущем примере не используется HTTP авторизация на NGINX).
Добавляем data source:
В качестве URL указываем имя сервиса из нашего Compose файла — контейнер с Grafana разрезолвит его в IP контейнера с Prometheus.
Добавляем дашборд, например Prometheus system:
Проверяем:
cAdvisor
Возвращаемся к Prometheus.
Далее — добавим cAdvisor для получения метрик из Docker.
Примечание: Docker недавно включил поддержку метрик Prometheus, но в настоящий момент эта возможность ещё «Warning: The available metrics and the names of those metrics are in active development and may change at any time.», потому на момент написания поста — используем cAdvisor.
См. https://docs.docker.com/engine/admin/prometheus/
Обновляем compose файл, добавляем контейнер с cAdvisor:
...
cadvisor:
image: google/cadvisor
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- 8080:8080
networks:
- back-tier
restart: always
deploy:
mode: global
Перезапускаем стек, проверяем:
[simterm]
# curl -s localhost:8080/metrics | head
# HELP cadvisor_version_info A metric with a constant '1' value labeled by kernel version, OS version, docker version, cadvisor version & cadvisor revision.
# TYPE cadvisor_version_info gauge
cadvisor_version_info{cadvisorRevision="17543be",cadvisorVersion="v0.25.0",dockerVersion="17.11.0-ce",kernelVersion="4.9.0-4-amd64",osVersion="Alpine Linux v3.4"} 1
# HELP container_cpu_system_seconds_total Cumulative system cpu time consumed in seconds.
# TYPE container_cpu_system_seconds_total counter
container_cpu_system_seconds_total{id="/"} 97.88
container_cpu_system_seconds_total{id="/docker"} 13.87
container_cpu_system_seconds_total{id="/init.scope"} 0.36
container_cpu_system_seconds_total{id="/system.slice"} 38.49
container_cpu_system_seconds_total{id="/system.slice/avahi-daemon.service"} 0.91
[/simterm]
cAdvisor так же имеет собственный вебинтерфейс, открываем в браузере http://prometheus-server.local:8080/containers/:
Обновляем /etc/prometheus/prometheus.yml, добавляем ещё один таргет — cadvisor:8080:
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'monitoring'
scrape_configs:
- job_name: 'prometheus-server'
static_configs:
- targets:
- prometheus-server:9090
labels:
__metrics_path__: /prometheus/metrics
name: prometheus-server
- targets:
- node-exporter:9100
labels:
name: node-exporter
- targets:
- cadvisor:8080
labels:
name: cAdvisor
Перезапускаем, проверяем:
Добавляем ещё один дашбоард в Grafana, например — Docker and system monitoring:
Alertmanager
Теперь добавляем Alertmanager.
Документация — тут>>>.
Сздаём каталог для настроек:
[simterm]
# mkdir /etc/alertmanager
[/simterm]
Создаём файл настроек /etc/alertmanager/config.yml:
global:
smtp_smarthost: 'smtp.sendgrid.net:25'
smtp_from: 'root@localhost'
smtp_auth_username: 'username'
smtp_auth_password: 'password'
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 30s
repeat_interval: 1h
receiver: jm-alerts
routes:
- match:
job: prometheus
receiver: jm-alerts
repeat_interval: 1h
receivers:
- name: 'jm-alerts'
email_configs:
- to: '[email protected]'
Обновляем prometheus-server.yml:
...
alertmanager:
image: prom/alertmanager
ports:
- 9093:9093
volumes:
- /etc/alertmanager/:/etc/alertmanager/
networks:
- prometheus
restart: always
command:
- '-config.file=/etc/alertmanager/config.yml'
- '-storage.path=/alertmanager'
В файл настроек Prometheus добавляем alerting (до Prometheus 1.4 алертменеджер указывался через --alermanager.url):
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'monitoring'
scrape_configs:
- job_name: 'prometheus-server'
static_configs:
- targets:
- prometheus-server:9090
labels:
__metrics_path__: /prometheus/metrics
name: prometheus-server
- targets:
- node-exporter:9100
labels:
name: node-exporter
- targets:
- cadvisor:8080
labels:
name: cAdvisor
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
В каталоге /etc/prometheus/ создаём файл alert.rules:
groups:
- name: example
rules:
- alert: high_load
expr: node_load1 > 0.0
for: 1s
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} under high load"
description: "{{ $labels.instance }} of job {{ $labels.job }} is under high load."
expr: node_load1 > 0.0 в течении 1 секунды (for: 1s) — используем 0.0 Load Avarage для проверки, потом можно указать адекватное значение.
Документация по правилам — тут>>>.
Обновляем файл настроек Prometheus — /etc/prometheus/prometheus.yml — добавляем rule_files и путь (относительно самого prometheus.yml) к файлу alert.rules:
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'monitoring'
rule_files:
- "alert.rules"
...
Запускаем, проверяем:
(мне нравится этот «Firing!» 🙂 )
И проверяем логи:
alertmanager_1 | level=error ts=2017-12-07T12:29:31.665200988Z caller=notify.go:302 component=dispatcher msg=»Error on notify» err=»dial tcp 159.122.219.43:25: getsockopt: connection refused»
alertmanager_1 | level=error ts=2017-12-07T12:29:31.665591597Z caller=dispatch.go:266 component=dispatcher msg=»Notify for alerts failed» num_alerts=1 err=»dial tcp 159.122.219.43:25: getsocko
pt: connection refused»
Упс… Это «приколы» сети в офисе — все почтовые порты закрыты. Но Alertmanager письма вроде отправляет — всё хорошо.
Alert для Docker сервисов
Раз всё работает (ну, почту ещё всё же проверить) — попробуем добавить правило для отправки уведомления при падении конкретного контейнера, например nginx_service.
Запускаем новый контейнер:
[simterm]
# docker run -tid -p 8081:80 --name nginx_service nginx 65d38787c356c846bb635f4bd66c6fa96e41e4a08a0b6d48116996cbf70f88e8
[/simterm]
Обновляем /etc/prometheus/alert.rules:
...
- alert: nginx_service_down
expr: absent(container_last_seen{exported_name="nginx_service"})
for: 1s
annotations:
summary: "Instance {{ $labels.instance }} is down"
description: "{{ $labels.instance }} of job {{ $labels.job }} is down."
...
Проверяем алерты:
Убиваем контейнер nginx_service:
[simterm]
# docker kill nginx_service nginx_service
[/simterm]
Ждём до 15 секунд (scrape_interval), и получаем алерт:
Мониторинг удалённого хоста
В целом на самом сервере мониторинга всё готово.
Последний штрих — добавить мониторинг удалённой ВМ и сервисов на ней.
На виртуалке prometheus_client — создаём compose файл prometheus-client.yml с сервисами:
version: '3.3'
networks:
nginx:
monitoring:
services:
node-exporter:
image: prom/node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
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
networks:
- monitoring
restart: always
cadvisor:
image: google/cadvisor
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- 8080:8080
networks:
- monitoring
restart: always
nginx:
image: nginx
ports:
- 80:80
networks:
- nginx
restart: always
Запускаем:
[simterm]
# docker-compose -f prometheus-client.yml up -d Starting setevoy_node-exporter_1 ... Starting setevoy_nginx_1 ... Starting setevoy_node-exporter_1 Starting setevoy_cadvisor_1 ... Starting setevoy_nginx_1 Starting setevoy_nginx_1 ... done
[/simterm]
Возвращаемся к файлу /etc/prometheus/prometheus.yml на хосте мониторинга и добавляем ещё одну job:
...
scrape_configs:
- job_name: 'prometheus-server'
static_configs:
- targets:
- prometheus-server:9090
labels:
__metrics_path__: /prometheus/metrics
name: prometheus-server
- targets:
- node-exporter:9100
labels:
name: node-exporter
- targets:
- cadvisor:8080
labels:
name: cAdvisor
- job_name: 'prometheus-client'
static_configs:
- targets:
- 10.11.100.167:9100
labels:
name: client-node-exporter
- targets:
- 10.11.100.167:8080
labels:
name: client-cAdvisor
...
Перезапускаем Prometheus стек, проверяем:
В /etc/prometheus/alert.rules добавляем алерт ClientInstanceDown:
groups:
- name: server
rules:
- alert: high_load
expr: node_load1 > 0.0
for: 1s
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} under high load"
description: "{{ $labels.instance }} of job {{ $labels.job }} is under high load."
- alert: nginx_service_down
expr: absent(container_last_seen{exported_name="nginx_service"})
for: 1s
annotations:
summary: "Instance {{ $labels.instance }} is down"
description: "{{ $labels.instance }} of job {{ $labels.job }} is down."
- name: client
rules:
- alert: ClientInstanceDown
expr: up{job="prometheus-client"} == 0
for: 1s
annotations:
summary: "Instance {{ $labels.instance }} is down"
description: "{{ $labels.instance }} of job {{ $labels.job }} is down."
Проверяем:
Останавливаем полностью вторую виртуалку:
[simterm]
$ VBoxManage controlvm prometheus-client poweroff soft 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
[/simterm]
И смотрим алерты:
Ссылки по теме
Примечание: в большинстве ссылок используется синтаксис для Prometheus 1.*, тогда как в этом посте используется Prometheus 2.* — имейте ввиду.
Prometheus
Monitoring Docker Services with Prometheus
Prometheus Monitoring with Grafana
Scraping application metrics with Prometheus
Monitoring a Docker Swarm Cluster with Prometheus (наверно — лучший пост по теме, который я нагугливал)
How to Setup Monitoring for Docker Containers using Prometheus
Bringing the light of monitoring with Prometheus
Monitoring in Docker Stacks — It’s that easy with Prometheus!
Docker Container and Host Monitoring, Logging (& Alerting) in a Box
Configuring Prometheus Alertmanager
Примеры файлов
vegasbrianc/prometheus/prometheus.yml
vegasbrianc/prometheus/docker-compose.yml
prometheus/prometheus/conf.good.yml
prometheus/alertmanager/simple.yml



















