周五晚上十点,某客户的生产 PostgreSQL 实例 CPU 突然飙到 95%,连接数告警连着弹了三条。这种时候谁来得及临时搭一套监控平台?第一反应肯定是 psql 连上去,把 pg_stat_activity、pg_stat_database、pg_stat_bgwriter 挨个查一遍,再手算几个比率。做是能做,但十几个视图翻下来,一个问题没查完,半天就过去了。后来我在 GitHub 上翻到一个叫 pgmetrics 的开源小工具,一条命令把数据库里里外外的统计指标全部拉出来,文本、JSON 都能出,不带网页、不带 agent、不常驻内存。用了一段时间之后,它已经成了我排查 PostgreSQL 问题的默认起手式。
pgmetrics 是一款免费开源的 PostgreSQL 统计指标采集工具,定位很朴素:你给它一个能连上数据库的连接串,它读一遍系统视图和统计信息,然后给你一份足够全面的体检报告。适合 DBA、SRE、后端开发,也适合那些不想为一个小数据库专门搭一套 Prometheus 监控栈的人。这篇文章我把自己的使用经验拆开来讲:为什么选它、怎么跑通、指标怎么看、怎么接脚本和告警,以及在真实环境里踩过的权限和连接坑。
1. 为什么我最终选了 pgmetrics:聊聊常规监控的三个尴尬
1.1 手写 SQL 查询视图:灵活但是费人
PostgreSQL 本身不缺监控数据,pg_stat_database、pg_stat_activity、pg_stat_all_tables、pg_stat_replication、pg_stat_archiver 这些视图已经把家底摆在那了。问题是数据分散,要拼出一份“数据库健康状况总览”得写一长串 SQL,而且每次排查问题都要现写,很难沉淀。
我一开始也是手工派,遇到问题就噼里啪啦敲查询,用完 Ctrl+C 扔掉。时间一长发现几个痛点:一是不同版本的 PostgreSQL 系统视图列名有差异,脚本要维护兼容;二是为了算一个缓存命中率,得自己写 SUM(blks_hit) * 1.0 / (SUM(blks_hit) + SUM(blks_read)) 这种比例,查多了容易烦;三是没有任何历史记录,今天看到的数据和昨天的对不上,想判断“是不是恶化了”只能靠直觉。
并不是说手写 SQL 没用。恰恰相反,pgmetrics 的很多输出其实就是把这些 SQL 预置好了。对于临时深挖某个具体问题,我还是会自己写 SQL 去追,比如查某个 query 的等待事件,看 pg_stat_statements 里的 top SQL。但如果是想做一次实例级巡检,或者接到告警后想尽快知道“这个库到底怎么了”,手写 SQL 的效率就太低了。
1.2 部署 exporter 接入 Prometheus:好方案但有点重
再正规一点的路线是 Prometheus 加 postgres_exporter。这是长期监控的标准答案,exporter 按固定间隔抓取指标,Prometheus 负责存储、告警、出图,Grafana 上直接套一套现成的 dashboard。这套组合在生产环境里非常成熟,我自己的核心业务库也是这么盯的。
问题出在两个地方。第一是部署成本。一个开源项目或者客户的测试环境,可能只有一台 2C4G 的机器,上面既要做业务又要跑数据库,再塞一个 Prometheus 加 Grafana 加 exporter,资源虽然不多但维护链路长了不少。第二是临时性。很多排查场景是突发的,比如连接数告警、vacuum 异常、复制延迟变大,这时候我不想先去翻 Grafana 看有没有配这个指标,我只想立刻知道当前状态。
对比下来,pgmetrics 恰好卡在“手写 SQL”和“Prometheus 全家桶”之间:单文件二进制,不安装不常驻,连上去跑一次就能拿到结构化报告。它不替代 Prometheus,而是补上“临场排查”和“轻量巡检”这两块拼图。
1.3 云数据库自带监控:省心但不够细
云厂商的托管 PostgreSQL(RDS、CloudSQL 之类的)都自带监控面板,CPU、内存、连接数、磁盘这些基础指标做得挺漂亮。但细看会发现,表级死元组比例、索引使用情况、复制延迟细节、归档状态这些偏内核的信息,在云监控里经常没有,或者要额外付费开启增强监控。
pgmetrics 有个好处:它不管你的库跑在哪里,只要能建立 TCP 连接就能采集。云上数据库也可以跑,而且它读的都是系统视图,对托管实例同样适用。我经常用它在云数据库上补一道“现场体检”,拿到云厂商控制台上看不到的细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 五分钟跑通:下载、连接与三种输出格式
2.1 获取二进制:GitHub Release 里挑一个文件
pgmetrics 用 Go 写的,发布物就是一个压缩包,里面只有一个可执行文件,不用装依赖,不用配置环境变量。GitHub 仓库的 Release 页面会提供 linux、macOS、Windows、FreeBSD 等平台的安装包。
在 Linux 服务器上,我一般先判断架构再下载:
bash复制uname -m
# x86_64 就是 amd64,aarch64 就是 arm64
wget https://github.com/rapidloop/pgmetrics/releases/download/v1.15.0/pgmetrics_1.15.0_linux_amd64.tar.gz
tar xzf pgmetrics_1.15.0_linux_amd64.tar.gz
sudo mv pgmetrics /usr/local/bin/
pgmetrics --version
这里有个实际心得:下载之前先确认数据库服务器的架构,尤其是现在 ARM 服
