Архитектура мониторинга bare-metal с Prometheus и Grafana
Prometheus собирает числовые метрики временных рядов, выполняя запросы к HTTP-эндпоинтам, обычно каждые 15–60 секунд. Grafana запрашивает Prometheus и преобразует эти метрики в дашборды, графики, таблицы и оповещения. Node Exporter предоставляет метрики Linux-хоста, такие как загрузка CPU, нагрузка на память, дисковое пространство, операции ввода-вывода файловой системы, средняя нагрузка и пропускная способность сети.
Для мониторинга в production-среде запускайте Prometheus и Grafana на выделенном bare-metal-сервере, если мониторинг критичен для бизнеса, срок хранения превышает 30 дней или вы планируете отслеживать более 100 систем. VPS подходит для небольшой лаборатории, нескольких веб-сайтов или менее 20 малонагруженных целей. Bare metal обеспечивает предсказуемую производительность дискового ввода-вывода и предотвращает проблемы «шумных соседей» во время компактизации Prometheus.
В этой конфигурации используется один сервер мониторинга и несколько отслеживаемых Linux-серверов:
- Prometheus: хранит метрики и проверяет правила оповещений на порту 9090.
- Node Exporter: предоставляет метрики хоста на порту 9100.
- Grafana: предоставляет дашборды на порту 3000 через Nginx.
- Alertmanager: группирует и маршрутизирует оповещения на порту 9093.
- Nginx: безопасно публикует Grafana через HTTPS.
Предварительные требования и подбор конфигурации сервера
Используйте чистую установку Ubuntu Server 24.04 LTS со статическим публичным IP-адресом. Приведённые ниже команды требуют наличия пользователя без прав root с доступом через sudo. Открывайте TCP-порты 22, 80 и 443 для интернета только при необходимости. По возможности держите порты Prometheus 9090, Alertmanager 9093 и Node Exporter 9100 закрытыми для внешнего доступа.
- Операционная система: Ubuntu Server 24.04 LTS x86_64
- Минимальная конфигурация сервера мониторинга: 4 ядра CPU, 8 ГБ ОЗУ, NVMe SSD 160 ГБ
- Рекомендуемая production-конфигурация сервера: 8 ядер CPU, 32 ГБ ОЗУ, NVMe SSD 960 ГБ
- Используемый интервал сбора метрик: 15 секунд
- Используемый срок хранения Prometheus: 30 дней
- Требуемая DNS-запись: запись A или AAAA, например
grafana.example.com
Для большинства развёртываний Prometheus дисковая ёмкость является ограничивающим ресурсом. Интервал сбора 15 секунд создаёт 5 760 образцов каждой метрики в день. Метрики с низкой кардинальностью, такие как статистика CPU, памяти и диска, требуют немного ресурсов; метки, содержащие идентификаторы пользователей, идентификаторы запросов, IP-адреса, хеши контейнеров или URL с динамическими путями, могут быстро расходовать дисковое пространство и память.
Подбор конфигурации в production-среде по количеству отслеживаемых хостов
Для хранения данных в течение 30 дней, интервала сбора 15 секунд и стандартных метрик Node Exporter используйте следующую конфигурацию сервера мониторинга.
Итог: Начните с 8 ядер CPU, 32 ГБ ОЗУ и NVMe-диска 960 ГБ примерно для 100 Linux-серверов; прежде чем сокращать срок хранения, увеличьте дисковую ёмкость.
| Отслеживаемые Linux-хосты | vCPU / ядра CPU | ОЗУ | Диск | Ежемесячный трафик |
|---|---|---|---|---|
| 1–20 хостов | 4 ядра | 8 ГБ | NVMe 160 ГБ | 1 ТБ |
| 21–150 хостов | 8 ядер | 32 ГБ | NVMe 960 ГБ | 3 ТБ |
| 151–500 хостов | 16 ядер | 64 ГБ | 2 × NVMe 1,92 ТБ в RAID 1 | 8 ТБ |
Эти значения рассчитаны для метрик операционной системы и умеренного количества метрик приложений. Добавьте ресурсы для метрик MySQL, PostgreSQL, Redis, почтового сервера, игрового сервера, Kubernetes, CI/CD, потоковой передачи данных или blackbox-проверок. Для более чем 500 хостов, хранения данных в течение нескольких лет или телеметрии приложений с высокой кардинальностью используйте федерацию Prometheus или платформу долгосрочного хранения метрик, например Thanos, Mimir или VictoriaMetrics.
Шаг 1: Подготовка bare-metal-сервера
Обновите пакеты, установите часовой пояс, установите необходимые утилиты и включите простой межсетевой экран. При необходимости замените UTC на предпочитаемый часовой пояс.
sudo apt update && sudo apt -y upgrade
sudo timedatectl set-timezone UTC
sudo apt install -y curl wget tar gnupg2 ca-certificates apt-transport-https nginx ufw
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
Создайте выделенный каталог для данных Prometheus. Предпочтительно использовать NVMe-накопитель, поскольку Prometheus постоянно записывает журнал предварительной записи и периодически выполняет компактизацию блоков временных рядов.
sudo mkdir -p /var/lib/prometheus
sudo mkdir -p /etc/prometheus/rules
sudo useradd --no-create-home --shell /usr/sbin/nologin prometheus
sudo chown -R prometheus:prometheus /var/lib/prometheus /etc/prometheus
Шаг 2: Установка Prometheus
Загрузите Prometheus 2.53.4 для Linux AMD64, установите его бинарные файлы и создайте службу systemd. Перед последующими обновлениями подтвердите версию выпуска на странице релизов Prometheus на GitHub; выполняйте смену версии осознанно и только после тестирования.
cd /tmp
PROM_VERSION=2.53.4
wget https://github.com/prometheus/prometheus/releases/download/v${PROM_VERSION}/prometheus-${PROM_VERSION}.linux-amd64.tar.gz
tar -xzf prometheus-${PROM_VERSION}.linux-amd64.tar.gz
sudo install -m 0755 prometheus-${PROM_VERSION}.linux-amd64/prometheus /usr/local/bin/prometheus
sudo install -m 0755 prometheus-${PROM_VERSION}.linux-amd64/promtool /usr/local/bin/promtool
sudo cp -r prometheus-${PROM_VERSION}.linux-amd64/consoles /etc/prometheus/
sudo cp -r prometheus-${PROM_VERSION}.linux-amd64/console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus
Создайте файл /etc/prometheus/prometheus.yml. Замените 10.20.0.11 и 10.20.0.12 на частные IP-адреса отслеживаемых хостов. Частные сетевые адреса позволяют не выставлять Node Exporter в публичный интернет.
sudo tee /etc/prometheus/prometheus.yml > /dev/null <<'EOF'
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
environment: production
site: bare-metal-1
alerting:
alertmanagers:
- static_configs:
- targets: ['127.0.0.1:9093']
rule_files:
- /etc/prometheus/rules/*.yml
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['127.0.0.1:9090']
- job_name: node
static_configs:
- targets:
- '127.0.0.1:9100'
- '10.20.0.11:9100'
- '10.20.0.12:9100'
EOF
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
Создайте и запустите модуль systemd Prometheus со сроком хранения 30 дней. Параметр --storage.tsdb.retention.time=30d ограничивает срок хранения блоков; также используйте ограничение размера, чтобы данные мониторинга не заполнили том сервера.
sudo tee /etc/systemd/system/prometheus.service > /dev/null <<'EOF'
[Unit]
Description=Prometheus Monitoring
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 \
--storage.tsdb.retention.time=30d \
--storage.tsdb.retention.size=120GB \
--web.listen-address=127.0.0.1:9090
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
sudo systemctl status prometheus --no-pager
Шаг 3: Установка Node Exporter на каждом отслеживаемом Linux-сервере
Выполните этот раздел на сервере Prometheus и на каждой целевой машине. Node Exporter прослушивает порт 9100. Привяжите его к частному IP-адресу или используйте правила межсетевого экрана, чтобы подключаться к нему мог только сервер Prometheus.
cd /tmp
NODE_VERSION=1.8.2
sudo useradd --no-create-home --shell /usr/sbin/nologin node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v${NODE_VERSION}/node_exporter-${NODE_VERSION}.linux-amd64.tar.gz
tar -xzf node_exporter-${NODE_VERSION}.linux-amd64.tar.gz
sudo install -m 0755 node_exporter-${NODE_VERSION}.linux-amd64/node_exporter /usr/local/bin/node_exporter
sudo tee /etc/systemd/system/node_exporter.service > /dev/null <<'EOF'
[Unit]
Description=Prometheus 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 --web.listen-address=:9100
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
curl -s http://127.0.0.1:9100/metrics | head
На каждом отслеживаемом хосте разрешите доступ к порту 9100 только с частного адреса сервера Prometheus. Замените 10.20.0.10 адресом сервера мониторинга.
sudo ufw allow from 10.20.0.10 to any port 9100 proto tcp
sudo ufw status numbered
Шаг 4: Добавление правил оповещений и Alertmanager
Создайте оповещения для недоступного хоста, длительной высокой загрузки CPU, нехватки дискового пространства и малого объёма доступной памяти. Оповещения должны указывать на требующее действий состояние, а не на каждый кратковременный всплеск.
sudo tee /etc/prometheus/rules/host-alerts.yml > /dev/null <<'EOF'
groups:
- name: host-alerts
rules:
- alert: HostDown
expr: up{job="node"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Host {{ $labels.instance }} is unreachable"
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
for: 10m
labels:
severity: warning
annotations:
summary: "CPU usage exceeds 90% on {{ $labels.instance }}"
- alert: LowDiskSpace
expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) * 100 < 10
for: 10m
labels:
severity: critical
annotations:
summary: "Less than 10% disk space remains on {{ $labels.instance }}"
- alert: LowAvailableMemory
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
for: 10m
labels:
severity: warning
annotations:
summary: "Available memory is below 10% on {{ $labels.instance }}"
EOF
sudo chown prometheus:prometheus /etc/prometheus/rules/host-alerts.yml
sudo promtool check config /etc/prometheus/prometheus.yml
sudo systemctl restart prometheus
Установите Alertmanager и начните с локального получателя. После проверки доставки оповещений замените конфигурацию получателя на правильно защищённый SMTP-релей, webhook, совместимый со Slack эндпоинт или интеграцию с PagerDuty.
cd /tmp
ALERT_VERSION=0.27.0
wget https://github.com/prometheus/alertmanager/releases/download/v${ALERT_VERSION}/alertmanager-${ALERT_VERSION}.linux-amd64.tar.gz
tar -xzf alertmanager-${ALERT_VERSION}.linux-amd64.tar.gz
sudo useradd --no-create-home --shell /usr/sbin/nologin alertmanager
sudo install -m 0755 alertmanager-${ALERT_VERSION}.linux-amd64/alertmanager /usr/local/bin/alertmanager
sudo mkdir -p /etc/alertmanager /var/lib/alertmanager
sudo chown -R alertmanager:alertmanager /etc/alertmanager /var/lib/alertmanager
sudo tee /etc/alertmanager/alertmanager.yml > /dev/null <<'EOF'
route:
receiver: local-log
group_by: ['alertname', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: local-log
EOF
sudo tee /etc/systemd/system/alertmanager.service > /dev/null <<'EOF'
[Unit]
Description=Prometheus Alertmanager
After=network-online.target
[Service]
User=alertmanager
Group=alertmanager
ExecStart=/usr/local/bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/var/lib/alertmanager --web.listen-address=127.0.0.1:9093
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now alertmanager
Шаг 5: Установка Grafana
Установите Grafana из подписанного APT-репозитория. Grafana будет прослушивать только localhost, поскольку Nginx будет обрабатывать публичный доступ по HTTPS.
sudo mkdir -p /etc/apt/keyrings
wget -q -O - https://apt.grafana.com/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/grafana.gpg
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install -y grafana
sudo sed -i 's/^;http_addr =.*/http_addr = 127.0.0.1/' /etc/grafana/grafana.ini
sudo systemctl enable --now grafana-server
sudo systemctl status grafana-server --no-pager
Для первоначального входа используйте локальную службу через SSH-туннель, а не открывайте порт 3000:
ssh -L 3000:127.0.0.1:3000 youruser@YOUR_SERVER_IP
Откройте http://localhost:3000, войдите с учётными данными admin и admin и немедленно смените пароль. Добавьте источник данных Prometheus с URL http://127.0.0.1:9090. Импортируйте дашборд с ID 1860 — широко используемый дашборд Node Exporter Full, — затем выберите источник данных Prometheus.
Шаг 6: Публикация Grafana через Nginx и HTTPS
Настройте DNS для grafana.example.com, указав этот сервер, прежде чем запрашивать сертификат. Замените домен в конфигурации и команде Certbot.
sudo tee /etc/nginx/sites-available/grafana > /dev/null <<'EOF'
server {
listen 80;
server_name grafana.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/grafana /etc/nginx/sites-enabled/grafana
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d grafana.example.com --redirect --agree-tos -m [email protected]
sudo systemctl status certbot.timer --no-pager
Создайте отдельных пользователей Grafana или подключите провайдера удостоверений; не используйте общую учётную запись администратора по умолчанию. Отключите анонимный доступ, если дашборды намеренно не являются публичными.
Шаг 7: Проверка сбора данных, хранения и оповещений
Убедитесь, что Prometheus видит каждую цель как работоспособную. Статус цели up, равный 1, означает успех; значение 0 означает, что Prometheus не может получить данные с эндпоинта.
curl -s http://127.0.0.1:9090/api/v1/query?query=up
curl -s http://127.0.0.1:9090/api/v1/targets | grep -o 'health":"[^"]*' | sort | uniq -c
sudo promtool check rules /etc/prometheus/rules/host-alerts.yml
sudo systemctl --no-pager --full status prometheus node_exporter alertmanager grafana-server nginx
В Grafana Explore выполните следующие запросы PromQL:
up{job="node"}
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
node_memory_MemAvailable_bytes / 1024 / 1024
node_filesystem_avail_bytes{mountpoint="/"} / 1024 / 1024 / 1024
Безопасно протестируйте оповещение HostDown, остановив Node Exporter на одном некритичном хосте более чем на две минуты, а затем восстановите его.
sudo systemctl stop node_exporter
# Подождите не менее 2 минут, проверьте раздел Alerts в Prometheus, затем восстановите службу:
sudo systemctl start node_exporter
Устранение распространённых проблем Prometheus и Grafana
Цель отображается как DOWN в Prometheus
Проверьте службу цели, межсетевой экран и маршрут от сервера Prometheus. Следующая команда должна вернуть метрики с сервера мониторинга. Если истекает время ожидания, разрешите TCP-порт 9100 только с частного IP-адреса Prometheus и проверьте правильность адреса цели в prometheus.yml.
curl -v http://10.20.0.11:9100/metrics
sudo systemctl status node_exporter --no-pager
sudo ss -lntp | grep 9100
Prometheus потребляет слишком много дискового пространства или ОЗУ
Проверьте активные ряды, занятое дисковое пространство и настройки хранения. Избегайте меток с неограниченным количеством значений. Сократить срок хранения с 30 до 15 дней безопаснее, чем допустить заполнение файловой системы, однако для стабильной нагрузки следует увеличить ёмкость NVMe.
curl -s http://127.0.0.1:9090/api/v1/status/tsdb
sudo du -sh /var/lib/prometheus
sudo df -h /var/lib/prometheus
sudo journalctl -u prometheus -n 100 --no-pager
Grafana возвращает ошибку 502 Bad Gateway
Ответ 502 обычно означает, что Grafana остановлена, прослушивает другой адрес или заблокирована ошибкой конфигурации. Проверьте обе службы и проверьте конфигурацию Nginx перед его перезагрузкой.
sudo systemctl status grafana-server nginx --no-pager
sudo ss -lntp | grep 3000
sudo nginx -t
sudo journalctl -u grafana-server -n 100 --no-pager
В Grafana нет данных
Убедитесь, что URL источника данных Grafana — http://127.0.0.1:9090, а не публичный URL, заблокированный межсетевым экраном. Сначала выполните в Prometheus запрос up. Если ряды не возвращаются, исправьте сбор данных Prometheus, прежде чем изменять переменные дашборда.
Эксплуатационные рекомендации для надёжного сервера мониторинга
- Ежедневно создавайте резервные копии дашбордов Grafana, источников данных, правил оповещений и конфигурационных файлов. Данные Prometheus можно воссоздать, но исторические метрики ценны при разборе инцидентов.
- Отслеживайте сам сервер мониторинга с помощью Node Exporter, включая использование диска, память, CPU и состояние RAID.
- Используйте диски NVMe в RAID 1 для важных production-данных мониторинга. RAID не является резервной копией.
- Устанавливайте исправления Ubuntu и обновляйте Prometheus, Grafana, Node Exporter и Alertmanager в запланированное окно технического обслуживания.
- Используйте частные VLAN, VPN-доступ или списки разрешённых адресов межсетевого экрана для портов метрик. Не публикуйте Node Exporter или эндпоинты Prometheus в интернете.
- Настройте оповещения об истечении срока действия сертификатов, сбоях резервного копирования, деградации RAID и росте объёма хранилища TSDB Prometheus.