Prometheus + Grafana + Alertmanager: полный стек мониторинга для корпоративного парка
Я Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15+ лет обслуживания корпоративных инфраструктур я поставил Prometheus минимум на 40 клиентских проектах — от мониторинга одного сервера 1С до парков в 200+ узлов. И каждый раз убеждаюсь: нет ничего лучше связки Prometheus + Grafana + Alertmanager для среднего бизнеса. Бесплатно, production-grade, сообщество огромное, экспортёров под всё. В этой статье — пошаговая установка на Linux, подключение Windows и Linux узлов, первые дашборды, алерты в Telegram и чек-лист, чтобы всё не развалилось через месяц.
Архитектура решения
- Prometheus Server — забирает (scrape) метрики с экспортёров по HTTP, хранит в TSDB.
- node_exporter — агент для Linux, отдаёт CPU/RAM/Disk/Net.
- windows_exporter — аналог для Windows, метрики через performance counters и WMI.
- blackbox_exporter — пробы HTTP/HTTPS/TCP/ICMP.
- snmp_exporter — сбор с коммутаторов, UPS, принтеров.
- Alertmanager — получает алерты от Prometheus, группирует, отправляет в email/Telegram/PagerDuty.
- Grafana — визуализация, дашборды, алерты с UI.
Под небольшой парк (до 100 узлов) — одна виртуалка 4 vCPU, 16 ГБ RAM, 200 ГБ SSD. Под 500+ узлов или длинный retention — кластер VictoriaMetrics или Thanos.
Установка Prometheus на Ubuntu 22.04
sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir /etc/prometheus /var/lib/prometheus
sudo chown prometheus:prometheus /etc/prometheus /var/lib/prometheus
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz
tar xf prometheus-2.54.1.linux-amd64.tar.gz
sudo cp prometheus-2.54.1.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.54.1.linux-amd64/promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool
sudo cp -r prometheus-2.54.1.linux-amd64/consoles prometheus-2.54.1.linux-amd64/console_libraries /etc/prometheus/
Создаём systemd-unit /etc/systemd/system/prometheus.service:
[Unit]
Description=Prometheus
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 \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
Restart=always
[Install]
WantedBy=multi-user.target
Базовый prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: 'corp-main'
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
rule_files:
- '/etc/prometheus/alert.rules.yml'
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'linux-nodes'
file_sd_configs:
- files: ['/etc/prometheus/targets/linux.yml']
- job_name: 'windows-nodes'
file_sd_configs:
- files: ['/etc/prometheus/targets/windows.yml']
- job_name: 'blackbox-http'
metrics_path: /probe
params: { module: [http_2xx] }
static_configs:
- targets:
- https://portal.itfresh.local
- https://mail.itfresh.local/owa
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox:9115
Файлы таргетов (/etc/prometheus/targets/linux.yml) лежат отдельно, управляются скриптом-генератором или через Ansible. Prometheus перечитывает их без рестарта.
node_exporter на Linux-узлах
# На каждом Linux-сервере
useradd --no-create-home --shell /bin/false node_exporter
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xf node_exporter-1.8.2.linux-amd64.tar.gz
cp node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
chown node_exporter:node_exporter /usr/local/bin/node_exporter
# systemd unit (упрощённо)
cat > /etc/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Node Exporter
[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter --collector.textfile.directory=/var/lib/node_exporter/textfile
[Install]
WantedBy=multi-user.target
EOF
systemctl enable --now node_exporter
windows_exporter на Windows-серверах
# На Windows Server через PowerShell
$msi = 'https://github.com/prometheus-community/windows_exporter/releases/download/v0.28.1/windows_exporter-0.28.1-amd64.msi'
Invoke-WebRequest -Uri $msi -OutFile C:\Install\windows_exporter.msi
msiexec /i C:\Install\windows_exporter.msi /quiet `
ENABLED_COLLECTORS=cpu,cs,logical_disk,net,os,service,system,tcp,memory,process,iis `
LISTEN_PORT=9182
New-NetFirewallRule -DisplayName 'Prometheus windows_exporter' `
-Direction Inbound -LocalPort 9182 -Protocol TCP -Action Allow
Test-NetConnection -Port 9182
Обратите внимание на включённые коллекторы. Не включайте всё подряд — это замедлит сбор и даст кардинальный взрыв метрик (process collector — 50 тыс. серий на одном сервере).
Grafana и первые дашборды
sudo apt install -y apt-transport-https software-properties-common
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update && sudo apt install -y grafana
sudo systemctl enable --now grafana-server
Открываем http://localhost:3000 (admin/admin при первом входе), добавляем Prometheus data source, импортируем готовые дашборды по ID:
| Источник | ID дашборда | Что покажет |
|---|---|---|
| node_exporter | 1860 (Node Exporter Full) | CPU/RAM/Disk/Net для Linux |
| windows_exporter | 14694 (Windows Exporter) | CPU/RAM/Disk/Services для Windows |
| blackbox | 7587 | Status-страница сайтов и портов |
| alertmanager | 9578 | Активные алерты |
| postgres_exporter | 9628 | Метрики PostgreSQL |
Первые alert-правила
groups:
- name: baseline
interval: 30s
rules:
- alert: HostDown
expr: up{job=~"linux-nodes|windows-nodes"} == 0
for: 3m
labels: { severity: critical }
annotations:
summary: "{{ $labels.instance }} недоступен"
description: "Экспортёр не отвечает более 3 минут"
- alert: HighDiskUsage
expr: (1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes) * 100 > 90
for: 10m
labels: { severity: warning }
annotations:
summary: "{{ $labels.instance }} {{ $labels.mountpoint }} занят > 90%"
- alert: HighMemory
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 92
for: 10m
labels: { severity: warning }
- alert: WindowsDiskLow
expr: (windows_logical_disk_free_bytes / windows_logical_disk_size_bytes) * 100 < 10
for: 10m
labels: { severity: warning }
- alert: WindowsServiceStopped
expr: windows_service_state{state="stopped",name=~"(mssql.*|w3svc|exchange.*|w32time)"} == 1
for: 2m
labels: { severity: critical }
Alertmanager и Telegram
global:
resolve_timeout: 5m
route:
receiver: telegram
group_by: ['alertname','instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
routes:
- match: { severity: critical }
receiver: telegram-critical
receivers:
- name: telegram
webhook_configs:
- url: http://alertmanager-bot:8080/webhook
- name: telegram-critical
webhook_configs:
- url: http://alertmanager-bot:8080/webhook-critical
Мы у себя используем metalmatze/alertmanager-bot — маленький сервис, который принимает webhook и шлёт красивое сообщение в чат. Настроили фильтр: все warning в один чат, все critical — в дежурный канал с упоминанием on-call инженера.
Мини-кейс: мониторинг на холдинге
В сентябре 2025 внедрили мониторинг холдингу — торговый оператор, 6 филиалов, 78 Windows-серверов + 22 Linux + коммутаторы и UPS через SNMP. До нас мониторинга не было вообще — узнавали о проблемах от звонков пользователей.
За 10 рабочих дней:
- Подняли Prometheus + Grafana + Alertmanager на виртуалке Dell с Xeon Platinum 8280, 32 ГБ RAM, 500 ГБ NVMe. Сетевой стек — 40G Mellanox до центрального хранилища в дата-центре МТС.
- Раскатили node_exporter на 22 Linux через Ansible playbook (3 минуты на все серверы).
- Раскатили windows_exporter на 78 Windows через GPO Software Installation + конфиг для коллекторов.
- Настроили snmp_exporter на 34 коммутатора Aruba и 12 UPS APC.
- Blackbox пробы для 18 критичных веб-сервисов.
- 41 alert-правило (disk, memory, services, SMART, replication, certs expiring).
- Алерты в Telegram: warning — общий канал, critical — дежурный.
- Grafana дашборды: Overview, Servers, Network, Storage, Services.
В первый месяц поймали 14 инцидентов до того, как пользователи заметили: диск на 98% на файл-сервере, истёкший SSL на портале, остановленный IIS AppPool, утечка памяти в 1C:УТ, физическая авария двух дисков в RAID. Стоимость внедрения — 165 тыс. руб. За год SLA поднялся с «когда увидим» до 99.6% по критичным сервисам.
Обслуживание и масштабирование
- Retention планируйте исходя из темпа сбора. 50 узлов × 400 метрик × 15 секунд × 90 дней ≈ 100–150 ГБ.
- Регулярно чистите неиспользуемые дашборды и data sources — они заставляют Grafana тормозить.
- Для длинного retention (год+) — VictoriaMetrics или Thanos с S3 storage.
- Бэкапы конфигов prometheus.yml, alerts, dashboards — в git.
- Алерт на сам Prometheus (Dead Man Switch) — отдельная проба, что мониторинг жив.
- Обновления экспортёров — раз в полгода через Ansible/PowerShell DSC.
- Тестируйте алерты — искусственно ломайте сервис раз в квартал.
Best practices по алертам
- Каждый алерт должен быть actionable — если от него нельзя ничего сделать, он не нужен.
- Severity: critical — будит ночью, warning — можно утром, info — вообще не шлют в Telegram.
- Обязательные labels: service, team, severity, instance.
- Runbook-ссылки в annotations — дежурный не должен гадать, что делать.
- Фильтрация noise: известные техокна — silence в Alertmanager.
- Alert fatigue — главный враг. Если вы игнорируете алерт — либо он неправильный, либо уберите его.
Развернём полноценный мониторинг под ключ
Ставлю связку Prometheus + Grafana + Alertmanager на ваш парк за 7–14 рабочих дней. Экспортёры под Windows, Linux, SNMP, PostgreSQL, MSSQL, Docker. 15+ лет опыта с корпоративным мониторингом. Выделенное плечо — Dell Xeon Platinum 8280 в дата-центре МТС на 40G аплинке Mellanox, с резервированием и бэкапами TSDB.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — частые вопросы по Prometheus
- Сколько ресурсов нужно для Prometheus?
- Для 50–100 узлов хватает 2 vCPU, 8 ГБ RAM, 100 ГБ SSD. Для парка 500+ узлов — 4–8 vCPU, 32 ГБ RAM, 500 ГБ NVMe. Retention по умолчанию 15 дней, можно продлить до 90 дней без боли.
- Zabbix или Prometheus?
- Zabbix — классика с push-моделью, проще для непрограммистов, хорош для сетевого оборудования SNMP. Prometheus — pull-модель, гибче для сервисных метрик, лучшая интеграция с Docker/Kubernetes и современным стеком.
- Нужен ли VictoriaMetrics?
- Если retention больше месяца-двух или кардинальность метрик огромна — да. VictoriaMetrics сжимает лучше в 3–10 раз и быстрее на запросах. Для 50 серверов и 30 дней retention — обычный Prometheus справляется.
- Как отправлять алерты в Telegram?
- Через Alertmanager с webhook на bot-ретранслятор (например, alertmanager-bot от metalmatze) или напрямую через generic webhook на свой микросервис, который пушит в Bot API. Конфиг в alertmanager.yml в секции receivers.
- Как мониторить сервисы без экспортёра?
- Через blackbox_exporter для HTTP/TCP/ICMP-пробов, через textfile collector у node_exporter для статистики из скриптов, или через Pushgateway для задач, которые сами пушат метрики.