Fitur Pemantauan PostgreSQL Postgres_exporter Baru

Selamat siang, pembaca habr!


Dalam catatan pertama tentang posgres_exporter , saya memeriksa kasus yang agak istimewa ketika bekerja dengan fitcha baru pada waktu itu, yaitu kemampuan untuk memonitor serangkaian instance dan / atau database oleh satu eksportir. Dan dia menggambarkan “buket” masalah yang dia temui dan solusi apa yang dia gunakan untuk membuatnya bekerja.
Maka, pada 25 November, rilis postgres_exporter 0.8.0 berikutnya dirilis. Itu memecahkan masalah yang dijelaskan dalam artikel sebelumnya, dan juga, yang sangat bagus, menambahkan fungsionalitas baru.


Saya meminta kucing ...


Untuk mulai dengan, saya ingin memperkenalkan Anda ke postgre_exporter lebih terinci dan menulis semacam panduan mulai cepat singkat. Mari kita bahas poin-poin utama:


  1. Variabel Lingkungan dan Parameter Startup
  2. Apa itu metrik default?
  3. Cara menambahkan metrik Anda sendiri

Deskripsi


postgres_exporter - utilitas untuk mengumpulkan metrik dari instance klaster DBMS PostgreSQL dalam format Prometheus yang dapat diakses, ditulis dalam Go, adalah open source dan didistribusikan secara gratis.


Variabel Lingkungan dan Argumen Baris Perintah


Postgres_exporter, dengan demikian, tidak memiliki file konfigurasi dan semua parameter dilewatkan ke eksportir baik melalui variabel lingkungan atau melalui argumen baris perintah. Pada saat yang sama, parameter untuk menghubungkan ke DBMS hanya dapat ditransfer melalui variabel lingkungan.


Variabel lingkungan


Seperti disebutkan di atas, variabel lingkungan dapat dibagi menjadi dua kelompok. Yang pertama melewati string koneksi, yang terakhir menduplikasi argumen baris perintah.


Mari kita mulai dengan grup pertama. Variabel-variabel ini dimulai dengan DATA_SOURCE_ awalan:


  • DATA_SOURCE_NAME - digunakan secara default. Memungkinkan Anda merekam string koneksi dalam format = , dan dalam bentuk URI dan dapat berisi login dan kata sandi koneksi.
    Opsi pekerjaan yang valid untuk menghubungkan ke PostgreSQL:


    • postgresql://rolename@dbhost:dbport/datname?sslmode=disable ;
    • postgresql://rolename:rolpass@dbhost:dbport?sslmode=disable&db=datname ;
    • postgresql://rolename:rolpass@?sslmode=disable&dbname=database&host=dbhost&port=dbport ;
    • postgresql://rolename:rolpass@?sslmode=disable&dbname=database&host=/tmp (koneksi melalui soket UNIX, diambil dari direktori unix_socket_directories dari instance PostgreSQL);
    • host=dbhost port=dbport dbname=database user=rolename sslmode=disable ;

    Jika Anda perlu terhubung ke beberapa instance (menggunakan spasi setelah titik desimal tidak diizinkan):


    • postgresql://rolename@dbhost:dbport/datname?sslmode=disable,postgresql://rolename@dbhost:dbport/datname?sslmode=disable ;
    • sslmode=disable dbname=postgres host=127.0.0.1 port=5434 user=postgres,sslmode=disable dbname=postgres port=5432 user=postgres .

  • DATA_SOURCE_URI - Alternatif ke DATA_SOURCE_NAME. Opsi ini hanya cocok jika Anda berniat untuk terhubung ke satu instance PostgreSQL).
    Variabel DATA_SOURCE_URI menetapkan bagian URI tanpa nama pengguna dan kata sandi, dalam bentuk "dbhost: dbport / dbname? Key = value". Nama pengguna dan kata sandi diambil dari variabel lingkungan DATA_SOURCE_USER dan DATA_SOURCE_PASS, atau dari file DATA_SOURCE_USER_FILE DATA_SOURCE_PASS_FILE.
    Ketika nama pengguna dan kata sandi disimpan dalam file, isinya diekstraksi dan dipindahkan ke variabel DATA_SOURCE_USER dan DATA_SOURCE_PASS. Lebih lanjut, dalam kode, semua ini dikumpulkan dalam URI lengkap dalam bentuk: "postgresql://" + DATA_SOURCE_USER + ":" + DATA_SOURCE_PASS + "@" + DATA_SOURCE_URI
  • DATA_SOURCE_URI_FILE - sama seperti DATA_SOURCE_URI, hanya membaca dari file;
  • DATA_SOURCE_USER - saat menggunakan DATA_SOURCE_URI, tetapkan nama pengguna untuk menghubungkan ke DBMS;
  • DATA_SOURCE_USER_FILE - sama seperti DATA_SOURCE_USER, hanya membaca dari file;
  • DATA_SOURCE_PASS - saat menggunakan DATA_SOURCE_URI, setel kata sandi pengguna untuk menghubungkan ke DBMS;
  • DATA_SOURCE_PASS_FILE - sama seperti DATA_SOURCE_PASS, hanya membaca dari file;

