Чому алерти БД мовчать до аварії?
Ви помічали, що база даних падає без попередження? Зазвичай першим сигналом стає скарга користувача: «сайт не відповідає». До цього моменту диск уже заповнений, репліка відстала на години, а транзакції заблоковані. Ми впроваджуємо систему алертів, яка сповіщає за 72 години до критичної події.
Налаштовуємо повний цикл моніторингу метрик БД: CPU, пам'ять, диск, підключення, реплікація, довгі запити. Використовуємо Prometheus, Alertmanager, Grafana. Інтегруємо сповіщення в Telegram або Slack. Наші правила покривають 15+ критичних метрик для PostgreSQL, MySQL та MongoDB. Предиктивні алерти на predict_linear в 3 рази ефективніші за прості порогові правила — вони дають час на реакцію, а не констатують аварію. Згідно з документацією Prometheus, predict_linear заснований на лінійній регресії.
Чому стандартні алерти не працюють?
Без предиктивних правил ви дізнаєтеся про проблему, коли вже пізно. Наприклад, алерт «диск заповнений на 95%» — це аварія. А «диск заповнений на 75%, зростання 2 GB/добу» — у вас 10 днів на розширення сховища. Prometheus вміє передбачати тренди через predict_linear, але мало хто це налаштовує. Ще часта помилка — ігнорування реплікації. Лаг у 60 секунд може призвести до втрати даних при збої master. Ми включаємо алерт PostgreSQLReplicationLag з критичним порогом. Середня економія клієнтів після впровадження — суттєва сума за рахунок запобігання простоям.
Як налаштувати алерти для PostgreSQL та MySQL?
| Компонент | Інструмент | Версія (рекомендована) |
|---|---|---|
| Метрики БД | postgres_exporter / mysqld_exporter | Latest |
| Збір та зберігання | Prometheus | 2.x |
| Візуалізація | Grafana | 10.x |
| Сповіщення | Alertmanager + Telegram | Latest |
| Системні метрики | node_exporter | Latest |
Установка exporters (Docker)
# PostgreSQL
docker run -d --name postgres_exporter \
-e DATA_SOURCE_NAME="postgresql://monitoring:password@localhost:5432/postgres?sslmode=disable" \
-p 9187:9187 \
quay.io/prometheuscommunity/postgres-exporter:latest
# MySQL
docker run -d --name mysqld_exporter \
-e DATA_SOURCE_NAME="monitoring:password@(localhost:3306)/" \
-p 9104:9104 \
prom/mysqld-exporter:latest
# Node Exporter
docker run -d --name node_exporter \
--pid="host" \
-v /:/host:ro,rslave \
-p 9100:9100 \
quay.io/prometheus/node-exporter:latest \
--path.rootfs=/host
Користувач для моніторингу PostgreSQL (мінімальні права): CREATE USER monitoring WITH PASSWORD 'monitoring_password'; GRANT pg_monitor TO monitoring;
Правила алертів (Prometheus rules)
Файл /etc/prometheus/rules/database.yml:
groups:
- name: postgresql_critical
rules:
- alert: PostgreSQLDown
expr: pg_up == 0
for: 30s
labels:
severity: critical
annotations:
summary: "PostgreSQL недоступен на {{ $labels.instance }}"
- alert: DiskSpaceHigh
expr: |
(node_filesystem_size_bytes{mountpoint="/var/lib/postgresql"} -
node_filesystem_free_bytes{mountpoint="/var/lib/postgresql"}) /
node_filesystem_size_bytes{mountpoint="/var/lib/postgresql"} * 100 > 85
for: 5m
labels:
severity: warning
- alert: DiskSpaceCritical
expr: |
(node_filesystem_size_bytes{mountpoint="/var/lib/postgresql"} -
node_filesystem_free_bytes{mountpoint="/var/lib/postgresql"}) /
node_filesystem_size_bytes{mountpoint="/var/lib/postgresql"} * 100 > 95
for: 1m
labels:
severity: critical
- alert: PostgreSQLTooManyConnections
expr: pg_stat_activity_count / pg_settings_max_connections * 100 > 80
for: 2m
labels:
severity: warning
- alert: PostgreSQLLongRunningTransaction
expr: pg_stat_activity_max_tx_duration{state="active"} > 600
for: 1m
labels:
severity: warning
- alert: PostgreSQLReplicationLag
expr: pg_replication_lag > 60
for: 2m
labels:
severity: critical
- name: postgresql_warning
rules:
- alert: PostgreSQLLowCacheHitRate
expr: |
(sum(pg_stat_database_blks_hit) /
(sum(pg_stat_database_blks_hit) + sum(pg_stat_database_blks_read))) * 100 < 99
for: 10m
labels:
severity: warning
- alert: HighCPUUsage
expr: |
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
- alert: LowFreeMemory
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
for: 5m
labels:
severity: warning
- name: mysql_alerts
rules:
- alert: MySQLDown
expr: mysql_up == 0
for: 30s
labels:
severity: critical
- alert: MySQLSlowQueries
expr: rate(mysql_global_status_slow_queries[5m]) > 5
for: 2m
labels:
severity: warning
- alert: MySQLInnoDBBufferPoolHitRateLow
expr: |
(mysql_global_status_innodb_buffer_pool_read_requests -
mysql_global_status_innodb_buffer_pool_reads) /
mysql_global_status_innodb_buffer_pool_read_requests * 100 < 99
for: 10m
labels:
severity: warning
- alert: MySQLReplicationLag
expr: mysql_slave_status_seconds_behind_master > 30
for: 1m
labels:
severity: critical
- name: mongo_alerts
rules:
- alert: MongoDBReplicationLag
expr: mongodb_rs_member_replication_lag_seconds > 60
for: 2m
labels:
severity: critical
- name: predictive_alerts
rules:
- alert: DiskWillFillSoon
expr: predict_linear(node_filesystem_free_bytes{mountpoint="/var/lib/postgresql"}[6h], 3*24*3600) < 0
for: 1h
labels:
severity: warning
Alertmanager: як налаштувати Telegram
# /etc/alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: telegram-critical
routes:
- match:
severity: critical
receiver: telegram-critical
repeat_interval: 30m
- match:
severity: warning
receiver: telegram-warning
repeat_interval: 4h
receivers:
- name: telegram-critical
telegram_configs:
- api_url: "https://api.telegram.org"
bot_token: "BOT_TOKEN"
chat_id: -1001234567890
message: |
\U0001f534 *{{ .GroupLabels.alertname }}*
{{ range .Alerts }}
*{{ .Annotations.summary }}*
{{ .Annotations.description }}
Час: {{ .StartsAt.Format "15:04:05" }}
{{ end }}
parse_mode: "Markdown"
- name: telegram-warning
telegram_configs:
- api_url: "https://api.telegram.org"
bot_token: "BOT_TOKEN"
chat_id: -1001234567891
message: |
\U000026a0 *{{ .GroupLabels.alertname }}*
{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}
parse_mode: "Markdown"
Чому предиктивні алерти кращі?
Предиктивні алерти на predict_linear дають час на реакцію: диск закінчиться через 3 дні — ви встигнете розширити сховище. Вартість однієї години простою БД може бути значною. Інвестиція в налаштування моніторингу окупається за 1-2 місяці.
Процес роботи: від запиту до деплою
- Аудит поточної інфраструктури — збираємо схему БД, версії, навантаження, виявляємо вузькі місця.
- Розробка конфігурації — підбираємо exporters, правила алертів, канали сповіщень. Визначаємо пороги на основі історичних даних: наприклад, 80% CPU протягом 5 хвилин — warning, 95% — critical.
- Встановлення та налаштування — розгортаємо стек (Prometheus, Alertmanager, Grafana) в Docker або на bare metal.
- Інтеграція з Telegram/Slack/PagerDuty — налаштовуємо шаблони повідомлень, маршрутизацію за severity.
- Тестування — форсуємо алерти, перевіряємо доставку, коригуємо чутливість.
- Документація та навчання — передаємо інструкції та доступи.
- Пост-релізна підтримка — коригуємо пороги за потреби, додаємо нові метрики.
Що входить в роботу
- Встановлення та налаштування Prometheus + Alertmanager + Grafana.
- Конфігурація exporters для PostgreSQL/MySQL/MongoDB.
- Написання набору правил (critical, warning, predictive).
- Налаштування сповіщень в Telegram/Slack.
- Створення дашборду Grafana з ключовими метриками (CPU, пам'ять, диск, підключення, реплікація).
- Документація з експлуатації та обслуговування.
- Гарантійна підтримка після впровадження.
Терміни та вартість
| Обсяг робіт | Строк | Вартість |
|---|---|---|
| Одна БД (PostgreSQL/MySQL) | 4-8 годин | розраховується індивідуально |
| Комплексний моніторинг (кілька БД + дашборди) | 1-2 дні | розраховується індивідуально |
Вартість залежить від складності інфраструктури, кількості БД та вимог до сповіщень. Ми оцінюємо проект безкоштовно після брифінгу. Зв'яжіться з нами — надішлемо комерційну пропозицію.
Перевірка роботи алертів
Після налаштування надсилаємо тестовий алерт через Alertmanager API:
curl -H "Content-Type: application/json" -d '[{"labels": {"alertname": "TestAlert", "severity": "warning"}, "annotations": {"summary": "Test alert from setup verification"}}]' http://localhost:9093/api/v1/alerts
Перевіряємо прихід сповіщення в Telegram. Відкриваємо Grafana та дивимось дашборди.
Наш досвід — більше 5 років в інфраструктурному моніторингу, 50+ впроваджених проектів. Напишіть нам — допоможемо налаштувати моніторинг БД під ключ за 1-2 дні. Отримайте консультацію безкоштовно.
Типові помилки при самостійному налаштуванні
- Забувають про реплікацію — алерти тільки на master. Репліка відстає, дані втрачаються.
- Немає предиктивних правил — дізнаються про проблему, коли диск уже заповнений.
- Забагато алертів — warning на кожний чих. Налаштовуємо тільки значущі пороги.
- Не тестують сповіщення — бот не надсилає через помилку в токені. Ми перевіряємо кожен канал.
Один запобіглий інцидент економить значно. Інвестиція в налаштування моніторингу окупається за 1-2 місяці. Замовте налаштування алертів БД і забудьте про несподівані збої.







