自定义 PostgreSQL 的监控指标,原来可以这么轻松!

2024年 4月 26日 107.0k 0

默认情况下,由 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 metricPrometheus metric

使用 Grafana 的一个简单演示:

Grafana graphGrafana 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 集群,但不要盲目地去增加集群的可观测性。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论