PROM 03: Подключение экспортеров для сервисов

Описание:

Всем привет!

В прошлом задании мы разобрали с вами основные уровни мониторинга, а также отметили, что мониторить необходимо абсолютно все компоненты вашей инфраструктуры. Помимо этого мы изучили основную концепцию работы экспортеров - они снимают метрики с сервиса или системы, после чего отдают полученные метрики в формате, который понимает Prometheus, по http протоколу. Promethues же в свою очередь подключается к экспортерам через заданный интервал времени, забирает метрики, добавляет новые теги и записывает полученные значения в локальную TSDB.

А сейчас мы переместимся на следующий уровень мониторинга - мониторинг сервисов, которые установлены на ваших серверах. Для этого мы рассмотрим мониторинг Redis сервера, а так же составим универсальный алгоритм для подключения любого нового сервиса к вашей системе мониторинга. А в заключение приведем список наиболее часто используемых экспортеров. В задании же вам надо будет настроить мониторинг базы данных MySQL.

Давайте продолжим историю с нашей компанией из предыдущих примеров. Итак, после прихода на работу вы уже подняли центральный сервер мониторинга Prometheus, а также подключили к нему все ваши серверы, которые у вас есть в наличии. Следующим этапом вам предстоит изучить каждый сервер и найти на нем запущенные сервисы - базы данных, веб-серверы, key value хранилища и так далее. И после этого настроить для каждого из них свой экспортер, который будет выдавать все нужные метрики для Prometheus.

Мониторинг Redis сервера

Итак, вы начали ходить по серверам вашей компании и на первом из них обнаружили запущенный Redis сервер. Redis - это NoSQL база данных, которая хранит данные типа ключ-значение в оперативной памяти. Чаще всего используется для кеширования. Если же у вас нет установленного Redis'а не переживайте - мы его сейчас установим.

Давайте составим примерный план действий, как мы будем подключать наш Redis к мониторингу:

Установить и запустить Redis сервер (если он еще не установлен).

Нужно найти экспортер, который сможет выдавать нам метрики в формате Prometheus.

Установить экспортер на сервер.

Подключить запущенный экспортер к Prometheus'у.

Итак, погнали!

0. Установка Redis-server.

Для установки Redis на виртуальную машину (на примере Ubuntu) воспользуемся пакетным менеджером:

root@node1:~# apt-get install redis-server
Reading package lists... Done
Building dependency tree
... skipped ...

Проверим что мы можем успешно подключиться к Redis'у с помощью консольной утилиты:

root@node1:~# redis-cli info
# Server
redis_version:5.0.7
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:636cde3b5c7a3923
... skipped ...

Как видно из вывода, мы успешно подключились к серверу и выполнили команду info, которая вывела нам большое количество различных параметров.

1. Поиск экспортера для Redis'а

Как мы уже говорили в прошлом задании для поиска экспортера проще всего воспользоваться официальным списком, расположенным на сайте Prometheus - List of exporters.

Если же там не оказалось того, что вы ищите - вы можете воспользоваться github.com или google.com для поиска нужного вам экспортера. И здесь я не шучу - гугл показывает феноменальные результаты при поиске экспортера. Если не верите, просто зайдите в гугл и наберите: <название сервиса> exporter. Например можно написать: cassandra exporter или же: exim exporter. В обоих случаях первой ссылкой будет ссылка на нужный вам экспортер на GitHub'е.

Обычно в описании экспортера на GitHub будет доступна инструкция по запуску и установке. Но скорее всего вы сможете скачать уже собранный экспортер и запустить его, даже если инструкции нет.

2. Установка Redis exporter

Теперь наша задача установить Redis exporter, который будет подключаться к нашему Redis серверу и выдавать метрики в формате Prometheus. Скачиваем экспортер:

root@node1:~# cd /opt/
root@node1:/opt# wget https://github.com/oliver006/redis_exporter/releases/download/v1.20.0/redis_exporter-v1.20.0.linux-amd64.tar.gz
... skipped ...
root@node1:/opt# tar zxf redis_exporter-v1.20.0.linux-amd64.tar.gz
root@node1:/opt# mv redis_exporter-v1.20.0.linux-amd64 redis-exporter

Давайте посмотрим на основные параметры запуска данного экспортера:

-redis.addr=redis://localhost:6379 - адрес Redis сервера, с которого необходимо собирать информацию;

-web.listen-address - адрес, на котором нужно слушать входящие подключения от Prometheus;

-web.telemetry-path - url по которому Prometheus сможет забрать метрики.

