用于 PostgreSQL 服务器指标的 Prometheus 导出器。
13
16
12
15
版本14
11
该软件包适用于 Docker:
# 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_URI="localhost:5432/postgres?sslmode=disable"
-e DATA_SOURCE_USER=postgres
-e DATA_SOURCE_PASS=password
quay.io/prometheuscommunity/postgres-exporter
测试:
curl " http://localhost:9187/metrics "
普罗米修斯配置示例:
scrape_configs :
- job_name : postgres
static_configs :
- targets : ["127.0.0.1:9187"] # Replace IP with the hostname of the docker container if you're running the container in a separate network
现在,将 DATA_SOURCE_PASS_FILE 与包含密码的已安装文件一起使用,以防止在环境变量中包含密码。
容器进程以 uid/gid 65534 运行(对于文件权限很重要)。
此功能处于测试阶段,可能需要在未来版本中进行更改。欢迎反馈。
该导出器支持多目标模式。这允许为多个 postgres 目标运行该导出器的单个实例。使用此导出器的多目标功能是可选的,适用于无法将导出器安装为 sidecar 的情况,例如 SaaS 托管服务。
要使用多目标功能,请将 http 请求发送到端点/probe?target=foo:5432
,其中 target 设置为要从中抓取指标的 postgres 实例的 DSN。
为了避免在 URL 中放入用户名和密码等敏感信息,通过配置文件的 auth_modules 部分支持预配置的身份验证模块。通过指定?auth_module=foo
http 参数,DSN 的 auth_modules 可以与/probe
端点一起使用。
普罗米修斯配置示例:
scrape_configs :
- job_name : ' postgres '
static_configs :
- targets :
- server1:5432
- server2:5432
metrics_path : /probe
params :
auth_module : [foo]
relabel_configs :
- source_labels : [__address__]
target_label : __param_target
- source_labels : [__param_target]
target_label : instance
- target_label : __address__
replacement : 127.0.0.1:9116 # The postgres exporter's real hostname:port.
配置文件控制导出器的行为。它可以使用--config.file
命令行标志进行设置,默认为postgres_exporter.yml
。
本节定义在多目标端点中使用的预设身份验证和连接参数。 auth_modules
是模块映射,其键是可在/probe
端点中使用的标识符。目前仅支持userpass
类型。
例子:
auth_modules :
foo1 : # Set this to any name you want
type : userpass
userpass :
username : first
password : firstpass
options :
# options become key=value parameters of the DSN
sslmode : disable
git clone https://github.com/prometheus-community/postgres_exporter.git
cd postgres_exporter
make build
./postgres_exporter <flags>
构建 Docker 镜像:
make promu
promu crossbuild -p linux/amd64 -p linux/armv7 -p linux/arm64 -p linux/ppc64le
make docker
这会将 docker 镜像构建为prometheuscommunity/postgres_exporter:${branch}
。
help
显示上下文相关的帮助(也可以尝试 --help-long 和 --help-man)。
[no-]collector.database
启用database
收集器(默认:启用)。
[no-]collector.database_wraparound
启用database_wraparound
收集器(默认值:禁用)。
[no-]collector.locks
启用locks
收集器(默认值:启用)。
[no-]collector.long_running_transactions
启用long_running_transactions
收集器(默认值:禁用)。
[no-]collector.postmaster
启用postmaster
收集器(默认值:禁用)。
[no-]collector.process_idle
启用process_idle
收集器(默认值:禁用)。
[no-]collector.replication
启用replication
收集器(默认:启用)。
[no-]collector.replication_slot
启用replication_slot
收集器(默认值:启用)。
[no-]collector.stat_activity_autovacuum
启用stat_activity_autovacuum
收集器(默认值:禁用)。
[no-]collector.stat_bgwriter
启用stat_bgwriter
收集器(默认:启用)。
[no-]collector.stat_database
启用stat_database
收集器(默认值:启用)。
[no-]collector.stat_statements
启用stat_statements
收集器(默认值:禁用)。
[no-]collector.stat_user_tables
启用stat_user_tables
收集器(默认值:启用)。
[no-]collector.stat_wal_receiver
启用stat_wal_receiver
收集器(默认值:禁用)。
[no-]collector.statio_user_indexes
启用statio_user_indexes
收集器(默认值:禁用)。
[no-]collector.statio_user_tables
启用statio_user_tables
收集器(默认值:启用)。
[no-]collector.wal
启用wal
收集器(默认:启用)。
[no-]collector.xlog_location
启用xlog_location
收集器(默认值:禁用)。
config.file
设置配置文件路径。默认为postgres_exporter.yml
web.systemd-socket
使用 systemd 套接字激活侦听器而不是端口侦听器(仅限 Linux)。默认为false
web.listen-address
用于监听 Web 界面和遥测的地址。默认值为:9187
。
web.config.file
使用 TLS 和/或基本身份验证的配置文件。文件的格式在导出工具包存储库中进行了描述。
web.telemetry-path
用于公开指标的路径。默认为/metrics
。
disable-default-metrics
仅使用通过--extend.query-path
从queries.yaml
提供的指标。默认为false
。
如果您不想抓取pg_settings
disable-settings-metrics
使用该标志。默认为false
。
auto-discover-databases
(已弃用)是否动态发现服务器上的数据库。默认为false
。
extend.query-path
(已弃用)包含要运行的自定义查询的 YAML 文件的路径。查看queries.yaml
以获取格式示例。
dumpmaps
不要运行 - 打印度量映射的内部表示。在调试自定义查询文件时很有用。
constantLabels
(已弃用)在所有指标中设置的标签。 label=value
对的列表,以逗号分隔。
version
显示应用程序版本。
exclude-databases
(已弃用)启用 autoDiscoverDatabases 时要删除的数据库列表。
include-databases
(已弃用)仅在启用 autoDiscoverDatabases 时包含的数据库列表。
log.level
设置日志记录级别: debug
、 info
、 warn
、 error
之一。
log.format
设置日志格式: logfmt
、 json
之一。
以下环境变量配置导出器:
DATA_SOURCE_NAME
默认旧格式。接受 URI 形式和 key=value 形式参数。 URI 可能包含要连接的用户名和密码。
DATA_SOURCE_URI
是DATA_SOURCE_NAME
的替代方案,它专门接受不带用户名和密码组件的主机名。例如, my_pg_hostname
或my_pg_hostname:5432/postgres?sslmode=disable
。
DATA_SOURCE_URI_FILE
与上面相同,但从文件中读取 URI。
DATA_SOURCE_USER
当使用DATA_SOURCE_URI
时,此环境变量用于指定用户名。
DATA_SOURCE_USER_FILE
相同,但从文件中读取用户名。
DATA_SOURCE_PASS
使用DATA_SOURCE_URI
时,此环境变量用于指定要连接的密码。
DATA_SOURCE_PASS_FILE
与上面相同,但从文件中读取密码。
PG_EXPORTER_WEB_TELEMETRY_PATH
公开指标的路径。默认为/metrics
。
PG_EXPORTER_DISABLE_DEFAULT_METRICS
仅使用queries.yaml
提供的指标。值可以是true
或false
。默认为false
。
PG_EXPORTER_DISABLE_SETTINGS_METRICS
如果您不想抓取pg_settings
,请使用该标志。值可以是true
或false
。默认为false
。
PG_EXPORTER_AUTO_DISCOVER_DATABASES
(已弃用)是否动态发现服务器上的数据库。值可以是true
或false
。默认为false
。
PG_EXPORTER_EXTEND_QUERY_PATH
包含要运行的自定义查询的 YAML 文件的路径。查看queries.yaml
以获取格式示例。
PG_EXPORTER_CONSTANT_LABELS
(已弃用)在所有指标中设置的标签。 label=value
对的列表,以逗号分隔。
PG_EXPORTER_EXCLUDE_DATABASES
(已弃用)启用 autoDiscoverDatabases 时要删除的以逗号分隔的数据库列表。默认为空字符串。
PG_EXPORTER_INCLUDE_DATABASES
(已弃用)仅在启用 autoDiscoverDatabases 时包含的以逗号分隔的数据库列表。默认为空字符串,表示允许所有。
PG_EXPORTER_METRIC_PREFIX
用于 postgres-exporter 导出的每个默认指标的前缀。默认为pg
以PG_
开头的环境变量设置的设置将被相应的 CLI 标志(如果给定)覆盖。
PostgreSQL 服务器的数据源名称必须通过DATA_SOURCE_NAME
环境变量设置。
要在默认的 Debian/Ubuntu 安装上本地运行它,这将起作用(根据需要转换为 init 脚本):
sudo -u postgres DATA_SOURCE_NAME="user=postgres host=/var/run/postgresql/ sslmode=disable" postgres_exporter
此外,您还可以设置一系列源以从一个导出器设置中抓取不同的实例。只需定义一个逗号分隔的字符串即可。
sudo -u postgres DATA_SOURCE_NAME="port=5432,port=6432" postgres_exporter
有关格式化连接字符串的其他方法,请参阅 github.com/lib/pq 模块。
如果将来添加其他指标,导出器将尝试动态导出它们,但它们将被标记为“无类型”。通过复制表并使用以下 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 值类型的值。这有助于为出口商建立丰富的自记录指标。
此功能已被弃用,取而代之的是内置收集器功能。对于通用 SQL 数据库监控,请参阅 sql_exporter。
-extend.query-path 命令行参数指定包含要运行的其他查询的 YAML 文件。 querys.yaml 中提供了一些示例。
要使用非官方支持的 postgres 版本(例如 8.2.15)或 postgres 的变体(例如 Greenplum),您可以使用--disable-default-metrics
标志禁用默认指标。这将删除所有内置指标,并仅使用您提供的queries.yaml
文件中的查询定义的指标(因此您必须提供一个,否则导出器将只返回内部状态而不是您的数据库)。
要从数据库服务器上的所有数据库中抓取指标,可以通过--auto-discover-databases
标志动态发现数据库 DSN。如果为 true,则针对所有已配置的 DSN 运行SELECT datname FROM pg_database WHERE datallowconn = true AND datistemplate = false and datname != current_database()
。根据结果创建一组新的 DSN,并为其抓取指标。
此外,选项--exclude-databases
添加了过滤自动发现结果的可能性,以丢弃不需要的数据库。
如果您只想包含数据库的子集,可以使用选项--include-databases
。导出器仍然向pg_database
表发出请求,但仅当数据库位于包含列表中时才进行抓取。
为了能够在 PostgreSQL 服务器版本 >= 10 中以非超级用户身份从pg_stat*
视图收集指标,您可以向用户授予pg_monitor
或pg_read_all_stats
内置角色。如果您需要监视较旧的 PostgreSQL 服务器,则必须以超级用户身份创建函数和视图,并分别为它们分配权限。
-- To use IF statements, hence to be able to check if the user exists before
-- attempting creation, we need to switch to procedural SQL (PL/pgSQL)
-- instead of standard SQL.
-- More: https://www.postgresql.org/docs/9.3/plpgsql-overview.html
-- To preserve compatibility with <9.0, DO blocks are not used; instead,
-- a function is created and dropped.
CREATE OR REPLACE FUNCTION __tmp_create_user () returns void as $$
BEGIN
IF NOT EXISTS (
SELECT -- SELECT list can stay empty for this
FROM pg_catalog . pg_user
WHERE usename = ' postgres_exporter ' ) THEN
CREATE USER postgres_exporter ;
END IF;
END;
$$ language plpgsql;
SELECT __tmp_create_user();
DROP FUNCTION __tmp_create_user();
ALTER USER postgres_exporter WITH PASSWORD ' password ' ;
ALTER USER postgres_exporter SET SEARCH_PATH TO postgres_exporter,pg_catalog;
-- If deploying as non-superuser (for example in AWS RDS), uncomment the GRANT
-- line below and replace <MASTER_USER> with your root user.
-- GRANT postgres_exporter TO <MASTER_USER>;
GRANT CONNECT ON DATABASE postgres TO postgres_exporter;
如果您使用 PostgreSQL 版本 >= 10,请运行以下命令
GRANT pg_monitor to postgres_exporter;
仅当您使用早于 10 的 PostgreSQL 版本时才运行以下 SQL 命令。在 PostgreSQL 中,视图以创建它们的用户的权限运行,因此它们可以充当安全屏障。需要创建函数来与非超级用户共享这些数据。仅创建视图会遗漏最重要的数据位。
CREATE SCHEMA IF NOT EXISTS postgres_exporter;
GRANT USAGE ON SCHEMA postgres_exporter TO postgres_exporter;
CREATE OR REPLACE FUNCTION get_pg_stat_activity () RETURNS SETOF pg_stat_activity AS
$$ SELECT * FROM pg_catalog . pg_stat_activity ; $$
LANGUAGE sql
VOLATILE
SECURITY DEFINER;
CREATE OR REPLACE VIEW postgres_exporter .pg_stat_activity
AS
SELECT * from get_pg_stat_activity();
GRANT SELECT ON postgres_exporter . pg_stat_activity TO postgres_exporter;
CREATE OR REPLACE FUNCTION get_pg_stat_replication () RETURNS SETOF pg_stat_replication AS
$$ SELECT * FROM pg_catalog . pg_stat_replication ; $$
LANGUAGE sql
VOLATILE
SECURITY DEFINER;
CREATE OR REPLACE VIEW postgres_exporter .pg_stat_replication
AS
SELECT * FROM get_pg_stat_replication();
GRANT SELECT ON postgres_exporter . pg_stat_replication TO postgres_exporter;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE OR REPLACE FUNCTION get_pg_stat_statements () RETURNS SETOF pg_stat_statements AS
$$ SELECT * FROM public . pg_stat_statements ; $$
LANGUAGE sql
VOLATILE
SECURITY DEFINER;
CREATE OR REPLACE VIEW postgres_exporter .pg_stat_statements
AS
SELECT * FROM get_pg_stat_statements();
GRANT SELECT ON postgres_exporter . pg_stat_statements TO postgres_exporter;
笔记
请记住在连接字符串中使用postgres
数据库名称:DATA_SOURCE_NAME=postgresql://postgres_exporter:password@localhost:5432/postgres?sslmode=disable
# Run the unit tests
make test
# Start the test database with docker
docker run -p 5432:5432 -e POSTGRES_DB=circle_test -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=test -d postgres
# Run the integration tests
DATA_SOURCE_NAME='postgresql://postgres:test@localhost:5432/circle_test?sslmode=disable' GOOPTS='-v -tags integration' make test