Kelompok kedua termasuk argumen duplikat variabel. Yaitu saat startup, Anda punya pilihan, mengatur parameter operasi aplikasi dalam bentuk variabel lingkungan, atau lulus sebagai argumen saat startup. Mulailah dengan awalan PG_EXPORTER_ :


  • PG_EXPORTER_WEB_LISTEN_ADDRESS - setel alamat dan port yang melaluinya eksportir akan menerima permintaan dari Prometheus. Secara default :9187 ;
  • PG_EXPORTER_WEB_TELEMETRY_PATH - jalur di mana metrik diberikan. Secara default /metrics ;
  • PG_EXPORTER_DISABLE_DEFAULT_METRICS - menonaktifkan koleksi metrik secara default. Fakta bahwa metrik ini ada di bawah. Hanya benar atau salah yang menerima nilai. Salah secara default (koleksi metrik diizinkan);
  • PG_EXPORTER_DISABLE_SETTINGS_METRICS - menonaktifkan koleksi metrik dari tampilan pg_settings. Fakta bahwa metrik ini ada di bawah. Hanya benar atau salah yang menerima nilai. Salah secara default (koleksi metrik diizinkan);
  • PG_EXPORTER_AUTO_DISCOVER_DATABASES - mendeteksi semua basis data contoh turunan untuk mengumpulkan metrik mereka. Hanya benar atau salah yang menerima nilai. Secara default, false (metrik dikumpulkan hanya dalam database yang ditentukan dalam parameter koneksi);
  • PG_EXPORTER_EXCLUDE_DATABASES - mengecualikan database dari daftar database yang metrik dikumpulkan jika PG_EXPORTER_AUTO_DISCOVER_DATABASES=true . Merupakan daftar nama database yang dipisahkan koma. Defaultnya adalah string kosong. PENTING :
    • templat templat0 dan templat1 - tidak perlu dikecualikan, jadi mereka terpotong pada tahap mendapatkan daftar basis data dari pg_databases;
    • tidak dapat mengecualikan database yang ditentukan dalam URI.
  • PG_EXPORTER_EXTEND_QUERY_PATH - Jalur ke file YAML yang berisi permintaan pengguna. File queries.yaml berisi contoh;
  • PG_EXPORTER_CONSTANT_LABELS - Label (konstan) ditambahkan ke semua metrik. Itu ditulis sebagai daftar pasangan = , dipisahkan oleh koma.

Argumen baris perintah


  • alamat web.listen sama dengan PG_EXPORTER_WEB_LISTEN_ADDRESS;
  • web.telemetry-path - sama seperti PG_EXPORTER_WEB_TELEMETRY_PATH;
  • metrik disable-default-sama dengan PG_EXPORTER_DISABLE_DEFAULT_METRICS;
  • disable-settings-metrics sama dengan PG_EXPORTER_DISABLE_SETTINGS_METRICS;
  • basis data penemuan-otomatis sama dengan PG_EXPORTER_AUTO_DISCOVER_DATABASES;
  • kecualikan-database sama dengan PG_EXPORTER_EXCLUDE_DATABASES;
  • ext.query-path - sama seperti PG_EXPORTER_EXTEND_QUERY_PATH;
  • constantLabels - sama seperti PG_EXPORTER_CONSTANT_LABELS;
  • dumpmaps - Menampilkan konten internal peta metrik. Digunakan untuk men-debug permintaan pengguna. Tidak memulai aplikasi;
  • log.level - setel salah satu level logging yang mungkin: debug , info , warn , error , fatal ;
  • log.format - mengatur metode dan format output log. Sebagai contoh: logger:syslog?appname=bob&local=7 atau logger:stdout?json=true . Secara default, logger:stderr .

Metrik Bawaan


Metrik - adalah sekumpulan metrik pemantauan tertentu, koleksi yang diletakkan langsung dalam kode. Pengumpulan - dapat dinonaktifkan dengan menentukan parameter baris perintah --disable-default-metrics dan / atau --disable-settings-metrics atau dengan mendefinisikan variabel lingkungan yang sesuai.
Saya perhatikan bahwa dalam versi saat ini masalah menggunakan metrik diselesaikan ketika autoDiscovery diaktifkan, karena ada duplikasi metrik, yang menyebabkan kesalahan.


