PostgreSQL Server Exporter

最近几年,在关系型数据库中, PostgreSQL 大放异彩,使用度极速上升。今天我们来看看 PostgreSQL 的监控。

针对 PostgreSQL 数据库 Prometheus Community 提供了一个 PostgreSQL Server Exporter 来采集监控指标,官方仓库地址是 https://github.com/prometheus-community/postgres_exporter ,PostgreSQL Server Exporter 已经在 PostgreSQL 的 9.4、9.5、9.6、10、11、12、13 版本上测试过了。当前最新版本是 v0.10.0 ,发布于 2021 年7 月 8 日。

安装运行

# Start an example database
docker run --net=host -it --rm -e POSTGRES_PASSWORD=password postgres
# Connect to it
docker run \
  --net=host \
  -e DATA_SOURCE_NAME="postgresql://postgres:password@localhost:5432/postgres?sslmode=disable" \
  quay.io/prometheuscommunity/postgres-exporter:v0.10.0

PostgreSQL Server Exporter 在启动的时候有很多参数可以选择,具体科学的如下:

  • help 展示帮助信息,也可以使用 --help-long 和 --help-man 。

  • web.listen-address 启动后程序监听的 web 端口,暴露监控数据也是这个端口,默认是 :9187 。

  • web.telemetry-path 暴露指标的路径,默认是 /metrics.

  • disable-default-metrics 关闭默认采集到指标,只使用通过 --extend.query-path 指定的 queries.yaml 文件里定义的指标。

  • disable-settings-metrics 如果不想获取 pg_settings 的监控指标可以使用这个参数来关闭。

  • auto-discover-databases 在服务器上动态发现数据库实例。

  • extend.query-path 自定义查询指标的文件路径,这个文件使用 YAML 格式来编写,启动前要校验文件格式。

  • dumpmaps 这个参数不会运行 Exporter ,只会打印内部的指标映射关系。用来 debug 自定义的查询文件。

  • constantLabels 设置所有指标的 Label,一般用一个列表的方式,通过 label=value 这样一对一对的设置,中间用逗号分隔。

  • version 打印 Exporter 的版本。

  • exclude-databases 启用 autoDiscoverDatabases 时不要收集的数据库列表。

  • include-databases 启用 autoDiscoverDatabases 时仅采集这个数据库列表里的数据库实例。

  • log.level 设置日志基本,一共有 4 中, debug, info, warn, error,选择其一就可以。

  • log.format 设置日志的格式, logfmt 或者 json.

  • web.config.file 使用 TLS 或者 basic authentication 的时候的配置文件,这个文件的搁置遵循 exporter-toolkit 仓库的规范。

PostgreSQL Server Exporter 在启动的时候有很多选项可以通过环境变量设置,如果Exporter 是以二进制运行在机器上的话,不建议使用环境变量,因为环境变量的管理非常繁琐。如果是容器镜像的话,环境变量的管理会好一些。可以使用的环境变量如下:

  • DATA_SOURCE_NAME the default legacy format. Accepts URI form and key=value form arguments. The URI may contain the username and password to connect with.

  • DATA_SOURCE_URI an alternative to DATA_SOURCE_NAME which exclusively accepts the hostname without a username and password component. For example, my_pg_hostname or my_pg_hostname?sslmode=disable.

  • DATA_SOURCE_URI_FILE The same as above but reads the URI from a file.

  • DATA_SOURCE_USER When using DATA_SOURCE_URI, this environment variable is used to specify the username.

  • DATA_SOURCE_USER_FILE The same, but reads the username from a file.

  • DATA_SOURCE_PASS When using DATA_SOURCE_URI, this environment variable is used to specify the password to connect with.

  • DATA_SOURCE_PASS_FILE The same as above but reads the password from a file.

  • PG_EXPORTER_WEB_LISTEN_ADDRESS Address to listen on for web interface and telemetry. Default is :9187.

  • PG_EXPORTER_WEB_TELEMETRY_PATH Path under which to expose metrics. Default is /metrics.

  • PG_EXPORTER_DISABLE_DEFAULT_METRICS Use only metrics supplied from queries.yaml. Value can be true or false. Default is false.

  • PG_EXPORTER_DISABLE_SETTINGS_METRICS Use the flag if you don't want to scrape pg_settings. Value can be true or false. Default is false.

  • PG_EXPORTER_AUTO_DISCOVER_DATABASES Whether to discover the databases on a server dynamically. Value can be true or false. Default is false.

  • PG_EXPORTER_EXTEND_QUERY_PATH Path to a YAML file containing custom queries to run. Check out queries.yaml for examples of the format.

  • PG_EXPORTER_CONSTANT_LABELS Labels to set in all metrics. A list of label=value pairs, separated by commas.

  • PG_EXPORTER_EXCLUDE_DATABASES A comma-separated list of databases to remove when autoDiscoverDatabases is enabled. Default is empty string.

  • PG_EXPORTER_INCLUDE_DATABASES A comma-separated list of databases to only include when autoDiscoverDatabases is enabled. Default is empty string, means allow all.

  • PG_EXPORTER_METRIC_PREFIX A prefix to use for each of the default metrics exported by postgres-exporter. Default is pg

另外以 PG_ 开头的环境变量在使用的时候会覆盖命令行参数,优先级较高。

添加新的监控指标

如果将来添加额外的监控指标, Exporter 将尝试动态添加并导出它们,但这些指标的类型会被标记为 “untyped”。通过复制这些表并使用以下 Python 代码片段,可以从 Postgres 文档中轻松创建其他其他指标的映射:

x = """tab separated raw text of a documentation table"""
for l in StringIO(x):
    column, ctype, description = l.split('\t')
    print """"{0}" : {{ prometheus.CounterValue, prometheus.NewDesc("pg_stat_database_{0}", "{2}", nil, nil) }}, """.format(column.strip(), ctype, description.strip())

适当的调整新生产的 Prometheus 监控指标类型的值,这样可以明确指标的类型,并且有利于查询和计算。

扩展。query-path命令行参数指定一个包含要运行的其他查询的YAML文件。在queries.yaml中提供了一些示例。

--extend.query-path 命令行参数提供了一个可以运行的 YAML 文件,这个文件可以自定义要采集的监控指标,这个文件的写法可以参考 queries.yaml

关闭默认指标采集

如果使用的是 Exporter 非官方支持的 Postgres 版本,比如 8.2.15 版本的 Postgres ,或者 Postgres 的变体,比如 Greenplum ,你可以使用 --disable-default-metrics 参数关闭所有的默认指标采集,这样所有的内置指标都不会出现了。这个时候需要使用--extend.query-path 指定 queries.yaml 文件来指定要采集到指标。否则只会采集到 Exporter 自身的指标,采集不到数据库的指标了。

打开自动发现数据库实例

为了从数据库服务器上的所有数据库中获取监控指标数据,可以通过 --auto-discover-databases 命令行参数动态发现数据库 DSN。SELECT datname FROM pg_database WHERE datallowconn = true AND datistemplate = false and datname != current_database() 将对所有配置的DSN运行,当结果为真时,从结果中创建一组新的DSN,为其抓取监控指标。

这个时候可以搭配 --exclude-databases--include-databases 两个参数使用,--exclude-databases 可以去掉不想要的数据库,--include-databases 可以保留只想要的数据。

小结

PostgreSQL Server Exporter 可以灵活多变的采集 Postgres 数据库的监控指标。

results matching ""

    No results matching ""