Архітектура моніторингу 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.