На самом деле у экспортера намного больше параметров, но практически все они относятся к собираемым метрикам. Какие-то из них можно отключить, какие-то, наоборот, включить. Для нас сейчас самое главное - это понять, что экспортер подключается к Redis, вытаскивает из него информацию и отдает ее Prometheus в его формате.

Итак, запускаем наш экспортер:

root@node1:/opt/redis-exporter# ./redis_exporter -redis.addr redis://localhost:6379 -web.listen-address=:9121 -web.telemetry-path=/metrics
INFO[0000] Redis Metrics Exporter v1.20.0 build date: 2021-03-22-13:25:02 sha1: f367ed48b4d1571b57f59e435418f402d4329265 Go: go1.16.2 GOOS: linux GOARCH: amd64
INFO[0000] Providing metrics at :9121/metrics

Как видно из лога, наш экспортер успешно запустился и готов к работе.

Поскольку все экспортеры отдают метрики по http протоколу, мы можем сами подключиться к нему с помощью curl и посмотреть, что он успел собрать:

root@node1:/opt/redis-exporter# curl localhost:9121/metrics
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# 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

... skipped ...

# HELP redis_commands_processed_total commands_processed_total metric
# TYPE redis_commands_processed_total counter
redis_commands_processed_total 3
# HELP redis_commands_total Total number of calls per command
# TYPE redis_commands_total counter
redis_commands_total{cmd="client"} 1
redis_commands_total{cmd="config"} 1
redis_commands_total{cmd="info"} 1

... skipped ...

# HELP redis_memory_used_bytes memory_used_bytes metric
# TYPE redis_memory_used_bytes gauge
redis_memory_used_bytes 859240
# HELP redis_memory_used_dataset_bytes memory_used_dataset_bytes metric
# TYPE redis_memory_used_dataset_bytes gauge
redis_memory_used_dataset_bytes 13314
# HELP redis_memory_used_lua_bytes memory_used_lua_bytes metric
# TYPE redis_memory_used_lua_bytes gauge
redis_memory_used_lua_bytes 41984
# HELP redis_memory_used_overhead_bytes memory_used_overhead_bytes metric
# TYPE redis_memory_used_overhead_bytes gauge
redis_memory_used_overhead_bytes 845926

... skipped ...

Отлично! Экспортер отдал нам метрики, которые он уже успел собрать. Например, можно посмотреть на метрику redis_commands_processed_total, которая судя по названию показывает количество выполненных команд Redis-сервером. Или же можно обратить внимание на метрику redis_commands_total{cmd="config"}, которая показывает количество выполненных команд CONFIG.

3. Подключение экспортера к Prometheus

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

global:
scrape_interval: 15s

scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']

- job_name: 'redis'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9121']

Итак, давайте попробуем перезапустить Prometheus и посмотреть на результат, воспользовавшись утилитой promtool:

root@node1:/opt/prometheus# systemctl restart prometheus
root@node1:/opt/prometheus# ./promtool query instant http://localhost:9090 up
up{instance="localhost:9090", job="prometheus"} => 1 @[1617801868.196]
up{instance="localhost:9121", job="redis"} => 1 @[1617801868.196]

Как видно из вывода наш экспортер был успешно запущен, и Prometheus начал собирать с него информацию.

Универсальный алгоритм подключения сервисов.

В вашей инфраструктуре может находиться просто огромное количество различных сервисов, которые запускаются в операционной системе. Это могут быть и базы данных: MySQL, PostgreSQL, MS SQL, Redis, Cassandra и другие. Это также могут быть веб-серверы: Lighttpd, Nginx, Apache и так далее. Но для подключения всего этого многобразия вам подойдет простой универсальный алгоритм:

Поиск экспортера. Вам необходимо найти в google информацию, какой экспортер может собирать метрики с вашего сервиса. В очень редких случаях вы не сможете найти такой экспортер, тогда его можно будет написать самим. Но это действительно очень редкая ситуация.

Установка экспортера. На данном этапе вам предстоит либо скачать бинарный файл и запустить его с помощью systemd, либо использовать Docker контейнер для запуска экспортера (часто можно найти готовый Docker образ).

Best Practice: Мы рекомендуем вам запускать все экспортеры с помощью Docker. В отличии от мониторинга системных метрик через node_exporter, остальные экспортеры всего лишь являются небольшим прокси приложением, которое собирает метрики из сервиса, конвертирует их в формат Prometheus и отдает при запросе. Поэтому такие приложения надо заворачивать в Docker без колебаний.

