Grafana и Prometheus

Задача - организовать отдельную вм с Debian на которой будет связка Grafana и Prometheus. Без особых изьебов. Чтоб вот просто максимально Что собственно ставим?

  • Grafana - клевая и стильная система визуализации данных. Проект на гитхаб - Grafana Labs Github
  • Prometheus - система сбора данных. Проект на гитхаб - Prometheus
  • Prometheus Node Exporter - штука которая опрашивает метрики с операционной системы и отображает их по HTTP. Проект на гитхаб - Prometheus Node Exporter

Установка Grafana с deb-пакета

Методы описанные с установкой ключа и апдейта с репозиторием к сожалению не работают потому как в моем случае при запросе ключа я получаю:

mayekkuzu@linux-term:~$ curl https://apt.grafana.com/gpg.key
Sorry, the provided token is not valid

Поэтому и ставить будем просто установкой deb файла. Посмотреть можно на странице Download. На момент написания это OSS 12.1.0

sudo apt update
sudo apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/oss/release/grafana_12.1.0_amd64.deb
sudo dpkg -i grafana_12.1.0_amd64.deb
sudo systemctl daemon-reload
sudo systemctl enable grafana-server --now

Далее открываем ip-vm:3000 и авторизовываемся под admin/admin. Далее в профиле меняем пароль на свой.

Ставим Prometheus

Здесь просто ставим два пакета через apt

sudo apt install prometheus prometheus-node-exporter

После установки сервисы запустятся автоматически, но следует проверить запуск служб командой:

mayekkuzu@grafana:~$ sudo systemctl is-enabled prometheus
enabled
mayekkuzu@grafana:~$ sudo systemctl is-enabled prometheus-node-exporter
enabled

Так же смотрим что поднялись порты:

mayekkuzu@linux-term:~$ ss -tulpn
Netid      State       Recv-Q      Send-Q            Local Address:Port             Peer Address:Port      Process
tcp        LISTEN      0           100                   127.0.0.1:25                    0.0.0.0:*
tcp        LISTEN      0           4096                          *:22                          *:*
tcp        LISTEN      0           100                       [::1]:25                       [::]:*
tcp        LISTEN      0           4096                          *:9100                        *:*         # Это Node Exporter
tcp        LISTEN      0           4096                          *:9090                        *:*         # Это Prometheus

Проверяем Prometheus и Node Exporter

По умолчанию если посмотреть в конфигфаил /etc/prometheus/prometheus.yaml в конце можно увидеть в блоке scrape_configs:

- job_name: node
    # If prometheus-node-exporter is installed, grab stats about the local
    # machine by default.
    static_configs:
      - targets: ['localhost:9100']

Что говорит о том что Prometheus уже собирает метрики с этой вм. Но долетают ли они? Давайте посмотрим curl'ом. Если отсутствует то установите sudp apt install curl

mayekkuzu@linux-term:~$ curl localhost:9100/metrics
# HELP apt_autoremove_pending Apt packages pending autoremoval.
# TYPE apt_autoremove_pending gauge
apt_autoremove_pending 0
# HELP apt_package_cache_timestamp_seconds Apt update last run time.
# TYPE apt_package_cache_timestamp_seconds gauge
apt_package_cache_timestamp_seconds 1.754826140084365e+09
# HELP apt_upgrades_held Apt packages pending updates but held back.
# TYPE apt_upgrades_held gauge
apt_upgrades_held{arch="",origin=""} 0
# HELP apt_upgrades_pending Apt packages pending updates by origin.
# TYPE apt_upgrades_pending gauge
apt_upgrades_pending{arch="",origin=""} 0
...

Теперь перейдем в GUI Prometheus ip-or-fqdn:9090. Попробуем вывести какие-нибудь данные, например node_os_version должен вывести версию операционной системы. Выберем в выпадающем списке и нажмем Execute. В Console выведется информация. Если оперируете числовыми данными, такими как нагрузка на CPU, сеть или диск, то после Execute выбирайте вкладку Graph чтобы увидеть графики.

