Система мониторинга


Система мониторинга

Установка системы

Перед началом установки убедитесь что у вас установлены последние версии Docker и Docker-Compose.
Подготовьте рабочую директорию (например /home/monitoring) и скачайте в неё файл-установщик start (файл необходимо запросить в компании Стек).

Данный скрипт разработан для быстрого старта и выполянет следующие процедуры:
- Проверяет и устанавливает все пакеты, требуемые для работы с docker
- Собирает все что потребуется для работы в рамках этого проекта
- После выполнения первых двух пунктов, появляется меню запуска (остановки) проекта

Сделайте этот файл исполняемым с помощью команды:

chmod +x /home/monitoring/start

Запустите данный файл, выполнив:

bash /home/monitoring/start  

Появится меню опций, выбираем "1. Сборка проекта" и переходим к выбору сборки.

Выбор сборки


Информация по сборкам:

Сборка №1 - позволяет подключить следующие сервисы к основному проекту:

  • Prometheus
  • Grafana
  • node-exporter
  • cAdvisor
  • loki
  • promtail
  • PushGateway*

Сборка №2 - позволяет подключить следующие сервисы к основному проекту:

  • Prometheus
  • Grafana
  • node-exporter
  • cAdvisor
  • postgres-exporter
  • pgbouncer-exporter
  • PushGateway

Сборка №3 - позволяет подключить следующие сервисы к основному проекту:

  • Prometheus
  • Grafana
  • node-exporter
  • cAdvisor
  • nginx-exporter
  • rabbitmq-exporter
  • PushGateway

Полная сборка - сборка влючает все компоненты предыдущих сборок.


После выбора одного из вариантов сборки программа подготовит все необходимые файлы для дальнейшей работы.
При этом необходимо заполнить параметры файла .env согласно вашим настройкам системы (пример ниже):

.env

Примечание

В строке R_HOST если указываете не IP-адрес, а имя, то оно не должно содержать символ "_" (подчеркивание)

и, при необходимости, внести изменения в файл docker-compose.yml (он создается автоматически в директории проекта, в нашем случае это /home/monitoring/) - изменить внешние порты для контейнеров, если они уже задействованы где-то в других проектах (в нашем случае порты 8080 и 3000 уже заняты под другие проекты, поэтому мы поменяли их на 8087 и 3010 соответственно):

.env

Запустите файл start, появится новое меню, выберите "1. Запустить проект", в ходе чего будут созданы необходимые контейнеры:

start

Проверить список запущенных контейнеров можно при помощи команды:

docker ps

Остановить проект можно также запустив файл start и выбрав в меню опций "1. Остановить проект":

start


Работа в системе

Теперь нам доступна система мониторинга, которая позволит протестировать стек на предмет соответствия нашим потребностям. Для этого будем использовать инструмент мониторинга Grafana (платформа для визуализации, мониторинга и анализа данных).

Панель инструментов Grafana доступна через: http://<указать_IP-Address_хоста>:3000 (например: http://172.17.138.180:3000open in new window)

В левой боковой панели выберем Dashboards:

start

Дашборд — набор отдельных панелей, размещенных в сетке с набором переменных. Например, имя сервера или приложения.
Для каждой версии сборки предустанавливается свой стандартный набор дашбордов.  
Дашборды, которые включены в любую версию сборки:
    - Docker Containers
    - Docker Host
    - Docker Prometheus Monitoring
    - Storage I/O Statistics  

У нас отразится список всех созданных дашбордов:

start

Например, в дашборд Docker Containers сможем посмотреть список запущенных контейнеров, насколько они загружают процессор, память, сеть.

start


Расширенная документация

(Предполагается, что у нас уже устанволены последние версии Docker, Docker-Compose и установлена система мониторинга в директории /home/monitoring)


A Prometheus & Grafana docker-compose stack


Ниже приведено описание использования Play-With-Docker (PWD) для запуска стека Monitoring, содержащего:

  1. cAdvisor
  2. node-exporter
  3. postgres-exporter
  4. pgbouncer-exporter
  5. rabbitmq-exporter
  6. nginx-exporter
  7. grafana
  8. spring-boot
  9. alertmanager
  10. pushgateway
  11. loki
  12. promtail
  13. prometheus

