# 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 чтобы увидеть графики.
![](./prometheus_gui_node_os_info.png)
## Защита метрик с помощью 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. Если все сделано корректно - вы автоматически перейдете в дашборд в котором можете отслеживать графики и статусы.

![](./node_exporter_result.png)
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9