Secara default, metrik dari tampilan berikut dikirim ke pemantauan:


  • pg_stat_bgwriter;
  • pg_stat_database;
  • pg_stat_database_conflicts;
  • pg_locks;
  • pg_stat_replication;
  • pg_stat_activity;
  • pg_settings.

Yang harus Anda perhatikan adalah pg_stat_replication dan pg_stat_activity, karena set bidang yang dikembalikan tergantung pada versi PostgreSQL. Untuk ini, versi DBMS diperiksa di eksportir dan permintaan yang sesuai dipilih. Anda tidak dapat menentukan versi di kueri pengguna. Diasumsikan bahwa administrator sudah tahu versi yang mana instance akan dipantau. Masalah juga dapat muncul jika Anda mencoba mengumpulkan metrik oleh satu eksportir dari contoh versi yang berbeda.
Dengan metrik pengaturan instance (pg_settings), semuanya agak sederhana, mereka dibentuk oleh permintaan:


 SELECT name, setting, COALESCE(unit, ''), short_desc, vartype FROM pg_settings WHERE vartype IN ('bool', 'integer', 'real'); 

Dengan demikian, secara default, satu set metrik dibentuk hanya dari nilai numerik.


Selanjutnya, kami akan mempertimbangkan kesimpulan dari eksportir, termasuk bagaimana kami akan memahami mengapa metrik hard-code memiliki hak mereka untuk ada. Misalnya, ambil dua metrik: shared_buffers dan wal_sender_timeout. Dalam output eksportir, untuk setiap metrik kami mendapatkan tiga baris.
Baris pertama - merepresentasikan petunjuk dan terdiri dari nama metrik di postgres_exporter, deskripsi (kolom short_desc dari tampilan pg_settings) dan jika jenisnya dikonversi ke tipe dasar, diindikasikan yang mana (nilai dalam kurung siku).
Baris kedua menunjukkan jenis nilai, dalam hal Prometheus. Dan baris ketiga, metrik dengan satu set label dan nilai yang diberikan.


Kembalikan nilai untuk shared_buffers.


 # HELP pg_settings_shared_buffers_bytes Sets the number of shared memory buffers used by the server. [Units converted to bytes.] # TYPE pg_settings_shared_buffers_bytes gauge pg_settings_shared_buffers_bytes{server="127.0.0.1:5432"} 1.34217728e+08 

pg_settings_shared_buffers_bytes - nama metrik. Ini, sesuai dengan aturan bentuk yang baik, terdiri dari nama tabel, nama metrik dan satuan ukuran. Selanjutnya datang deskripsi singkat dari tabel pg_settings. Dan terakhir, indikasi bahwa nilai metrik telah dikonversi ke satuan byte (Unit dikonversi ke byte). Mengapa perlu memperhatikan yang terakhir, karena langsung dalam database nilainya terlihat sedikit berbeda, yaitu:


  name | setting | unit | short_desc ----------------+---------+------+-------------------------------------------------------------- shared_buffers | 16384 | 8kB | Sets the number of shared memory buffers used by the server. 

Jenis metrik yang kami miliki adalah GAUGE, yang artinya dapat mengambil nilai arbitrer dari waktu ke waktu. Dalam kasus kami, jumlah buffer, ketika fine-tuning, dapat berubah di kedua arah.
Anda dapat mempelajari lebih lanjut tentang jenis metrik dan perbedaannya dalam dokumentasi Prometheus.


Metrik berikut adalah wal_sender_timeout. Bidang informasi dikumpulkan sesuai dengan prinsip yang sama seperti yang dijelaskan di atas. Hanya dalam kasus ini nilai metrik dikonversi menjadi detik, dan basis data disimpan dalam milidetik. Dengan fitur ini, Anda harus berhati-hati dan mempertimbangkan ketika merencanakan grafik.


 # HELP pg_settings_wal_sender_timeout_seconds Sets the maximum time to wait for WAL replication. [Units converted to seconds.] # TYPE pg_settings_wal_sender_timeout_seconds gauge pg_settings_wal_sender_timeout_seconds{server="127.0.0.1:5432"} 60 

Nilai yang disimpan dalam database:


 demo=# SELECT name, setting, COALESCE(unit, ''), short_desc, vartype FROM pg_settings WHERE name='wal_sender_timeout'; name | setting | coalesce | short_desc | vartype --------------------+---------+----------+----------------------------------------------------+--------- wal_sender_timeout | 60000 | ms | Sets the maximum time to wait for WAL replication. | integer 

