Инструменты мониторинга серверов: Grafana, Prometheus и Netdata
Настройка стека Prometheus + Grafana, Netdata, node_exporter, правила оповещений, создание дашбордов и мониторинг метрик сервера.
Содержание
Инструменты мониторинга серверов: Grafana, Prometheus и Netdata
Эффективный мониторинг серверной инфраструктуры необходим для раннего обнаружения проблем с производительностью и предотвращения простоев. В этом руководстве мы настроим комплексную систему мониторинга серверов с использованием Prometheus, Grafana и Netdata.
Что такое Prometheus?
Prometheus — это система сбора метрик и мониторинга с открытым исходным кодом, поддерживаемая Cloud Native Computing Foundation (CNCF). Благодаря pull-архитектуре он регулярно собирает метрики с целевых систем по HTTP и хранит их в базе данных временных рядов.
Основные возможности Prometheus:
- PromQL: Мощный язык запросов для анализа метрик
- Pull-Based Model: Сбор метрик с целей по HTTP
- Service Discovery: Автоматическое обнаружение целей (Kubernetes, Consul, DNS)
- Alert Manager: Управление оповещениями на основе условий
- Многомерные данные: Гибкая модель данных на основе меток
- Federation: Иерархическое связывание нескольких серверов Prometheus
Установка Node Exporter
Node Exporter — это экспортёр Prometheus, который собирает метрики оборудования и ОС с серверов Linux.
Установка с Systemd
# Скачать Node Exporter
cd /tmp
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xzf node_exporter-1.7.0.linux-amd64.tar.gz
# Переместить бинарный файл
sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
# Создать пользователя
sudo useradd --no-create-home --shell /bin/false node_exporter
# Файл сервиса systemd
sudo tee /etc/systemd/system/node_exporter.service > /dev/null <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \\
--collector.systemd \\
--collector.processes \\
--web.listen-address=:9100
[Install]
WantedBy=multi-user.target
EOF
# Запустить сервис
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
sudo systemctl status node_exporter
Node Exporter с Docker
# docker-compose.yml
version: '3.8'
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
Проверка метрик:
curl http://localhost:9100/metrics | head -50
Установка Prometheus
Стек Prometheus с Docker Compose
# docker-compose.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d'
- '--web.enable-lifecycle'
volumes:
prometheus_data:
Конфигурация Prometheus
# prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_timeout: 10s
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
rule_files:
- "alert_rules.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets:
- 'node-exporter:9100'
- '192.168.1.10:9100'
- '192.168.1.11:9100'
labels:
env: 'production'
Правила оповещений
Обнаруживайте критические состояния с помощью правил оповещений Prometheus:
# prometheus/alert_rules.yml
groups:
- name: server_alerts
rules:
- alert: ВысокаяЗагрузкаCPU
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 5m
labels:
severity: warning
annotations:
summary: "Высокая загрузка CPU ({{ $labels.instance }})"
description: "Загрузка CPU составляет {{ $value | printf \"%.1f\" }}% — выше 85% в течение 5 минут."
- alert: ВысокоеИспользованиеПамяти
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90
for: 5m
labels:
severity: critical
annotations:
summary: "Высокое использование памяти ({{ $labels.instance }})"
description: "Использование памяти составляет {{ $value | printf \"%.1f\" }}% — выше 90%."
- alert: ДискПочтиЗаполнен
expr: (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"})) * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "Диск почти заполнен ({{ $labels.instance }})"
description: "{{ $labels.mountpoint }} использование диска {{ $value | printf \"%.1f\" }}%"
- alert: ИнстансНедоступен
expr: up == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Инстанс недоступен ({{ $labels.instance }})"
description: "{{ $labels.job }} цель недоступна в течение 2 минут."
Настройка Alertmanager
# alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'telegram'
receivers:
- name: 'telegram'
telegram_configs:
- bot_token: 'ВАШ_ТОКЕН_БОТА'
chat_id: ВАШ_CHAT_ID
parse_mode: 'HTML'
message: |
<b>{{ .Status | toUpper }}</b>
<b>Оповещение:</b> {{ .CommonLabels.alertname }}
<b>Серьёзность:</b> {{ .CommonLabels.severity }}
<b>Инстанс:</b> {{ .CommonLabels.instance }}
Установка Grafana
Grafana с Docker Compose
services:
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=НадёжныйПароль123!
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
grafana_data:
Популярные дашборды Grafana
# Node Exporter Full Dashboard
Dashboard ID: 1860
Источник данных: Prometheus
# Docker Container Monitoring
Dashboard ID: 893
# Prometheus Stats
Dashboard ID: 2
Пользовательские запросы PromQL
# Процент использования CPU
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Процент использования RAM
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
# Процент использования диска
(1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100
# Сетевой трафик (байт/секунду)
rate(node_network_receive_bytes_total{device="eth0"}[5m])
rate(node_network_transmit_bytes_total{device="eth0"}[5m])
# Время работы системы
node_time_seconds - node_boot_time_seconds
Установка Netdata
Netdata — инструмент мониторинга серверов в реальном времени. Установка чрезвычайно проста и мгновенно предоставляет детальные метрики.
Установка одной командой
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
sudo systemctl status netdata
Веб-интерфейс: http://IP_СЕРВЕРА:19999
Netdata с Docker
version: '3.8'
services:
netdata:
image: netdata/netdata:latest
container_name: netdata
restart: unless-stopped
ports:
- "19999:19999"
cap_add:
- SYS_PTRACE
- SYS_ADMIN
security_opt:
- apparmor:unconfined
volumes:
- netdataconfig:/etc/netdata
- netdatalib:/var/lib/netdata
- netdatacache:/var/cache/netdata
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes:
netdataconfig:
netdatalib:
netdatacache:
Полный стек мониторинга (Docker Compose)
# docker-compose.monitoring.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus:/etc/prometheus
- prometheus_data:/prometheus
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- prometheus
networks:
- monitoring
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100"
networks:
- monitoring
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
restart: unless-stopped
ports:
- "9093:9093"
networks:
- monitoring
networks:
monitoring:
driver: bridge
volumes:
prometheus_data:
grafana_data:
docker compose -f docker-compose.monitoring.yml up -d
Установив стек Prometheus + Grafana + Netdata, вы сможете мониторить всю инфраструктуру серверов REXE с единого дашборда. Правила оповещений позволяют проактивно обнаруживать проблемы.
Связанные статьи
Настройка прокси-сервера: руководство по Squid и HAProxy
Squid forward proxy, HAProxy балансировщик нагрузки, SSL-терминация, правила ACL, кэширование, проверки состояния и высокая доступность.
Установка Nginx Proxy Manager: Reverse Proxy с веб-интерфейсом
Установка Nginx Proxy Manager через Docker, автоматическое обновление SSL-сертификатов, настройка proxy host, списки доступа, редиректы, потоки и пользовательские locations.
Установка CrowdSec: Движок безопасности на основе сообщества
Установка CrowdSec, настройка bouncer, обнаружение атак, блокировка IP, дашборд, управление коллекциями и сценариями.