Pengekspor Prometheus untuk metrik server PostgreSQL.
Versi PostgreSQL yang Diuji CI: 11
, 12
, 13
, 14
, 15
, 16
Paket ini tersedia untuk 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
Uji dengan:
curl " http://localhost:9187/metrics "
Contoh konfigurasi Prometheus:
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
Sekarang gunakan DATA_SOURCE_PASS_FILE dengan file terpasang yang berisi kata sandi untuk mencegah kata sandi dalam variabel lingkungan.
Proses kontainer berjalan dengan uid/gid 65534 (penting untuk izin file).
Fitur ini masih dalam versi beta dan mungkin memerlukan perubahan pada rilis mendatang. Umpan balik diterima.
Eksportir ini mendukung pola multi target. Hal ini memungkinkan menjalankan satu instance eksportir ini untuk beberapa target postgres. Penggunaan fungsi multi-target eksportir ini bersifat opsional dan dimaksudkan untuk kasus di mana tidak mungkin menginstal eksportir sebagai bantuan, misalnya layanan yang dikelola SaaS.
Untuk menggunakan fungsionalitas multi-target, kirim permintaan http ke titik akhir /probe?target=foo:5432
di mana target disetel ke DSN instans postgres untuk mengambil metrik.
Untuk menghindari memasukkan informasi sensitif seperti nama pengguna dan kata sandi di URL, modul autentikasi yang telah dikonfigurasi sebelumnya didukung melalui bagian auth_modules pada file konfigurasi. auth_modules untuk DSN dapat digunakan dengan titik akhir /probe
dengan menentukan parameter ?auth_module=foo
http.
Contoh konfigurasi Prometheus:
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.
File konfigurasi mengontrol perilaku eksportir. Ini dapat diatur menggunakan flag baris perintah --config.file
dan defaultnya adalah postgres_exporter.yml
.
Bagian ini mendefinisikan autentikasi prasetel dan parameter koneksi untuk digunakan di titik akhir multi-target. auth_modules
adalah peta modul dengan kunci sebagai pengidentifikasi yang dapat digunakan di titik akhir /probe
. Saat ini hanya jenis userpass
yang didukung.
Contoh:
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>
Untuk membuat image Docker:
make promu
promu crossbuild -p linux/amd64 -p linux/armv7 -p linux/arm64 -p linux/ppc64le
make docker
Ini akan membangun image buruh pelabuhan sebagai prometheuscommunity/postgres_exporter:${branch}
.
help
Tampilkan bantuan peka konteks (coba juga --help-long dan --help-man).
[no-]collector.database
Mengaktifkan kolektor database
(default: diaktifkan).
[no-]collector.database_wraparound
Mengaktifkan kolektor database_wraparound
(default: dinonaktifkan).
[no-]collector.locks
Mengaktifkan kolektor locks
(default: diaktifkan).
[no-]collector.long_running_transactions
Aktifkan kolektor long_running_transactions
(default: dinonaktifkan).
[no-]collector.postmaster
Mengaktifkan kolektor postmaster
(default: dinonaktifkan).
[no-]collector.process_idle
Aktifkan kolektor process_idle
(default: dinonaktifkan).
[no-]collector.replication
Mengaktifkan kolektor replication
(default: diaktifkan).
[no-]collector.replication_slot
Mengaktifkan kolektor replication_slot
(default: diaktifkan).
[no-]collector.stat_activity_autovacuum
Mengaktifkan kolektor stat_activity_autovacuum
(default: dinonaktifkan).
[no-]collector.stat_bgwriter
Mengaktifkan kolektor stat_bgwriter
(default: diaktifkan).
[no-]collector.stat_database
Mengaktifkan kolektor stat_database
(default: diaktifkan).
[no-]collector.stat_statements
Mengaktifkan kolektor stat_statements
(default: dinonaktifkan).
[no-]collector.stat_user_tables
Aktifkan kolektor stat_user_tables
(default: diaktifkan).
[no-]collector.stat_wal_receiver
Mengaktifkan kolektor stat_wal_receiver
(default: dinonaktifkan).
[no-]collector.statio_user_indexes
Mengaktifkan kolektor statio_user_indexes
(default: dinonaktifkan).
[no-]collector.statio_user_tables
Mengaktifkan kolektor statio_user_tables
(default: diaktifkan).
[no-]collector.wal
Mengaktifkan wal
collector (default: diaktifkan).
[no-]collector.xlog_location
Mengaktifkan kolektor xlog_location
(default: dinonaktifkan).
config.file
Atur jalur file konfigurasi. Standarnya adalah postgres_exporter.yml
web.systemd-socket
Gunakan pendengar aktivasi soket systemd alih-alih pendengar port (hanya Linux). Standarnya false
web.listen-address
Alamat untuk mendengarkan antarmuka web dan telemetri. Standarnya adalah :9187
.
web.config.file
File konfigurasi untuk menggunakan TLS dan/atau otentikasi dasar. Format file dijelaskan dalam repositori toolkit eksportir.
web.telemetry-path
Jalur untuk mengekspos metrik. Standarnya adalah /metrics
.
disable-default-metrics
Gunakan hanya metrik yang disediakan dari queries.yaml
melalui --extend.query-path
. Standarnya false
.
disable-settings-metrics
Gunakan tanda jika Anda tidak ingin menghapus pg_settings
. Standarnya false
.
auto-discover-databases
(DIHAPUSKAN) Apakah akan menemukan database di server secara dinamis. Standarnya false
.
extend.query-path
(DIHAPUSKAN) Jalur ke file YAML yang berisi kueri khusus untuk dijalankan. Lihat queries.yaml
untuk contoh formatnya.
dumpmaps
Jangan dijalankan - cetak representasi internal peta metrik. Berguna saat men-debug file kueri khusus.
constantLabels
(DIHAPUSKAN) Label yang akan disetel di semua metrik. Daftar pasangan label=value
, dipisahkan dengan koma.
version
Tampilkan versi aplikasi.
exclude-databases
(DIHAPUSKAN) Daftar database yang akan dihapus ketika autoDiscoverDatabases diaktifkan.
include-databases
(DIHAPUSKAN) Daftar database yang hanya disertakan ketika autoDiscoverDatabases diaktifkan.
log.level
Setel level logging: salah satu dari debug
, info
, warn
, error
.
log.format
Atur format log: salah satu logfmt
, json
.
Variabel lingkungan berikut mengonfigurasi eksportir:
DATA_SOURCE_NAME
format lama default. Menerima formulir URI dan argumen formulir kunci=nilai. URI mungkin berisi nama pengguna dan kata sandi untuk terhubung.
DATA_SOURCE_URI
merupakan alternatif DATA_SOURCE_NAME
yang secara eksklusif menerima nama host tanpa komponen nama pengguna dan kata sandi. Misalnya, my_pg_hostname
atau my_pg_hostname:5432/postgres?sslmode=disable
.
DATA_SOURCE_URI_FILE
Sama seperti di atas tetapi membaca URI dari sebuah file.
DATA_SOURCE_USER
Saat menggunakan DATA_SOURCE_URI
, variabel lingkungan ini digunakan untuk menentukan nama pengguna.
DATA_SOURCE_USER_FILE
Sama, tetapi membaca nama pengguna dari suatu file.
DATA_SOURCE_PASS
Saat menggunakan DATA_SOURCE_URI
, variabel lingkungan ini digunakan untuk menentukan kata sandi yang akan digunakan untuk terhubung.
DATA_SOURCE_PASS_FILE
Sama seperti di atas tetapi membaca kata sandi dari suatu file.
PG_EXPORTER_WEB_TELEMETRY_PATH
Jalur untuk mengekspos metrik. Standarnya adalah /metrics
.
PG_EXPORTER_DISABLE_DEFAULT_METRICS
Gunakan hanya metrik yang disediakan dari queries.yaml
. Nilai bisa true
atau false
. Standarnya false
.
PG_EXPORTER_DISABLE_SETTINGS_METRICS
Gunakan tanda jika Anda tidak ingin mengikis pg_settings
. Nilai bisa true
atau false
. Standarnya false
.
PG_EXPORTER_AUTO_DISCOVER_DATABASES
(DIHAPUSKAN) Apakah akan menemukan database di server secara dinamis. Nilai bisa true
atau false
. Standarnya false
.
PG_EXPORTER_EXTEND_QUERY_PATH
Jalur ke file YAML yang berisi kueri khusus untuk dijalankan. Lihat queries.yaml
untuk contoh formatnya.
PG_EXPORTER_CONSTANT_LABELS
(DIHAPUSKAN) Label yang akan disetel di semua metrik. Daftar pasangan label=value
, dipisahkan dengan koma.
PG_EXPORTER_EXCLUDE_DATABASES
(DIHAPUSKAN) Daftar database yang dipisahkan koma untuk dihapus ketika autoDiscoverDatabases diaktifkan. Defaultnya adalah string kosong.
PG_EXPORTER_INCLUDE_DATABASES
(DIHAPUSKAN) Daftar database yang dipisahkan koma untuk hanya disertakan ketika autoDiscoverDatabases diaktifkan. Defaultnya adalah string kosong, artinya izinkan semua.
PG_EXPORTER_METRIC_PREFIX
Awalan yang digunakan untuk setiap metrik default yang diekspor oleh postgres-exporter. Standarnya adalah pg
Pengaturan yang ditetapkan oleh variabel lingkungan yang dimulai dengan PG_
akan ditimpa oleh tanda CLI yang sesuai jika diberikan.
Nama sumber data server PostgreSQL harus ditetapkan melalui variabel lingkungan DATA_SOURCE_NAME
.
Untuk menjalankannya secara lokal pada instalasi Debian/Ubuntu default, ini akan berfungsi (transposisi ke skrip init sesuai kebutuhan):
sudo -u postgres DATA_SOURCE_NAME="user=postgres host=/var/run/postgresql/ sslmode=disable" postgres_exporter
Selain itu, Anda dapat mengatur daftar sumber untuk mengambil contoh yang berbeda dari satu pengaturan eksportir. Cukup tentukan string yang dipisahkan koma.
sudo -u postgres DATA_SOURCE_NAME="port=5432,port=6432" postgres_exporter
Lihat modul github.com/lib/pq untuk mengetahui cara lain memformat string koneksi.
Eksportir akan mencoba mengekspor metrik tambahan secara dinamis jika metrik tersebut ditambahkan di masa mendatang, namun metrik tersebut akan ditandai sebagai "belum diketik". Peta metrik tambahan dapat dengan mudah dibuat dari dokumentasi Postgres dengan menyalin tabel dan menggunakan cuplikan Python berikut:
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 ())
Sesuaikan nilai tipe nilai prometheus yang dihasilkan dengan tepat. Hal ini membantu membangun metrik dokumentasi mandiri yang kaya bagi eksportir.
Fitur ini tidak digunakan lagi karena fungsi kolektor bawaan. Untuk pemantauan database SQL umum, lihat sql_exporter.
Argumen baris perintah -extend.query-path menentukan file YAML yang berisi kueri tambahan untuk dijalankan. Beberapa contoh disediakan di queries.yaml.
Untuk bekerja dengan versi postgres yang tidak didukung secara resmi (misalnya 8.2.15), atau varian postgres (misalnya Greenplum), Anda dapat menonaktifkan metrik default dengan tanda --disable-default-metrics
. Tindakan ini menghapus semua metrik bawaan, dan hanya menggunakan metrik yang ditentukan oleh kueri dalam file queries.yaml
yang Anda berikan (jadi Anda harus menyediakannya, jika tidak, eksportir tidak akan mengembalikan apa pun kecuali status internal dan database Anda).
Untuk mengambil metrik dari semua database di server database, DSN database dapat ditemukan secara dinamis melalui flag --auto-discover-databases
. Jika benar, SELECT datname FROM pg_database WHERE datallowconn = true AND datistemplate = false and datname != current_database()
dijalankan untuk semua DSN yang dikonfigurasi. Dari hasilnya, satu set DSN baru dibuat yang metriknya diambil.
Selain itu, opsi --exclude-databases
menambahkan kemungkinan untuk memfilter hasil penemuan otomatis untuk membuang database yang tidak Anda perlukan.
Jika Anda hanya ingin menyertakan subkumpulan database, Anda dapat menggunakan opsi --include-databases
. Eksportir masih membuat permintaan ke tabel pg_database
, tetapi melakukan scrape hanya jika database ada dalam daftar yang disertakan.
Untuk dapat mengumpulkan metrik dari tampilan pg_stat*
sebagai non-pengguna super di server PostgreSQL versi >= 10, Anda dapat memberikan peran bawaan pg_monitor
atau pg_read_all_stats
kepada pengguna. Jika Anda perlu memantau server PostgreSQL lama, Anda harus membuat fungsi dan tampilan sebagai pengguna super, dan menetapkan izin secara terpisah untuk fungsi dan tampilan tersebut.
-- 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;
Jalankan perintah berikut jika Anda menggunakan versi PostgreSQL >= 10
GRANT pg_monitor to postgres_exporter;
Jalankan perintah SQL berikut hanya jika Anda menggunakan versi PostgreSQL yang lebih lama dari 10. Di PostgreSQL, tampilan dijalankan dengan izin dari pengguna yang membuatnya sehingga dapat bertindak sebagai penghalang keamanan. Fungsi perlu dibuat untuk membagikan data ini dengan non-pengguna super. Hanya membuat tampilan saja yang akan menghilangkan bagian data terpenting.
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;
CATATAN
Ingatlah untuk menggunakan nama databasepostgres
dalam string koneksi: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