默认情况下,由 postgres_exporter 运行的查询,可能不足以让用户可视化许多重要的指标。为此,我们总是可以创建自定义查询,来要求 postgres_exporter 公开自定义查询的输出。postgres_exporter 最近已被转移到 Prometheus 社区仓库,并基于 PostgreSQL 版本9.4到14进行过测试。
此工具可为您的 PostgreSQL 集群提供可观测性,通过它您可以检查其运行表现,并通过 9187(默认)端口公开指标。
指标
postgres_exporter 有一些默认的指标,它们非常有用,但也给了你使用yaml文件添加自定义指标的灵活性。此yaml文件必须包含用来获取要监视的数据的查询,并且需要具有特定的结构:
metric_name:
master: true (optional)
cache_seconds: 30 (optional)
query: "SELECT metric_1, metric_2 FROM table"
metrics:
- metric_1:
usage: "LABEL"
description: "Metric 1 description"
- metric_2:
usage: "GAUGE"
description: "Metric 2 description"
结构非常简单,您需要了解它的每个部分的一些注意事项:
• metric_name:你想为你的指标定义的简单的名称。
• master:在复制环境中,此值经常会与领导者主机混淆,但它实际上意味着,查询将只在DATA_SOURCE_NAME参数配置的数据库中执行。
• cache_seconds:在再次运行查询之前,将最后一次抓取的值保留的时长。如果指标数据不经常变更,请考虑添加此参数。
• query:这是你的查询定义,复杂程度无关紧要,它可以是简单的,也可以是非常复杂的,只要确保执行速度快。查询返回的每个字段将会对应表示定义中的一个指标。
• metrics:这是查询返回的每个字段组成的数组。按查询结果的顺序定义它,对于每个指标(字段),您需要指定:
usage:LABEL、GAUGE、COUNTER或HISTROGRAM。这将取决于检索到的数据,以及您计划如何在图形中显示它。
description:检索到的数据的一个简短说明。
指标是如何构建和公开的
Postgres exporter 将metric name和metric field进行串联以公开指标,例如metric_name_metric_1和metric_name_metric_2。
API 不会公开具有LABEL类型的指标,因为它们将是数字指标的一部分,并且它们在应用过滤器时非常有用。这意味着每个指标中必须至少有一个数值(GAUGE,COUNTER或HISTROGRAM)。
指标定义
一个基本的指标定义如下所示:
pg_database_size:
query: "SELECT pg_database.datname, pg_database_size(pg_database.datname) as bytes FROM pg_database"
master: true
cache_seconds: 30
metrics:
- datname:
usage: "LABEL"
description: "Name of the database"
- bytes:
usage: "GAUGE"
description: "Disk space used by the database"
上面的示例将显示为:
pg_database_size_bytes
从postgres-exporter的 REST-API 检查指标:
$ curl http://localhost:9187/metrics -s | grep pg_database_size_bytes
# HELP pg_database_size_bytes Disk space used by the database in bytes
# TYPE pg_database_size_bytes gauge
pg_database_size_bytes{datname="postgres",server="postgres:5432"} 8.758051e+06
pg_database_size_bytes{datname="template0",server="postgres:5432"} 8.602115e+06
pg_database_size_bytes{datname="template1",server="postgres:5432"} 8.602115e+06
正如您所看到的,指标还显示了添加到定义中的信息,TYPE 和作为HELP的描述,并且所有具有LABEL类型的字段都会添加到大括号之间的指标中,其他指标都是从环境中收集的。
现在从 Prometheus 检查一下:
Prometheus metric
使用 Grafana 的一个简单演示:
Grafana graph
这只是一个非常简单的例子,用来说明你可以做什么。现在来检查一些关于postgres-exporter配置的要点。
配置
根据您的环境,您可以为每个 PostgreSQL 实例设置一个postgres-exporter,也可以为多个实例设置一个postgres-exporter,您可以在DATA_SOURCE_NAME环境变量中使用逗号分隔连接字符串。
要收集单个实例的指标,您可以这样设置DATA_SOURCE_NAME环境变量:
DATA_SOURCE_NAME="postgresql://POSTGRES_USER:PASSWORD@localhost:5432/postgres?sslmode=disable"
如果您希望为多个 PostgreSQL 实例使用一个 postgres-exporter,您可以像这样设置该环境变量:
DATA_SOURCE_NAME="postgresql://POSTGRES_USER:PASSWORD@host1:5432/postgres?sslmode=disable,postgresql://POSTGRES_USER:PASSWORD@host2:5432/postgres?sslmode=disable"
可以配置一个postgres-exporter从多个 PostgreSQL 实例收集指标,但现在不推荐这样配置,因为有一个 bug 尚未解决,它会建立太多连接来收集指标。可以在这里查看该问题。
建议每个 PostgreSQL 实例都有自己的postgres-exporter,这样你就可以你的仪表板中监控所有节点了。
业务相关指标
通常需要收集与业务信息相关的指标,例如在过去的N小时内创建的用户数量、核心业务中持续进行的相关流程等。
所有这些都可以添加到每个postgres-exporter服务配置中。有时,报告或连续聚合查询是在副本服务器中完成的,这可能会是您更适合获取业务相关指标的地方,以便将负载从主节点中移出。
自动发现数据库
要配置此选项,您需要设置下一个环境变量:
PG_EXPORTER_AUTO_DISCOVER_DATABASES=true
您也可以将其与环境变量PG_EXPORTER_EXCLUDE_DATABASES和PG_EXPORTER_INCLUDE_DATABASES结合使用。
此选项允许您从所有现有数据库或 PostgreSQL 实例中的一部分数据库收集指标。数据库是从 pg_database 系统表中收集的,该表来自DATA_SOURCE_NAME中配置的数据库,然后会为每个发现的数据库打开一个连接。在每个实例有许多数据库的环境中,由于导出器使用的连接数量可能会出现问题。可以在这里查看报告的问题。
查询文件
使用环境变量PG_EXPORTER_EXTEND_QUERY_PATH添加自定义的queries.yaml文件,该值必须包含文件的路径。例如:
PG_EXPORTER_EXTEND_QUERY_PATH="/opt/postgres_exporter/queries.yaml"
常量标签
PG_EXPORTER_CONSTANT_LABELS会将您设置的标签附加在所有指标中。建议至少添加一个标签,以帮助您识别指标的来源,例如cluster_name。当你有多个集群时,过滤它们会更容易。
结论
本文中提出的建议基于导出器的使用经验,以及在本地环境和云环境中进行的配置。本文并未提及所有配置参数,但重点提到了一些重要的配置参数。Postgres exporter 是开源的,它是一个非常有用的工具,以用来监控您的 PostgreSQL 集群,但不要盲目地去增加集群的可观测性。