Полное руководство по установке и настройке мониторинга с Grafana и Prometheus: от установки до первого дашборда

Оцените статью

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-адрес заблокирован. Есть два пути решения:

  1. Поднять локальное зеркало репозитория, скачав пакеты через зарубежный прокси-сервер. Это более сложный, но надёжный способ.
  2. Указать прокси-сервер напрямую в конфигурации репозитория. Добавьте в файл 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:

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

    Дополнительные возможности:

    • использование шаблонов и плагинов: Grafana предлагает множество готовых шаблонов и плагинов, которые упрощают создание дашбордов. Вы можете найти подходящие шаблоны для мониторинга серверов и использовать их как основу для своего дашборда.
    • настройка алертов: в Grafana можно настроить алерты на основе метрик, отображаемых на дашборде. Это позволит получать уведомления о критических изменениях в работе системы.
    • совместная работа: Grafana поддерживает совместную работу над дашбордами. Вы можете делиться дашбордами с коллегами, настраивать права доступа и работать над ними в команде.

    Похожие записи

    ProxyChains специфическая работа с прокси-серверами в UNIX/Linux-системах

    В современном мире, где вопросы конфиденциальности и безопасности в сети становятся всё более актуальными, инструменты для работы с прокси-серверами приобретают особую ценность. Одним из таких инструментов является программа ProxyChains, которая…

    Резервное копирование баз данных MySQL в Linux: краткое руководство с примерами

    Резервное копирование — ключевой элемент стратегии обеспечения безопасности и надёжности данных. Для баз данных MySQL, которые широко используются в веб-разработке и других областях, регулярное создание резервных копий особенно важно. В…

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Читать еще статьи

    ProxyChains специфическая работа с прокси-серверами в UNIX/Linux-системах

    ProxyChains специфическая работа с прокси-серверами в UNIX/Linux-системах

    Полное руководство по установке и настройке мониторинга с Grafana и Prometheus: от установки до первого дашборда

    Полное руководство по установке и настройке мониторинга с Grafana и Prometheus: от установки до первого дашборда

    Резервное копирование баз данных MySQL в Linux: краткое руководство с примерами

    Резервное копирование баз данных MySQL в Linux: краткое руководство с примерами

    Клонирование работающего Linux-сервера с помощью rsync (немного из практики).

    Клонирование работающего Linux-сервера с помощью rsync (немного из практики).

    Установка Keycloak в Ubuntu 24.04: от тестового запуска до production-конфигурации

    Установка Keycloak в Ubuntu 24.04: от тестового запуска до production-конфигурации

    Оптимизация хранения медиафайлов WordPress: перенос в облачное S3-хранилище Cloud.ru

    Оптимизация хранения медиафайлов WordPress: перенос в облачное S3-хранилище Cloud.ru