Grafana и Prometheus зачем они нужны?
Прежде чем погрузиться в установку, давайте разберёмся, о чём вообще речь. Grafana – это мощная платформа для визуализации и анализа данных, которая позволяет создавать красивые и информативные дашборды (панели мониторинга) на основе данных из различных источников.
Prometheus – это система мониторинга и оповещения с открытым исходным кодом, которая собирает метрики с ваших серверов и приложений в режиме реального времени. Вместе они образуют классический стек для мониторинга инфраструктуры: Prometheus собирает данные, а Grafana их отображает.
Например, вы можете отслеживать загрузку CPU, использование памяти, количество запросов к веб-серверу, температуру процессора и многое другое. Если какой-то показатель выходит за пределы нормы, система может отправить уведомление в Telegram, Slack или по электронной почте. В этой статье мы сосредоточимся на установке и базовой настройке Grafana и Prometheus на CentOS (хотя инструкции подойдут и для других дистрибутивов Linux).

Установка Grafana
Grafana распространяется через официальный репозиторий, поэтому установка будет стандартной для RPM-систем. Но есть нюанс: из-за географических ограничений (например, если ваш сервер находится в России) доступ к репозиторию может быть заблокирован. Мы рассмотрим обходные пути.
Импортируем GPG-ключ репозитория
Для проверки подлинности пакетов необходимо добавить ключ:
# wget -q -O gpg.key https://rpm.grafana.com/gpg.key
Создаём файл репозитория
Создайте файл /etc/yum.repos.d/grafana.repo со следующим содержимым:
[grafana]
name=grafana
baseurl=https://rpm.grafana.com
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://rpm.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
Возможные проблемы с доступом из РФ
Обратите внимание: в свете последних событий (санкционные ограничения) при попытке подключиться к репозиторию вы можете получить ошибку вроде:
Errors during downloading metadata for repository ‘grafana’:
– Status code: 403 for https://rpm.grafana.com/repodata/repomd.xml (IP: 151.101.130.217)
Error: Failed to download metadata for repo ‘grafana’: Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried
Это означает, что ваш IP-адрес заблокирован. Есть два пути решения:
- Поднять локальное зеркало репозитория, скачав пакеты через зарубежный прокси-сервер. Это более сложный, но надёжный способ.
- Указать прокси-сервер напрямую в конфигурации репозитория. Добавьте в файл
grafana.repoстроку:
proxy=http://45.138.27.6:3128
Естественно, вместо 45.138.27.6 нужно указать адрес вашего рабочего прокси. Если прокси требует авторизацию, запись будет выглядеть так:
proxy=http://user:password@proxy.example.com:3128
После этого повторите попытку установки.
Установка и запуск сервиса
Теперь устанавливаем Grafana как сервис, активируем автозапуск и запускаем:
# dnf install grafana
# systemctl enable grafana-server
# systemctl start grafana-server
По умолчанию веб-интерфейс Grafana доступен на порту 3000, а логин и пароль – admin/admin (при первом входе система попросит сменить пароль). Если у вас включён Firewalld, откройте порт:
# firewall-cmd --permanent --add-port=3000/tcp
# firewall-cmd --reload
Теперь можно открыть браузер и перейти по адресу http://ваш-сервер:3000. Вы должны увидеть страницу входа:

