January 8, 2022

Мониторинг нод с помощью стека Prometheus/Node Exporter/Grafana на Ubuntu 20.04

Предварительно обновим пакеты и систему

sudo apt update && sudo apt upgrade -y

Установка Prometheus

Свежую версию ищем на официальном сайте или гитхабе.

1) Создаём системную группу и системного пользователя Prometheus.

sudo groupadd --system prometheus
sudo useradd -s /sbin/nologin --system -g prometheus prometheus

2) Скачиваем и распаковываем последнюю версию Prometheus.

curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d '"' -f 4 | wget -qi -
tar xvf prometheus*.tar.gz
cd prometheus*/

3) Создаём необходимые каталоги и копируем файлы

sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
sudo cp prometheus promtool /usr/local/bin/
sudo cp -r console_libraries consoles prometheus.yml /etc/prometheus

4) Назначаем права пользователю prometheus права на каталоги.

sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
sudo chown prometheus:prometheus /usr/local/bin/{prometheus,promtool}

5) Запускаем Prometheus.

sudo /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://<your_ip>:9090

Завершив процесс, который открыт в нашем терминале, web-интерфейс станет недоступен.

6) Для дальнейшей настройки установим mcedit и создадим юнит systemd.

sudo apt install mc -y
sudo 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

Сохраните и закройте файл. После перезагрузите демона.

sudo systemctl daemon-reload

Повторно задаем права пользователю prometheus, запускаем службу и добавляем её в автозапуск.

sudo chown -R prometheus:prometheus /var/lib/prometheus
sudo systemctl enable prometheus.service
sudo systemctl start prometheus.service
sudo systemctl status prometheus.service

Установка Node Exporter

Свежую версию ищем на гитхабе.

1) Скачиваем и распаковываем последнюю версию Node Exporter.

curl -s https://api.github.com/repos/prometheus/node_exporter/releases/latest | grep browser_download_url | grep linux-amd64 |  cut -d '"' -f 4 | wget -qi -
tar xvf node_exporter-*linux-amd64.tar.gz

2) Переходим в каталог и запускаем сценарий.

cd node_exporter-*linux-amd64
./node_exporter

Вы должны получить следующее сообщение. Не прерывайте его выполнение:

Откройте в браузере адрес http://<your_ip>:9100/metrics или создайте новую консоль терминала, обратившись к данным с помощью curl. Результат должен быть примерно следующим.

Файлы с node-exporter копируем в каталог /etc/prometheus/node-exporter.

cd ~
sudo cp -a $HOME/node_exporter-*linux-amd64/. /etc/prometheus/node-exporter/

Выставляем на него правильные права.

sudo chown -R prometheus:prometheus /etc/prometheus/node-exporter/

3) Создаём юнит node-exporter.service

sudo 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

4) Отредактируем главный конфигурационный файл prometheus, добавив в него информацию о Node Exporter.
При редактировании файлов *.yml табуляция не допустима, используйте четное количество пробелов.

sudo mcedit /etc/prometheus/prometheus.yml

Примечание: Два узла добавлены для примера, если вы хотите использовать только метрики node_exporter, достаточно указать один узел: ['localhost:9100']

Сохраняем настройки и выходим.

5) Активируем и добавляем в автозагрузку node-exporter.service.

sudo systemctl enable node-exporter.service
sudo systemctl start node-exporter.service
sudo systemctl status node-exporter.service

Перезапускаем службу prometheus.service

sudo systemctl restart prometheus.service

6) Введим в адресной строке браузера http://<your_ip>:9090/targets.

Если вы все сделали правильно, результат должен быть следующий

Установка и настройка Grafana. Тестирование Node Exporter

1) Скачиваем, устававливаем и запускаем последнюю стабильную версию.

sudo apt install -y adduser libfontconfig1 
sudo apt install -y gnupg2 curl software-properties-common
curl https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo apt -y install grafana
sudo systemctl enable --now grafana-server

2) Настроим Grafana. Добавим Prometheus в качестве источника данных.

Заходим на http://<your_ip>:3000
Username: admin
Password: admin

Сразу меняем пароль на свой.

