- 数据库主机上按实例运行 prometheus-community/postgres_exporter 0.20.1, 以实例 OS 用户走本地 socket,经 peer + ident 映射到仅有 pg_monitor 的 homelab_monitor 角色;无密码、不经 Bao。版本与官方 sha256sums.txt 同源。 - prod/dev 启用 pg_stat_statements;monitoring.yml 仅在未生效时 reload/重启 (prod 走 Patroni pending restart),重复执行 changed=0。 - 告警以上游 postgres_mixin 为底改写为 PrometheusRule,阈值对齐 Patroni failover lag 与 max_slot_wal_keep_size;抓取目标带 env 标签。 - Alertmanager 新增 env="dev" 路由到独立 dev 频道,dev SQL 检查告警补 env。 Co-Authored-By: Claude Opus 5.5 <[email protected]>
28 lines
1.4 KiB
Django/Jinja
28 lines
1.4 KiB
Django/Jinja
[Unit]
|
|
Description=PostgreSQL {{ pg_instance }} SQL metrics
|
|
After=homelab-postgresql-{{ pg_instance }}.service
|
|
[Service]
|
|
# 本地 socket 上 TLS 无意义,sslmode=disable 只是避免驱动默认尝试 TLS。
|
|
# 以实例 OS 用户运行才能进入 0700 的 socket 目录;peer + ident 把它映射成只读监控角色。
|
|
# 监控角色只约束 exporter 自己发出的查询;这不是隔离边界——同一 OS 用户仍可经 peer 以
|
|
# superuser 登录,exporter 被攻破即等同实例属主。InaccessiblePaths 只是不让它直接读写
|
|
# 数据目录、私钥与 pgpass。暴露面因此仅限内网监听地址。
|
|
User={{ pg_profile.user }}
|
|
Group={{ pg_profile.user }}
|
|
Environment="DATA_SOURCE_NAME=host={{ pg_socket_dir }} port={{ pg_profile.port }} user={{ pg_monitor_user }} dbname=postgres sslmode=disable application_name=postgres_exporter"
|
|
ExecStart=/opt/postgres_exporter-{{ pg_exporter_version }}.linux-amd64/postgres_exporter \
|
|
--web.listen-address={{ pg_address }}:{{ pg_profile.exporter_port }} \
|
|
--collector.database_wraparound --collector.long_running_transactions \
|
|
--collector.stat_checkpointer --collector.stat_wal_receiver --collector.stat_statements
|
|
Restart=on-failure
|
|
RestartSec=5
|
|
InaccessiblePaths={{ pg_parent_dir }} {{ pg_config_dir }}
|
|
NoNewPrivileges=true
|
|
ProtectSystem=strict
|
|
ProtectHome=true
|
|
PrivateTmp=true
|
|
PrivateDevices=true
|
|
MemoryMax=64M
|
|
[Install]
|
|
WantedBy=multi-user.target
|