Vector 的 PostgreSQL Metrics 数据源深度解析:配置、指标字典与源码实现
2026/9/13 19:26:44 网站建设 项目流程

Vector 的 PostgreSQL Metrics 数据源深度解析:配置、指标字典与源码实现

【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector

导读

本文以 Vector 官方文档postgresql_metrics数据源(source)为线索,完整梳理该组件的定位、工作原理、全部配置参数与权限要求,并基于当前仓库的 CUE 元数据与 Rust 源码,逐条解读其输出的指标语义与实现细节。读者学完后将能独立配置 Vector 对 PostgreSQL 实例进行周期性指标采集,理解include_databases/exclude_databases的正则过滤机制、TLS 连接方式、版本兼容边界,以及每个指标的来源视图与单位换算规则。

说明:本文所依据的官方文档页面 postgresql_metrics.md 本身是一个由模板自动生成的占位文件,其真实内容由 postgresql_metrics.cue(组件元数据)与 generated/postgresql_metrics.cue(配置定义)两份 CUE 数据生成,下文内容均以这两份数据与 源码实现 为准。

组件定位与基本特性

postgresql_metrics是 Vector 内置的指标类数据源(component_kind: source),用于从 PostgreSQL 数据库周期性地采集统计信息并转换为 Vector 的 metric 事件流。其元数据定义位于 postgresql_metrics.cue,关键特性如下:

特性维度取值说明
deliveryat_least_once至少一次投递语义(但该组件本身can_acknowledge返回false,不支持端到端确认)
deployment_rolesdaemonsidecar可作为守护进程或边车(sidecar)部署
developmentstable稳定级组件
egress_methodbatch批量输出
statefulfalse无状态组件,不支持检查点
collect.checkpointdisabled不启用检查点机制
collect.from.service.versions9.6-13官方声明支持的 PostgreSQL 版本范围为 9.6 ~ 13
collect.from.interface.socketoutgoing / tcp + unix / ssl optional通过 TCP 或 Unix Socket 主动外连,TLS 可选

采集协议上,该组件通过 PostgreSQL 原生前端/后端协议(tokio-postgres)以出站(outgoing)方式连接数据库,支持 TCP 与 Unix Socket 两种传输,SSL 为可选(与sslmode参数联动)。从源码看,PostgresqlMetrics::new会解析 endpoint 并取出唯一主机(Host::TcpHost::Unix),若 URI 中包含多个 host 则直接报错MultipleHostsNotSupported,因此每个 endpoint 只能指向单一实例(src/sources/postgresql_metrics.rs)。

工作原理与数据来源

按 CUE 文档 的how_it_works说明,该组件通过向配置的 PostgreSQL 服务器发起 SQL 查询来收集指标。核心工作流程在 build 方法 中体现:

  1. 启动时为每个 endpoint 建立连接并校验版本;
  2. scrape_interval_secs为周期驱动tokio::time::interval定时器;
  3. 每个周期内使用join_all并发地对所有 endpoint 执行collect,结果合并成一个 metric 批次;
  4. 通过send_batch一次性投递给下游 sink。

单次collect_metrics会并发执行三组查询(collect_metrics):

查询来源视图用途说明
pg_stat_database数据库级统计每个数据库一行,输出 20 个左右指标
pg_stat_database_conflicts恢复冲突统计每个数据库一行,输出 5 个冲突计数器
pg_stat_bgwriter后台写进程统计全局一行,输出 11 个指标

每次采集结束后,如果任一查询失败,该 endpoint 会输出up = 0的指标并记录内部错误事件,而不是中断整个管道;全部成功则输出up = 1并继续输出其余指标(collect)。

配置指南

postgresql_metrics的配置项定义于 generated/postgresql_metrics.cue,同时在 PostgresqlMetricsConfig 中由configurable_component宏生成。所有配置项如下:

