用於 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 命令。需要建立函數來與非超級使用者共享這些資料。僅建立視圖會遺漏最重要的資料位。
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