Защита метрик с помощью Basic Auth

Задачка нетривиальная на самом деле потому что нужно крафтить хэш пароля. Вобщем ставим пакет python3-bcrypt.

sudo apt install python3-bcrypt

Далее создаем фаил gen-pass.py с таким содержимым

import getpass
import bcrypt

password = getpass.getpass("password: ")
hashed_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())
print(hashed_password.decode())

Теперь формируем хеш пароля. Например наш пароль SuperPuperSecurityYobaBoba

mayekkuzu@DESKTOP-ABA6QE3:~$ python3 gen-pass.py
password: SuperPuperSecurityYobaBoba
$2b$12$mR1OGgvYQ2DuBwOkNQ6STOrGFRp5hiofRzS3g7PhK489huQCN5eVa # это и есть наш хэш

Создадим фаил /etc/prometheus/web.yml с таким содержимым

basic_auth_users:
    admin: $2b$12$mR1OGgvYQ2DuBwOkNQ6STOrGFRp5hiofRzS3g7PhK489huQCN5eVa

Далее обязательно проверяем фаил инструментом promtool на наличие ошибок:

mayekkuzu@linux-term:~$ sudo promtool check web-config /etc/prometheus/web.yml
/etc/prometheus/web.yml SUCCESS

Теперь нам необходимо фаил /etc/prometheus/web.yml передать как аргумент службе prometheus-node-exporter. Для этого приводим содержимое файла /etc/default/prometheus-node-exporter к такому виду:

ARGS="--web.config.file=/etc/prometheus/web.yml"

Далее делаем рестарт службы:

sudo systemctl restart prometheus-node-exporter
sudo systemctl status prometheus-node-exporter

Проверяем curl'ом доступ без пароля и с паролем:

mayekkuzu@linux-term:~$ curl localhost:9100/metrics
Unauthorized
mayekkuzu@linux-term:~$ curl -u admin:SuperPuperSecurityYobaBoba localhost:9100/metrics
# HELP apt_autoremove_pending Apt packages pending autoremoval.
# TYPE apt_autoremove_pending gauge
apt_autoremove_pending 0
# HELP apt_package_cache_timestamp_seconds Apt update last run time.
# TYPE apt_package_cache_timestamp_seconds gauge
apt_package_cache_timestamp_seconds 1.754582275664897e+09
...

Теперь нужно понимать что Prometheus перестал получать метрики потому как они теперь закрыты за basic auth. В блоке с job node которая слушает наш node exporter приводим к такому виду в файле /etc/prometheus/prometheus.yaml

  - job_name: node
    # If prometheus-node-exporter is installed, grab stats about the local
    # machine by default.
    static_configs:
      - targets: ['localhost:9100']
    basic_auth:
      username: 'admin'
      password: 'SuperPuperSecurityYobaBoba'

Обязательно проверяем конфигурацию

mayekkuzu@linux-term:~$ sudo promtool check config /etc/prometheus/prometheus.yml
Checking /etc/prometheus/prometheus.yml
 SUCCESS: /etc/prometheus/prometheus.yml is valid prometheus config file syntax
sudo systemctl restart prometheus
sudo systemctl status prometheus

По аналогии выше попробуем дернуть произвольные данные, если подтягиваются то все сделано корректно

Добавляем все это добро в Grafana

В панели управления Grafana сначала добавляем prometheus как Data Source. Для этого выбираем Connections -> Data Sources -> + Add Data Source -> Prometheus. Заполняем поле Connection до UI Prometheus (с портом 9090). Потому как все сервисы в одной вм - используем http://localhost:9090

Теперь импортируем Дашборд. Копируем ID с страницы https://grafana.com/grafana/dashboards/1860-node-exporter-full/

Далее идем Dashboards -> New -> Import Вставляем ID и жмакаем Load. Подписываем Дашборд если необходимо, назначаем папку и выбираем Data Source - Prometheus. Если все сделано корректно - вы автоматически перейдете в дашборд в котором можете отслеживать графики и статусы.