Prometheus-Exporter für PostgreSQL-Servermetriken.
CI-getestete PostgreSQL-Versionen: 11
, 12
, 13
, 14
, 15
, 16
Dieses Paket ist für Docker verfügbar:
# 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
Testen Sie mit:
curl " http://localhost:9187/metrics "
Beispiel-Prometheus-Konfiguration:
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
Verwenden Sie nun DATA_SOURCE_PASS_FILE mit einer bereitgestellten Datei, die das Kennwort enthält, um zu verhindern, dass das Kennwort in einer Umgebungsvariablen enthalten ist.
Der Containerprozess läuft mit UID/GID 65534 (wichtig für Dateiberechtigungen).
Diese Funktion befindet sich in der Betaphase und erfordert möglicherweise Änderungen in zukünftigen Versionen. Feedback ist willkommen.
Dieser Exporter unterstützt das Multi-Target-Muster. Dies ermöglicht die Ausführung einer einzelnen Instanz dieses Exporters für mehrere Postgres-Ziele. Die Verwendung der Multi-Target-Funktionalität dieses Exporters ist optional und für Fälle gedacht, in denen es nicht möglich ist, den Exporter als Sidecar zu installieren, beispielsweise bei SaaS-verwalteten Diensten.
Um die Multi-Target-Funktionalität zu nutzen, senden Sie eine http-Anfrage an den Endpunkt /probe?target=foo:5432
, wobei target auf den DSN der Postgres-Instanz gesetzt ist, aus der Metriken extrahiert werden sollen.
Um zu vermeiden, dass vertrauliche Informationen wie Benutzername und Passwort in die URL eingefügt werden, werden vorkonfigurierte Authentifizierungsmodule über den Abschnitt auth_modules der Konfigurationsdatei unterstützt. auth_modules für DSNs können mit dem /probe
Endpunkt verwendet werden, indem der http-Parameter ?auth_module=foo
angegeben wird.
Beispiel-Prometheus-Konfiguration:
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.
Die Konfigurationsdatei steuert das Verhalten des Exporters. Es kann mit dem Befehlszeilen-Flag --config.file
festgelegt werden und ist standardmäßig postgres_exporter.yml
.
In diesem Abschnitt werden voreingestellte Authentifizierungs- und Verbindungsparameter für die Verwendung im Multi-Target-Endpunkt definiert. auth_modules
ist eine Zuordnung von Modulen, wobei der Schlüssel die Kennung ist, die im /probe
Endpunkt verwendet werden kann. Derzeit wird nur der userpass
-Typ unterstützt.
Beispiel:
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>
So erstellen Sie das Docker-Image:
make promu
promu crossbuild -p linux/amd64 -p linux/armv7 -p linux/arm64 -p linux/ppc64le
make docker
Dadurch wird das Docker-Image als prometheuscommunity/postgres_exporter:${branch}
erstellt.
help
Zeigt kontextsensitive Hilfe an (versuchen Sie auch --help-long und --help-man).
[no-]collector.database
Aktiviert den database
(Standard: aktiviert).
[no-]collector.database_wraparound
Aktivieren Sie den Kollektor database_wraparound
(Standard: deaktiviert).
[no-]collector.locks
Aktiviert den locks
Collector (Standard: aktiviert).
[no-]collector.long_running_transactions
Aktivieren Sie den long_running_transactions
-Kollektor (Standard: deaktiviert).
[no-]collector.postmaster
Aktiviert den postmaster
Collector (Standard: deaktiviert).
[no-]collector.process_idle
Aktivieren Sie den process_idle
Kollektor (Standard: deaktiviert).
[no-]collector.replication
Aktivieren Sie den replication
(Standard: aktiviert).
[no-]collector.replication_slot
Aktivieren Sie den replication_slot
-Kollektor (Standard: aktiviert).
[no-]collector.stat_activity_autovacuum
Aktivieren Sie den stat_activity_autovacuum
Kollektor (Standard: deaktiviert).
[no-]collector.stat_bgwriter
Aktivieren Sie den stat_bgwriter
Collector (Standard: aktiviert).
[no-]collector.stat_database
Aktivieren Sie den stat_database
Kollektor (Standard: aktiviert).
[no-]collector.stat_statements
Aktivieren Sie den stat_statements
Collector (Standard: deaktiviert).
[no-]collector.stat_user_tables
Aktivieren Sie den stat_user_tables
Kollektor (Standard: aktiviert).
[no-]collector.stat_wal_receiver
Aktivieren Sie den stat_wal_receiver
Kollektor (Standard: deaktiviert).
[no-]collector.statio_user_indexes
Aktiviert den statio_user_indexes
-Kollektor (Standard: deaktiviert).
[no-]collector.statio_user_tables
Aktivieren Sie den statio_user_tables
Kollektor (Standard: aktiviert).
[no-]collector.wal
Aktivieren Sie den wal
Collector (Standard: aktiviert).
[no-]collector.xlog_location
Aktivieren Sie den xlog_location
Collector (Standard: deaktiviert).
config.file
Legen Sie den Pfad der Konfigurationsdatei fest. Der Standardwert ist postgres_exporter.yml
web.systemd-socket
Verwenden Sie Systemd-Socket-Aktivierungs-Listener anstelle von Port-Listenern (nur Linux). Der Standardwert ist false
web.listen-address
Adresse zum Abhören für Webschnittstelle und Telemetrie. Der Standardwert ist :9187
.
web.config.file
Konfigurationsdatei zur Verwendung von TLS und/oder Basisauthentifizierung. Das Format der Datei ist im Exporter-Toolkit-Repository beschrieben.
web.telemetry-path
Pfad, unter dem Metriken verfügbar gemacht werden. Der Standardwert ist /metrics
.
disable-default-metrics
Verwenden Sie nur Metriken, die von queries.yaml
über --extend.query-path
bereitgestellt werden. Der Standardwert ist false
.
disable-settings-metrics
Verwenden Sie das Flag, wenn Sie pg_settings
nicht scrapen möchten. Der Standardwert ist false
.
auto-discover-databases
(VERALTET) Legt fest, ob die Datenbanken auf einem Server dynamisch ermittelt werden sollen. Der Standardwert ist false
.
extend.query-path
(VERALTET) Pfad zu einer YAML-Datei, die benutzerdefinierte Abfragen enthält, die ausgeführt werden sollen. Beispiele für das Format finden Sie in queries.yaml
.
dumpmaps
Nicht ausführen – die interne Darstellung der Metrikkarten drucken. Nützlich beim Debuggen einer benutzerdefinierten Abfragedatei.
constantLabels
(VERALTET) Beschriftungen, die in allen Metriken festgelegt werden sollen. Eine Liste von label=value
-Paaren, getrennt durch Kommas.
version
Anwendungsversion anzeigen.
exclude-databases
(VERALTET) Eine Liste von Datenbanken, die entfernt werden sollen, wenn autoDiscoverDatabases aktiviert ist.
include-databases
(VERALTET) Eine Liste von Datenbanken, die nur einbezogen werden sollen, wenn autoDiscoverDatabases aktiviert ist.
log.level
Legen Sie die Protokollierungsebene fest: eine von debug
, info
, warn
oder error
.
log.format
Legen Sie das Protokollformat fest: logfmt
oder json
.
Die folgenden Umgebungsvariablen konfigurieren den Exporter:
DATA_SOURCE_NAME
ist das standardmäßige Legacy-Format. Akzeptiert Argumente im URI-Format und im Schlüssel=Wert-Format. Der URI kann den Benutzernamen und das Passwort für die Verbindung enthalten.
DATA_SOURCE_URI
ist eine Alternative zu DATA_SOURCE_NAME
, die ausschließlich den Hostnamen ohne Benutzernamen- und Passwortkomponente akzeptiert. Zum Beispiel my_pg_hostname
oder my_pg_hostname:5432/postgres?sslmode=disable
.
DATA_SOURCE_URI_FILE
Dasselbe wie oben, liest jedoch den URI aus einer Datei.
DATA_SOURCE_USER
Bei Verwendung DATA_SOURCE_URI
wird diese Umgebungsvariable zur Angabe des Benutzernamens verwendet.
DATA_SOURCE_USER_FILE
Dasselbe, liest jedoch den Benutzernamen aus einer Datei.
DATA_SOURCE_PASS
Bei Verwendung DATA_SOURCE_URI
wird diese Umgebungsvariable verwendet, um das Kennwort für die Verbindung anzugeben.
DATA_SOURCE_PASS_FILE
Das Gleiche wie oben, liest jedoch das Passwort aus einer Datei.
PG_EXPORTER_WEB_TELEMETRY_PATH
Pfad, unter dem Metriken verfügbar gemacht werden. Der Standardwert ist /metrics
.
PG_EXPORTER_DISABLE_DEFAULT_METRICS
Verwenden Sie nur Metriken, die von queries.yaml
bereitgestellt werden. Der Wert kann true
oder false
sein. Der Standardwert ist false
.
PG_EXPORTER_DISABLE_SETTINGS_METRICS
Verwenden Sie das Flag, wenn Sie pg_settings
nicht scrapen möchten. Der Wert kann true
oder false
sein. Der Standardwert ist false
.
PG_EXPORTER_AUTO_DISCOVER_DATABASES
(VERALTET) Ob die Datenbanken auf einem Server dynamisch ermittelt werden sollen. Der Wert kann true
oder false
sein. Der Standardwert ist false
.
PG_EXPORTER_EXTEND_QUERY_PATH
Pfad zu einer YAML-Datei, die benutzerdefinierte Abfragen zur Ausführung enthält. Beispiele für das Format finden Sie in queries.yaml
.
PG_EXPORTER_CONSTANT_LABELS
(VERALTET) Beschriftungen, die in allen Metriken festgelegt werden sollen. Eine Liste von label=value
-Paaren, getrennt durch Kommas.
PG_EXPORTER_EXCLUDE_DATABASES
(VERALTET) Eine durch Kommas getrennte Liste von Datenbanken, die entfernt werden sollen, wenn autoDiscoverDatabases aktiviert ist. Der Standardwert ist eine leere Zeichenfolge.
PG_EXPORTER_INCLUDE_DATABASES
(VERALTET) Eine durch Kommas getrennte Liste von Datenbanken, die nur einbezogen werden, wenn autoDiscoverDatabases aktiviert ist. Der Standardwert ist eine leere Zeichenfolge, was bedeutet, dass alle zulässig sind.
PG_EXPORTER_METRIC_PREFIX
Ein Präfix, das für jede der von postgres-exporter exportierten Standardmetriken verwendet wird. Der Standardwert ist pg
Einstellungen, die durch Umgebungsvariablen festgelegt werden, die mit PG_
beginnen, werden durch das entsprechende CLI-Flag überschrieben, sofern angegeben.
Der Datenquellenname des PostgreSQL-Servers muss über die Umgebungsvariable DATA_SOURCE_NAME
festgelegt werden.
Um es lokal auf einer Standard-Debian/Ubuntu-Installation auszuführen, funktioniert Folgendes (ggf. in das Init-Skript umwandeln):
sudo -u postgres DATA_SOURCE_NAME="user=postgres host=/var/run/postgresql/ sslmode=disable" postgres_exporter
Außerdem können Sie eine Liste von Quellen festlegen, um verschiedene Instanzen aus dem einen Exporter-Setup zu extrahieren. Definieren Sie einfach eine durch Kommas getrennte Zeichenfolge.
sudo -u postgres DATA_SOURCE_NAME="port=5432,port=6432" postgres_exporter
Weitere Möglichkeiten zum Formatieren der Verbindungszeichenfolge finden Sie im Modul github.com/lib/pq.
Der Exporter wird versuchen, zusätzliche Metriken dynamisch zu exportieren, wenn diese in Zukunft hinzugefügt werden, sie werden jedoch als „nicht typisiert“ markiert. Zusätzliche Metrikkarten können einfach aus der Postgres-Dokumentation erstellt werden, indem Sie die Tabellen kopieren und das folgende Python-Snippet verwenden:
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 ())
Passen Sie den Wert des resultierenden Prometheus-Werttyps entsprechend an. Dies hilft dabei, umfassende selbstdokumentierende Metriken für den Exporteur zu erstellen.
Diese Funktion ist zugunsten integrierter Collector-Funktionen veraltet. Informationen zur generischen SQL-Datenbanküberwachung finden Sie im sql_exporter.
Das Befehlszeilenargument -extend.query-path gibt eine YAML-Datei an, die zusätzliche auszuführende Abfragen enthält. Einige Beispiele finden Sie in query.yaml.
Um mit nicht offiziell unterstützten Postgres-Versionen (z. B. 8.2.15) oder Postgres-Varianten (z. B. Greenplum) zu arbeiten, können Sie die Standardmetriken mit dem Flag --disable-default-metrics
deaktivieren. Dadurch werden alle integrierten Metriken entfernt und nur Metriken verwendet, die durch Abfragen in der von Ihnen bereitgestellten Datei queries.yaml
definiert wurden (Sie müssen also eine angeben, da der Exporter sonst nur interne Status und nicht Ihre Datenbank zurückgibt).
Um Metriken aus allen Datenbanken auf einem Datenbankserver zu extrahieren, können die Datenbank-DSNs dynamisch über das Flag --auto-discover-databases
ermittelt werden. Wenn true, SELECT datname FROM pg_database WHERE datallowconn = true AND datistemplate = false and datname != current_database()
für alle konfigurierten DSNs ausgeführt. Aus dem Ergebnis wird ein neuer Satz von DSNs erstellt, für den die Metriken gescrapt werden.
Darüber hinaus bietet die Option --exclude-databases
die Möglichkeit, das Ergebnis der automatischen Erkennung zu filtern, um nicht benötigte Datenbanken zu verwerfen.
Wenn Sie nur eine Teilmenge der Datenbanken einschließen möchten, können Sie die Option --include-databases
verwenden. Der Exporter stellt weiterhin eine Anfrage an die Tabelle pg_database
, führt jedoch nur dann einen Scraping-Vorgang durch, wenn die Datenbank in der Include-Liste enthalten ist.
Um als Nicht-Superuser in PostgreSQL-Serverversionen >= 10 Metriken aus pg_stat*
-Ansichten sammeln zu können, können Sie dem Benutzer die integrierten Rollen pg_monitor
oder pg_read_all_stats
zuweisen. Wenn Sie ältere PostgreSQL-Server überwachen müssen, müssen Sie Funktionen und Ansichten als Superuser erstellen und diesen separat Berechtigungen zuweisen.
-- 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;
Führen Sie den folgenden Befehl aus, wenn Sie PostgreSQL-Versionen >= 10 verwenden
GRANT pg_monitor to postgres_exporter;
Führen Sie die folgenden SQL-Befehle nur aus, wenn Sie PostgreSQL-Versionen verwenden, die älter als 10 sind. In PostgreSQL werden Ansichten mit den Berechtigungen des Benutzers ausgeführt, der sie erstellt hat, sodass sie als Sicherheitsbarrieren dienen können. Es müssen Funktionen erstellt werden, um diese Daten mit dem Nicht-Superuser zu teilen. Nur beim Erstellen der Ansichten werden die wichtigsten Datenbits weggelassen.
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;
NOTIZ
Denken Sie daran,postgres
Datenbanknamen in der Verbindungszeichenfolge zu verwenden: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