Pre Running
Для сбора метрик требуется добавить (изменить) параметры в файл /home/monitoring/config/prometheus.yml

  • В блоке rule_files добавим файлы с правилами, при которых будет вызываться alert на инциденты, возникающие в тех или иных случаях, в зависимости от описания (пример ниже):

    rule_files:
      - 'alert.rules'
      - 'rabbitmq.rules'
      - 'google-cAdvisor.rules'
      - 'node-exporter.rules'
      - 'postgres_exporter.rules'
      - 'pgbouncer-exporter.rules'
      - 'nginx.rules'
    
  • В блоке scrape_configs мы описываем наши задачи по сбору метрик (пример ниже на рисунке), где:
    - job_name: название задачи (например, nginx)
    - scrape_interval: интервал времени, в пределах которого будет происходить обновление данных
    - static_configs - механизм распознания цели (таргета), он может быть динамическим или статическим:

    • динамический - по умолчанию есть только одно задание prometheus, опрашивает порт 9090 localhost'a для полученеия метрик состояния самого сервера.

    • статический - указываем несколько заданий через targets (можем указать ip-адрес с портом или указать доменое имя необходимого ресурса, также через запятую можем указать несколько ip-адресов если таргетов несколько)
      Примечание: Сам блок targets поддерживает labels (метки) для удобства определения метрик по группам, если их много. Если потребуется можно добавить alias(синонимы)

      - job_name: 'nginx'
        scrape_interval: 60s
        metrics_path: '/metrics'
        static_configs:
          - targets: ['172.17.138.180:9113', '172.17.138.180:9114', '172.17.138.180:9118']
            labels:
              group: 'nginx-group'
              alias: nginx-1
      

Pushgateway


Pushgateway - Prometheus использует Pushgateway для отчетности и сбора данных.

Сценарии использования Pushgateway:

  1. Prometheus использует режим вытягивания по времени. Может быть невозможно напрямую получить данные индикатора каждой цели из-за причин подсети или брандмауэра. В настоящее время вы можете использовать каждую цель для передачи данных в PushGateway, а затем Prometheus для регулярного включения PushGateway
  2. При мониторинге различных бизнес-данных необходимо коллективно суммировать различные бизнес-данные

Перейдем к настройкам: добавим точку взаимодействия между Prometheus и Pushgateway. Для этого нужно загрузить пользовательские данные мониторинга через Pushgateway, после собрать эти данные через Prometheus для мониторинга. Затем добавим Pushgateway к целевой задаче Prometheus в prometheus.yml:

- job_name: 'pushgateway'
  scrape_interval: 10s
  honor_labels: true
  static_configs:
    - targets: ['pushgateway:9091']
      labels:
        alias: pushgateway

После завершения настройки перезапустите контейнер Prometheus:

docker-compose restart prometheus

Была протестированная работа хранения данных в Pushgateway, используя метод API Push-данные для Pushgateway.

API

Выполним команду для добавления метрик:

 echo "test_metric 123456" | curl --data-binary @- http:/<указать_IP-адрес_хоста>:9091/metrics/job/test_job  

