Налаштування сповіщень за метриками бази даних (CPU, пам'ять, диск, з'єднання)
Сповіщення — це сповіщення, яке приходить до того, як користувачі помітили проблему. "Диск заповнений на 95%" — це аварія. "Диск заповнений на 75%, ріст 2 ГБ/день" — це 10 днів на вирішення. Правильні пороги та правильні канали доставки — половина роботи.
Стек моніторингу
Стандартний стек для баз даних:
PostgreSQL/MySQL/MongoDB
│
Exporter (postgres_exporter / mysqld_exporter / mongodb_exporter)
│ метрики у форматі Prometheus
Prometheus (збір та зберігання метрик)
│
Alertmanager (маршрутизація сповіщень)
│
Telegram / Slack / PagerDuty
│
Grafana (візуалізація)
Встановлення exporters
# 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 для системних метрик (CPU, RAM, диск)
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; -- системна роль PG 10+
-- або вручну:
GRANT SELECT ON pg_stat_database TO monitoring;
GRANT SELECT ON pg_stat_replication TO monitoring;
GRANT EXECUTE ON FUNCTION pg_current_wal_lsn() TO monitoring;
Правила сповіщень Prometheus
# /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 }}"
description: "База не відповідає понад 30 секунд"
# Диск > 85% заповнений
- 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
annotations:
summary: "PostgreSQL диск {{ $value | printf \"%.1f\" }}% заповнений"
# Критичне заповнення диска
- 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
annotations:
summary: "КРИТИЧНО: PostgreSQL диск {{ $value | printf \"%.1f\" }}% заповнений"
# Занадто багато з'єднань
- alert: PostgreSQLTooManyConnections
expr: |
pg_stat_activity_count / pg_settings_max_connections * 100 > 80
for: 2m
labels:
severity: warning
annotations:
summary: "{{ $value | printf \"%.0f\" }}% з'єднань PostgreSQL використано"
description: "Розгляньте PgBouncer або збільшення max_connections"
# Довга транзакція (> 10 хвилин)
- alert: PostgreSQLLongRunningTransaction
expr: |
pg_stat_activity_max_tx_duration{state="active"} > 600
for: 1m
labels:
severity: warning
annotations:
summary: "Транзакція виконується {{ $value | printf \"%.0f\" }} секунд"
# Лаг репліцірування > 60 секунд
- alert: PostgreSQLReplicationLag
expr: pg_replication_lag > 60
for: 2m
labels:
severity: critical
annotations:
summary: "Реплика відстає на {{ $value | printf \"%.0f\" }} секунд"
- name: postgresql_warning
rules:
# Cache hit rate < 99%
- 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
annotations:
summary: "Cache hit rate: {{ $value | printf \"%.1f\" }}% (норма > 99%)"
# CPU > 80%
- alert: HighCPUUsage
expr: |
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "CPU {{ $labels.instance }}: {{ $value | printf \"%.0f\" }}%"
# Вільної ОЗУ < 10%
- alert: LowFreeMemory
expr: |
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
for: 5m
labels:
severity: warning
annotations:
summary: "Вільна пам'ять: {{ $value | printf \"%.1f\" }}%"
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 # критичні повторювати кожні 30 хвилин
- 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 # ID групи/каналу







