query:| SELECT
datname,
numbackends,
xact_commit,
xact_rollback,
blks_read,
blks_hit
FROM pg_stat_database
WHERE datname NOT IN ('template0', 'template1')
pg_xact_age:name:pg_xact_agedesc:"开放事务年龄分布直方图"query:| SELECT datname,
greatest(0, extract(epoch FROM now() - xact_start)) AS seconds
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() AND backend_type = 'client backend'
AND datname IS NOT NULL AND xact_start IS NOT NULL;ttl:10tags:[cluster]metrics:- datname:{usage:LABEL, description:"数据库名称"}- seconds:usage:HISTOGRAMbucket:[1,3,10,30,100,300,1000,3000,10000,30000,100000]description:"开放事务年龄快照(秒)"
pg_connections:desc:"当前数据库连接"query:| SELECT
count(*) as total,
count(*) FILTER (WHERE state = 'active') as active,
count(*) FILTER (WHERE state = 'idle') as idle,
count(*) FILTER (WHERE state = 'idle in transaction') as idle_in_transaction
FROM pg_stat_activity
WHERE pid != pg_backend_pid()ttl:1metrics:- total:{usage:GAUGE, description:"总连接数"}- active:{usage:GAUGE, description:"活跃连接数"}- idle:{usage:GAUGE, description:"空闲连接数"}- idle_in_transaction:{usage:GAUGE, description:"事务中空闲连接数"}
pg_stat_statements_metrics:desc:"查询性能统计"tags:[extension:pg_stat_statements]query:| SELECT
sum(calls) as total_calls,
sum(total_exec_time) as total_time,
sum(mean_exec_time * calls) / sum(calls) as mean_time
FROM pg_stat_statementsttl:60metrics:- total_calls:{usage:COUNTER}- total_time:{usage:COUNTER, scale:0.001}- mean_time:{usage:GAUGE, scale:0.001}
自定义采集器
创建自己的指标
在配置目录中创建新的 YAML 文件:
# /etc/pg_exporter/custom_metrics.ymlapp_metrics:desc:"应用特定指标"query:| SELECT
(SELECT count(*) FROM users WHERE active = true) as active_users,
(SELECT count(*) FROM orders WHERE created_at > NOW() - '1 hour'::interval) as recent_orders,
(SELECT avg(processing_time) FROM jobs WHERE completed_at > NOW() - '5 minutes'::interval) as avg_job_timettl:30metrics:- active_users:{usage:GAUGE, description:"当前活跃用户数"}- recent_orders:{usage:GAUGE, description:"最近一小时的订单数"}- avg_job_time:{usage:GAUGE, description:"平均作业处理时间"}
测试您的采集器:
pg_exporter --explain --config=/etc/pg_exporter/
条件指标
使用谓词查询实现条件指标:
partition_metrics:desc:"分区表指标"predicate_queries:- name:"检查是否使用了分区"predicate_query:| SELECT EXISTS (
SELECT 1 FROM pg_class
WHERE relkind = 'p' LIMIT 1
)query:| SELECT
parent.relname as parent_table,
count(*) as partition_count,
sum(pg_relation_size(child.oid)) as total_size
FROM pg_inherits
JOIN pg_class parent ON parent.oid = pg_inherits.inhparent
JOIN pg_class child ON child.oid = pg_inherits.inhrelid
WHERE parent.relkind = 'p'
GROUP BY parent.relnamettl:300metrics:- parent_table:{usage:LABEL}- partition_count:{usage:GAUGE}- total_size:{usage:GAUGE}