Первым делом интегрируем Prometheus в Grafana. Для этого во вкладке «Configuration» -> «Data sources» -> «Add data source» устанавливаем плагин Prometheus.

Cо следующими параметрами подключения.

Нажимаем внизу «Save & test», видим «Data source is working» и возвращаемся в панель Grafana.

3) Настроим дашборд для графического отображения данных.

Сам дашборд: 1 Node Exporter for Prometheus Dashboard EN v20201010 by StarsL.cn.

В меню слева нажимаем на «+» -> «Create» -> «Import». Вводим ID дашборда «11074» в поле «Import via grafana.com» и нажимаем на кнопку «Load».

Дальнейшие настройки должны быть следующие.

Нажав на «Import», получим результат.

Поздравляю, настройка завершена!

Полезные настройки

Установка Node Exporter для передачи метрик ноды

1) Cкачиваем Node Exporter и задаем права доступа.

curl -s https://api.github.com/repos/prometheus/node_exporter/releases/latest | grep browser_download_url | grep linux-amd64 |  cut -d '"' -f 4 | wget -qi - && \
tar xvf node_exporter-*linux-amd64.tar.gz && \
rm node_exporter-*linux-amd64.tar.gz && \
sudo mv node_exporter-*linux-amd64 node_exporter && \
chmod +x $HOME/node_exporter/node_exporter && \
sudo mv $HOME/node_exporter/node_exporter /usr/bin && \
rm -Rvf $HOME/node_exporter/

2) Создаём файл сервиса node-exporter.

sudo tee /etc/systemd/system/node-exporter.service > /dev/null <<EOF
[Unit]
Description=node_exporter
After=network-online.target

[Service]
User=$USER
ExecStart=/usr/bin/node_exporter
Restart=always
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

3) Запускаем сервис node-exporter.

sudo systemctl daemon-reload && \
sudo systemctl enable node-exporter && \
sudo systemctl start node-exporter

4) Проверяем логи.

sudo journalctl -u node-exporter -f

В выводе терминала мы увидим нечто подобное.

Теперь переходим в браузере на своём домашнем устройстве по адресу: http://<your_ip>:9100/metrics, где <your_ip> - IP сервера, на котором установлен node_exporter.

Здесь мы должны увидеть метрики, которые будут отправляться на ноду-обработчик и в дальнейшем отображаться в графане.

Как добавить информацию с настроенных нод в графану на сервере-обработчике

После того, как экспортёры настроены, открываем файл конфига прометеуса на сервере-обработчике.

sudo mcedit /etc/prometheus/prometheus.yml

Так должен выглядеть конфиг

Обращаем внимание на подраздел job_name: "node_exporter".

targets - это сервер, на которую мы устанавливали node exporter и откуда будем получать метрики.

label - имя сервера для отображения в графане.

targets: [<IP>:9100] - меняем только IP.
label: "<label>" - меняем на своё название сервера.

Строго соблюдаем синтаксис: каждый отступ 2 пробела.

Не рекомендуется использовать пробелы в названиях лейблов.

# так будет выглядеть конфиг для одной ноды
global:
  scrape_interval:     15s
  evaluation_interval: 15s
scrape_configs:
  - job_name: "node_exporter"
    static_configs:
    - targets: [<IP>:9100]
      labels:
        label: "<label_1>"
        
# так будет выглядеть конфиг для четырёх нод
global:
  scrape_interval:     15s
  evaluation_interval: 15s
scrape_configs:
  - job_name: "node_exporter"
    static_configs:
    - targets: [<IP-1>:9100]
      labels:
        label: "<label_1>"
    - targets: [<IP-2>:9100]
      labels:
        label: "<label_2>"
    - targets: [<IP-3>:9100]
      labels:
        label: "<label_3>"
    - targets: [<IP-4>:9100]
      labels:
        label: "<label_4>"

После того, как настроили конфиг, сохраняем изменения и перезапускаем Grafana и Prometheus.

sudo systemctl daemon-reload && \
sudo systemctl restart grafana-server && \
sudo systemctl restart prometheus.service

Идем в Grafana и смотрим что получилось.


Ресурсы, которые я использовал для подготовки гайда.