真正反映数据库压力的指标是pg_stat_database和pg_locks衍生指标:pg_stat_database_blks_read_total、pg_stat_database_tup_fetched_total暴露i/o与查询放大,pg_stat_database_conflicts_total突增提示wal冲突或备库延迟,pg_locks_count需按accessexclusivelock等模式过滤,锁等待指标须用rate()或delta()计算趋势。

postgres_exporter 里哪些指标真正反映数据库压力
直接看 pg_stat_database 和 pg_locks 衍生指标,别被一堆 pg_settings 类指标带偏。实际压测和线上故障中,postgres_up 只是连通性信号,pg_stat_database_blks_read_total 和 pg_stat_database_tup_fetched_total 才暴露 I/O 和查询放大问题。
-
pg_stat_database_conflicts_total在高并发更新场景下突增,说明 WAL replay 冲突或备库延迟严重,但主库本身不报错,容易被忽略 -
pg_locks_count要配合mode标签过滤,只看AccessExclusiveLock和RowExclusiveLock的数量变化,ShareLock多不代表卡顿 - 默认采集间隔 15s,但锁等待类指标(如
pg_locks_age_seconds)需要搭配 Prometheus 的rate()或delta()计算趋势,单点值意义不大
mysql_exporter 的 slow\_query 指标为什么总为 0
不是 exporter 有问题,而是 MySQL 服务端没开慢日志或配置不匹配。mysqld 必须同时满足:启用 slow_query_log=ON、设置 long_query_time(建议 ≤ 1.0)、且 log_output 包含 FILE 或 TABLE —— mysql_exporter 只从 mysql.slow_log 表或解析 slow log 文件获取数据,不走 Performance Schema。
- 如果用
log_output=TABLE,确认slow_log表引擎是CSV(MySQL 5.7+ 默认),否则 exporter 查询会失败并静默跳过 -
mysqld_exporter启动时加--collect.global_status --collect.info_schema.processlist是常规操作,但慢查统计必须显式加--collect.perf_schema.events_statements_summary或依赖 slow log,二者不可互换 - Percona Server 或 MySQL 8.0+ 开启
performance_schema后,perf_schema_event_waits_total可辅助定位锁等待,但它和慢查指标无直接关联
SQL 查询模板里 GROUP BY 和 label\_join 的取舍
Prometheus 不支持在 metric 查询里写 JOIN,所有关联逻辑必须前置到 exporter 的 SQL 中完成。比如想把 pg_stat_activity 的 usename 和 application_name 绑定到 pg_stat_database 指标上,不能靠 PromQL 的 label_join() 补,得改 postgres_exporter 的自定义查询。
- 自定义 SQL 中用
JOIN或子查询把维度字段(如datname,usename)作为GROUP BY键,否则 exporter 会丢弃非聚合列,导致标签丢失 - 避免在 SQL 里用
string_agg()拼接多个会话的application_name,Prometheus 标签值不能含逗号或换行,会直接拒收该时间序列 - PostgreSQL 12+ 支持
pg_stat_statements插件,它的queryid是哈希值,不要试图在 SQL 模板里md5(query)对齐,exporter 已内置映射逻辑
采集频率调高后 PostgreSQL 连接数暴涨
postgres_exporter 每次采集都新建连接,默认不复用。如果 Prometheus 抓取间隔设成 5s,又开了 10 个自定义查询,可能每秒新建 2 条连接,很快打满 max_connections。
- 在 exporter 启动参数里加
--web.listen-address=:9187 --extend.query-path=/path/to/queries.yaml,然后在queries.yaml里统一配metrics_path,减少重复连接 - PostgreSQL 端设置
idle_in_transaction_session_timeout = 60000,防止 exporter 查询中断后连接卡在 idle in transaction 状态 - 不要给每个指标单独配一个
pg_*查询,合并成一条带多 CTE 的 SQL,exporter 支持复杂查询,但注意WITH子句里不能有写操作
最麻烦的是跨版本兼容:PostgreSQL 10 的 pg_stat_replication 没有 sync_state 字段,而 exporter v0.12+ 的默认 queries.yaml 里引用了它,一跑就报 column "sync_state" does not exist —— 得手动删掉这行,或者降级 exporter 版本。










