Есть рабочее окружение, которое включает в себя две 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"}
:
Готово.