配置项类型必填默认值说明
endpointsarray<string>要抓取的 PostgreSQL 实例列表,每个元素必须是 libpq 连接 URI 格式
scrape_interval_secsuint15两次抓取之间的间隔,单位秒
namespacestringpostgresql覆盖该 source 输出指标的默认命名空间
include_databasesarray<string>用 POSIX 正则匹配datname列,只采集匹配数据库的指标;不设置则采集所有数据库
exclude_databasesarray<string>用 POSIX 正则匹配datname列,跳过匹配数据库的指标
tlsobject连接 PostgreSQL 时的 TLS 配置
tls.ca_filestring是(配置 tls 时)附加 CA 证书文件的绝对路径,证书须为 DER 或 PEM(X.509)格式

一个最小可运行的配置示例:

sources: postgresql_metrics: type: postgresql_metrics endpoints: - postgresql://postgres:vector@localhost:5432/postgres scrape_interval_secs: 15

完整配置示例(含数据库过滤与 TLS)

sources: postgresql_metrics: type: postgresql_metrics endpoints: - postgresql://postgres:vector@localhost:5432/postgres - postgresql:///postgres?host=/var/run/postgresql&user=vector&password=vector scrape_interval_secs: 30 namespace: postgresql include_databases: - "^postgres$" - "^vector$" - "^foo" exclude_databases: - "^template.*" tls: ca_file: certs/ca.pem

要点说明:

  • endpoints支持 TCP(postgresql://user:pass@host:port/dbname)与 Unix Socket(postgresql:///dbname?host=/path/to/socket)两种形式;
  • include_databasesexclude_databases可同时使用:先按 include 过滤出候选库,再用 exclude 剔除(见下文源码分析);
  • include_databases/exclude_databases列表中指定空字符串""可匹配datnameNULL的行(即共享对象相关的统计行);
  • 配置tls时可通过 URI 中的sslmode=require等参数指定加密策略,ca_file用于校验证书链。

将指标接入下游

sinks: prometheus: type: prometheus_exporter inputs: [postgresql_metrics] address: "0.0.0.0:9598" default_namespace: postgresql

数据库账号权限要求

按 CUE 文档的 Required Privileges 一节,采集账号必须被允许对以下视图执行 SELECT 查询:

  • pg_stat_database
  • pg_stat_database_conflicts
  • pg_stat_bgwriter

实际部署中,可以创建一个只读监控账号并授予相应权限,例如:

CREATE USER vector_monitor WITH PASSWORD 'vector'; GRANT CONNECT ON DATABASE postgres TO vector_monitor; GRANT pg_monitor TO vector_monitor; -- PostgreSQL 10+ 推荐,涵盖统计视图只读访问

pg_monitor内置角色的引入属于 PostgreSQL 自身能力,若使用 9.6 等旧版本需改用对上述三个视图的显式 GRANT。)

输出指标字典

