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

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