# Grafana и Prometheus Задача - организовать отдельную вм с Debian на которой будет связка Grafana и Prometheus. Без особых изьебов. Чтоб вот просто максимально Что собственно ставим? - Grafana - клевая и стильная система визуализации данных. Проект на гитхаб - [Grafana Labs Github](https://github.com/grafana/grafana) - Prometheus - система сбора данных. Проект на гитхаб - [Prometheus](https://github.com/prometheus/prometheus) - Prometheus Node Exporter - штука которая опрашивает метрики с операционной системы и отображает их по HTTP. Проект на гитхаб - [Prometheus Node Exporter](https://github.com/prometheus/node_exporter) ## Установка Grafana с deb-пакета Методы описанные с установкой ключа и апдейта с репозиторием к сожалению не работают потому как в моем случае при запросе ключа я получаю: ```bash mayekkuzu@linux-term:~$ curl https://apt.grafana.com/gpg.key Sorry, the provided token is not valid ``` :::info # Как оказалось в дальнейшем С не отечественных IP ключ отображается. Понятно ::: Поэтому и ставить будем просто установкой deb файла. Посмотреть можно на странице [Download](https://grafana.com/grafana/download?edition=oss). На момент написания это OSS 12.1.0 ```bash 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 ```bash sudo apt install prometheus prometheus-node-exporter ``` После установки сервисы запустятся автоматически, но следует проверить запуск служб командой: ```bash mayekkuzu@grafana:~$ sudo systemctl is-enabled prometheus enabled mayekkuzu@grafana:~$ sudo systemctl is-enabled prometheus-node-exporter enabled ``` Так же смотрим что поднялись порты: ```bash 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`: ```yaml - 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` ```bash 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. ```bash sudo apt install python3-bcrypt ``` Далее создаем фаил gen-pass.py с таким содержимым ```python import getpass import bcrypt password = getpass.getpass("password: ") hashed_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt()) print(hashed_password.decode()) ``` Теперь формируем хеш пароля. Например наш пароль `SuperPuperSecurityYobaBoba` ```bash mayekkuzu@DESKTOP-ABA6QE3:~$ python3 gen-pass.py password: SuperPuperSecurityYobaBoba $2b$12$mR1OGgvYQ2DuBwOkNQ6STOrGFRp5hiofRzS3g7PhK489huQCN5eVa # это и есть наш хэш ``` Создадим фаил /etc/prometheus/web.yml с таким содержимым ```yaml basic_auth_users: admin: $2b$12$mR1OGgvYQ2DuBwOkNQ6STOrGFRp5hiofRzS3g7PhK489huQCN5eVa ``` Далее обязательно проверяем фаил инструментом promtool на наличие ошибок: ```bash 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` к такому виду: ```bash ARGS="--web.config.file=/etc/prometheus/web.yml" ``` Далее делаем рестарт службы: ```bash sudo systemctl restart prometheus-node-exporter sudo systemctl status prometheus-node-exporter ``` Проверяем curl'ом доступ без пароля и с паролем: ```bash 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` ```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' ``` Обязательно проверяем конфигурацию ```bash 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 ``` ```bash 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. Если все сделано корректно - вы автоматически перейдете в дашборд в котором можете отслеживать графики и статусы. 