3.3 핵심 Metric 지도
처음부터 모든 metric을 dashboard에 올리지 않습니다. Availability, workload, saturation, maintenance, durability라는 다섯 질문에 답할 최소 집합부터 고릅니다.
Availability
up{job="postgres"}
pg_up
up은 Prometheus가 exporter endpoint scrape에 성공했는지, pg_up은 exporter가 PostgreSQL 수집에 성공했는지를 나타냅니다.
up | pg_up | 해석 |
|---|---|---|
| 0 | 없음 | exporter/network/scrape 설정 문제 |
| 1 | 0 | exporter는 응답하지만 DB 접속 또는 수집 실패 |
| 1 | 1 | 기본 수집 성공. 서비스 정상까지 보장하지는 않음 |
Connection과 saturation
현재 database별 backend 수는 gauge입니다.
sum by (instance) (
pg_stat_database_numbackends{datname!~"template.*"}
)
max_connections와 비교할 때는 superuser reserved slot, connection pool, 운영 접속 여유를 남깁니다. 숫자가 높다는 이유만으로 문제는 아닙니다. connection 대기나 신규 connection 실패와 함께 봅니다.
Transaction workload
sum by (instance) (
rate(pg_stat_database_xact_commit{datname!~"template.*"}[5m])
+ rate(pg_stat_database_xact_rollback{datname!~"template.*"}[5m])
)
Rollback 비율은 workload 성격에 따라 정상 범위가 다릅니다.
sum by (instance) (rate(pg_stat_database_xact_rollback[5m]))
/
sum by (instance) (
rate(pg_stat_database_xact_commit[5m])
+ rate(pg_stat_database_xact_rollback[5m])
)
Cache와 I/O
sum by (instance) (rate(pg_stat_database_blks_hit[5m]))
/
sum by (instance) (
rate(pg_stat_database_blks_hit[5m])
+ rate(pg_stat_database_blks_read[5m])
)
이 비율은 PostgreSQL shared buffer hit입니다. OS page cache hit는 포함하지 않으므로 낮은 비율을 곧바로 physical disk 병목으로 해석하지 않습니다. node_exporter의 disk latency와 PostgreSQL I/O timing을 함께 확인합니다.
Temporary file 증가량도 봅니다.
sum by (instance) (rate(pg_stat_database_temp_bytes[5m]))
증가가 크면 sort나 hash가 work_mem을 넘었을 가능성이 있지만, query workload와 실행계획을 확인하기 전까지 work_mem을 전역으로 올리지 않습니다.
Lock과 deadlock
sum by (instance, mode) (pg_locks_count)
pg_locks_count는 mode별 lock 개수이지 blocking session 수가 아닙니다. AccessExclusiveLock 증가를 탐지하는 데는 도움이 되지만 blocking chain은 pg_blocking_pids()로 확인합니다.
Deadlock은 counter 증가를 경보 후보로 삼습니다.
increase(pg_stat_database_deadlocks[10m]) > 0
WAL과 replication
Replica에서는 다음 gauge를 확인합니다.
pg_replication_is_replica
pg_replication_lag_seconds
pg_replication_last_replay_seconds
lag_seconds가 0이어도 WAL receive와 replay 위치가 같은 idle replica일 수 있습니다. 쓰기가 없는 시간에는 time lag만으로 복제 건강을 판정하기 어렵습니다. WAL byte 차이, receiver 상태, primary의 sender 상태를 함께 확인합니다.
Replication slot이 inactive인데 retained WAL이 계속 증가하면 disk capacity 문제로 이어질 수 있습니다. Slot active 상태와 WAL 보존량을 함께 경보화합니다.
Maintenance와 table 통계
stat_user_tables collector는 live/dead tuple, vacuum/analyze 시각과 횟수를 제공합니다. Table별 series가 생기므로 table 수가 많은 cluster에서는 cardinality를 먼저 계산합니다.
운영 우선순위는 다음과 같습니다.
- transaction ID wraparound까지 남은 여유
- 오래된 transaction과 vacuum 방해 session
- dead tuple 증가 속도
- autovacuum 실행 여부와 소요 시간
- table BLOAT 추정
Dashboard 최소 구성
up,pg_up- TPS와 rollback ratio
- connection 사용량
- lock mode와 deadlock 증가량
- cache hit ratio와 temp bytes/s
- WAL rate와 checkpoint
- replica lag와 slot retained WAL
- oldest transaction age와 dead tuple
- node CPU pressure/memory pressure/disk latency
Metric 이름은 exporter release에 따라 달라질 수 있으므로 배포한 version의 /metrics를 기준으로 panel과 rule을 검증합니다.