Если вы инженер в крупной компании, а особенно если ваша организация поставляет свои услуги в виде SaaS-решений, то вам так или иначе придется решать задачу мониторинга работы всех ваших баз PostgreSQL. На них часто бывает завязан функционал, важный для компании с точки зрения финансовых рисков, поэтому крайне желательно организовать не только мониторинг, но и получение уведомлений, когда что-то идет не по плану (или пойдет в ближайшем будущем). Рассмотрим несколько способов, как это можно сделать:
- Самостоятельно, с использованием уже привычного стека Prometheus + Grafana (на котором можно будет строить мониторинг также и любых других ваших сервисов);
- Подключить сторонние open-source специализированные решения для мониторинга PostgreSQL;
- Использовать специализированные платные решения.
По каждому варианту поймем все плюсы и минусы, чтобы вы смогли более уверенно выбрать свой путь.
Похожим образом работают все другие виды экспортеров для prometheus. У него есть масса различных экспортеров для разных систем, в частности mysql_exporter, mongodb_exporter, redis_exporter и др.
Для сбора метрик самого хоста вам придется дополнительно установить и настроить node_exporter, который работает схожим образом
CREATE USER postgres_exporter WITH PASSWORD '****';
ALTER USER postgres_exporter SET SEARCH_PATH TO postgres_exporter,pg_catalog;
-- Права доступа для пользователя мониторинга:
GRANT CONNECT ON DATABASE <ваша бд> TO postgres_exporter;
GRANT pg_monitor TO postgres_exporter;[Unit]
Description=Prometheus PostgreSQL Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=postgres
Group=postgres
Type=simple
ExecStart=/usr/local/bin/postgres_exporter \
--web.listen-address=0.0.0.0:9187 \
--web.telemetry-path=/metrics \
--log.level=info \
--extend.query-path=/etc/postgres_exporter/queries.yaml \
DATA_SOURCE_NAME="postgresql://postgres_exporter:exporter_password@localhost:5432/postgres?sslmode=disable"
Restart=always
[Install]
WantedBy=multi-user.targetsystemctl daemon-reload
systemctl start postgres_exporter
systemctl enable postgres_exporterglobal:
scrape_interval: 20s
scrape_configs:
- job_name: 'postgres'
static_configs:
- targets: ['IP_postgres_exporter:9187']systemctl restart prometheus
systemctl enable prometheusavg(pg_stat_database_blks_hit / (pg_stat_database_blks_hit + pg_stat_database_blks_read))