ผู้ส่งออก Prometheus สำหรับตัววัดเซิร์ฟเวอร์ PostgreSQL
CI เวอร์ชัน PostgreSQL ที่ทดสอบแล้ว: 11
, 12
, 13
, 14
, 15
, 16
แพ็คเกจนี้ใช้ได้กับ 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 "
ตัวอย่างการกำหนดค่า 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
ตอนนี้ใช้ DATA_SOURCE_PASS_FILE กับไฟล์ที่เมาท์ซึ่งมีรหัสผ่านเพื่อป้องกันการมีรหัสผ่านในตัวแปรสภาพแวดล้อม
กระบวนการคอนเทนเนอร์ทำงานด้วย uid/gid 65534 (สำคัญสำหรับการอนุญาตไฟล์)
คุณลักษณะนี้อยู่ในรุ่นเบต้าและอาจต้องมีการเปลี่ยนแปลงในรุ่นต่อๆ ไป ข้อเสนอแนะยินดีต้อนรับ
ผู้ส่งออกรายนี้รองรับรูปแบบหลายเป้าหมาย ซึ่งช่วยให้เรียกใช้อินสแตนซ์เดียวของผู้ส่งออกนี้สำหรับเป้าหมาย postgres หลายรายการ การใช้ฟังก์ชันหลายเป้าหมายของผู้ส่งออกนี้เป็น ทางเลือก และมีไว้สำหรับกรณีที่ไม่สามารถติดตั้งผู้ส่งออกเป็นรถเทียมข้างรถจักรยานยนต์ได้ เช่น บริการที่จัดการโดย SaaS
หากต้องการใช้ฟังก์ชันหลายเป้าหมาย ให้ส่งคำขอ http ไปยังตำแหน่งข้อมูล /probe?target=foo:5432
โดยที่เป้าหมายถูกตั้งค่าเป็น DSN ของอินสแตนซ์ postgres เพื่อดึงข้อมูลเมตริกออกมา
เพื่อหลีกเลี่ยงการใส่ข้อมูลที่ละเอียดอ่อน เช่น ชื่อผู้ใช้และรหัสผ่านใน URL โมดูลการตรวจสอบสิทธิ์ที่กำหนดค่าไว้ล่วงหน้าจะได้รับการสนับสนุนผ่านทางส่วน auth_modules ของไฟล์กำหนดค่า auth_modules สำหรับ DSN สามารถใช้กับตำแหน่งข้อมูล /probe
ได้โดยการระบุพารามิเตอร์ ?auth_module=foo
http
ตัวอย่างการกำหนดค่า 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.
ไฟล์การกำหนดค่าควบคุมพฤติกรรมของผู้ส่งออก สามารถตั้งค่าได้โดยใช้แฟล็กบรรทัดคำสั่ง --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
สิ่งนี้จะสร้างอิมเมจนักเทียบท่าเป็น 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
address ที่อยู่สำหรับรับฟังเว็บอินเตอร์เฟสและการตรวจวัดทางไกล ค่าเริ่มต้นคือ :9187
ไฟล์การกำหนดค่า web.config.file
เพื่อใช้ TLS และ/หรือการตรวจสอบสิทธิ์ขั้นพื้นฐาน รูปแบบของไฟล์อธิบายไว้ในที่เก็บเครื่องมือผู้ส่งออก
web.telemetry-path
เส้นทางที่ใช้แสดงเมตริก ค่าเริ่มต้นคือ /metrics
disable-default-metrics
ใช้เฉพาะเมตริกที่มาจาก queries.yaml
ผ่าน --extend.query-path
ค่าเริ่มต้นเป็น false
disable-settings-metrics
ใช้การตั้งค่าสถานะหากคุณไม่ต้องการขูด pg_settings
ค่าเริ่มต้นเป็น 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 เริ่มต้น สิ่งนี้จะใช้งานได้ (เปลี่ยนเป็นสคริปต์เริ่มต้นตามความเหมาะสม):
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 สำหรับวิธีอื่นๆ ในการจัดรูปแบบสตริงการเชื่อมต่อ
ผู้ส่งออกจะพยายามส่งออกเมตริกเพิ่มเติมแบบไดนามิกหากมีการเพิ่มในอนาคต แต่จะถูกทำเครื่องหมายเป็น "ไม่ได้พิมพ์" คุณสามารถสร้างแผนที่เมตริกเพิ่มเติมได้อย่างง่ายดายจากเอกสารของ Postgres โดยการคัดลอกตารางและใช้ตัวอย่าง Python ต่อไปนี้:
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 ())
ปรับค่าของประเภทค่าโพรมีธีอุสผลลัพธ์ให้เหมาะสม ซึ่งจะช่วยสร้างตัวชี้วัดการจัดทำเอกสารด้วยตนเองที่สมบูรณ์สำหรับผู้ส่งออก
คุณลักษณะนี้เลิกใช้แล้วเพื่อสนับสนุนฟังก์ชันตัวรวบรวมในตัว สำหรับการตรวจสอบฐานข้อมูล SQL ทั่วไป โปรดดูที่ sql_exporter
อาร์กิวเมนต์บรรทัดคำสั่ง -extend.query-path ระบุไฟล์ YAML ที่มีการสืบค้นเพิ่มเติมที่จะเรียกใช้ ตัวอย่างบางส่วนมีอยู่ใน query.yaml
หากต้องการทำงานกับ postgres เวอร์ชันที่ไม่รองรับอย่างเป็นทางการ (เช่น 8.2.15) หรือเวอร์ชันของ postgres (เช่น Greenplum) คุณสามารถปิดการใช้งานการวัดเริ่มต้นด้วยการตั้งค่าสถานะ --disable-default-metrics
การดำเนินการนี้จะลบเมตริกในตัวทั้งหมดออก และใช้เฉพาะเมตริกที่กำหนดโดยข้อความค้นหาในไฟล์ queries.yaml
ที่คุณระบุ (ดังนั้นคุณต้องระบุข้อมูลดังกล่าว ไม่เช่นนั้นผู้ส่งออกจะไม่ส่งคืนอะไรเลยนอกจากสถานะภายใน ไม่ใช่ฐานข้อมูลของคุณ)
หากต้องการดึงตัววัดจากฐานข้อมูลทั้งหมดบนเซิร์ฟเวอร์ฐานข้อมูล คุณสามารถค้นพบ DSN ของฐานข้อมูลได้แบบไดนามิกผ่านแฟล็ก --auto-discover-databases
เมื่อเป็นจริง SELECT datname FROM pg_database WHERE datallowconn = true AND datistemplate = false and datname != current_database()
จะถูกรันสำหรับ DSN ที่กำหนดค่าไว้ทั้งหมด จากผลลัพธ์ที่ได้ ชุด DSN ใหม่จะถูกสร้างขึ้นเพื่อคัดลอกเมตริก
นอกจากนี้ ตัวเลือก --exclude-databases
ยังเพิ่มความเป็นไปได้ในการกรองผลลัพธ์จากการค้นพบอัตโนมัติเพื่อละทิ้งฐานข้อมูลที่คุณไม่ต้องการ
หากคุณต้องการรวมเฉพาะฐานข้อมูลชุดย่อย คุณสามารถใช้ตัวเลือก --include-databases
ผู้ส่งออกยังคงส่งคำขอไปยังตาราง pg_database
แต่จะทำการคัดลอกจากเฉพาะในกรณีที่ฐานข้อมูลอยู่ในรายการรวม
เพื่อให้สามารถรวบรวมตัววัดจากมุมมอง pg_stat*
ในฐานะผู้ใช้ที่ไม่ใช่ผู้ใช้ขั้นสูงในเซิร์ฟเวอร์ PostgreSQL เวอร์ชัน >= 10 คุณสามารถมอบบทบาทในตัว 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;
เรียกใช้คำสั่ง SQL ต่อไปนี้เฉพาะเมื่อคุณใช้ PostgreSQL เวอร์ชันเก่ากว่า 10 เท่านั้น ใน 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