Изучить параметры запуска экспортера. Это важный пункт, поскольку в нем вы должны найти параметры, которые отвечают за подключение к изучаемому сервису - как в примере с Redis - нам необходимо было указать, на каком хосте у нас запущен Redis сервер, под каким пользователем и паролем мы должны к нему подключаться. Помимо этого нас интересуют параметры прослушки адресов, чтобы мы знали, на какой порт должен ходить Prometheus чтобы собрать метрики.

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

Отработать этот порядок действий, мы предложим вам в задании к этому уроку. Используйте этот алгоритм всегда и он будет приносить вам пользу :)

Обзор популярных экспортеров

На самом деле большого смысла переводить или копировать статью List of exporters нет. Но я все же считаю правильным рассказать вам о стандартных экспортерах, которые вы с 99% вероятностью будете использовать в своей работе. Итак, поехали:

node_exporter - экпортер, который мониторит вашу операционную систему. Его мы изучали в прошлом задании. Просто Must Have в 100% случаев. Кстати, для Windows есть свой экспортер - windows_exporter

snmp_exporter - экспортер для сбора метрик с оборудования, которое поддерживает SNMP протокол, и отдачи их в формате Prometheus. Очень частый вопрос: как мониторить сетевые железки через Prometheus? Вот ответ - используя SNMP экспортер.

postgresql_exporter / mysqld_exporter / mssql_exporter - экспортеры для популярных баз данных. Принцип работы точно такой же, как и у остальных - подключаются к базе, вытаскивают метрики и отдают Prometheus'у.

kafka_exporter / rabbitmq_exporter - экспортеры для популярных приложений очередей сообщений.

nginxlog_exporter - экспортер, который читает файл access.log любого формата и накапливает метрики из него. Например, появилась строка с 500-ой ошибкой в логе Nginx, и экспортер внутри себя увеличивает значение счетчика с 500-ми ошибками. А когда придет Prometheus - отдает все собранные метрики. Очень хороший экспортер для мониторинга ваших веб-серверов.

jmx_exporter - самый нужный экспортер, если у вас есть Java приложения.

json_exporter - очень удобен, если у вашего приложения есть API с json форматом. Данный экспортер может обратиться к API, получить данные в формате json и вытащить указанный параметр, который впоследствии отобразится в метриках.

blackbox_exporter - еще один экспортер, который точно будет использоваться в вашей инфраструктуре. Опрашивает заданные url и возвращает метрики по ним - время ответа, код ответа, статус и так далее. Позволяет мониторить доступность веб-ресурсов и SSL сертификатов.

cadvisor - экспортер для мониторинга Docker контейнеров. Подключается к Docker сервису и вытаскивает всю информацию по всем контейнерам, которые есть в системе. Вы сможете увидеть метрики потребление памяти, cpu, сети и дисков, разбитых по контейнерам.

Как вы понимаете, этот список не является полным. Но я постарался привести примеры самых популярных экспортеров, которые вы будете использовать с вероятностью 99%.

Итоги

Итак, сегодня мы с вами разобрались со вторым уровнем мониторинга - мониторингом сервисов. И даже посмотрели на практике как можно вытаскивать метрики с Redis сервера. Помимо этого мы разобрали универсальный алгоритм подключения абсолютно любого сервиса к Prometheus мониторингу. Ну и в заключении привели ссылки на самые популярные экспортеры, которые вы будете встречать постоянно.

Полезные ссылки:

Exporters List

Задание:

В этом задании вам нужно установить базу данных MySQL. Также вам нужно установить экспортер для базы данных и собирать с него метрики через Prometheus. После выполнения всех критериев, приведенных ниже, отправьте задание на проверку. На подготовленной виртуальной машине уже установлен Prometheus.

Критерии оценки выполнения задания:

Установите БД MySQL:

1.1. MySQL должен быть установлен из стандартного репозитория с помощью менеджера пакетов apt (пакет mysql-server).

1.2. В MySQL должен быть создан отдельный пользователь exporter с любым паролем.

Установите экспортер mysqld_exporter следуя инструкции на GitHub:

2.1. Исполняемый файл экспортера mysqld_exporter должен находиться внутри отдельной директории /opt/mysqld_exporter.

2.2. Экспортер mysqld_exporter должен быть запущен как сервис c помощью systemd и быть описан в файле /etc/systemd/system/mysqld_exporter.service.

2.3. Экспортер должен быть запущен на порту 9111.

2.4. Экспортер должен подключаться к локальной базе данных MySQL с помощью логина и пароля.

Настройте Prometheus:

3.1. Prometheus должен собирать все метрики c экспортера mysqld_exporter.