Настройка реверс-прокси через Nginx (опционально, но рекомендуется)
Ходить по IP-порту не совсем кошерно – лучше настроить реверс-прокси с ограничением доступа по IP-адресам внутренней сети. Пример конфигурации Nginx (подставьте свои домены и IP):
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name www.grafana.shiskitech.ru grafana.shiskitech.ru;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name www.grafana.shiskitech.ru grafana.shiskitech.ru;
access_log /var/log/nginx/grafana.shiskitech.ru-access.log;
error_log /var/log/nginx/grafana.shiskitech.ru-error.log warn;
ssl_certificate /etc/letsencrypt/live/grafana.shiskitech.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/grafana.shiskitech.ru/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
client_max_body_size 64M;
fastcgi_buffers 64 4K;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
if ($host ~ ^www\.(?<domain>.+)$) {
return 301 $scheme://$domain$request_uri;
}
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_pass http://127.0.0.1:3000;
}
}
Конфиг достаточно типовой, особых вопросов вызывать не должен. Главное – не забудьте заменить IP и домены на свои.
Установка Prometheus
Prometheus – это сервер мониторинга, который будет собирать метрики с ваших хостов. В отличие от Grafana, Prometheus не имеет официального RPM-репозитория (хотя есть Docker-образ), поэтому мы установим его из tar.gz-архива.
Открываем порты в Firewalld
Чтобы Prometheus и его компоненты (Alertmanager, Node Exporter) могли общаться, откроем необходимые порты:
# firewall-cmd --permanent --zone=public --add-port=9090/tcp --add-port=9093/tcp --add-port=9094/{tcp,udp} --add-port=9100/tcp
# firewall-cmd --reload
Пояснение:
— 9090 – веб-интерфейс Prometheus.
— 9093 – Alertmanager (оповещения).
— 9094 – кластеризация Alertmanager.
— 9100 – Node Exporter (сбор метрик с ОС).
Скачиваем последнюю стабильную версию
Перейдите на официальную страницу загрузки и скопируйте ссылку на последнюю версию для Linux amd64. На момент написания статьи это v2.54.1:
# wget https://github.com/prometheus/prometheus/releases/download/v3.14.0/prometheus-3.14.0.linux-amd64.tar.gz
Распаковываем и копируем в /opt/prometheus.
Создаём пользователя и структуру каталогов
Prometheus рекомендуется запускать от отдельного непривилегированного пользователя:
# useradd --no-create-home --shell /bin/bash prometheus
# usermod --home /opt/prometheus prometheus
# mkdir /etc/prometheus
# mkdir /var/lib/prometheus
Распаковываем и размещаем бинарники
Распакуйте архив и переместите файлы:
# tar -xzf prometheus-2.54.1.linux-amd64.tar.gz
# cd prometheus-2.54.1.linux-amd64
# cp prometheus promtool /usr/local/bin/
# cp -r consoles/ console_libraries/ /opt/prometheus/
# cp prometheus.yml /etc/prometheus/
Для удобства создадим симлинки (необязательно, но красиво):
# ln -s /usr/local/bin/prometheus /usr/local/bin/prometheus
# ln -s /usr/local/bin/promtool /usr/local/bin/promtool
Теперь сменим владельца на пользователя prometheus:
# chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus /opt/prometheus
Проверяем запуск вручную
Перед тем как создавать systemd-сервис, убедимся, что Prometheus стартует без ошибок. Выполните от пользователя prometheus:
# su prometheus -s /bin/bash
$ /opt/prometheus/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/opt/prometheus/consoles --web.console.libraries=/opt/prometheus/console_libraries
Если всё хорошо, вы увидите логи, а веб-интерфейс станет доступен на порту 9090. Откройте браузер и перейдите по адресу http://ваш-сервер:9090. Должна появиться страница с запросом PromQL:

Создаём systemd-сервис
Остановите ручной запуск (Ctrl+C) и создайте файл /etc/systemd/system/prometheus.service:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/opt/prometheus/consoles \
--web.console.libraries=/opt/prometheus/console_libraries
[Install]
WantedBy=multi-user.target
Теперь активируем и запускаем сервис:
# systemctl daemon-reload
# systemctl enable prometheus
# systemctl start prometheus
Проверьте статус:
# systemctl status prometheus
Если всё зелёное – Prometheus работает. Дальнейшая настройка (добавление целей сбора метрик, настройка оповещений) выходит за рамки этой статьи, но базовая установка завершена.
Настройка Reverse-прокси для Prometheus
Реверс прокси настраиваем аналогично варианту с графаной, с единственным отличием это basic-авторизация.
Создаем пользователя и для начала устанавливаем пакет apache2-utils.
# aptitude install apache2-utils
Генерируем логин-пароль для пользователя.
# htpasswd -c /etc/nginx/.htpasswd administrator
Конфигурация Nginx с гибридной авторизацией.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name www.prometheus.shiskitech.ru prometheus.shiskitech.ru;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name www.prometheus.shiskitech.ru prometheus.shiskitech.ru;
access_log /var/log/nginx/prometheus.shiskitech.ru-access.log;
error_log /var/log/nginx/prometheus.shiskitech.ru-error.log warn;
ssl_certificate /etc/letsencrypt/live/prometheus.shiskitech.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/prometheus.shiskitech.ru/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
client_max_body_size 64M;
fastcgi_buffers 64 4K;
satisfy any;
allow 37.194.5.244/32;
allow 10.212.1.0/24;
allow 127.0.0.1;
deny all;
auth_basic "Administrator’s Area";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
if ($host ~ ^www\.(?<domain>.+)$) {
return 301 $scheme://$domain$request_uri;
}
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_pass http://127.0.0.1:9090;
}
}
Сбор базовых параметров узлов сети при помощи Node Exporter
Сбор базовых параметров узлов моего кластера производится при помощи Node Exporter данные из которого забираются Prometheus и это чем-то напоминает работу Zabbix Agent.
Установка Node Exporter
Станно, что нет официального репозитария для Ubuntu и приходится скачивать бинарник, создавать пользователя и писать сервис. Это конечно все элементарно описывается через Ansible, но давайте сейчас проведем эксперимент и проработаем всю последовательность действий вручную.
Последовательность действий аналогична любому бинарнику на GO и просто скачиваем, делаем исполняемым, укладываем в /opt/node_exporter и пишем сервис.
# cd /tmp/
# wget https://github.com/prometheus/node_exporter/releases/download/v1.12.1/node_exporter-1.12.1.linux-amd64.tar.gz
Создаем пользователя.
# useradd --no-create-home --shell /bin/false node_exporter
# chown -R node_exporter:node_exporter /opt/node_exporter/
Создаем сервис /etc/systemd/system/node_exporter.service.
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/opt/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
Старт-стоп вкл на постоянку все выше описано и ничего интересного, дальше можно метрики вытащить так-же с basic-auth и убедиться, что там все красиво рисуется. Что интересно, но можно вытащить метрики через WEB-интерфейс аналогично Prometheos, просто на всякий случай оно как-бы смысла особого не имеет, просто для красоты.
# systemctl daemon-reload
# systemctl start node_exporter
# systemctl enable node_exporter
При желании можно аналогично Prometheos выставить доступ для прямого контроля через Nginx. Это опять же вкусовщина которая не влияет ни на что.

