Мониторинг метрик Linux-серверов с помощью Prometheus и Grafana

Проблема

Типичный парк Linux-серверов это десятки или сотни машин, каждая из которых генерирует десятки метрик: загрузка CPU, потребление памяти, дисковые операции, сетевой трафик, температура компонентов и многое другое. Администратор, вооружённый только tophtop и df -h, способен оценить состояние одного-двух серверов, но когда счёт идёт на десятки, ручной сбор информации превращается в бесконечный обход по SSH. При этом проблемы часто возникают в нерабочее время, и обнаруживаются постфактум по жалобам пользователей или после полного исчерпания ресурсов. Отсутствие единой картины и исторических данных делает невозможным анализ трендов, планирование мощностей и оперативное реагирование. Prometheus Grafana это открытый стек, который решает эти проблемы, предоставляя централизованный сбор, хранение и визуализацию метрик с любого количества серверов полностью бесплатно.

Решение

Стек Prometheus Grafana  де-факто стандарт для мониторинга Linux-инфраструктуры. На целевые серверы устанавливается лёгкий агент Node Exporter, который открывает HTTP-эндпоинт с метриками системы (CPU, память, диск, сеть, systemd-сервисы и т.д.). Центральный сервер Prometheus опрашивает Node Exporter’ы по расписанию, сохраняет временные ряды в локальной TSDB и предоставляет язык запросов PromQL для анализа. Grafana подключается к Prometheus как к источнику данных и отображает метрики в виде наглядных дашбордов с графиками, таблицами и алертами. Вся система контейнеризуема, но мы развернём её «на голом железе» для максимальной производительности и простоты. Официальная документация: Prometheus OverviewGrafana documentationNode Exporter. Дополнительно мы настроим оповещения в Telegram через Alertmanager, чтобы администратор узнавал о проблемах раньше, чем пользователи.

Пошаговая инструкция

Шаг 1. Установка Node Exporter на целевые серверы

Node Exporter это единый бинарный файл без зависимостей. Установим его на каждый Linux-сервер, который нужно мониторить.

  1. Скачайте последнюю версию Node Exporter с официального GitHub:

bash

cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.0/node_exporter-1.8.0.linux-amd64.tar.gz
tar xzf node_exporter-1.8.0.linux-amd64.tar.gz
sudo mv node_exporter-1.8.0.linux-amd64/node_exporter /usr/local/bin/
  1. Создайте systemd-юнит /etc/systemd/system/node_exporter.service:
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=nobody
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
  1. Запустите и включите службу:

bash

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
  1. Проверьте, что метрики отдаются на порту 9100:

bash

curl http://localhost:9100/metrics

Документация Node Exporter: Monitoring Linux host metrics with the Node Exporter.

Шаг 2. Установка и настройка Prometheus Server

Prometheus устанавливается на центральный сервер мониторинга. Он будет опрашивать все Node Exporter’ы.

  1. Скачайте Prometheus с официального сайта:

bash

cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.54.0/prometheus-2.54.0.linux-amd64.tar.gz
tar xzf prometheus-2.54.0.linux-amd64.tar.gz
sudo mv prometheus-2.54.0.linux-amd64/prometheus /usr/local/bin/
sudo mv prometheus-2.54.0.linux-amd64/promtool /usr/local/bin/
sudo mkdir -p /etc/prometheus /var/lib/prometheus
  1. Создайте конфигурационный файл /etc/prometheus/prometheus.yml:

yaml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'linux_servers'
    static_configs:
      - targets:
          - '192.168.1.10:9100'
          - '192.168.1.11:9100'
          - '192.168.1.12:9100'

Замените IP-адреса на реальные адреса ваших серверов с Node Exporter.

  1. Создайте systemd-юнит /etc/systemd/system/prometheus.service:
[Unit]
Description=Prometheus
After=network.target

[Service]
User=nobody
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus/ \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=multi-user.target
  1. Запустите Prometheus:

bash

sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
  1. Проверьте веб-интерфейс Prometheus: http://<IP_сервера>:9090. На вкладке Status → Targets должны отображаться все целевые серверы со статусом UP.

Подробнее о настройке: Getting started with Prometheus.

Шаг 3. Установка Grafana и подключение к Prometheus

Grafana — это веб-интерфейс для визуализации метрик. Установим её на тот же сервер, что и Prometheus (или на отдельный).

  1. Добавьте репозиторий Grafana и установите пакет:

bash

sudo apt-get install -y software-properties-common wget
sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install grafana -y
  1. Запустите Grafana:

bash

sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
  1. Откройте веб-интерфейс Grafana: http://<IP_сервера>:3000. Логин/пароль по умолчанию  admin/admin.
  2. Добавьте источник данных:
    • Перейдите в Connections → Data sources → Add data source.
    • Выберите Prometheus.
    • В поле URL введите http://localhost:9090.
    • Нажмите Save & test.

Документация по установке Grafana: Install Grafana on Debian/Ubuntu.

Шаг 4. Импорт готового дашборда Node Exporter Full

Чтобы не создавать графики вручную, импортируйте проверенный дашборд из сообщества.

  1. В Grafana перейдите в Dashboards → New → Import.
  2. В поле Import via grafana.com введите ID дашборда 1860 (Node Exporter Full) и нажмите Load. Этот дашборд доступен на Grafana Dashboards.
  3. Выберите источник данных Prometheus и нажмите Import.

Через несколько секунд откроется полноценный дашборд с графиками CPU, памяти, дискового ввода-вывода, сети и аптаймом для всех хостов.

Шаг 5. Настройка алертов (Alertmanager + Telegram)

Prometheus включает Alertmanager для отправки оповещений. Настроим уведомления в Telegram.

  1. Скачайте Alertmanager с официального сайта:

bash

cd /tmp
wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz
tar xzf alertmanager-0.27.0.linux-amd64.tar.gz
sudo mv alertmanager-0.27.0.linux-amd64/alertmanager /usr/local/bin/
sudo mkdir /etc/alertmanager
  1. Создайте конфигурацию /etc/alertmanager/alertmanager.yml:

yaml

route:
  receiver: 'telegram'

receivers:
  - name: 'telegram'
    telegram_configs:
      - bot_token: '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11'
        chat_id: 123456789
        message: '{{ .CommonAnnotations.summary }}'

Замените токен и chat_id на реальные. Токен получается у @BotFather, chat_id — у любого бота-информатора.

  1. Создайте systemd-юнит и запустите Alertmanager:

bash

sudo systemctl enable --now alertmanager
  1. В конфигурации Prometheus (/etc/prometheus/prometheus.yml) добавьте секцию rule_files и alerting:

yaml

alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - localhost:9093

rule_files:
  - "/etc/prometheus/alerts.yml"
  1. Создайте файл правил /etc/prometheus/alerts.yml:

yaml

groups:
  - name: linux
    rules:
      - alert: HighCPU
        expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "High CPU usage on {{ $labels.instance }}"
  1. Перезапустите Prometheus:

bash

sudo systemctl restart prometheus

Теперь при превышении порога CPU 80% в течение 5 минут Alertmanager отправит уведомление в Telegram.

Официальная документация по алертингу: Alerting rulesAlertmanager configuration.

Устранение распространённых проблем

СимптомВероятная причинаРешение
Target в Prometheus отображается как DOWNЗакрыт порт 9100 на целевом сервере или Node Exporter не запущенПроверьте systemctl status node_exporter. Откройте порт 9100 в брандмауэре: sudo ufw allow 9100/tcp.
В Grafana нет данных (Dashboards пустые)Неверный URL источника данных Prometheus или Prometheus не слушает порт 9090Проверьте curl http://localhost:9090/metrics. В настройках источника данных укажите http://localhost:9090.
Дашборд Node Exporter Full не показывает графикиНе совпадают названия метрик (версия Node Exporter отличается от той, под которую создан дашборд)Попробуйте импортировать дашборд с ID 16098 (Node Exporter / System metrics) или обновите Node Exporter до последней версии.
Alertmanager не отправляет сообщения в TelegramНеверный токен или chat_id, или Alertmanager не может достучаться до API TelegramПроверьте лог Alertmanager: journalctl -u alertmanager -f. Убедитесь, что сервер имеет доступ к api.telegram.org (443 порт).
Высокое потребление памяти PrometheusСлишком много метрик или слишком большой интервал храненияУменьшите --storage.tsdb.retention.time (по умолчанию 15 дней). Используйте федерацию или удалённое хранилище для долгосрочного хранения.

Развёрнутый стек Prometheus Grafana даёт администратору полную картину состояния всей серверной инфраструктуры в реальном времени и за любой исторический период. Node Exporter собирает метрики без нагрузки на серверы, Prometheus эффективно хранит временные ряды, а Grafana превращает их в наглядные дашборды, которые можно вывести на отдельный монитор в NOC. Добавив алерты, вы перестанете узнавать о проблемах от пользователей бот в Telegram сообщит о высокой нагрузке или заполнении диска раньше, чем это заметят. Стек полностью бесплатен, открыт и поддерживается огромным сообществом, а его настройка по описанной инструкции занимает не более часа.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu