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 |  |
|||
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 |  |