1. Постановка задачи.
Задача: организовать мониторинг серверов и микросервисов, в режиме реального времени нужно отслеживать как состояние отдельных компонентов, так и состояние системы в целом.
2. Описание программ.
Prometheus server — центральное звено. Prometheus является открытой time series СУБД, написанной на языке Go и изначально разработанной в компании SoundCloud. Другими словами, эта штука хранит ваши метрики. Интересной особенностью Prometheus является то, что он сам тянет метрики с заданного множества сервисов (делает pull). За счет этого у Prometheus не могут забиться какие-то там очереди или вроде того, а значит мониторинг никогда не станет узким местом системы. Также проект интересен тем, что он принципиально не предлагает какого-либо горизонтального масштабирования или high availability. Дескать, третье тысячелетие на дворе — в случае чего просто возьмите машину помощнее, не выпендривайтесь.
Агенты, собирающие метрики и предоставляющие их в понятном для Prometheus’а виде. В зависимости от контекста называются экспортерами (exporter) или таргетами (target). Устанавливаются на целевые машины. Типичный представитель — Node Exporter — собирает данные о вычислительных ресурсах: загрузку процессора, памяти, диска и так далее. Есть куча других экспортеров. Например, cadvisor собирает данные о контейнерах. Есть экспортеры для Postgres’а, для Nginx’а и прочих сервисов. С точки зрения самого Prometheus’а они ничем принципиально не отличаются друг от друга, просто каждый собирает какие-то свои метрики. Можно писать свои экспортеры, если ничего из готового вам не подходит.
Node Exporter — сервис, задача которого заключается в экспорте информации о машине в формате, понятном Prometheus’у. Вообще, для Prometheus написано множество готовых exporter’ов практически под все существующие системы — всякие там web-серверы, СУБД, очереди сообщений, и так далее. В рамках этой заметки мы будем использовать только Node Exporter. Настройка других exporter’ов вряд ли будет сильно отличаться.
Alertmanager — менеджер уведомлений. Ни один инструмент мониторинга немыслим без компонента для рассылки уведомлений. В Prometheus для этой цели используется Alertmanager.
Grafana представляет собой открытый web-frontend к различным time series СУБД, таким, как Graphite, InfluxDB, Prometheus. В общем, Grafana рисует для вас красивые графики, используя информацию из Prometheus. Характерно, что у Prometheus есть и собственный web-интерфейс. Однако он предельно прост и довольно неудобен. Поэтому даже сами разработчики Prometheus рекомендуют использовать Grafana.
Важно! Настройки, связанные с безопасностью, в рамках этого поста не рассматриваются. За информацией о том, как настроить firewall, поднять Nginx для какой-нибудь аутентификации, а также настроить TLS, обращайтесь к соответствующим более ранним заметкам. Обращаю ваше внимание на то, что по умолчанию Prometheus слушает все сетевые интерфейсы без какой-либо аутентификации и шифрования. Grafana имеет кое-какую аутентификацию, но также слушает все интерфейсы и не имеет шифрования.
Вы можете найти более полный список официальных экспортеров и экспортеров сообщества на веб-сайте Prometheus.
Ссылка на сайт разработчика: https://prometheus.io/download/.
Ссылки разработчика на GitHub: https://github.com/prometheus/prometheus/releases/.
3. Общая подготовка системы.
Обновим систему:
# yum -y update && yum -y upgrade
Удалим SELinux:
# yum -y remove selinux*
Перезагрузим CentOS 7:
# shutdown -r now
4. Настройка синхронизации времени.
Выполним настройку службы синхронизации времени по действиям. Если этого не сделать, если не синхронизировать время, то позднее в работе Prometheus будут ошибки или вообще работать не будет.
Если интересно узнать всё поподробнее о настройках времени и серверов NTP, то пройдите по ссылке на инструкцию «CentOS 7: Настройка даты и времени, пояса, автоматическая синхронизация мирового времени (Network Time Protocol)».
Выполним настройку не вдаваясь в подробности.
Для того, чтобы в системе были доступны часовые пояса, установите утилиту tzdata:
# yum -y install tzdata
Чтобы сменить часовой пояс, можете воспользоваться специальной утилитой timedatectl
, которая входит в состав systemd.
# timedatectl set-timezone Asia/Yekaterinburg
Заменим часовой пояс на Asia/Yekaterinburg
:
Делаем бэкап файла localtime
:
# mv /etc/localtime /etc/localtime.bak
# ln -s /usr/share/zoneinfo/Asia/Yekaterinburg /etc/localtime
Установим chrony.
Внимание! В CentOS 7 данная утилита уже идет в комплекте даже при минимальной комплектации установщика. Устанавливать отдельно в CentOS 7 утилиту chrony не надо.
Ссылка: «CentOS 7: Настройка синхронизация времени по Network Time Protocol. Утилита ntp».
Основные преимущества chrony:
- высокая скорость и точность синхронизации;
- корректная работа при отсутствии доступа к эталонным часам (ntpd требуются регулярные запросы);
- по умолчанию не меняет сразу время при синхронизации, чтобы не нарушить работу программ.
# yum -y install chrony
Как и любой другой сервис, после установки chrony нужно включить и добавить в автозагрузку:
# systemctl start chronyd
# systemctl enable chronyd
Для проверки статуса chrony используется следующая команда.
# systemctl status chronyd
Проверяем, нормально ли запустился:
Все в порядке, сервис настроен и работает. После запуска он автоматически синхронизирует время. Теперь наши часы будут автоматически синхронизироваться с сервером времени в интернете.
# timedatectl status
Чтобы проверить, синхронизирован ли chrony на самом деле. Как и у ntp, у chrony есть интерфейс командной строки chronyc. Мы будем использовать его программу командной строки chronyc, которая имеет опцию отслеживания для предоставления соответствующей информации.
# chronyc tracking
Чтобы проверить информацию об источниках chrony, можно выполнить следующую команду:
# chronyc sources
С временем закончили. Всё работает. Идем дальше!
5. Получение и запуск Prometheus Service.
Установим текстовый редактор mc, download-менеджер wget, архиватор tar:
# yum -y install mc wget tar
Зайдем на страничку разработчика системы Prometheus и скопируем ссылку на скачивание архива с программой:
Ссылка на сайт разработчика: https://prometheus.io/download/.
Ссылки разработчика на GitHub: https://github.com/prometheus/prometheus/releases/.
Переместимся в каталог пользователя под которым работаем:
# cd ~
Скачаем данный архив на сервер CentOS 7, в локальный каталог пользователя:
# wget https://github.com/prometheus/prometheus/releases/download/v2.17.1/prometheus-2.17.1.linux-amd64.tar.gz
Проверим, что он в каталоге:
# ls
Ответ: список содержимого каталога + файл-архив prometheus-2.17.1.linux-amd64.tar.gz.
prometheus-2.17.1.linux-amd64.tar.gz
Создадим и добавим «бездомного» и «бесконсольного» служебного пользователя по имени prometheus.
# useradd --no-create-home --shell /bin/false prometheus
Создадим пару служебных каталогов:
# mkdir /etc/prometheus
# mkdir /var/lib/prometheus
Добавим права на их использование пользователем prometheus:
# chown prometheus:prometheus /etc/prometheus
# chown prometheus:prometheus /var/lib/prometheus
Распакуем, ранее скачанный, архив с программой prometheus-2.17.1.linux-amd64.tar.gz.
# tar -xvzf prometheus-2.17.1.linux-amd64.tar.gz
Проверим результат:
# ls
Ответ: список содержимого каталога + каталог prometheus-2.17.1.linux-amd64.
prometheus-2.17.1.linux-amd64
Рассортируем содержимое каталога prometheus-2.17.1.linux-amd64.
Скопируем бинарные файлы ‘prometheus
‘ and ‘promtool
‘ в каталог ‘/usr/local/bin
‘.
# cp prometheus-2.17.1.linux-amd64/prometheus /usr/local/bin/
# cp prometheus-2.17.1.linux-amd64/promtool /usr/local/bin/
Добавим права на их использование пользователем prometheus:
# chown prometheus:prometheus /usr/local/bin/prometheus
# chown prometheus:prometheus /usr/local/bin/promtool
# chmod -R 700 /usr/local/bin/prometheus
# chmod -R 700 /usr/local/bin/promtool
Скопируем ‘consoles
‘ и ‘console_libraries
‘ каталоги из каталога prometheus-2.17.1.linux-amd64 в каталог ‘/etc/prometheus
‘.
# cp -r prometheus-2.17.1.linux-amd64/consoles /etc/prometheus
# cp -r prometheus-2.17.1.linux-amd64/console_libraries /etc/prometheus
# cp -r prometheus-2.17.1.linux-amd64/prometheus.yml /etc/prometheus
Добавим права на их использование пользователем prometheus:
# chown -R prometheus:prometheus /etc/prometheus/consoles
# chown -R prometheus:prometheus /etc/prometheus/console_libraries
# chown -R prometheus:prometheus /etc/prometheus/prometheus.yml
Важно! Конфигурационный файл Prometheus использует формат YAML, который строго запрещает табуляцию и требует двух пробелов для отступов. Prometheus не удастся запустить, если конфигурационный файл некорректно отформатирован.
В глобальных настройках (раздел global
) задайте интервал по умолчанию для сбора метрик. Обратите внимание, что Prometheus будет применять эти настройки для каждого экспортера, если только глобальные переменные не переопределяются индивидуальными настройками отдельного экспортера.
Согласно этому значению scrape_interval
Prometheus будет собирать метрики своих экспортеров каждые 15 секунд, что достаточно для большинства экспортеров.
global:
scrape_interval: 15s
Теперь добавьте Prometheus в список экспортеров, чтобы собирать его метрики. Для этого используйте директиву scrape_configs
:
...
scrape_configs:
- job_name: 'prometheus_server'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
С помощью job_name
Prometheus маркирует экспортеры в запросах и графах, потому тут лучше выбрать описательное имя.
Поскольку Prometheus экспортирует важные данные о себе, которые используются для мониторинга производительности и отладки, можно переопределить глобальную директиву scrape_interval
с 15 секунд до 5 секунд, чтобы данные обновлялись чаще.
С помощью директив static_configs
и targets
Prometheus определяет, где запускать экспортеры. Поскольку этот конкретный экспортер запущен на том же сервере, что и Prometheus, можно использовать localhost вместо IP-адреса и порт по умолчанию — 9090 порт.
Внимание! В последних версиях Prometheus конфигурационный файл уже идет в комплекте и теперь его особо модифицировать не требуется. Все и так хорошо работает!
Настроим конфигурационный файл Prometheus /etc/prometheus/prometheus.yml
под наши нужды, но перед этим копируем его, на всякий случай:
# cp /etc/prometheus/prometheus.yml /etc/prometheus/prometheus.yml.original
Открываем для редактирования:
# mcedit /etc/prometheus/prometheus.yml
Добавим в него следующие строки по смыслу синтаксиса файла конфигурации:
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=` to any timeseries scraped from this config.
- job_name: 'prometheus_server'
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ['localhost:9090']
Сохраним файл и выйдем из тестового редактора.
Проверим синтаксис:
# promtool check config /etc/prometheus/prometheus.yml
Ответ:
Подробнее можно узнать о правилах написания файла конфигурации на сайте разработчика программы: https://prometheus.io/docs/prometheus/latest/configuration/configuration/
Добавим права на его использование пользователем prometheus:
# chown prometheus:prometheus /etc/prometheus/prometheus.yml
Создадим конфигурационный файл службы Prometheus Service:
# mcedit /etc/systemd/system/prometheus.service
Этот файл сообщает systemd, что Prometheus нужно запускать в качестве пользователя prometheus, его конфигурационный файл находится в каталоге /etc/prometheus/prometheus.yml
, а данные и метрики хранятся в каталоге /var/lib/prometheus
.
Также нелишним будет знать некоторые особенности устройства Prometheus. В частности, по умолчанию все данные хранятся в течение 15 дней, метрики собираются раз в 5-15 секунд, а одна метрика в среднем занимает два байта на сэмпл. Обладая этой информацией, и зная количество метрик, можно прикинуть, сколько дискового пространства вам понадобится для их хранения.
Внимание! Хранилище Prometheus не позиционируется, как супер надежное. Если у вас очень ценные метрики, рекомендуется сохранять их куда-то еще через адаптеры. Ещё со временем метрики Prometheus из разных источников будут занимать приличное количество места на диске, поэтому заранее продумайте, где будете хранить большие объемные файлы, которые будут расти и расти!
Если что, то можно сделать потом ссылку на каталог, который фактически будет храниться в другом, более удобном месте.
Информация как это сделать имеется в инструкции «CentOS 7: Как создать и искать символические ссылки (ln)».
Добавим в него следующие строки:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus
--config.file=/etc/prometheus/prometheus.yml
--storage.tsdb.path=/var/lib/prometheus/
--web.console.templates=/etc/prometheus/consoles
--web.console.libraries=/etc/prometheus/console_libraries
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
или поподробнее со всякими фишками и включенным режимом администрирования:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
WorkingDirectory=/etc/prometheus/
# RuntimeDirectory=prometheus
# RuntimeDirectoryMode=0750
ExecStart=/usr/local/bin/prometheus
--config.file=/etc/prometheus/prometheus.yml
--storage.tsdb.retention=365d
--storage.tsdb.path=/var/lib/prometheus/
--storage.tsdb.max-block-duration=2h
--web.console.templates=/etc/prometheus/consoles
--web.console.libraries=/etc/prometheus/console_libraries
--web.enable-lifecycle
--web.enable-admin-api
--web.listen-address=:9090
--log.level=info
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
LimitNOFILE=10000
TimeoutStopSec=20
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=prometheus
[Install]
WantedBy=multi-user.target
Сохраним файл и выйдем из тестового редактора.
Перезагрузим системные службы systemd service.
# systemctl daemon-reload
Стартуем Prometheus service:
# systemctl start prometheus
Прописываем в автозапуск CentOS 7:
# systemctl enable prometheus
Проверим успех запуска:
# systemctl status prometheus
Вывод описывает состояние Prometheus, основной идентификатор процесса (PID), использование памяти и так далее.
Внимание! Бывает, что всё сделано правильно, но ничего упорно не стартует. Сверьтесь с писком возможных ошибок с вашей стороны.
1. Иногда бывает, что у пользователя prometheus
теряется доступ к /usr/local/bin/prometheus
. Заново выдайте права 700 на /usr/local/bin/prometheus
и запустите службу снова. Пару раз так было так на других дистрибутивах Linux, хотя визуально всё хорошо и права стоят на все операции.
# chown prometheus:prometheus /usr/local/bin/prometheus
# chmod -R 700 /usr/local/bin/prometheus
2. Вы отредактировали файл etc/prometheus/prometheus.yml
и сохранили его не в кодировке UTF-8. Файл существует, но не считывается. Меняйте кодировку на UTF-8.
3. Если вы получили сообщение об ошибке, убедитесь, что не допустили ошибок в синтаксисе YAML в файле конфигурации, а затем следуйте инструкциям на экране, чтобы устранить проблему. Синтаксис этого файла очень капризный, даже один лишний пробел или перенос строки, которые вы не заметили, могут не позволять запустить службу. Не расстраивайтесь и проверьте всё внимательно.
Если состояние сервиса не active, следуйте предыдущим инструкциям на экране и повторите предыдущие действия, чтобы устранить проблему, прежде чем продолжить. Возможно у вас просто опечатка в файле конфигурации оказалась.
Откроем порт 9090.
- Если firewalld:
# firewall-cmd --zone=public --add-port=9090/tcp --permanent
# systemctl reload firewalld
- Если iptables:
Открываем файл конфигурации iptables текстовым редактором:
# mcedit /etc/sysconfig/iptables
В разделе ‘OUTPUT ACCEPT
‘, добавляем строку:
-A INPUT -p tcp -m tcp --dport 9090 -m state --state NEW -j ACCEPT
Перезапускаем iptables:
# sudo systemctl restart iptables
Проверяем, что Prometheus отдает свои собственные метрики:
# curl 'localhost:9090/metrics'
Теперь можно установить дополнительный экспортер для создания метрик о ресурсах сервера.
6. Prometheus Server web-интерфейс.
Зайдем в web-интерфейс по адресу:
# http://Server-IP:9090/graph
Если всё было сделано правильно и проброшен порт 9090, вас встретит страница приветствия:
7. Получение и запуск Node Exporter (localhost).
Первым делом настроим Prometheus node exporter на Prometheus Server.
Чтобы расширить стандартные возможности Prometheus, установите дополнительный экспортер под названием Node Exporter. Node Exporter предоставляет подробную информацию о системе, включая использование процессора, диска и памяти.
Скопируем ссылку на соответствующий модуль с сайта разработчиков:
Ссылка на сайт разработчика: https://prometheus.io/download/.
Ссылки разработчика на GitHub: https://github.com/prometheus/prometheus/releases/.
Переместимся в каталог пользователя под которым работаем:
# cd ~
Скачаем данный архив на сервер CentOS 7, в локальный каталог пользователя:
# wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
Проверим, что он в каталоге:
# ls
Ответ: список содержимого каталога + файл-архив node_exporter-0.18.1.linux-amd64.tar.gz.
node_exporter-0.18.1.linux-amd64.tar.gz
Распакуем скачанный архив:
# tar -xvzf node_exporter-0.18.1.linux-amd64.tar.gz
Создадим и добавим «бездомного» и «бесконсольного» служебного пользователя по имени ‘nodeusr
‘ для Node Exporter.
# useradd --no-create-home --shell /bin/false nodeusr
Переместим бинарные файлы в каталог ‘/usr/local/bin
‘ из каталога скачанного и распакованного архива.
# mv node_exporter-0.18.1.linux-amd64/node_exporter /usr/local/bin/
Добавим права на их использование пользователем nodeusr
:
# chown nodeusr:nodeusr /usr/local/bin/node_exporter
Создадим конфигурационный файл службы Node Exporter:
# mcedit /etc/systemd/system/node_exporter.service
Добавим в него следующие строки:
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=nodeusr
Group=nodeusr
Type=simple
ExecStart=/usr/local/bin/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
Сохраним файл и выйдем из тестового редактора.
Коллекторы определяют, какие метрики генерирует Node Exporter. Полный список коллекторов Node Exporter, включая включенные по умолчанию и устаревшие, можно найти в файле README для Node Exporter.
Чтобы переопределить список коллекторов, используйте флаг --collectors.enabled
.
...
ExecStart=/usr/local/bin/node_exporter --collectors.enabled meminfo,loadavg,filesystem
...
В таком случае Node Exporter будет генерировать метрики, используя только коллекторы meminfo, loadavg и filesystem. Вы можете использовать столько коллекторов, сколько вам нужно, но обратите внимание, что при перечислении коллекторов пробелов перед запятыми или после них нет.
Перезагрузим системные службы systemd service.
# systemctl daemon-reload
Стартуем Prometheus service:
# systemctl start node_exporter
Прописываем в автозапуск CentOS 7:
# systemctl enable node_exporter
Проверим успех запуска:
# systemctl status node_exporter
Здесь вы увидите состояние Node Exporter, основной идентификатор процесса (PID), использование памяти и так далее.
Внимание! Иногда бывает, что у пользователя nodeusr
нет доступа к /usr/local/bin/node_exporter
, хотя визуально всё хорошо и права стоят на все операции. Заново выдайте права 700 на /usr/local/bin//node_exporter
и запустите службу снова. Было так на других дистрибутивах Linux.
Если состояние сервиса не active, следуйте инструкциям на экране и повторите предыдущие действия, чтобы устранить проблему, прежде чем продолжить.
Откроем порт 9100.
- Если firewalld:
# firewall-cmd --zone=public --add-port=9100/tcp --permanent
# systemctl reload firewalld
- Если iptables:
Открываем файл конфигурации iptables текстовым редактором:
# mcedit /etc/sysconfig/iptables
В разделе ‘OUTPUT ACCEPT
‘, добавляем строку:
-A INPUT -p tcp -m tcp --dport 9100 -m state --state NEW -j ACCEPT
Перезапускаем iptables:
# sudo systemctl restart iptables
Проверяем, что метрики отдаются:
# curl 'localhost:9100/metrics'
8. Node Exporter web-интерфейс.
Зайдем в web-интерфейс по адресу:
# http://IP-Address:9100/metrics
Если всё было сделано правильно и проброшен порт 9100, вас встретит страница приветствия с большим количеством различных строк:
9. Настройка взаимодействия Prometheus и Node Exporter.
Добавим конфигурацию Node Exporter задачи для Prometheus Server.
Prometheus собирает только метрики экспортеров, указанных в разделе scrape_configs
его конфигурационного файла. Добавьте в этот файл экспортер Node Exporter.
Зайдем на Prometheus Server и модифицируем prometheus.yml
в каталоге /etc/prometheus/
.
Редактируем файл:
# mcedit /etc/prometheus/prometheus.yml
Добавляем в файл конфигурации в блок scrape config в самый конец раздела:
- job_name: 'node_exporter_prometheus' scrape_interval: 5s metrics_path: /metrics static_configs: - targets: ['localhost:9100']
Сохраним файл и выйдем из тестового редактора.
Поскольку этот экспортер работает на том же сервере, что и Prometheus, можно использовать localhost вместо IP-адреса и порт по умолчанию Node Exporter — это 9100 порт.
Весь файл конфигурации должен выглядеть так:
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=` to any timeseries scraped from this config.
- job_name: 'prometheus_server'
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter_prometheus'
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ['localhost:9100']
Сохраним и выйдем из текстового редактора.
Проверим синтаксис:
# promtool check config /etc/prometheus/prometheus.yml
Ответ:
Чтобы настройки активировались, перезапустим службу:
# systemctl restart prometheus
Проверим успех запуска:
# systemctl status prometheus
Если состояние сервиса не active, следуйте инструкциям на экране и повторите предыдущие действия, чтобы устранить проблему, прежде чем продолжить.
Внимание! Если вы получили сообщение об ошибке, убедитесь, что не допустили ошибок в синтаксисе YAML в файле конфигурации, а затем следуйте инструкциям на экране, чтобы устранить проблему. Синтаксис этого файла очень капризный, даже один лишний пробел или перенос строки, которые вы не заметили, могут не позволять запустить службу. Не расстраивайтесь и проверьте всё внимательно.
Зайдем в web-оболочку Prometheus Server и проверим targets.
Зайдем в web-интерфейс по адресу:
# http://IP-Address:9090/targets
Примерный вид в браузере:
10. Получение и запуск MySQL Exporter (localhost).
Создадим служебного пользователя сбора метрик MySQL Server базы данных.
Войдите в свою базу данных и выполните следующие команды:
# mysql -u root -p
> CREATE USER 'mysqld_exporter'@'localhost' IDENTIFIED BY 'password' WITH MAX_USER_CONNECTIONS 3;
> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysqld_exporter'@'localhost';
> FLUSH PRIVILEGES;
> exit
Скачаем mysqld_exporter с официальной странички разработчиков: https://prometheus.io/download/.
Для этого получим ссылку для закачивания архива с программой.
Ссылка на сайт разработчика: https://prometheus.io/download/.
Ссылки разработчика на GitHub: https://github.com/prometheus/prometheus/releases/.
Переместимся в каталог пользователя под которым работаем:
# cd ~
Скачаем данный архив на сервер CentOS 7, в локальный каталог пользователя:
# wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz
Проверим, что он в каталоге:
# ls
Ответ: список содержимого каталога + файл-архив mysqld_exporter-0.12.1.linux-amd64.tar.gz.
mysqld_exporter-0.12.1.linux-amd64.tar.gz
Распакуем скачанный архив:
# tar -xvzf mysqld_exporter-0.12.1.linux-amd64.tar.gz
Создадим и добавим «бездомного» и «бесконсольного» служебного пользователя по имени ‘mysqld_exporter
‘ для MySQL Exporter.
# useradd --no-create-home --shell /bin/false mysqld_exporter
Переместим бинарный файл в каталог ‘/usr/local/bin
‘ из каталога скачанного и распакованного архива.
# mv mysqld_exporter-0.12.1.linux-amd64/mysqld_exporter /usr/local/bin/
Добавим права на их использование пользователем mysqld_exporter:
# chown mysqld_exporter:mysqld_exporter /usr/local/bin/mysqld_exporter
Создадим рабочий каталог для MySQL Exporter:
# mkdir -p /etc/mysql_exporter
Создадим MySQL файл с паролем для MySQL Exporter.
# touch /etc/mysql_exporter/.my.cnf
# mcedit /etc/mysql_exporter/.my.cnf
Добавим в него строки, которые будут содержать строки вашего логина и пароля из примера по созданию служебного пользователя сбора метрик MySQL Server базы данных:
[client]
user=mysqld_exporter
password=password
Сохраним и выйдем из файла.
Добавим права на каталог для пользователя mysqld_exporter:
# chown -R mysqld_exporter:mysqld_exporter /etc/mysql_exporter
Добавим свойства 600 на каталог:
# chmod 600 /etc/mysql_exporter/.my.cnf
Создадим конфигурационный файл службы MySQL Exporter:
# mcedit /etc/systemd/system/mysql_exporter.service
Добавим в него следующие строки:
[Unit]
Description=MySQL Exporter Service
Wants=network.target
After=network.target
[Service]
User=mysqld_exporter
Group=mysqld_exporter
Type=simple
Environment="DATA_SOURCE_NAME=mysqld_exporter:password@tcp(127.0.0.1:3306)/"
ExecStart=/usr/local/bin/mysqld_exporter
--config.my-cnf /etc/mysql_exporter/.my.cnf
--collect.global_status
--collect.info_schema.innodb_metrics
--collect.auto_increment.columns
--collect.info_schema_processlist
--collect.binlog_size
--collect.global_variables
--collect.info_schema.tablestats
--collect.global_variables
--collect.info_schema.query_response_time
--collect.info_schema.userstats
--collect.info_schema.tables
--collect.perf_schema.tablelocks
--collect.perf_schema.file_events
--collect.perf_schema.eventswaits
--collect.perf_schema.indexiowaits
--collect.perf_schema.tableiowaits
--collect.slave_status
Restart=always
[Install]
WantedBy=multi-user.target
Перезагрузим системные службы systemd service.
# systemctl daemon-reload
Стартуем MySQL Exporter service:
# systemctl start mysql_exporter
Прописываем в автозапуск CentOS 7:
# systemctl enable mysql_exporter
Проверим успех запуска:
# systemctl status mysql_exporter
Здесь вы увидите состояние MySQL Exporter, основной идентификатор процесса (PID), использование памяти и так далее.
Если состояние сервиса не active, следуйте инструкциям на экране и повторите предыдущие действия, чтобы устранить проблему, прежде чем продолжить.
Откроем порт 9104.
Если firewalld:
# firewall-cmd --zone=public --add-port=9104/tcp --permanent
# systemctl reload firewalld
Если iptables:
Открываем файл конфигурации iptables текстовым редактором:
# mcedit /etc/sysconfig/iptables
В разделе ‘OUTPUT ACCEPT
‘, добавляем строку:
-A INPUT -p tcp -m tcp --dport 9104 -m state --state NEW -j ACCEPT
Перезапускаем iptables:
# sudo systemctl restart iptables
Проверяем, что метрики отдаются:
# curl 'localhost:9104/metrics'
11. MySQL Exporter web-интерфейс.
Зайдем в web-интерфейс по адресу:
# http://IP-Address:9104/metrics
Если всё было сделано правильно и проброшен порт 9104, вас встретит страница приветствия с большим количеством различных строк:
12. Настройка взаимодействия Prometheus и MySQL Exporter.
Добавим конфигурацию MySQL Exporter задачи для Prometheus Server.
Prometheus собирает только метрики экспортеров, указанных в разделе scrape_configs
его конфигурационного файла. Добавьте в этот файл экспортер MySQL Exporter.
Зайдем на Prometheus Server и модифицируем prometheus.yml
в каталоге /etc/prometheus/
.
Редактируем файл:
# mcedit /etc/prometheus/prometheus.yml
Добавляем в файл конфигурации в блок scrape config в самый конец раздела:
- job_name: 'mysql_exporter_prometheus'
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ['localhost:9104']
Сохраним файл и выйдем из тестового редактора.
Поскольку этот экспортер работает на том же сервере, что и Prometheus, можно использовать localhost вместо IP-адреса и порт по умолчанию MySQL Exporter — это 9104 порт.
Весь файл конфигурации должен выглядеть так:
g# my global config
global:
scrape_interval: 5s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 5s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=` to any timeseries scraped from this config.
- job_name: 'abiturientu_ru'
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter_abiturientu_ru'
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ['localhost:9100']
- job_name: 'mysql_exporter_abiturientu_ru'
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ['localhost:9104']
Сохраним и выйдем из текстового редактора.
Проверим синтаксис:
# promtool check config /etc/prometheus/prometheus.yml
Ответ:
Чтобы настройки активировались, перезапустим службу:
# systemctl restart prometheus
Проверим успех запуска:
# systemctl status prometheus
Если состояние сервиса не active, следуйте инструкциям на экране и повторите предыдущие действия, чтобы устранить проблему, прежде чем продолжить.
Если вы получили сообщение об ошибке, убедитесь, что не допустили ошибок в синтаксисе YAML в файле конфигурации, а затем следуйте инструкциям на экране, чтобы устранить проблему. Синтаксис этого файла очень капризный, даже один лишний пробел или перенос строки, которые вы не заметили, могут не позволять запустить службу. Не расстраивайтесь и проверьте всё внимательно.
Зайдем в web-оболочку Prometheus Server и проверим targets.
Теперь можно будет получать метрики MySQL Exporter и использовать их в Grafana.
13. Проверка работы Prometheus Server.
# http://Server-IP:9090/graph
Для начала проверьте статус Prometheus и Node Explorer, открыв меню Status в верхней части экрана, а затем выбрав Targets.
Нажимаем Status —> Targets:
Поскольку Prometheus собирает и свои данные и другие метрики, в состоянии UP вы должны увидеть все цели, которые ему ставили.
Если экспортера нет или вы видите сообщение об ошибке, проверьте состояние сервисов с помощью следующих команд:
# systemctl status prometheus
# systemctl status node_exporter
# systemctl status mysql_exporter
В выводе должна быть строка Active: active (running)
. Если это не так, или активный сервер работает некорректно, вернитесь на несколько шагов обратно по инструкции, чтобы исправить ошибки.
Чтобы убедиться, что экспортеры работают правильно, выполните несколько выражений Node Exporter.
Вы можете щелкнуть Graph и запросить любые метрики сервера, а затем нажать кнопку выполнить, чтобы показать выходные данные. Он покажет вывод консоли.
Браузер запросов. Для примера запросим вручную параметр node_memory_MemAvailable_bytes
.
Консольный выход node_memory_MemAvailable_bytes
. Нажимаем клавишу Execute —>затем вкладку Graph:
В ответ получаем график метрики node_memory_MemAvailable_bytes
.
Наведите указатель мыши на график, чтобы получить дополнительную информацию о какой-либо конкретной точке вдоль осей X и Y.
Если вы хотите проверить результаты, выполните команду free
в терминале. Флаг -h
отображает вывод free
в удобочитаемом формате и выводит сумму в мегабайтах.
# free -h
Этот вывод содержит сведения об использовании памяти, включая доступную память в столбце available
.
Небольшая разница в результатах обусловлена, что сервер CentOS 7 работает в своем рабочем режиме и пока я работал с консолью состояние могло измениться. В целом метрика и запрос не врут и не противоречат друг другу.
Помимо базовых операторов язык запросов Prometheus также предоставляет множество функций для агрегирования результатов.
Чтобы узнать больше о расширениях Prometheus, ознакомьтесь со списком доступных экспортеров, а также с официальным веб-сайтом Grafana.
В повседневной жизни вы вряд ли будете смотреть графики в этом интерфейсе. Гораздо приятнее смотреть графики в Grafana.
Приглашаю проследовать к изучению следующего материала из этого цикла статей — Часть II: статья «CentOS 7: Установка и настройка Grafana Server».
14. Менеджер тревог Alertmanager.
Alertmanager — это про алерты. Первое время алертов у вас не будет, поэтому сейчас его можно не ставить. Позднее я напишу отдельную инструкцию.
15. Оригиналы источников информации.
- prometheus.io «Configuration».
- fosslinux.com «How to install and configure Prometheus on CentOS 7».
- laurvas.ru «Осваиваем мониторинг с Prometheus. Часть 1. Знакомство и установка.».
- github.com «No datapoints found. #1022».
- eax.me «Устанавливаем связку из Prometheus и Grafana».
- habr.com «Мониторинг сервисов с Prometheus».
- 8host.com «Установка Prometheus в Ubuntu».
- stackoverflow.com «mysqld_exporter DATA SOURCE NAME in mysqld_exporter.service».
- dmosk.ru «Установка Prometheus + Alertmanager + node_exporter на Linux».
Источник: https://hamsterden.ru/prometheus/