Node-exporter + Grafana + Prometheus + Alertmanager
🪓 Telegram канал UTSA 🪓 Telegram чат UTSA
В данном гайде мы настроим систему мониторинга, которая будет собирать метрики со всех наших серверов и визуализировать их в Grafana. Также можно установить Alertmanager для получения оповещений о проблемах серверов в нашем случае в телеграм
Нам необходим отдельный сервер для Prometheus, Grafana, Node Exporter, Alertmanager. На все остальные сервера будет устанавливаться только Node Exporter
Prometheus является открытой СУБД, написанной на языке Go. Интересной особенностью Prometheus является то, что он сам вытягивает метрики с заданного множества сервисов. За счет этого у Prometheus не могут забиться какие-либо очереди данных, а значит мониторинг никогда не станет узким местом системы
Node Exporter - это сервис, задача которого заключается в экспорте информации о машине в формате, понятном Prometheus. На самом деле для Prometheus существует много других exporter’ов, но нам для мониторинга серверов отлично подойдет Node Exporter
Grafana представляет собой открытый веб-фронтенд к различным time series СУБД, таким, как Graphite, InfluxDB, и, конечно, Prometheus. С помощью Grafana мы сможем наблюдать красивые графики через наш браузер. Характерно, что у Prometheus есть и собственный веб-интерфейс, но даже сами разработчики Prometheus рекомендуют использовать Grafana
Получается что Node Exporter будет собирать нам информацию о сервере и передавать ее в Prometheus. Prometheus будет в свою очередь хранить и передавать информацию в Grafana. А Grafana будет визуализировать для нас всю информацию в виде приятных графиков
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):8080/\033[0m"
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9100/\033[0m"
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):3000/\033[0m"
Node Exporter
Node Exporter
Node Exporter мы устанавливаем на все наши сервера, чтобы с них собирать данные и передавать их на основной сервер, где будет установлен Prometheus и Grafana. В целях безопасности создадим учетную запись node_exporter
# используем параметры --no-create-home и --shell /bin/false, # чтобы этот пользователь не мог войти на сервер useradd --no-create-home --shell /bin/false node_exporter
Вы можете найти последние двоичные файлы вместе с их контрольными суммами на странице загрузки Prometheus
cd wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz tar xvf node_exporter-1.5.0.linux-amd64.tar.gz # скопируем бинарные файлы в /usr/local/bin cp node_exporter-1.5.0.linux-amd64/node_exporter /usr/local/bin chown node_exporter:node_exporter /usr/local/bin/node_exporter node_exporter --version #node_exporter, version 1.5.0 (branch: HEAD, revision: 1b48970ffcf5630534fb00bb0687d73c66d1c959) # удаляем ненужные файлы rm -r node_exporter-*
tee /etc/systemd/system/node_exporterd.service > /dev/null <<EOF [Unit] Description=Node Exporter Wants=network-online.target After=network-online.target [Service] User=node_exporter Group=node_exporter ExecStart=/usr/local/bin/node_exporter [Install] WantedBy=default.target EOF
systemctl daemon-reload systemctl enable node_exporterd systemctl restart node_exporterd && journalctl -u node_exporterd -f -o cat
Проверяем, что метрики отдаются
curl 'localhost:9100/metrics'
Теперь самое время проверить метрики в браузере
# узнаем адрес и вставляем в браузер echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9100/\033[0m" # http://108.108.108.108:9100/
Prometheus, Grafana, AlertManager
Для Prometheus и Grafana используем отдельный сервер. Можно арендовать VPS 1/2/20
Шаг 1 - Подготовка сервера
# обновляем репозитории apt update && apt upgrade -y # устанавливаем необходимые утилиты apt install curl iptables build-essential git wget jq make gcc nano tmux htop nvme-cli pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip libleveldb-dev -y apt install python3-pip -y pip install yq
File2Ban - подробнее здесь
# устанавливаем и копируем конфиг, который будет иметь больший приоритет apt install fail2ban -y && \ cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local && \ nano /etc/fail2ban/jail.local # раскомментировать и добавить свой IP: ignoreip = 127.0.0.1/8 ::1 <ip> systemctl restart fail2ban # проверяем status systemctl status fail2ban # проверяем, какие jails активны (по умолчанию только sshd) fail2ban-client status # проверяем статистику по sshd fail2ban-client status sshd # смотрим логи tail /var/log/fail2ban.log # останавливаем работу и удаляем с автозагрузки #systemctl stop fail2ban && systemctl disable fail2ban
Шаг 2 - Создание пользователя Prometheus
В целях безопасности создадим учетную запись prometheus
# используем параметры --no-create-home и --shell /bin/false, # чтобы этот пользователь не мог войти на сервер useradd --no-create-home --shell /bin/false prometheus # создадим необходимые каталоги для хранения файлов и данных Prometheus mkdir /etc/prometheus mkdir /var/lib/prometheus # установим права пользователя и группы в новых каталогах для пользователя prometheus chown prometheus:prometheus /etc/prometheus chown prometheus:prometheus /var/lib/prometheus
Шаг 3 - Установка Prometheus
Вы можете найти последние двоичные файлы вместе с их контрольными суммами на странице загрузки Prometheus
cd && \ wget https://github.com/prometheus/prometheus/releases/download/v2.38.0/prometheus-2.38.0.linux-amd64.tar.gz && \ tar xvf prometheus-2.38.0.linux-amd64.tar.gz
# скопируем бинарные файлы в /usr/local/bin cp prometheus-2.38.0.linux-amd64/prometheus /usr/local/bin/ cp prometheus-2.38.0.linux-amd64/promtool /usr/local/bin/ # установим права собственности пользователя и группы на бинарные файлы chown prometheus:prometheus /usr/local/bin/prometheus chown prometheus:prometheus /usr/local/bin/promtool # скопируем consoles, console_libraries и prometheus.yml в /etc/prometheus cp -r prometheus-2.38.0.linux-amd64/consoles /etc/prometheus cp -r prometheus-2.38.0.linux-amd64/console_libraries /etc/prometheus cp prometheus-2.38.0.linux-amd64/prometheus.yml /etc/prometheus/ # установим права собственности пользователя и группы в каталогах для пользователя prometheus # флаг -R гарантирует, что право собственности также будет установлено для файлов внутри каталога chown -R prometheus:prometheus /etc/prometheus # удаляем ненужные файлы rm -rf prometheus-2.38.0.linux-amd64.tar.gz prometheus-2.38.0.linux-amd64 # проверим версии prometheus --version promtool --version
Шаг 4 - Настройка Prometheus
Теперь нам необходимо настроить prometheus.yml и добавить в него 1 или несколько параметров в зависимости от количества серверов и используемых нод
Предупреждение: конфигурационный файл Prometheus использует формат YAML, который строго запрещает табуляцию и требует двух пробелов для отступа. Prometheus не запустится, если файл конфигурации неправильно отформатирован
Info: Prometheus использует job_name
для обозначения экспортеров в запросах и на графиках, поэтому обязательно заполняем данное значение
В некоторых случая, к примеру для APTOS необходимо также указывать chain:
И, поскольку Prometheus экспортирует важные данные о себе, которые можно использовать для мониторинга производительности и отладки, то переопределимscrape_interval
с 15 секунд до 5 секунд для более частых обновлений
Наконец, Prometheus использует директивы static_configs
иtargets
, чтобы определить, где работают экспортеры. Поскольку этот конкретный экспортер работает на том же сервере, что и сам Prometheus, мы можем использовать localhost
вместо IP-адреса вместе с портом по умолчанию, 9090
Открываем дефолтный конфиг и приводим его к следующему виду
nano /etc/prometheus/prometheus.yml
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:8080','localhost:9100']
ВНИМАНИЕ - мы заменили стандартный порт prometheus (9090) на порт (8080)
После завершения настройки мы готовы протестировать Prometheus, запустив его в первый раз
tee /etc/systemd/system/prometheusd.service > /dev/null <<EOF [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 \ --web.listen-address=:8080 [Install] WantedBy=multi-user.target EOF
systemctl daemon-reload && systemctl enable prometheusd && systemctl restart prometheusd && systemctl status prometheusd #journalctl -u prometheusd -f -o cat
Проверяем, что метрики отдаются
curl 'localhost:8080/metrics'
Теперь самое время проверить информацию в браузере
# узнаем адрес и вставляем в браузер echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):8080/\033[0m" # http://108.108.108.108:9090/
В дальнейшем Вы можете добавлять в prometheus.yml дополнительную информацию о других своих серверах, чтобы мониторить сразу несколько серверов. Конфигурация будет зависеть от Ваших настроек и json для Grafana
Шаг 5 - Установка Grafana
Вы можете найти последние двоичные файлы вместе с их контрольными суммами на странице загрузки Grafana
sudo apt-get install -y adduser libfontconfig1 musl wget https://dl.grafana.com/enterprise/release/grafana-enterprise_11.2.2_amd64.deb sudo dpkg -i grafana-enterprise_11.2.2_amd64.deb
systemctl daemon-reload && systemctl enable grafana-server && systemctl restart grafana-server && systemctl status grafana-server
journalctl -u grafana-server -f
Теперь самое время перейти в браузер
# узнаем адрес и вставляем в браузер echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):3000/\033[0m" # http://108.108.108.108:3000/
Теперь нам необходимо указать в графе URL адрес к своему серверу с Prometheus. Если Prometheus находится на том же сервере, что и Grafana, то задаем http://localhost:8080 и сохраняем настройки
Теперь самое интересное и нам необходимо загрузить json файлы для нашего дашборда. Для этого необходимо знать ID json файла или скачать его у кого-то или создать самому
- Найти json по душе можно здесь
Если у нас есть скачанный json, то загружаем его самостоятельно
Можно загрузить сразу несколько json и переключаться между ними. Или создать свой собственный, потратив на это определенное количество времени)
Шаг 6 - Установка Alert manager
Для начала настроим правила Prometheus. Для этого создаем файл rules.yml в разделе /etc/prometheus/, в котором будут размещены наши правила для alerts
В нашем конфигурационном файле мы будем мониторить работу node exporter, нагрузку CPU, RAM и объем диска
nano /etc/prometheus/rules.yml
groups: - name: CriticalAlers rules: - alert: UPTIME_DOWN expr: up == 0 for: 1m labels: severity: critical annotations: description: '🚨𝐒𝐄𝐑𝐕𝐄𝐑 𝐢𝐬 𝐃𝐎𝐖𝐍 {{ $labels.instance }} ' summary: 'СЕРВЕР НЕДОСТУПЕН БОЛЕЕ 1 МИНУТЫ. ПРОВЕРИТЬ node_exporter И САМ СЕРВЕР' - alert: DISK_space_usage_is_High expr: 100 * (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes{mountpoint="/"})) > 85 for: 1m labels: severity: critical annotations: description: '🚨𝐇𝐈𝐆𝐇 𝐃𝐈𝐒𝐊 𝐔𝐒𝐀𝐆𝐄 {{ $labels.instance }} ' summary: 'ДИСК ЗАПОЛНЕН НА 85 ПРОЦЕНТОВ. ПРОВЕРИТЬ ДИСК' - alert: DISK_space_BIGDATA_usage_is_High expr: 100 * (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes{mountpoint="/bigdata"})) > 85 for: 1m labels: severity: critical annotations: description: '🚨𝐇𝐈𝐆𝐇 𝐃𝐈𝐒𝐊 𝐔𝐒𝐀𝐆𝐄 {{ $labels.instance }} ' summary: 'ДИСК BIGDATA ЗАПОЛНЕН НА 85 ПРОЦЕНТОВ. ПРОВЕРИТЬ ДИСК' - alert: CPU_usage_is_High expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85 for: 1m labels: severity: critical annotations: description: '🚨𝐇𝐈𝐆𝐇 𝐂𝐏𝐔 𝐔𝐒𝐀𝐆𝐄 {{ $labels.instance }} ' summary: 'CPU ИСПОЛЬЗУЕТ БОЛЕЕ 85 ПРОЦЕНТОВ. ПРОВЕРИТЬ СЕРВЕР' - alert: RAM_usage_is_High expr: 100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) > 85 for: 1m labels: severity: critical annotations: description: '🚨𝐇𝐈𝐆𝐇 𝐑𝐀𝐌 𝐔𝐒𝐀𝐆𝐄 {{ $labels.instance }} ' summary: 'RAM ИСПОЛЬЗУЕТ БОЛЕЕ 85 ПРОЦЕНТОВ. ПРОВЕРИТЬ СЕРВЕР'
Добавляем информацию о наших rules в существующий конфиг prometheus
nano /etc/prometheus/prometheus.yml
rule_files: - 'rules.yml' alerting: alertmanagers: - static_configs: - targets: - localhost:9093
Проверяем созданные правила. Вывод должен быть #SUCCESS
promtool check rules /etc/prometheus/rules.yml
После внесения всех изменений перезагружаем Prometheus
systemctl restart prometheusd && systemctl status prometheusd
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz tar -zxf alertmanager-0.26.0.linux-amd64.tar.gz # скопируем бинарные файлы в /usr/local/bin/ cp alertmanager-0.26.0.linux-amd64/alertmanager /usr/local/bin/ cp alertmanager-0.26.0.linux-amd64/amtool /usr/local/bin/ # скопируем alertmanager.yml в /etc/prometheus/ cp alertmanager-0.26.0.linux-amd64/alertmanager.yml /etc/prometheus # даем пользователю prometheus права на конфигурационные файлы chown -R prometheus:prometheus /etc/prometheus/alertmanager.yml chown -R prometheus:prometheus /etc/prometheus/rules.yml chown -R prometheus:prometheus /usr/local/bin/alertmanager chown -R prometheus:prometheus /usr/local/bin/amtool
# удаляем исходник cd rm -r alertmanager-*
Настраиваем alertmanager.yml, в котором прописываем бот токен и чат ID от телеграм, на который будут приходить уведомления
nano /etc/prometheus/alertmanager.yml
global: resolve_timeout: 10s route: group_by: ['alertname'] group_wait: 10s group_interval: 15s repeat_interval: 60m receiver: 'telegram_bot' receivers: - name: 'telegram_bot' telegram_configs: - bot_token: 'ВАШ_БОТ_ТОКЕН' api_url: 'https://api.telegram.org' chat_id: ВАШ_ЧАТ_ID parse_mode: ''
Теперь можно попробовать сделать пробный запуск и отключить временно node exporter на другом сервере. Должно будет прийти оповещение в телеграм
alertmanager --config.file=/etc/prometheus/alertmanager.yml
Веб-интерфейс будет доступен на порту 9093. Узнаем адрес и вставляем в браузерecho -e "\033[0;32mhttp://$(wget -qO- eth0.me):9093/\033[0m"
tee /etc/systemd/system/alertmanager.service > /dev/null <<EOF [Unit] Description=alertmanager After=network.target [Service] User=prometheus Group=prometheus Type=simple ExecStart=/usr/local/bin/alertmanager --config.file=/etc/prometheus/alertmanager.yml --log.level=debug [Install] WantedBy=multi-user.target EOF
systemctl daemon-reload systemctl enable alertmanager systemctl restart alertmanager && systemctl status alertmanager journalctl -u alertmanager -f -o cat
Настройка UFW
В целях обеспечения защиты своих данных необходимо как минимум закрыть наши порты от других, так как без этого любой зная IP сервера и порт сможет получить данные Node exporter или Prometheus c Grafana
Мы можем настроить UFW так, чтобы данные с Prometheus и Grafana были доступны только с нужного нам IP (к примеру домашнего ПК). А данные от Node exporter были доступны только для сервера где установлен Prometheus
# Разрешить получать данные от Grafana только с домашнего IP ufw allow from <ВАШ_IP> to any port 3000
# Разрешить получать данные от Prometheus только с домашнего IP ufw allow from <ВАШ_IP> to any port 8080
# Разрешить получать данные от Node Exporter только для сервера с Prometheus ufw allow from <IP_PROMETHEUS> to any port 9100
Полезные команды
apt install stress stress --cpu 4 --timeout 600s
apt install stress-ng stress-ng --vm-bytes $(awk '/MemFree/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1
systemctl stop alertmanager systemctl disable alertmanager rm /etc/systemd/system/alertmanager.service systemctl daemon-reload
systemctl stop prometheusd systemctl disable prometheusd systemctl daemon-reload rm /etc/systemd/system/prometheusd.service
systemctl stop grafana-server systemctl disable grafana-server systemctl daemon-reload