Всем привет! Недавно закончился PGConf, где большая часть докладов была посвящена новым фичам PostgreSQL Pro, и лишь немногие касались ванильной версии. Попробую разнообразить повестку и рассказать что мы делаем с уклоном на мониторинг PG .
В Прометей Лаб я влился с октября 2024 года и начал развивать сервис администрирования баз данных. Сегодня я хочу поделиться нашим подходом к мониторингу, который экономит время и нервы.
Если вы DBA, то вы наверняка сталкивались с задачей мониторинга десятков инстансов баз данных — PostgreSQL, MSSQL, MariaDB, Oracle или что-то из NoSQL — на разных ОС, от bare metal до PaaS. Настройка мониторинга в таких условиях может занять недели, а ошибки в алертинге приводят к простоям.
Зачастую, в больших компаниях есть типовой мониториг который, мягко говоря, сложно кастомизировать, а попытки его доработать, в лучшем случае, вылились в пару месяцев переписки и согласования с безами.. В худшем - вы разочаровались в жизни, смирились и продолжаете кушать кактус заводить заявки.
Я тоже через это проходил, поэтому в Прометей Лаб мы сфокусировались на переносимом, масштабируемом, k8s ready решении, на типовых компонентах которое можно оперативно развернуть и с минимальной болью занести в разрешенный техстек. В последней демо, при наличии тех учеток в бд, весь процесс подключения нового клиента к мониторингу с нуля занимает 40 минут и поддерживает кастомизацию под любые нужды.
В этой статье я расскажу, как мы этого добились, поделюсь нашим стеком, примерами конфигураций и планами на будущее. Если вы сталкивались с подобными задачами, возможно эта статья натолкнет вас на мысли как расшить направление мониторинга и сократить время реакции на инциденты.
Требования к решению
Вот вводные, которые определили наш подход:
Разнообразие ОС у клиентов: Linux, Windows, иногда экзотические дистрибутивы.
Гибридная инфраструктура: VM, bare metal, PaaS (Sber Cloud, Yandex Cloud).
Масштаб: 30-50 инстансов баз данных на клиента.
Разные СУБД: PostgreSQL, MariaDB, MSSQL, ClickHouse, Oracle.
Минимальные усилия на настройку: Решение должно быть легко тиражируемым между клиентами.
Кастомизация: Возможность добавлять свои метрики и специфические пороги.
Cloud Ready: возможность упаковать все в хельмы и ставить в k8s
Эти требования исключали использование ОС-специфичных инструментов и требовали легковесного, переносимого решения. Мы выбрали контейнеризацию через Docker, так как она решает следующие задачи:
Автоматизация: GitLab CI + Docker Compose максимально упрощает конфигурирование и развертывание.
Независимость от ОС: Не у всех есть k8s, а контейнеры все так же продолжают одинаково работать на Centos, Ubuntu, ALT linux etc.
Простота тиражирования: Один набор конфигураций подходит для всех клиентов.
Достаточная производительность: Для наших объемов (до 50 инстансов) текущей архитектуры более чем достаточно.
Наш стек мониторинга

