Налаштування алертів за метриками бази даних (CPU, пам'ять, диск, підключення)

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування алертів за метриками бази даних (CPU, пам'ять, диск, підключення)
Середня
від 1 робочого дня до 3 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Налаштування сповіщень за метриками бази даних (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 групи/каналу