所有指标默认命名空间均为postgresql,均带endpoint(如postgresql:///postgres?host=localhost&port=5432)与host两个必选标签;凡来源于pg_stat_database/pg_stat_database_conflicts的指标额外带db(数据库名)标签。全部指标定义位于 CUE 元数据的 output.metrics 部分。

存活探针

指标类型标签说明
upgaugeendpoint, hostPostgreSQL 服务器是否在线:采集成功为 1,失败为 0

pg_stat_database系列(带db标签)

指标类型说明
pg_stat_database_datidgauge该数据库的 OID;共享对象行为 0
pg_stat_database_numbackendsgauge当前连接到该数据库的后端进程数(唯一反映当前状态的列,其余均为自上次重置以来的累计值)
pg_stat_database_xact_commit_totalcounter已提交事务数
pg_stat_database_xact_rollback_totalcounter已回滚事务数
pg_stat_database_blks_read_totalcounter磁盘块读取次数
pg_stat_database_blks_hit_totalcounter缓冲区缓存命中次数(仅统计 PostgreSQL 缓冲池命中,不含操作系统文件系统缓存)
pg_stat_database_tup_returned_totalcounter查询返回的行数
pg_stat_database_tup_fetched_totalcounter查询取回的行数
pg_stat_database_tup_inserted_totalcounter插入行数
pg_stat_database_tup_updated_totalcounter更新行数
pg_stat_database_tup_deleted_totalcounter删除行数
pg_stat_database_conflicts_totalcounter因恢复冲突被取消的查询数(仅备库出现)
pg_stat_database_temp_files_totalcounter临时文件创建数(无论成因是排序/哈希,也不受log_temp_files影响)
pg_stat_database_temp_bytes_totalcounter写入临时文件的总字节数
pg_stat_database_deadlocks_totalcounter检测到的死锁数
pg_stat_database_checksum_failures_totalcounter数据页校验和失败次数;未启用数据校验和时为 0(PostgreSQL 12+ 才输出
pg_stat_database_checksum_last_failuregauge最近一次校验和失败的时间戳;未启用时为 0(PostgreSQL 12+ 才输出
pg_stat_database_blk_read_time_seconds_totalcounter后端读取数据文件块耗时(毫秒,单位换算为秒);未开启track_io_timing时为 0
pg_stat_database_blk_write_time_seconds_totalcounter后端写入数据文件块耗时(毫秒,单位换算为秒);未开启track_io_timing时为 0
pg_stat_database_stats_resetgauge这些统计信息最近一次被重置的时间

pg_stat_database_conflicts系列(带db标签)

指标类型说明
pg_stat_database_conflicts_confl_tablespace_totalcounter因表空间被删除而取消的查询数
pg_stat_database_conflicts_confl_lock_totalcounter因锁超时被取消的查询数
pg_stat_database_conflicts_confl_snapshot_totalcounter因快照过旧被取消的查询数
pg_stat_database_conflicts_confl_bufferpin_totalcounter因缓冲页被钉住被取消的查询数
pg_stat_database_conflicts_confl_deadlock_totalcounter因死锁被取消的查询数

pg_stat_bgwriter系列(无db标签)

指标类型说明
pg_stat_bgwriter_checkpoints_timed_totalcounter定时触发的检查点次数
pg_stat_bgwriter_checkpoints_req_totalcounter请求触发的检查点次数
pg_stat_bgwriter_checkpoint_write_time_seconds_totalcounter检查点处理中写文件到磁盘的总耗时(毫秒换算为秒)
pg_stat_bgwriter_checkpoint_sync_time_seconds_totalcounter检查点处理中同步文件到磁盘的总耗时(毫秒换算为秒)
pg_stat_bgwriter_buffers_checkpoint_totalcounter检查点期间写入的缓冲页数
pg_stat_bgwriter_buffers_clean_totalcounter后台写进程写入的缓冲页数
pg_stat_bgwriter_maxwritten_clean_totalcounter后台写进程因写入过多缓冲页而停止清理扫描的次数
pg_stat_bgwriter_buffers_backend_totalcounter后端直接写入的缓冲页数
pg_stat_bgwriter_buffers_backend_fsync_totalcounter后端自行执行 fsync 的次数(正常由后台写进程处理)
pg_stat_bgwriter_buffers_alloc_totalcounter已分配的缓冲页数
pg_stat_bgwriter_stats_resetgauge这些统计信息最近一次被重置的时间

源码级实现细节

版本检测与兼容边界

连接建立后,客户端会执行SHOW server_version_num并将结果解析为整数,若小于90600(即 PostgreSQL 9.6)则返回InvalidVersion错误并拒绝采集(build_client)。这与 CUE 中声明的versions: "9.6-13"一致。此外,checksum_failureschecksum_last_failure两个指标仅在client_version >= 120000(PostgreSQL 12+)时才被采集,因为pg_stat_database视图的这两列是 PG 12 新增的(collect_pg_stat_database)。

include_databases/exclude_databases的动态 SQL

DatnameFilter(src/sources/postgresql_metrics.rs)负责把正则列表编译成针对pg_stat_databasepg_stat_database_conflictsWHERE子句:

  • 每个 include 模式生成datname ~ $n(POSIX 正则匹配),用OR连接后整体括号包裹;
  • 每个 exclude 模式生成NOT (datname ~ $n ...)
  • include 与 exclude 之间用AND组合,先 include 后 exclude;
  • 列表中的""会被单独提取:include 含""时追加datname IS NULL(用OR合并),exclude 含""时追加datname IS NOT NULL(用AND合并,且优先级高于 include)。

所有模式均通过参数化查询($1$2…)传入,避免 SQL 注入。集成测试test_host_include_databases_and_exclude_databases验证了include: ["template\\d+"]+exclude: ["template0"]最终只会留下template1的结果(src/sources/postgresql_metrics.rs)。

单位换算与端点脱敏

  • blk_read_timeblk_write_timecheckpoint_write_timecheckpoint_sync_time在 PostgreSQL 中单位是毫秒,源码统一除以 1000转换为秒后输出(如 collect_pg_stat_database);
  • endpoint标签并非原始 URI,而是经过config_to_endpoint重写、剔除用户名/密码等敏感信息后的脱敏连接串(如postgresql:///postgres?host=localhost&port=5432),同时仅保留非默认参数(如sslmode=requiretarget_session_attrs=read-write等),默认值会被省略(config_to_endpoint)。

错误处理与内部可观测性

采集失败时通过 PostgresqlMetricsCollectError 发出PostgreSQL query error.内部事件(stage=receiving,error_type=request_failed)并累加component_errors_total计数器;成功路径则分别发出EndpointBytesReceivedEventsReceivedCollectionCompleted事件,用于观测抓取字节数、事件量与耗时。组件自身的遥测指标为collect_completed_totalcollect_duration_seconds(见 CUE telemetry 定义)。若下游send_batch返回错误(管道关闭),会发出StreamClosedError并终止采集循环。

测试验证

除单元测试generate_config外,源码底部包含一组需要postgresql_metrics-integration-testsfeature 启用的集成测试(src/sources/postgresql_metrics.rs),覆盖了本文提到的核心行为:

  • test_host:TCP 连接 + 完整指标采集,断言up == 1、命名空间为postgresql、存在endpoint/host标签,且三类查询均有代表性指标输出;
  • test_local:Unix Socket 连接(postgresql:///postgres?host=...&user=vector&password=vector);
  • test_host_sslsslmode=require+ca_file的 TLS 连接;
  • test_host_include_databases/test_host_exclude_databases/test_host_exclude_databases_empty/test_host_include_databases_and_exclude_databases:验证正则过滤与空串匹配 NULL 的行为。

这些测试依赖 test_util 中的 postgres 辅助函数(pg_urlpg_socket)提供测试库连接信息。

总结与最佳实践

postgresql_metrics组件以轻量的 SQL 抓取方式,将 PostgreSQL 的pg_stat_databasepg_stat_database_conflictspg_stat_bgwriter三大统计视图转化为带统一endpoint/host/db标签的指标流。实战中建议:

  1. 限定权限:为监控账号只授予对上述三个视图的 SELECT(或直接授予pg_monitor);
  2. 善用数据库过滤:用include_databases/exclude_databases精确控制采集范围,避免template库等无关库产生噪声;
  3. 关注版本差异:9.6 以下不支持,12 以下无 checksum 相关指标;若需要 I/O 耗时指标,需在 PostgreSQL 侧开启track_io_timing
  4. 配置告警:以up == 0作为连接失败的即时信号,配合pg_stat_replication等指标(如需要可另行采集)完善数据库可观测体系。

更完整的组件文档页面可在 postgresql_metrics.md 模板 与其生成源 postgresql_metrics.cue 中查阅。

【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询