跳转到主要内容

PG Exporter v1.5.0

升级 Go 1.27.3 与安全依赖,修正复制身份、连接 URL 和运行状态一致性

PG Exporter v1.5.0 升级 Go 工具链与依赖,修正复制采集器的身份与状态映射,并修复目标 URL、自动发现、健康检查、采集计划、时间配置和 HTTP 路由六类运行时缺陷。

默认配置仍包含 58 个 YAML 文件、96 个采集器分支、59 个命名空间、460 个不同指标定义。指标数量跨全部版本分支去重,包含默认关闭的采集器和两个尚未展开的 SQL 直方图;它不表示每次抓取都会输出 460 条时序。

变更摘要

  • 连接 URL 更安全: URL 语法、查询参数转义或解码后的参数名非法时,启动立即失败,诊断不再暴露原始连接串。规范化错误参数时,不会再静默丢弃显式 TLS 选项。选中的 PG_EXPORTER_URL_FILE 为空或仅含空白时也会拒绝启动。
  • 自动发现连接正确数据库: 数据库身份复用 lib/pq 解析,包括 dbname 与 database 别名。替换发现数据库的路径时清除冲突参数,保留库名特殊字符,避免多个连接重复采集同一库、产生重复指标并使 HTTP 返回 500。
  • 健康响应保持一致: 每次响应从一个原子状态快照生成 HTTP 状态码和正文,避免并发探测、抓取与重载时出现 HTTP 200 搭配 down 或 starting。健康检查仍使用目标状态缓存。
  • 采集计划跟随元数据: 元数据预检成功后,连接用户、Schema 集合或扩展集合变化会使计划失效。下一次抓取选中新增的合格采集器;依赖移除后不再选中相应采集器。集合不变时保留缓存。
  • 拒绝非法时间配置: YAML TTL、timeout 与谓词 TTL 拒绝 NaN、无穷大和导致正向时长溢出的值;零值、默认值及有限负超时关闭期限的语义不变。
  • 保证指标路径可达: 启动时检查当前 HTTP mux 实际选择的指标处理器,覆盖解码路径与重定向,避免校验成功但请求进入首页或重定向。
  • 修正复制身份与状态: 全部 pg_sub_* 样本增加 datname 标签,区分不同数据库中的同名订阅。pg_recv_state 改用真实接收器状态字典,legacy 查询改用 PG9.6 兼容的 substring()。
  • 校准采集器描述: 明确可选复制 origin 的权限要求、发布端表数量与订阅端表/序列数量的区别,并将 pg_backend 的说明修正为按后端类型分组。这些说明修改不新增指标族,也不启用可选采集器。

工具链与依赖

组件 v1.4.1 v1.5.0
Go 1.26.5 1.27.3
prometheus/client_golang 1.23.2 1.25.0
prometheus/common 0.70.0 0.72.1
prometheus/exporter-toolkit 0.17.1 0.20.0
golang.org/x/net 0.57.0 0.61.0
golang.org/x/crypto 0.54.0 0.58.0
golang.org/x/text 0.40.0 0.43.0

数据库驱动仍为 lib/pq 1.12.3,本版没有驱动迁移或新增可选数据源。Prometheus client/model/procfs、YAML、压缩、OAuth2 等传递依赖也随之更新;不能仅凭版本升级就声称修复了应用可利用的 CVE。

安全更新

本次升级纳入上游安全修复,不表示每个 CVE 都能通过 PG Exporter 利用。下表比较 v1.4.1 源码、原始依赖和 Go 1.26.5:S 表示静态符号匹配,P 表示导入包匹配但未找到受影响符号调用,M 表示只匹配模块、未导入受影响包。静态符号匹配也可能是保守分析结果,不等于攻击复现。

Go 标准库与构建工具

Go 1.27.3 包含 CVE-2026-111943 的 X.509 不可信中间证书拒绝列表,以及累计的 HTTP、TLS、模板与解析器修复。旧基线中存在以下受影响标准库记录;匹配层级取自 Darwin/arm64,平台专属问题仍需满足相应前提。

CVE 组件 首个修复版本 旧基线匹配
CVE-2026-39821 net/http, net/http/internal/http2 1.26.6, 1.27.0-rc.3 P
CVE-2026-46600 net 1.26.6, 1.27.0-rc.3 P
CVE-2026-33818 encoding/asn1 1.26.6, 1.27.0-rc.3 S
CVE-2026-56859 encoding/xml 1.26.6, 1.27.0-rc.3 M
CVE-2026-56853 net/http 1.26.6, 1.27.0-rc.3 S
CVE-2026-56862 crypto/tls 1.26.6, 1.27.0-rc.3 S
CVE-2026-56858 html/template 1.26.6, 1.27.0-rc.3 S
CVE-2026-56860 net/url 1.26.6, 1.27.0-rc.3 P
CVE-2026-94448 html/template 1.26.9, 1.27.2 S
CVE-2026-97030 html/template 1.26.9, 1.27.2 S
CVE-2026-78659 net/http, net/http/internal/http2 1.26.9, 1.27.2 S
CVE-2026-56857 internal/syscall/windows, os 1.26.9, 1.27.2 P
CVE-2026-56866 net/http, net/http/httputil 1.26.9, 1.27.2 P
CVE-2026-97031 crypto/tls 1.26.9, 1.27.2 S
CVE-2026-94440 mime/multipart, net/textproto 1.26.9, 1.27.2 S
CVE-2026-78667 net/http 1.26.9, 1.27.2 P
CVE-2026-78660 net/http, net/http/internal/http2 1.26.9, 1.27.2 P
CVE-2026-78669 net/http, net/http/internal/http2 1.26.9, 1.27.2 S
CVE-2026-78663 net/http, net/http/internal/http2 1.26.9, 1.27.2 S
CVE-2026-94439 net/http 1.26.9, 1.27.2 S
CVE-2026-97032 net/http, net/http/internal/http2 1.26.9, 1.27.2 S
CVE-2026-111943 crypto/x509 1.26.10, 1.27.3 S

