Независимо от того, являетесь ли вы System Administrator\DevOps в крупной ИТ компании, или ваш парк состоит из небольшого количества серверов, или вы разработчик который желает держать жизненный цикл приложения под контролем "в облаке", важно одно - следить за своей инфраструктурой и приложениями. Качественно настроенный мониторинг позволяет узнать когда сервер\приложение выходит из строя, и когда появляются к этому предпосылки. В этой статье мы дадим краткий обзор того, как настроить мониторинг используя стек Prometheus, Grafana и Node Exporter.
Prometheus - сердце мониторинга. Это экосистема, позволяющая собирать метрики с физических серверов, VPS, отдельных приложений, различных баз данных, контейнеров и устройств IoT. Prometheus включает в себя сотни готовых решений для сбора информации и позволяет одновременно мониторить тысячи служб. При необходимости, по мере изучения, опытный администратор может для него написать свои сценарии.
Node exporter - представляет из себя готовое приложение, экспортер метрик Prometheus для сбора данных о состоянии сервера в среду визуализации.
Grafana - среда визуализации. Использует метрики, которые собрал Prometheus, и отображает их в виде информативных графиков и диаграмм, организованных в настраиваемые панели.
18 мая 2020 года состоялся долгожданный релиз Grafana 7.0. Рассмотрим основные новшества:
- Новый редактор панелей. Редизайн на основе отзывов сообщества.
- Новый интерфейс трассировки и поддержка визуализации трассировок Jaeger и Zipkin.
- Анализ корпоративного использования, индикатор присутствия пользователей, улучшение аутентификации.
- Данные, которые вы хотите визуализировать, могут поступать из разных мест, и они не всегда в правильной форме. Теперь пользователи могут преобразовывать данные в таблицы, не относящиеся к временным рядам (например, файлы JSON или даже простые таблицы поиска).
- Улучшенный дашборд. Он поддерживает горизонтальную прокрутку и изменение размера столбцов. Вы можете изменять порядок, скрывать и переименовывать столбцы. Эта новая панель также поддерживает новые режимы отображения ячеек.
- Новые плагины платформы.
- Обновленный tutorials.
- Поддержка Amazon CloudWatch для журналов Cloudwatch.
- Удален PhantomJS.
- Поддержка часовых поясов
Рассмотрим пример дашборда, который предлагает Node Exporter for Prometheus Dashboard для Linux host машин. Визуализация следующих данных: disk space, process count, swap, cpu usage, RAM usage, IP outgoing traffic, system load, disk I/O и другие метрики.
Для каждой панели вы можете настроить свой необходимый набор графиков и подключить для мониторинга сотни хостов и приложений.
- Установка Prometheus
- Установка Node Exporter
- Установка и настройка Grafana. Тестирование Node Exporter
- Установка и настройка MySQL Exporter
- Установка других экспортеров
- Защита Grafana\Prometheus
- Заключение
Установка Prometheus
Свежую версию ищем на официально странице
root@dedicated:~# wget https://github.com/prometheus/prometheus/releases/download/ v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz root@dedicated:~# tar zxvf prometheus-2.18.1.linux-amd64.tar.gz root@dedicated:~# cd prometheus-2.18.1.linux-amd64/
Создадим необходимые каталоги, и скопируем в них необходимые файлы:
root@dedicated:~# mkdir /etc/prometheus root@dedicated:~# mkdir /var/lib/prometheus root@dedicated:~# cp prometheus promtool /usr/local/bin/ root@dedicated:~# cp -r console_libraries consoles prometheus.yml /etc/prometheus
Добавим пользователя prometheus:
root@dedicated:~# useradd --no-create-home --shell /bin/false prometheus
И назначим правильные права на каталоги:
root@dedicated:~# chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus root@dedicated:~# chown prometheus:prometheus /usr/local/bin/{prometheus,promtool}
Следующей командой запустим Prometheus:
root@dedicated:~# /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
Успешным выполнением можно считать состояние «Server is ready to receive web requests»:
Не завершая вывода консоли вводим в браузере http://178.20.152.79:9090
Завершив процесс который открыт в нашем терминале, web-интерфейс станет недоступен. Для дальнейшей настройки создадим юнит systemd:
root@dedicated:~# mcedit /etc/systemd/system/prometheus.service
следующего содержания:
[Unit] Description=Prometheus Service After=network.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
Сохраните и закройте файл. Создание, редактирование и управление системой инициализации Systemd мы ранее рассматривали в руководстве «Использование systemd»
root@dedicated:~# systemctl daemon-reload
Повторно задаем права пользователю prometheus, запускаем службу и добавляем её в автозапуск:
root@dedicated:~# chown -R prometheus:prometheus /var/lib/prometheus root@dedicated:~# systemctl enable prometheus.service root@dedicated:~# systemctl start prometheus.service root@dedicated:~# systemctl status prometheus.service
Установка Node Exporter
Свежую версию Node Exporter ищем на странице приложения. Скачайте его и извлеките из архива:
root@dedicated:~# wget https://github.com/prometheus/node_exporter /releases/download/v1.0.0/node_exporter-1.0.0.linux-amd64.tar.gz root@dedicated:~# tar xvfz node_exporter-*.*-amd64.tar.gz
Перейдите в каталог и запустите сценарий:
root@dedicated:~# cd node_exporter-*.*-amd64 root@dedicated:~# ./node_exporter
Вы должны получить следующее сообщение. Не прерывайте его выполнение:
Откройте в браузере адрес http://ip_address:9100/metrics, или создайте новую консоль терминала, обратившись к данным с помощью curl. Результат должен быть примерно следующим:
Файлы с node-exporter предварительно скопированы в каталолг /etc/prometheus/node-exporter/. Проследите так же, чтобы на него были выставлены правильные права:
root@dedicated:~# chown -R prometheus:prometheus /etc/prometheus/node-exporter/
Cоздайте юнит со следующим содержимым:
root@dedicated:~# mcedit /etc/systemd/system/node-exporter.service [Unit] Description=Node Exporter After=network.target [Service] User=prometheus Group=prometheus Type=simple ExecStart=/etc/prometheus/node-exporter/node_exporter [Install] WantedBy=multi-user.target
Затем отредактируйте главный конфигурационный файл prometheus, добавив в него информацию о Node Exporter. При редактировании файлов *.yml табуляция не допустима, используйте четное количество пробелов:
scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090', 'localhost:9100']
Примечание: Два узла добавлены для примера, если вы хотите использовать только метрики node_exporter, достаточно указать один узел: ['localhost:9100']
Примените настройки, активируйте и добавьте в автозагрузку node-exporter.service, перезапустите службу prometheus.service. Введите в адресной строке браузера http://ip_address:9090/targets
Если вы все сделали правильно, результат должен быть следующий:
Установка и настройка Grafana. Тестирование Node Exporter
Скачиваем и устававливаем последнюю стабильную версию:
root@dedicated:~# apt-get install -y adduser libfontconfig1 root@dedicated:~# wget https://dl.grafana.com/oss/release/grafana_7.0.3_amd64.deb root@dedicated:~# dpkg -i grafana_7.0.3_amd64.deb root@dedicated:~# systemctl enable grafana-server root@dedicated:~# systemctl start grafana-server root@dedicated:~# systemctl status grafana-server http://ip_address:3000/ login: admin password: admin
После ввода стандартного логина и пароля, вам сразу же будет предложено ввести новый пароль и подтвердить его.
Первым делом интегрируем Prometheus в Grafana. Для этого во вкладке «Configuration» - «Data Sources» устанавливаем плагин Prometheus со следующими параметрами подключения:
В нашем примере мы будем использовать Node Exporter for Prometheus Dashboard EN v20191102. Переходим по ссылке, внимательно читаем описание и качаем JSON файл.
Возвращаемся в панель Grafana, в меню слева выберем «+» -> «Create» -> «Import». Нажав «Upload .json file» выбираем наш скачанный дискавери. Дальнейшие настройки должны быть следующие:
Выполнив все эти действия мы должны получить результат:
Примеры будут не полные, если мы не проведем базовое нагрузочное тестирование. Делаем это на чистой тестовой базе данных. В правом верхнем углу выберем обновление графиков 5 секунд и результат за последние 30 минут.
На хостовой машине установим утилиту и stress и запустим её:
root@dedicated:~# apt-get install stress root@dedicated:~# root@dedicated:~# stress -c 2 -i 1 -m 1 --vm-bytes 256M -t 60s
или:
root@dedicated:~# apt-get install sysbench root@dedicated:~# sysbench --test=cpu --cpu-max-prime=20000 ru
Ждем 60 секунд и посмотрим на некоторые наши графики:
Протестируем дисковую подсистему и удалим созданный файл:
root@dedicated:~# sysbench --test=fileio --file-total-size=2G prepare root@dedicated:~# sysbench fileio --file-total-size=2G cleanup
Установка и настройка MySQL Exporter
Установим MySQL Exporter. Свежий релиз смотрим на официальном проекте на GitHub
root@dedicated:~# wget https://github.com/prometheus/mysqld_exporter/releases /download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz root@dedicated:~# tar xvf mysqld_exporter*.tar.gz root@dedicated:~# mv mysqld_exporter-*.linux-amd64/mysqld_exporter /usr/local/bin/ root@dedicated:~# chmod +x /usr/local/bin/mysqld_exporter
Добавим данные для аутентификации:
root@dedicated:~# mcedit /etc/.mysqld_exporter.cnf [client] user=mysqld_exporter password=StrongPassword Создадим юнит systemd: root@dedicated:~# mcedit /etc/systemd/system/mysqld_exporter.service [Unit] Description=Prometheus MySQL Exporter After=network.target User=prometheus Group=prometheus [Service] Type=simple Restart=always ExecStart=/usr/local/bin/mysqld_exporter \ --config.my-cnf /etc/.mysqld_exporter.cnf \ --collect.global_status \ --collect.info_schema.innodb_metrics \ --collect.auto_increment.columns \ --collect.info_schema.processlist \ --collect.binlog_size \ --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 \ --web.listen-address=127.0.0.1:9104 [Install] WantedBy=multi-user.target
Применим настройки и убедимся, что служба работоспособна:
root@dedicated:~# systemctl daemon-reload root@dedicated:~# systemctl start mysqld_exporter.service root@dedicated:~# systemctl enable mysqld_exporter.service root@dedicated:~# systemctl status mysqld_exporter.service
Добавим информацию о службе в конфигурационный файл Prometheus
root@dedicated:~# mcedit /etc/prometheus/prometheus.yml - job_name: 'mysqld_exporter' static_configs: - targets: ['127.0.0.1:9104']
Проверьте работоспособность. Перезагрузите prometheus и выполните запрос данных:
root@dedicated:~# curl http://localhost:9104/metrics
Создадим тестовую базу mariadb c двумя пользователями, userdb для тестирования и mysqld_exporter для подключения к Grafana:
MariaDB [(none)]> CREATE DATABASE testdb character set utf8 collate utf8_bin; MariaDB [(none)]> GRANT ALL PRIVILEGES ON testdb.* TO userdb@localhost IDENTIFIED by 'StrongPassword'; MariaDB [(none)]>GRANT ALL PRIVILEGES ON testdb.* TO mysqld_exporter@localhost IDENTIFIED by 'StrongPassword'; MariaDB [(none)]> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysqld_exporter'@'localhost'; MariaDB [(none)]> FLUSH PRIVILEGES; MariaDB [(none)]> QUIT;
Затем во вкладке «Configuration» - «Data Sources» устанавливаем плагин MySQL и настроим подключение к нашей созданной базе данных:
Аналогично, как это было с Node Exporter, установим дашборд для сбора метрик MySQL, например, этот. Выполняем импорт JSON:
и получаем дашборд следующего вида:
Графиков на самом деле намного больше, но не будем акцентировать внимание на скриншотах, при необходимости вы можете поменять их расположение и удалить ненужные. Каждый дашборд вы можете настроить как угодно для собственного удобства. Давайте лучше выполним нагрузочное тестирование уже знакомой нам утилитой sysbench. Для начала подготовим нашу базу данных, создадим таблички (у меня это 10000), укажем параметры подключения:
root@dedicated:~# sysbench --db-driver=mysql --mysql-user=userdb --mysql-password='StrongPassword' --mysql-db=testdb --mysql_storage_engine=mariadb --table_size=10000 --tables=4 --threads=4 /usr/share/sysbench/oltp_read_write.lua prepare
...и запустим непосредственно тест:
root@dedicated:~# sysbench --db-driver=mysql --mysql-user=userdb --mysql-password='StrongPassword' --mysql-db=testdb --mysql_storage_engine=innodb --table_size=10000 --tables=4 --threads=1 --time=60 /usr/share/sysbench/oltp_read_write.lua run
Выполнение у нас выставлено 60 секунд. Пока выполняется нагрузочное тестирование, посмотрим как ведут себя графики:
Как видим, Grafana отреагировала на аномалию.
Установка других экспортеров
У Prometheus есть множество готовых решений, ознакомится вы можете на официальной странице сообщества. Готовые дашборды Grafana так же доступны в свободном доступе для скачивания. В зависимости от операционной системы и архитектурных решений, установка может отличаться, но для администратора, при понимании функционирования своей инфраструктуры, не должно возникнуть проблем в донастройке. Стек Grafana\Prometheus довольно гибок, и если каких-то решений не существует, по мере изучения, вы можете научиться писать свои собственные уникальные service discovery для сбора метрик.
Защита Grafana\Prometheus
Каждый экспортер и решение которые вы устанавливаете на сервер, должно быть закрыто средствами firewall от внешнего мира. Доступ к метрикам должен быть строго ограничен, все порты которые предоставляют информацию о хост системе, должны быть защищены
Если вы настраиваете экспортеры на продакшн сервере, установку необходимо начинать с ограничения доступа по портам извне. Или наоборот, открыть порт, если он закрыт брандмауэром. Предварительно, с портами, которые используют экспортеры вы можете ознакомиться на GitHub или обратиться к официальной документации.
У Prometheus отсутствует встроенная система аутентификации. В этом разделе мы рассмотрим на простом примере, как мы дожем ограничить к нему доступ. Начнем с установки необходимых компонентов:
root@dedicated:~# apt-get install nginx apache2-utils
Следующая команда попросит ввести и подтвердить пароль для пользователя freehost. Придумайте сложный пароль, не менее 10 символов, с латинскими буквами разных регистров, цифрами и спецсимволами:
root@dedicated:~# htpasswd -c /etc/nginx/.htpasswd freehost New password: Re-type new password: Adding password for user freehost
В каталоге nginx будет создана соответствующая запись:
root@dedicated:~# cat /etc/nginx/.htpasswd freehost:$apr3$Rkb2qvSWQH$IyiKaGhwrJhS7i.sKJQUKhFrqmgrO.
Создадим виртуалхост для Prometheus:
root@dedicated:~# cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/prometheus.conf root@dedicated:~# mcedit /etc/nginx/conf.d/prometheus.conf
следующего содержания:
Теперь разрешим весь трафик на локальном узле, и ограничим доступ по порту снаружи для Node Exporter. Трафик нужно ограничить для всех экспортёров, которые будут вами использоваться
root@dedicated:~# iptables -A INPUT -i lo -j ACCEPT root@dedicated:~# iptables -A INPUT -p tcp --dport 9100 -j DROP root@dedicated:~# iptables -A INPUT -p tcp --dport 9090 -j DROP
Проверим доступ во стороннего IP адреса закрытость порта и отдаются ли метрики:
Заключение
Используя Grafana в связке с Prometheus мы можем следить за состоянием сервера и своевременно анализировать аномалии. Подробные графики показывают полную картину функционирования сервера и позволяют администратору более точно определить причину некорректной работы. Большое количество готовых экспортеров может сполна покрыть большинство задач администрирования. Для наших клиентов облачного VPS хостинга, мы приготовили шаблон, с помощью которого вы сможете установить Debian 10 с предустановленным стеком Grafana\Prometheus\Node Exporter в считанные минуты и приступить к его настройке. Наша круглосуточная служба технической поддержки поможет с его базовой настройкой, если у вас возникнут сложности.
Дата: 12.06.2020 Автор: Дмитрий
|
|
Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:
comments powered by Disqus