Blame

131dd0 Mayekkuzu 2025-08-10 11:28:16 1
# Grafana и Prometheus
276fc2 Mayekkuzu 2025-08-10 12:20:32 2
Задача - организовать отдельную вм с Debian на которой будет связка Grafana и Prometheus. Без особых изьебов. Чтоб вот просто максимально
3
Что собственно ставим?
4
- Grafana - клевая и стильная система визуализации данных. Проект на гитхаб - [Grafana Labs Github](https://github.com/grafana/grafana)
5
- Prometheus - система сбора данных. Проект на гитхаб - [Prometheus](https://github.com/prometheus/prometheus)
6
- Prometheus Node Exporter - штука которая опрашивает метрики с операционной системы и отображает их по HTTP. Проект на гитхаб - [Prometheus Node Exporter](https://github.com/prometheus/node_exporter)
131dd0 Mayekkuzu 2025-08-10 11:28:16 7
## Установка Grafana с deb-пакета
8
Методы описанные с установкой ключа и апдейта с репозиторием к сожалению не работают потому как в моем случае при запросе ключа я получаю:
9
```bash
10
mayekkuzu@linux-term:~$ curl https://apt.grafana.com/gpg.key
11
Sorry, the provided token is not valid
12
```
13
:::info
14
# Как оказалось в дальнейшем
15
С не отечественных IP ключ отображается. Понятно
16
:::
17
Поэтому и ставить будем просто установкой deb файла. Посмотреть можно на странице [Download](https://grafana.com/grafana/download?edition=oss). На момент написания это OSS 12.1.0
18
```bash
19
sudo apt update
20
sudo apt-get install -y adduser libfontconfig1 musl
21
wget https://dl.grafana.com/oss/release/grafana_12.1.0_amd64.deb
22
sudo dpkg -i grafana_12.1.0_amd64.deb
23
sudo systemctl daemon-reload
24
sudo systemctl enable grafana-server --now
25
```
26
Далее открываем ip-vm:3000 и авторизовываемся под admin/admin. Далее в профиле меняем пароль на свой.
27
## Ставим Prometheus
28
Здесь просто ставим два пакета через apt
29
```bash
30
sudo apt install prometheus prometheus-node-exporter
31
```
276fc2 Mayekkuzu 2025-08-10 12:20:32 32
После установки сервисы запустятся автоматически, но следует проверить запуск служб командой:
33
```bash
34
mayekkuzu@grafana:~$ sudo systemctl is-enabled prometheus
35
enabled
36
mayekkuzu@grafana:~$ sudo systemctl is-enabled prometheus-node-exporter
37
enabled
38
```
39
Так же смотрим что поднялись порты:
40
```bash
41
mayekkuzu@linux-term:~$ ss -tulpn
42
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
43
tcp LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
44
tcp LISTEN 0 4096 *:22 *:*
45
tcp LISTEN 0 100 [::1]:25 [::]:*
46
tcp LISTEN 0 4096 *:9100 *:* # Это Node Exporter
47
tcp LISTEN 0 4096 *:9090 *:* # Это Prometheus
48
```
49
## Проверяем Prometheus и Node Exporter
50
По умолчанию если посмотреть в конфигфаил /etc/prometheus/prometheus.yaml в конце можно увидеть в блоке `scrape_configs`:
51
```yaml
52
- job_name: node
53
# If prometheus-node-exporter is installed, grab stats about the local
54
# machine by default.
55
static_configs:
56
- targets: ['localhost:9100']
57
```
58
Что говорит о том что Prometheus уже собирает метрики с этой вм. Но долетают ли они? Давайте посмотрим curl'ом. Если отсутствует то установите `sudp apt install curl`
59
```bash
60
mayekkuzu@linux-term:~$ curl localhost:9100/metrics
61
# HELP apt_autoremove_pending Apt packages pending autoremoval.
62
# TYPE apt_autoremove_pending gauge
63
apt_autoremove_pending 0
64
# HELP apt_package_cache_timestamp_seconds Apt update last run time.
65
# TYPE apt_package_cache_timestamp_seconds gauge
66
apt_package_cache_timestamp_seconds 1.754826140084365e+09
67
# HELP apt_upgrades_held Apt packages pending updates but held back.
68
# TYPE apt_upgrades_held gauge
69
apt_upgrades_held{arch="",origin=""} 0
70
# HELP apt_upgrades_pending Apt packages pending updates by origin.
71
# TYPE apt_upgrades_pending gauge
72
apt_upgrades_pending{arch="",origin=""} 0
73
...
74
```
7ad44e Mayekkuzu 2025-08-10 13:16:15 75
Теперь перейдем в GUI Prometheus ip-or-fqdn:9090. Попробуем вывести какие-нибудь данные, например node_os_version должен вывести версию операционной системы. Выберем в выпадающем списке и нажмем Execute. В Console выведется информация. Если оперируете числовыми данными, такими как нагрузка на CPU, сеть или диск, то после Execute выбирайте вкладку Graph чтобы увидеть графики.
76
![](./prometheus_gui_node_os_info.png)
77
## Защита метрик с помощью Basic Auth
78
Задачка нетривиальная на самом деле потому что нужно крафтить хэш пароля. Вобщем ставим пакет python3-bcrypt.
79
```bash
80
sudo apt install python3-bcrypt
81
```
82
Далее создаем фаил gen-pass.py с таким содержимым
83
```python
84
import getpass
85
import bcrypt
86
87
password = getpass.getpass("password: ")
88
hashed_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())
89
print(hashed_password.decode())
90
```
91
Теперь формируем хеш пароля. Например наш пароль `SuperPuperSecurityYobaBoba`
92
```bash
93
mayekkuzu@DESKTOP-ABA6QE3:~$ python3 gen-pass.py
94
password: SuperPuperSecurityYobaBoba
95
$2b$12$mR1OGgvYQ2DuBwOkNQ6STOrGFRp5hiofRzS3g7PhK489huQCN5eVa # это и есть наш хэш
96
```
97
Создадим фаил /etc/prometheus/web.yml с таким содержимым
98
```yaml
99
basic_auth_users:
100
admin: $2b$12$mR1OGgvYQ2DuBwOkNQ6STOrGFRp5hiofRzS3g7PhK489huQCN5eVa
101
```
102
Далее обязательно проверяем фаил инструментом promtool на наличие ошибок:
103
```bash
104
mayekkuzu@linux-term:~$ sudo promtool check web-config /etc/prometheus/web.yml
105
/etc/prometheus/web.yml SUCCESS
106
```
107
Теперь нам необходимо фаил /etc/prometheus/web.yml передать как аргумент службе prometheus-node-exporter. Для этого приводим содержимое файла `/etc/default/prometheus-node-exporter` к такому виду:
108
```bash
109
ARGS="--web.config.file=/etc/prometheus/web.yml"
110
```
111
Далее делаем рестарт службы:
112
```bash
113
sudo systemctl restart prometheus-node-exporter
114
sudo systemctl status prometheus-node-exporter
115
```
116
Проверяем curl'ом доступ без пароля и с паролем:
117
```bash
118
mayekkuzu@linux-term:~$ curl localhost:9100/metrics
119
Unauthorized
120
mayekkuzu@linux-term:~$ curl -u admin:SuperPuperSecurityYobaBoba localhost:9100/metrics
121
# HELP apt_autoremove_pending Apt packages pending autoremoval.
122
# TYPE apt_autoremove_pending gauge
123
apt_autoremove_pending 0
124
# HELP apt_package_cache_timestamp_seconds Apt update last run time.
125
# TYPE apt_package_cache_timestamp_seconds gauge
126
apt_package_cache_timestamp_seconds 1.754582275664897e+09
127
...
128
```
129
Теперь нужно понимать что Prometheus перестал получать метрики потому как они теперь закрыты за basic auth. В блоке с job node которая слушает наш node exporter приводим к такому виду в файле `/etc/prometheus/prometheus.yaml`
130
```yaml
131
- job_name: node
132
# If prometheus-node-exporter is installed, grab stats about the local
133
# machine by default.
134
static_configs:
135
- targets: ['localhost:9100']
136
basic_auth:
137
username: 'admin'
138
password: 'SuperPuperSecurityYobaBoba'
139
```
140
Обязательно проверяем конфигурацию
141
```bash
142
mayekkuzu@linux-term:~$ sudo promtool check config /etc/prometheus/prometheus.yml
143
Checking /etc/prometheus/prometheus.yml
144
SUCCESS: /etc/prometheus/prometheus.yml is valid prometheus config file syntax
145
```
146
```bash
147
sudo systemctl restart prometheus
148
sudo systemctl status prometheus
149
```
150
По аналогии выше попробуем дернуть произвольные данные, если подтягиваются то все сделано корректно
d1d2e5 Mayekkuzu 2025-08-10 13:29:13 151
## Добавляем все это добро в Grafana
152
В панели управления Grafana сначала добавляем prometheus как Data Source. Для этого выбираем `Connections -> Data Sources -> + Add Data Source -> Prometheus`. Заполняем поле Connection до UI Prometheus (с портом 9090). Потому как все сервисы в одной вм - используем `http://localhost:9090`
153
154
Теперь импортируем Дашборд. Копируем ID с страницы https://grafana.com/grafana/dashboards/1860-node-exporter-full/
155
156
Далее идем `Dashboards -> New -> Import` Вставляем ID и жмакаем Load. Подписываем Дашборд если необходимо, назначаем папку и выбираем Data Source - Prometheus. Если все сделано корректно - вы автоматически перейдете в дашборд в котором можете отслеживать графики и статусы.
bd75ac Mayekkuzu 2025-08-10 13:30:40 157
158
![](./node_exporter_result.png)