Prometheus: exporter_proxy – мониторинг сервисов в приватной сети

Автор: | 11/12/2017
 

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

Потребуется:

  1. на Менеджере и всех нодах запустить node-exporter
  2. на Менеджере запустить exporter-proxy
  3. добавить таргеты в 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"}:

Готово.