Сбор данных с Node Exporter в Prometheus
Найдите файл конфигурации Prometheus (обычно называется prometheus.yml). В моем случае мы создали симлинк в /etc/prometheus/prometheus.yml.
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
# The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
labels:
app: "prometheus"
scrape_native_histograms: true
Выше представлены значения по умолчанию.
Добавляем сбор данных с узлов (статическая конфигурация без автодискавери).
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets: ['ваш_сервер:9100']
Замените «ваш_сервер» на IP-адрес или доменное имя сервера, где запущен Node Exporter, сохраните изменения в файле конфигурации и перезапустите сервис Prometheus, чтобы новые настройки вступили в силу.

Проверка работы конфигурации:
- после перезапуска Prometheus проверьте, что он успешно собирает данные с Node Exporter. Для этого можно воспользоваться веб-интерфейсом Prometheus (по умолчанию доступен по адресу http://ваш_сервер:9090).
- в разделе Status → Targets вы должны увидеть Node Exporter в списке целевых объектов с состоянием UP.
Добавляем остальные узлы
Аналогично добавляем и остальные узлы и в результате получаем вот такого рода статическую конфигурацию.
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["s-rain-02-ne.shiskitech.ru:9090"]
labels:
app: "prometheus"
- targets: ['s-rain-01-ne.shiskitech.ru:9100','s-rain-02-ne.shiskitech.ru:9100','s-rain-03-ne.shiskitech.ru:9100']
labels:
app: "node_exporter"
scrape_native_histograms: true
В итоге в Prometheus мы увидим все наши узлы.

Источники данных и дашборды в Grafana
Grafana — это мощная система визуализации данных, которая позволяет создавать информативные дашборды на основе метрик, собранных различными системами мониторинга. В сочетании с Node Exporter и Prometheus Grafana становится незаменимым инструментом для мониторинга IT-инфраструктуры.
Добавление Prometheus как источника данных в Grafana:
В главном меню Grafana выберите пункт «Configuration» (или «Конфигурация»), а затем — «Data Sources» (или «Источники данных»).

Нажмите кнопку «Add data source» (или «Добавить источник данных») и в списке выберите «Prometheus».

Настройка параметров источника данных:
- укажите URL-адрес сервера Prometheus (например, http://ваш_сервер:9090).
- если Prometheus защищён аутентификацией, введите необходимые учётные данные.
- настройте дополнительные параметры, если это требуется (например, параметры таймаута или прокси-сервер).
- нажмите «Save & Test» (или «Сохранить и проверить»), чтобы убедиться, что Grafana может подключиться к Prometheus.

Создание дашборда для визуализации метрик Node Exporter:
- Создание нового дашборда:
- в главном меню Grafana выберите «Create» (или «Создать»), а затем — «New dashboard» (или «Новый дашборд»).
- вы окажетесь в режиме редактирования дашборда.
- Добавление панелей с метриками:
- нажмите кнопку «Add panel» (или «Добавить панель»), чтобы создать новую панель на дашборде.
- выберите тип визуализации (например, график, таблица, гистограмма), который лучше всего подходит для отображения интересующих вас метрик.
- в разделе «Query» (или «Запрос») выберите добавленный ранее источник данных (Prometheus).
- сформулируйте запрос для получения метрик от Node Exporter. Например, для отображения загрузки CPU можно использовать запрос node_cpu_seconds_total.
- настройте параметры визуализации: оси, легенды, цвета и другие опции.
- сохраните изменения, нажав «Apply» (или «Применить»).

- Добавление дополнительных панелей:
- повторите шаги для добавления других панелей с метриками, которые вас интересуют. Например, можно добавить панели для отображения использования памяти (node_memory_*), дискового пространства (node_filesystem_*), сетевых метрик (node_network_*) и т. д.
- экспериментируйте с различными типами визуализаций и запросами, чтобы найти наиболее информативные способы отображения данных.
- Настройка внешнего вида дашборда:
- измените расположение панелей, их размер и другие параметры, чтобы дашборд был удобным для восприятия.
- добавьте заголовок и описание дашборда, чтобы другие пользователи могли понять, какую информацию он отображает.
- сохраните дашборд, чтобы изменения вступили в силу.
Дополнительные возможности:
- использование шаблонов и плагинов: Grafana предлагает множество готовых шаблонов и плагинов, которые упрощают создание дашбордов. Вы можете найти подходящие шаблоны для мониторинга серверов и использовать их как основу для своего дашборда.
- настройка алертов: в Grafana можно настроить алерты на основе метрик, отображаемых на дашборде. Это позволит получать уведомления о критических изменениях в работе системы.
- совместная работа: Grafana поддерживает совместную работу над дашбордами. Вы можете делиться дашбордами с коллегами, настраивать права доступа и работать над ними в команде.