Victoria metrics stack: для хранения и сбора метрик
Grafana: Визуализация метрик через дашборды.
Экспортеры: Специализированные агенты для сбора метрик из PostgreSQL, MSSQL, MariaDB, Oracle и ClickHouse.
Docker Compose: Единая точка развертывания всех компонентов.
Alertmanager: Маршрутизация алертов в Telegram по каналам для критичных и некритичных событий.
Мы выбрали Victoria metrics по причине более оптимального потребления ресурсов и разделения его функциональности ( prometheus при рестарте мог запускаться по 5-10 минут ), в случае с викторией в 99.9% случаев хватает перезапуска vmagent c ДТ в секунды.
Структура конфигураций
Для повышения удобства и "читабельности" выносим все таргеты в отдельные группы и типы
vmetrics/vmagent/targets
├── blackbox
│ └── blackbox_dc_gw.yml
├── clickhouse
│ └── sc-bi.yml
├── etcd
│ └── etcd_ya_dc1.yml
├── mariadb
│ └── mariadb.yml
├── mssql
│ └── mssql_db.yml
├── node
│ ├── clickhouse_sc-bi.yml
│ ├── etcd_os_scrape.yml
│ ├── haproxy_ya_dc1.yml
│ ├── localhost.yml
│ ├── mssql_os.yml
│ ├── partoni_pg_common.yml
│ ├── pg-common.yml
│ └── psql-sc-bi.yml
└── pgsql
└── pgsql_db.yml
и, там где это возможно, вычитываем конфигурацию директориями ( для критичных узлов приходиться создавать отдельный job со своим набором сертификатов )
scrape_configs:
#--------------------------------------------------------------#
# job: node no ssl
# node_exporter ( nodeexporter OS stats )
# labels: [cls, ins, ip, instance]
#--------------------------------------------------------------#
- job_name: node
scrape_interval: 10s
metrics_path: /metrics
file_sd_configs:
- files: [ ./targets/node/*.yml ]
#--------------------------------------------------------------#
# job: etcd
# labels: [cls, ins, ip, instance]
# path: targets/etcd/<etcd_instance>.yml
#--------------------------------------------------------------#
- job_name: etcd
metrics_path: /metrics
file_sd_configs:
- files: [ /etc/vmagent/targets/etcd/pg_common.yml ]
scheme: https
tls_config:
ca_file: /etc/tls/pg_common/ca.crt
cert_file: /etc/tls/pg_common/server.crt
key_file: /etc/tls/pg_common/server.key
Чтобы сохранить переносимость, кастомизацию алертов делаем через record rule и модификацию запросов
Чуть подробнее:
- alert: PostgreSQL_SlowQueries
expr: >-
pg_stat_activity_max_tx_duration {state!="idle in transaction"} > 300
unless pg:ins:pg_stat_activity_max_tx_duration_custom {}
unless pg:ins:pg_stat_activity_max_tx_duration_custom {}
Т.е, когда для хоста пишется кастомная метрика, она не попадает под более жесткие общие правила, и на выходе можно реализовать кастомные алерты со своими порогами
Не то чтобы было очень удобно, но такой WA решает основную задачу - переносимость между клиентами ( весь кастом в отдельной папке и если ее убрать, то это не влияет на работоспособность )
vmetrics/vmagent/
├── alert_rules
│ ├── blackbox_exporter_rules.yml
│ ├── clickhouse_rules.yml
│ ├── etcd_rules.yml
│ ├── mssql_exporter_rules.yml
│ ├── mysql_rules.yml
│ ├── node_exporter_rules.yml
│ ├── oracle_exporter_rules.yml
│ ├── postgresql_rules.yml
│ └── windows_os_rules.yml
├── custom_rules
│ ├── node_alert_custom.yml
│ ├── node_record_custom.yml
│ ├── pgsql_alert_custom_rules.yml
│ └── pgsql_record_custom.yml
├── record_rules
│ ├── agent.yml
│ ├── etcd.yml
│ ├── mssql.yml
│ ├── node.yml
│ └── pgsql.yml
Делаем отдельные каналы для критов и warning, с делением на топики по типу СУБД
при желании можно сделать любое деление, из очевидного - добавить в лейблы Код ИС и маршутизирововать алерты в целевой канал, актуально для зрелых проектов
как видно на примере, мы делим алерты по направлениям (экспертизе команды) на разные направления


По самим алертам, сейчас накопился такой набор :

Если тема будет интересна, то обязуюсь более подробно об этом рассказать в следующей статье (все ключевые направления уже закрыты: дедлоки, долгие транзакции, автовакуум, bloat, репликация, коннекты, роллбеки, чекпойты, деддаплы)
Касаемо графиков.. чтобы не осталять совсем без информации, то исходники графиков PG можно глянуть тут https://demo.pigsty.io/
могу сказать, что все необходимое для анализа там можно найти, добавить и скомпоновать по своему вкусу. Наше видение хорошего дашборда так же доезжает автоматом при раскатке.
примеры дашбордов
MS SQL Backup

PG: overview

Из ньюансов, т.к кластер обычно состоит больше чем из одного узла, то, для построения комплексных дашбордов, добавляем лейбл с именем кластера ( обычно это имя хоста без 01\02\03 )
так же добавляем лейбл type - тип ресурса, чтобы отправлять алерты в нужную группу.
- labels: { cls: 'pg-common', ins: 'p01-pgdb01', ip: '10.2.20.10', type: 'postgres' }
targets:
- 10.2.20.10:9100
тут может закрасться мысль, что поддерживать в консистентном состоянии все порты экспортеров из докера, лейблы для node exporter\pg\haproxy\etcd\pgbouncer это ... сложно ) и вы будете правы, поэтому лучше сразу сделать инвентарь с шаблонами по которым все заполняется автоматом.
Экспортеры
1) PG pg_exporter:latest
используем наработки проекта https://github.com/Vonng/pg_exporter, только добавили вывод отладочной информации
Плюсы: из коробки очень гибкая возможность настройки:
в рамках одного экспортера можно делать кастомные запросы под разные версии PG
настраивается TTL для кеширования запросов, чтобы контролировать overhead
настраивается timeout
все запросы описываются в понятном формате и их легко добавлять
2) MS SQL burningalchemist/sql_exporter:latest
Выглядит многообещающим и суперуниверсальным, есть все шансы что кастомные запросы переведем на него
Возможность кастомизации и добавления своих запросов.
Поддерживает все нужные типы баз данных
из существенных минусов:
нет поддержки TTL, как WA - запускать с нужной периодичностью тяжелые запросы и писать результаты в таблицу.
3) Mariadb prom/mysqld-exporter:latest
покрывает 99% потребностей по части алертинга, но решение от pmm информативнее, все еще параллельно используем pmm при траблшутинге
4) Oracle iamseth/oracledb_exporter:latest
Есть необходимый набор базовых метрик
Есть возможность подключить кастомные запросы
дальше, докручиваем CD которая запускает мини автоматизацию, создает конфиги для экспортеров + добавляет нужные лейблы, порты для таргетов
из ключевого, есть деление docker-compose файлов
docker-compose.yml ( ядро мониторинга )
image: victoriametrics/victoria-metrics:latest
image: victoriametrics/vmagent:latest
image: victoriametrics/vmalert:latest
image: grafana/grafana
image: prom/alertmanager:latest
image: grafana/loki:latest
mssql.docker-compose.yml
pgsql.docker-compose.yml
oracle.docker-compose.yml
maria.docker-compose.yml
etc
Ближайшие планы
Реализация долгосрочного хранения [Источники] → VM1 (сырые данные, 10s, 10d)] → [VM2 (downsampling, 1m, 60d)]
Перестать мучать дежурных, доделать интеграцию alertmanager и Jira, с последующей синхронизацией с учетными системами заказчика
Сделать мониторинг на мониторинг или перенести все в k8s
Добавить стадию CI и доработать CD
Проверки синтаксиса конфигов перед применением изменений
Определять какой файл изменился и перезапускать\перечитывать конфиги только нужных компонентов
Заключение
С таким подходом подключение к мониторингу баз заказчика занимает минут 40-60, единообразно работает и поддерживает большинство СУБД, в качестве бонуса - видно кто и почему вносил изменения (например добавили метрику по итогам postmortem) да и все наработки легко переносить между клиентами.
Так же есть большой задел для кастомизации и переиспользования на разных проектах
ps: Однозначно еще есть что улучшить..
pps: готов поделиться текущим состоянием и исходниками по запросу в ЛС (abushmelev@prometey-lab.ru) при условии конструктивной обратной связи :-)