Есть рабочее окружение, которое включает в себя две VMSS с Docker Swarm — на одной работают swarm-managers, на второй — swarm-workers:
В Master группе работает виртуальная машина с одним менеджером, в Nodes/Workers — три ВМ с воркерами.
Master находятся за одним Load Balancer, Nodes — за вторым.
Задача — собирать метрики со всех виртуальных машин.
[simterm]
root@hzwzatr7dzxp4000000:~# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 1tjrynfa1jl86e35clgd222s9 hzwzatr7dzxp4000000 Ready Active ai3040vw51jch7zikcx0mjy5c * hzwzatr7dzxp4000000 Ready Drain Leader 2m498rtdvl49enbz9luf96xfz hzwzatr7dzxp4000001 Ready Active sgd2si6637x14nemgrvoyhnlq hzwzatr7dzxp4000002 Ready Active
[/simterm]
Используем exporter_proxy.
Потребуется:
- на Менеджере и всех нодах запустить
node-exporter - на Менеджере запустить
exporter-proxy - добавить таргеты в Prometehus сервер
Содержание
Метрики Swarm Manager
Начинаем с менеджера.
Создаём конфиг prometheus-proxy-config.yml — это файл настроек самого прокси:
listen: "0.0.0.0:9099"
access_log:
path: "/dev/stdout"
format: "ltsv"
fields: ['time', 'time_nsec', 'status', 'size', 'reqtime_nsec', 'backend', 'path', 'query', 'method']
error_log:
path: "/dev/stderr"
exporters:
node_exporter:
url: "http://node-exporter:9100/metrics"
path: "/node_exporter/metrics"
Тут в строке url: "http://node-exporter:9100/metrics" указываем URL node-exporter в виде имени node-exporter, которое Compose разрезолвит в IP контейнера с node-exporter сервисом, после чего сервис exporter_proxy будет получать с него данные по порту 9100, и передавать «в мир» на порт 9099 (см. ниже) через URI node_exporter/metrics.
Добавляем Compose файл prometheus-client.yml с двумя сервисами — node-exporter и exporter_proxy:
version: '2'
networks:
prometheus:
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:
- prometheus
restart: always
prometheus-proxy:
image: rrreeeyyy/exporter_proxy
volumes:
- ./prometheus-proxy-config.yml:/etc/config.yml
ports:
- "9099:9099"
command:
- '-config=/etc/config.yml'
networks:
- prometheus
restart: always
Запускаем:
[simterm]
# docker-compose -f prometheus-client.yml up -d
[/simterm]
Проверяем работу прокси:
[simterm]
# curl -s localhost:9099/node_exporter/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"} 5.2499e-05
go_gc_duration_seconds{quantile="0.25"} 5.2499e-05
go_gc_duration_seconds{quantile="0.5"} 5.2499e-05
go_gc_duration_seconds{quantile="0.75"} 5.2499e-05
go_gc_duration_seconds{quantile="1"} 5.2499e-05
go_gc_duration_seconds_sum 5.2499e-05
go_gc_duration_seconds_count 1
# HELP go_goroutines Number of goroutines that currently exist.
[/simterm]
Тут мы в URI добавляем /node_exporter/, что бы exporter_proxy вернул нам метрики от контейнера с именем node-exporter.
Всё хорошо — метрики отдаёт.
Настройка Prometeus сервера
Теперь добавляем этот прокси в самом Prometheus сервере.
Azure Load Balancer rules
Открываем порт 9090 на фаерволе:
Добавляем probe (для Azure VMSS only):
И правило на Load Balancer:
Проверяем доступ с сервера мониторинга:
[simterm]
# curl -s jm-website.westeurope.cloudapp.azure.com:9099/node_exporter/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"} 2.1499e-05
go_gc_duration_seconds{quantile="0.25"} 2.2e-05
go_gc_duration_seconds{quantile="0.5"} 2.3999e-05
go_gc_duration_seconds{quantile="0.75"} 4.76e-05
go_gc_duration_seconds{quantile="1"} 5.3298e-05
go_gc_duration_seconds_sum 0.000355693
go_gc_duration_seconds_count 11
# HELP go_goroutines Number of goroutines that currently exist.
[/simterm]
Переходим к настройкам Prometheus сервера — в /etc/prometheus/prometheus.yml добавляем job_name: ‘jm-website-qa’ и таргет jm-website.westeurope.cloudapp.azure.com:9099:
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'jm-dev-monitor'
rule_files:
- "alert.rules"
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: 'jm-website-qa'
static_configs:
- targets:
- jm-website.westeurope.cloudapp.azure.com:9099
labels:
__metrics_path__: /node_exporter/metrics
name: jm-website-qa-node
...
Через __metrics_path__ — указываем путь к «бекенду», т.е. имя ноды.
Проверяем:
Всё найс!
Метрики Swarm Workers
ОК, возвращаемся к Swarm, и запускаем node-exporter на трёх воркерах (сейчас експортер запущен только на менеджере) из простого compose worker-node-exporter.yml:
version: '2'
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
Стартуем:
[simterm]
$ docker-compose -f worker-node-exporter.yml up -d
[/simterm]
Повторяем на всех воркерах.
Переходим к хосту менеджера, обновляем файл настроек прокси prometheus-proxy-config.yml — добавляем три воркера, через их IP:
X
listen: "0.0.0.0:9099"
access_log:
path: "/dev/stdout"
format: "ltsv"
fields: ['time', 'time_nsec', 'status', 'size', 'reqtime_nsec', 'backend', 'path', 'query', 'method']
error_log:
path: "/dev/stderr"
exporters:
master_exporter:
url: "http://node-exporter:9100/metrics"
path: "/master_exporter/metrics"
worker_1_exporter:
url: "http://192.168.0.4:9100/metrics"
path: "/worker_1_node_exporter/metrics"
worker_2_exporter:
url: "http://192.168.0.5:9100/metrics"
path: "/worker_2_node_exporter/metrics"
worker_3_exporter:
url: "http://192.168.0.6:9100/metrics"
path: "/worker_3_node_exporter/metrics"
Запускаем:
[simterm]
# docker-compose -f prometheus-client.yml up -d
[/simterm]
Проверяем:
[simterm]
# curl -s localhost:9099/worker_1_node_exporter/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"} 2.8299e-05
go_gc_duration_seconds{quantile="0.25"} 3.2999e-05
go_gc_duration_seconds{quantile="0.5"} 3.6798e-05
go_gc_duration_seconds{quantile="0.75"} 4.21e-05
go_gc_duration_seconds{quantile="1"} 8.0999e-05
go_gc_duration_seconds_sum 0.003193038
go_gc_duration_seconds_count 78
# HELP go_goroutines Number of goroutines that currently exist.
[/simterm]
И на сервере мониторинга — добавляем ещё три таргета:
...
- job_name: 'jm-website-qa'
static_configs:
- targets:
- jm-website.westeurope.cloudapp.azure.com:9099
labels:
__metrics_path__: /master_exporter/metrics
name: jm-website-qa-manager
- targets:
- jm-websitep.westeurope.cloudapp.azure.com:9099
labels:
__metrics_path__: /worker_1_node_exporter/metrics
name: jm-website-qa-worker-1
- targets:
- jm-website.westeurope.cloudapp.azure.com:9099
labels:
__metrics_path__: /worker_2_node_exporter/metrics
name: jm-website-qa-worker-2
- targets:
- jm-website.westeurope.cloudapp.azure.com:9099
labels:
__metrics_path__: /worker_3_node_exporter/metrics
name: jm-website-qa-worker-3
...
Проверяем:
И графики метрики up по запросу up{job="jm-website-qa"}:
Готово.