Semua nilai yang memiliki unit dikurangi menjadi dua jenis: metrik volume menjadi byte; metrik waktu ke detik.


Set Metrik Khusus


Selain atau sebagai pengganti metrik default, Anda dapat menggunakan metrik Anda sendiri. Untuk melakukan ini, cukup setel path file, dengan permintaan pengguna, melalui argumen --extend.query-path = query.yaml atau melalui variabel lingkungan PG_EXPORTER_EXTEND_QUERY_PATH.
Repositori proyek memiliki file YAML dengan contoh: queries.yaml


Saya perhatikan bahwa dibandingkan dengan versi sebelumnya, di 0.8.0 master kunci baru dan cache_seconds ditambahkan. Dalam contoh di bawah ini, kami menganalisis format perekaman dan tujuan bidang.


Contoh konten file queries.yaml


 pg_database: query: "SELECT pg_database.datname, pg_database_size(pg_database.datname) as size_bytes FROM pg_database" master: true cache_seconds: 30 metrics: - datname: usage: "LABEL" description: "Name of the database" - size_bytes: usage: "GAUGE" description: "Disk space used by the database" 

Kunci dan nilai dari contoh di atas:


  • pg_database - awalan acak untuk metrik yang dikembalikan oleh permintaan (Diperlukan);
  • query - berisi kueri SQL (Diperlukan);
  • master - mengeksekusi permintaan hanya dalam database yang ditentukan saat menghubungkan ke URI (master database). Diperlukan saat memulai eksportir dengan bendera --auto-temukan-database. Terima benar atau salah. Salah secara default. (Opsional);
  • cache_seconds - waktu di mana data cache akan dikembalikan. Sudah diatur dalam hitungan detik;
  • metrics - berisi daftar tag dan metrik;
  • datname , size_bytes - daftar item. Nama item daftar harus cocok dengan nama kolom dalam kueri;
  • usage - jenis nilai. Terima COUNTER, GAUGE, LABLE (selengkapnya di dokumentasi Prometheus)
  • description - Deskripsi metrik khusus

Contoh metrik pengembalian:


 # HELP pg_database_size_bytes Disk space used by the database # TYPE pg_database_size_bytes gauge pg_database_size_bytes{datname="dbtest1",server="localhost:5432"} 1.0105503e+07 pg_database_size_bytes{datname="demo",server="localhost:5432"} 2.813719199e+09 pg_database_size_bytes{datname="postgres",server="localhost:5432"} 4.735491e+06 pg_database_size_bytes{datname="template0",server="localhost:5432"} 7.758339e+06 pg_database_size_bytes{datname="template1",server="localhost:5432"} 7.758339e+06 

Ringkasan


Baiklah, kami meringkas, semua yang kami miliki di versi terbaru postgres_exporter 0.8.0. Pada dasarnya, semua perbaikan terkait dengan pemantauan beberapa instance dan / atau beberapa database dalam sebuah instance.


  • Argumen pengecualian-basis data (muncul di 0.6.0) memungkinkan Anda untuk mengecualikan basis data dari daftar basis data tempat metrik akan dikumpulkan. Tetapi Anda tidak dapat mengecualikan database yang ditentukan dalam koneksi URI, karena itu adalah basis induk;
  • Sekarang Anda dapat menggunakan kueri khusus untuk tampilan global (pg_stat_activity, pg_stat_database, dll.) Bersama dengan argumen database pencarian otomatis. Untuk melakukan ini, bidang master tambahan telah ditambahkan, menunjukkan bahwa permintaan harus dieksekusi hanya dalam database master;
  • Sekarang Anda dapat menggunakan metrik default dengan argumen auto-discovery-database;
  • Untuk permintaan pengguna, bidang cache_seconds telah ditambahkan, yang memungkinkan Anda untuk mengatur waktu (dalam detik) di mana respons server terhadap permintaan terkait akan di-cache.

Sumber


  • Prometheus [ 1 ] adalah aplikasi sumber terbuka yang digunakan untuk memantau dan mengingatkan acara. Ini menulis metrik waktu-nyata ke basis data deret waktu yang dibangun menggunakan model permintaan HTTP, dengan kueri yang fleksibel dan peringatan waktu-nyata.
  • postgres_exporter adalah pengekspor metrik PostgreSQL untuk Prometheus.
    Versi, pada saat penulisan, v 0.5.1. Versi PostgreSQL 9.4+ yang didukung (tetapi seperti yang diperlihatkan oleh praktik, itu berfungsi pada 9.3).

Source: https://habr.com/ru/post/id480902/


All Articles