После завершения выполнения обновите страницу пользовательского интерфейса PushGateway (http://<указать_IP-Address_хоста>:9091 (например: http://172.17.138.180:9091open in new window) ), у нас отразятся недавно добавленные test_metric. Помимо test_metric отразится push_time_seconds и push_failure_time_seconds (они являются связанными индикаторами , автоматически генерируемыми системой Pushgateway)

start

На этом этапе мы можем запросить индикатор на странице пользовательского интерфейса Prometheus (для этого в браузере перейдем по ссылке: http://<указать_IP-Address_хоста>:9090 (например: http://172.17.138.180:9090open in new window))

test_metric

start

push_time_seconds

start

push_failure_time_seconds

start

Если нужно удалить определенный индикатор, можем запустить удаление с помощью метода API. Например удалить job="test_job" для всех значений индекса в группе можно выполнив следующую команду:

curl -X DELETE http://172.17.138.180:9091/metrics/job/test_job

Также можно удалить запись индикатора на странице интерфейса PushGateway. Нажмите кнопку Delete Group чтобы удалить.

start


PGbouncer-exporter


pgbouncer-exporter - можно использовать для создания своего модуля pgbouncer внутри контейнера или подключаться на существующий pgbouncer (обе реализации есть, но описания в docker-compose разные, требуется перед эксплуатацией определиться с подходом). В переменных средах окружения добавлены новые переменные. В контейнер прокинем (используем volumes) наш конфиг с настройками подключения (можно использовать формат yml или ini для подключения конфига внутри контейнера, так же можно инициализировать кластер (создав поддержку multiple pgbouncer instances), указав два dsn для подключения к pgbouncer). Как это сделать можно прочитать здесьopen in new window

Для сбора метрик в Prometheus требуется добавить новую job в файл prometheus.yml:

- job_name: 'pgbouncer-exporter'
  metrics_path: '/metrics'
  honor_labels: true
  scrape_interval: 30s
  scrape_timeout: 10s
  static_configs:
    - targets: ['pgbouncer-exporter:9100']
      labels:
        alias: pgbouncer

В тот же файл подключим наш alert для pgbouncer-exporter

rule_files:
  - 'prometheus-pgbouncer-exporter.rules'

Node-exporter


Данный экспортер используется для сбора метрик с оборудования и ОС, предоставляемых ядрами *NIX, написанный на Go с подключаемыми сборщиками метрик.
Так как мы используем docker compose, там же определяем что именно будем собирать и с каких ресурсов, указав это через конструкцию command:

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)($$|/)"

Проверим что получилось, выполнив:

curl http://localhost:9100/metrics | grep "node_"

Мы хотим видеть данные в Prometheus, а в дальнейшем в Grafana. Добавим job в файл prometheus.yml:

- job_name: 'node-exporter'
  scrape_interval: 15s
  dns_sd_configs:
  - names:
    - 'tasks.node_exporter'
    type: 'A'
    port: 9100
  static_configs:
    - targets: ['node-exporter:9100']

Подключаем node-exporter Prometheus alert

rule_files:
  - 'node-exporter.rules'

Вот сам проектopen in new window

Соберем node-exporter:

git clone https://github.com/prometheus/node_exporter.git
cd node_exporter
make build

Docker build

Исправим строку:

COPY .build/${OS}-${ARCH}/node_exporter /bin/node_exporter

на

COPY ./node_exporter /bin/node_exporter

Так же есть реализация для ANSIBLEopen in new window


Postgres-exporter


Позволяет собирать метрики с PostgreSQL.
Поддерживает следующие версии: 9.4, 9.5, 9.6, 10, 11, 12, 13, 14

Используем следующие переменные:

  • DATA_SOURCE_NAME - опрередляет driver, user, password, host, port, name database
  • PG_EXPORTER_EXTEND_QUERY_PATH - указывает на конфиг с запросами, которые в дальнейшем сможем посмотреть в Prometheus и Grafana

Весь перечень описания переменных можно посмотреть здесьopen in new window.

Добавим job в файл prometheus.yml:

- job_name: 'postgres-exporter'
    metrics_path: '/metrics'
    honor_labels: true
    scrape_interval: 300s
    scrape_timeout: 60s
    static_configs:
      - targets: ['postgres-exporter:9187']
        labels:
          alias: postgres

Nginx-exporter


NGINX предоставляет несколько метрик через страницу stub_status . NGINX Plus предоставляет более богатый набор метрик через API и панель мониторинга. Экспортер NGINX Prometheus извлекает метрики из одного NGINX или NGINX Plus, преобразует метрики в соответствующие типы метрик Prometheus и, наконец, предоставляет их через HTTP-сервер для сбора Prometheus. Чтобы экспортировать метрики NGINX, передадим переменные внутрь контейнера:

environment:
  SCRAPE_URI: "http://${HOST}/status"

Для того чтобы использовать эту конструкцию и не получить null, сначала требуется добавить в nginx контейнер новый location:

location = /status {
    stub_status;
}

или его расшириенный вариант, позволяющий огранить доступ к данному ресурсу с определенных сетей:

location /status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;
    allow 172.16.0.0/12;
    deny all;
    }

Эта конфигурация создает простую веб-страницу с основными данными о состоянии, которая может выглядеть следующим образом:

Active connections: 291
server accepts handled requests
 16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106

Подробнее с параметрами можно ознакомиться здесьopen in new window.

Добавим job в файл prometheus.yml:

- job_name: 'nginx-exporter'
  scrape_interval: 60s
  metrics_path: '/metric'
  static_configs:
    - targets: ['nginx-exporter:9113']

Rabbitmq-exporter


Экспортер Prometheus для метрик RabbitMQ.
Требуется указать URL для подключения к запущенному rabbitmq и указать порт на котором открывается авторизация:

RABBIT_URL=http://${HOST}:15675

Зайдите на localhost:9419/metrics, должен открыться интерфейс с метриками от rabbitmq.