构建工具链还包含模块/工具链下载校验修复 CVE-2026-56865、CVE-2026-56864、CVE-2026-94444、CVE-2026-94447。这些属于构建环境加固,不是 Exporter 运行时漏洞。官方公告分别列于 Go 1.26.6、Go 1.27.2 和 Go 1.27.3。

Go 模块

依赖升级 纳入的修复 与 PG Exporter 的关系
x/net 0.57.0 → 0.61.0 CVE-2026-78659、CVE-2026-78660、CVE-2026-78669、CVE-2026-78663、CVE-2026-97032,0.60.0 修复 HTTP/2 内存放大、畸形响应 framing、CPU 消耗、流控额度计算与 HPACK 竞态。旧基线有四项静态符号匹配和一项包匹配;相同 CVE 也影响 Go 内置的 HTTP/2 副本,不应重复计数。
x/crypto 0.54.0 → 0.58.0 CVE-2026-56854,0.55.0 修复;CVE-2026-56855 与 CVE-2026-78662,0.56.0 修复 SSH source-address 认证限制与死锁;本程序未导入受影响包,仅属模块级升级。
x/text 0.40.0 → 0.43.0 CVE-2026-56851,0.41.0 修复 secure/precis Nickname 变换 panic;本程序未导入受影响包。

2026-10-23 的 govulncheck 核验中,v1.5.0 候选在 Darwin/arm64、Linux/amd64 和 Windows/amd64 均 没有符号级或导入包级已知漏洞。未导入的 OpenPGP 包仍保留无修复版本的模块级公告 GO-2026-5932,因此不宣称所有依赖模块零告警。只升级 Go、保留旧依赖仍有五项 x/net 匹配,工具链与依赖升级都不可省略。

请使用重新构建的发行制品:只更新主机上的 Go 编译器,不会改变已经编译的 Exporter 二进制。

升级提示

  1. 同步部署采集器配置。 仅替换二进制不会应用 SQL 与标签修正。替换 /etc/pg_exporter.yml 前,请先合并本地自定义配置。

  2. 检查 pg_sub_* 标签变化。 新增 datname 会产生新时序;按需在 PromQL 连接与聚合中保留数据库身份。pg_sub_id 仍为 Gauge。

  3. 补齐 PG10–13 的订阅权限。 管理员须在每个用作 Exporter 主连接数据库 的库中,对实际监控角色执行以下授权。仅在订阅所属数据库授权并不足够。它不开放 subconninfo;PG14+ 在标准目录 ACL 下无需额外授权。

    GRANT SELECT (oid) ON pg_catalog.pg_subscription TO monitor;
  4. 检查接收器状态告警。 streaming=0、stopping=4、connecting=5(PG19+)、starting=6、waiting=7、restarting=8、stopped=9,未知/NULL 为 -1,编码 1–3 保留。没有接收器行时仍不输出样本。

  5. 修正过去被容忍的非法输入。 错误 URL 转义、空 URL 文件、非有限时间值与不可达指标路径现在会校验失败。为兼容两种 HTTP mux,建议使用 /metrics。

未指定 sslmode 时仍默认 disable,远程连接需显式配置 TLS;scratch 容器验证证书时仍须挂载 CA。空 YAML 重载仍会替换为零个配置采集器,目录中的非法文件可能被跳过,SIGTERM 也不会等待活跃 HTTP 请求结束。完整运行约定见安全指南、HTTP API与内置采集器。

验证范围

发布前验证覆盖竞态测试、新旧 HTTP mux、静态分析、模块与生成配置一致性、约 60.4 万次短时模糊测试,以及六个目标平台构建。非超级用户默认采集通过 PostgreSQL 9.1–9.6、10–18、19 RC1 和 PgBouncer 1.26.1 实测。运行场景包括冲突数据库别名、特殊库名、Schema/扩展变化、失败重载、断连恢复、物理备库晋升与并发 HTTP 请求;另验证了 RPM/DEB 安装与 Docker 构建。

这些检查只覆盖记录中的版本与场景,不等于所有扩展组合和生产负载均已验证。Composite、Patroni、pgBackRest 与 PostgreSQL 日志组件仍属开发工作,不包含在 v1.5.0 中。