PostgreSQL Field Guide

PostgreSQL 监控:SQL、指标与日志

建立 PostgreSQL SQL、指标和日志三层可观测性,覆盖 pg_stat_statements、JSON 日志、postgres_exporter、Prometheus、Grafana 与 pgBadger

PostgreSQL 可观测性至少需要三层证据:SQL 统计解释资源花在哪里,指标说明系统何时偏离基线,日志保留错误与事件上下文。只装一个 dashboard 不能替代这三层。

1. 用 pg_stat_statements 找工作负载热点

pg_stat_statements 是 PostgreSQL 官方扩展。它需要加入 shared_preload_libraries,通常要重启实例,然后在需要统计的 database 中创建扩展:

shared_preload_libraries = 'pg_stat_statements'
compute_query_id = auto
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

SELECT
  queryid,
  calls,
  total_exec_time,
  mean_exec_time,
  rows,
  shared_blks_hit,
  shared_blks_read,
  left(query, 160) AS query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;

按总耗时、平均耗时、调用次数、返回行数和 I/O 分别看排行;单次最慢与累计消耗最大不是同一个问题。统计会被重置,部署、故障和参数变更时应记录采样窗口。字段定义以 pg_stat_statements 官方文档 为准。

查询文本可能包含敏感信息

扩展会规范化常量,但日志、DDL、动态 SQL 和应用注释仍可能泄露标识符或业务数据。限制统计视图与日志读取权限,并为采集、保留和脱敏设定规则。

2. 使用 JSON 日志保留事件上下文

jsonlog 便于可靠解析时间、SQLSTATE、backend、database、用户、application name 和错误上下文:

logging_collector = on
log_destination = 'jsonlog'
log_min_duration_statement = '500ms'  # 示例值,应按负载基线调整
log_lock_waits = on
deadlock_timeout = '1s'

不要把示例阈值直接复制到所有环境。过低会产生大量 I/O 与敏感查询文本,过高会漏掉高频中等耗时 SQL。优先用 pg_stat_statements 发现累计热点,用日志解释错误、锁等待、检查点、autovacuum 和特定慢请求。参数语义见 Error Reporting and Logging

pgBadger 可以分析 PostgreSQL 原生日志与 jsonlog,生成查询、连接、错误、锁、检查点和 autovacuum 报告。先确保日志格式稳定、轮转可靠、时区一致,再把它加入离线分析流程。

3. 指标、Prometheus 与 Grafana

postgres_exporter 适合已有 Prometheus/Grafana 的团队。采集角色优先使用 pg_monitor 或必要的只读统计权限,不要给 exporter 超级用户:

CREATE ROLE metrics LOGIN;
GRANT pg_monitor TO metrics;

在目标版本上核对 collector 和权限。其 multi-target 模式仍被上游标为 Beta,自定义 extend.query-path 已 deprecated;新采集需求应优先使用内置 collector 或单独的通用 SQL exporter,而不是积累不可维护的查询文件。

最小信号集

领域信号需要一起看的上下文
连接使用量、等待、连接池队列pool mode、应用实例数、保留连接
查询latency、calls、rows、I/Odeploy、plan 变化、参数分布
事务长事务、idle in transaction、冲突owner、重试能力、vacuum 影响
等待时长、阻塞链、deadlockDDL、批任务、业务事务
WAL/复制生成速率、archive failure、lag、slot retentionRPO、网络、磁盘余量
维护dead tuples、freeze age、vacuum/analyze 进度表写入率、autovacuum 参数
存储数据/WAL/临时文件增长、I/O latency容量预测、checkpoint、查询 spill
恢复最近成功备份、可恢复时间、实测 RTOrepository、密钥、恢复演练

阈值应来自正常时段和峰值时段的基线,告警应指向可执行的诊断路径。复制 lag 的字节数、时间和 replay 状态含义不同,不能只设一个全局阈值。

工具采用顺序

  1. 所有生产实例先启用并治理 pg_stat_statements
  2. 输出可解析日志,并把 SQLSTATE、锁等待、归档失败和 autovacuum 纳入采集。
  3. 已有 Prometheus 时接入 postgres_exporter 与 PostgreSQL 专用 dashboard。
  4. 需要日志趋势报告时加入 pgBadger;管理多实例可评估 pgwatch
  5. 深度 workload 分析可评估 PoWA;临时排障可使用 pg_activity

工具越多不等于盲区越少。先统一 instance、database、role、application、query ID、时间窗口和变更事件这些关联维度。

Last updated on

On this page