Добавляем job в prometheus.yml:

- job_name: 'rabbitmq-exporter'
  scrape_interval: 15s
  scrape_timeout: 10s
  metrics_path: '/metrics'
  honor_labels: true
  static_configs:
    - targets: ['rabbitmq-exporter:9419']

- job_name: 'rabbitmq-server'
  scrape_interval: 15s
  scrape_timeout: 10s
  metrics_path: '/metrics'
  honor_labels: true
  static_configs:
    - targets: ['stack-rabbitmq-1:15692']

Примечание

В задаче (job'e) 'rabbitmq-server' в строке targets указываем имя контейнера, не IP-адрес.


cAdvisor


cAdvisor (наш "консультант" по контейнерам) предоставляет пользователям контейнеров представление об использовании ресурсов и характеристиках производительности их работающих контейнеров. Это запущенный демон, который собирает, агрегирует, обрабатывает и экспортирует информацию о запущенных контейнерах. В частности, для каждого контейнера хранятся параметры изоляции ресурсов, историческое использование ресурсов, гистограммы полного исторического использования ресурсов и сетевая статистика. Эти данные экспортируются контейнером и всей машиной.
cAdvisor имеет встроенную поддержку контейнеров Docker и должен поддерживать практически любой другой тип контейнера из коробки. Абстракция контейнера cAdvisor основана на lmctfy, поэтому контейнеры по своей сути вложены иерархически.

Добавим следующее в наш docker compose:

volumes:
  - /:/rootfs:ro \
  - /var/run:/var/run:ro \
  - /sys:/sys:ro \
  - /var/lib/docker/:/var/lib/docker:ro \
  - /dev/disk/:/dev/disk:ro \

Это вся основная информация, которую нам требуется подключать.

В prometheus.yml добавим блок:

- job_name: 'cadvisor'
  scrape_interval: 15s
  dns_sd_configs:
  - names:
    - 'tasks.cadvisor'
    type: 'A'
    port: 8081
  static_configs:
    - targets: ['cadvisor:8080']

Подключим alert в тот же файл:

rule_files:
  - 'google-cAdvisor.rules'

Все rules по cAdvisor можно найти здесьopen in new window


Alertmanager


Alertmanager обрабатывает предупреждения, отправленные клиентскими приложениями, такими как сервер Prometheus. Он заботится об их дедупликации, группировке и маршрутизации к правильной интеграции получателя, такой как электронная почта, PagerDuty или OpsGenie. Он также заботится об отключении и подавлении предупреждений.
О всех параметрах настройки рассказывать нет смысла (очень много). Вот документацияopen in new window.

Едиственное что нужно сделать - прокинуть конфиг с настройками и подключить его через command. Пример конифга здесьopen in new window.


Loki


Loki — это горизонтально масштабируемая, высокодоступная, многопользовательская система агрегации журналов.

Интегрируется в Grafana путем добавления в datasource.yml:

- name: Loki

  type: loki
  access: proxy
  url: http://loki:3100
  jsonData:
      httpHeaderName1: "X-Scope-OrgID"
  secureJsonData:
      httpHeaderValue1: "tenant1"

Не забываем добавить plugin для docker:

docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions

Проверяем добавился ли:

 docker plugin ls

start


Promtail


Promtail — агент, отвечающий за централизацию логов (собирает логи, обрабатывает их и отправляет в Loki). В свою очередь, Loki их хранит, а Grafana запрашивает данные из Loki и визуализирует их.
Образ уже собран с конфигом, который вызывается командой: -config.file=/etc/promtail/config.yml
Так же можно помотреть интерфейс, зайдя на port 9080.


Prometheus


Prometheus - это бесплатное программное приложение, используемое для мониторинга событий и оповещения. Он записывает метрики в реальном времени в базу данных временных рядов, построенную с использованием модели HTTP-запроса, с гибкими запросами и оповещениями в режиме реального времени.
Нам портебуется прокинуть конфиг и rules внутрь контейнера, ну и соответственно через command инициализировать конфиг файл.


Итоговый результат


В Prometheus добавлено множество alerts и разбиты по отдельным файлам rules в зависимости от инструмента, для которого требуется проверка для вывода alerts:

cAdvisor
node-exporter
postgres-exporter
pgbouncer-exporter
rabbitmq-exporter
nginx-exporter
grafana
spring-boot
alertmanager
pushgateway
loki
promtail

В общей сложности более 90 alert триггеров.