COSMOS WIKI
October 7, 2023

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 будет визуализировать для нас всю информацию в виде приятных графиков

Порты по умолчанию:

  • prometheus - 9090 (в нашем гайде изменен на 8080)

echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):8080/\033[0m"

  • node exporter - 9100

echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9100/\033[0m"

  • grafana - 3000

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/
Нажимаем на Metrics
Видим, что все отлично и мы получаем нужные данные, которые позже будут отображаться в Grafana

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/
Переходим в Targets

В дальнейшем Вы можете добавлять в 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

Cмотрим логи

journalctl -u grafana-server -f

Теперь самое время перейти в браузер

# узнаем адрес и вставляем в браузер
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):3000/\033[0m"
# http://108.108.108.108:3000/
При первом открытии необходимо ввести логин и пароль
  • Логин - admin
  • Пароль - admin
Система сразу просит придумать нам новый пароль. Не пропускайте это!!!
Переходим в Data sources, чтобы настроить Grafana

Теперь нам необходимо указать в графе 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

Полезные команды

Временно нагрузить CPU

apt install stress
stress --cpu 4 --timeout 600s

Временно нагрузить RAM

apt install stress-ng
stress-ng --vm-bytes $(awk '/MemFree/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

Удалить Alert manager

systemctl stop alertmanager
systemctl disable alertmanager
rm /etc/systemd/system/alertmanager.service
systemctl daemon-reload

Удалить Prometheus

systemctl stop prometheusd
systemctl disable prometheusd
systemctl daemon-reload
rm /etc/systemd/system/prometheusd.service

Удалить Grafana

systemctl stop grafana-server
systemctl disable grafana-server
systemctl daemon-reload
Поддержим природу вместе: 0xa7476EC14cD663C742d527113638C77a1631Cc89 cosmos1m2mm7kzvw6m3464h94ryqg8xvr6tyeyyecppnq