PGD Monitor collects these metrics and exposes them consistently across SQL, using bdr.ts_metrics() and related functions, as well as its REST API, its web UI, and its Prometheus /metrics endpoint. See PGD Monitor for how to enable and access each of those interfaces.
PGD timeseries metrics
These metrics come from the registry that bdr.ts_metrics() returns. The monitor worker samples them roughly every 10 seconds, except where noted.
| Metric | Unit | Sample interval | Description |
|---|---|---|---|
pgd_sys_cpu_pct | Percent | 10s | CPU utilization as a percentage of total capacity. |
pgd_sys_mem_pct | Percent | 10s | Memory utilization as a percentage of total available. |
pgd_sys_disk_pgdata_free_bytes | Bytes | 60s | Free disk space on the PGDATA volume. |
pgd_sys_disk_pgdata_total_bytes | Bytes | 60s | Total disk space on the PGDATA volume. |
pgd_sys_disk_pgwal_free_bytes | Bytes | 60s | Free disk space on the write-ahead log (WAL) volume. |
pgd_sys_disk_pgwal_total_bytes | Bytes | 60s | Total disk space on the WAL volume. |
pgd_pg_connections | Count | 10s | Total number of active Postgres backend connections. |
pgd_pg_active_queries | Count | 10s | Number of currently active (non-idle) queries. |
pgd_connmgr_conns_rw | Count | 10s | Client connections through the Connection Manager's read-write proxy port. |
pgd_connmgr_conns_ro | Count | 10s | Client connections through the Connection Manager's read-only proxy port. |
pgd_pg_tps | Per second | 10s | Committed and aborted transactions per second. |
pgd_pg_cache_hit_pct | Percent | 10s | Buffer cache hit ratio of the PGD database. |
pgd_pg_deadlocks_rate | Per second | 10s | Deadlocks per second in the PGD database. |
pgd_pg_wraparound_age_max | Count | 60s | Age in transactions of the oldest frozen-xid horizon across all databases. |
pgd_pg_longest_tx_seconds | Seconds | 10s | Age in seconds of the longest open transaction. |
pgd_max_replay_lag_bytes | Bytes | 10s | Maximum replication replay lag in bytes across all peers. |
pgd_oldest_kept_lag_bytes | Bytes | 10s | Size of retained WAL needed by the cluster, kept using the group slot. |
pgd_analytics_lag_bytes | Bytes | 10s | Replication lag in bytes for analytics nodes. |
pgd_clock_drift_max_milliseconds | Milliseconds | 10s | Approximate maximum clock drift across nodes. |
pgd_conflicts_rate | Per second | 10s | Replication conflicts per second across all apply workers. |
pgd_apply_errors_rate | Per second | 10s | Apply errors per second across all apply workers. |
Commit latency histogram
pgd_commit_latency_milliseconds is a histogram-kind metric giving the mean commit latency, in milliseconds, across all active commit scopes. The monitor worker samples it every 60 seconds. Read it with bdr.ts_histogram(), bdr.ts_histogram_distribution(), or bdr.ts_histogram_cumulative(), or as the _bucket, _sum, and _count series on the Prometheus endpoint.
Cluster state metrics
These identity and Raft metrics come from cached cluster catalog data rather than the timeseries registry, so they're available on the Prometheus endpoint and the REST API, but not through bdr.ts_metrics(). Unless noted, each is an identity metric with the constant value 1, carrying its payload in labels.
| Metric | Labels | Description |
|---|---|---|
pgd_node_info | node_name | Identity of the node serving the request. |
pgd_raft_state | node_group, state | Raft state of this node in the group. |
pgd_raft_leader | node_group, node_name | Current Raft leader of the group. |
pgd_raft_term | node_group | Current Raft term (gauge). |
pgd_raft_commit_index | node_group | Raft commit index (gauge). |
pgd_write_leader | node_group, node_name | Current write leader of the group. |
pgd_read_node | node_group, node_name | A current read node of the group. Repeats once per read node. |
pgd_replication_sent_lsn_bytes | target_name | WAL position sent to the target node, as bytes since 0/0. |
pgd_replication_replay_lsn_bytes | target_name | WAL position applied by the target node, as bytes since 0/0. |
pgd_replication_received_lsn_bytes | origin_name | WAL position received from the origin node, as bytes since 0/0. |
Log sequence number (LSN) positions are exported as bytes since 0/0, so you can subtract them directly in PromQL. For example, sent minus replay equals apply lag in bytes.
Commit scope counters
Per-commit-scope transaction counters, labeled by commit_scope. Only scopes that have been used are reported.
| Metric | Description |
|---|---|
pgd_commit_scope_calls_total | Transactions that used the commit scope. |
pgd_commit_scope_commits_total | Commits under the commit scope. |
pgd_commit_scope_aborts_total | Aborts under the commit scope. |
pgd_commit_scope_degrades_total | Transactions that hit degraded mode under the commit scope. |
pgd_commit_scope_config_degrades_total | Transactions started while the commit scope was already in degraded mode. |
Postgres statistics metrics
These metrics mirror Prometheus postgres_exporter collectors, read from the local node's statistics views. They're available only on the Prometheus endpoint, and only when bdr.monitor_prometheus_pg_metrics is on (the default). Set it to off on a node if postgres_exporter already runs there and you don't want duplicate series, then reload the configuration. PGD-native metrics keep exporting either way.
Per database
Labeled by datname. Includes template databases, since their frozen-xid horizon matters for wraparound.
| Metric | Type | Description |
|---|---|---|
pgd_pg_stat_database_numbackends | Gauge | Backends currently connected to the database. |
pgd_pg_stat_database_xact_commit_total | Counter | Committed transactions. |
pgd_pg_stat_database_xact_rollback_total | Counter | Rolled-back transactions. |
pgd_pg_stat_database_blks_read_total | Counter | Disk blocks read. |
pgd_pg_stat_database_blks_hit_total | Counter | Disk blocks found in shared buffers. |
pgd_pg_stat_database_deadlocks_total | Counter | Deadlocks detected. |
pgd_pg_stat_database_temp_files_total | Counter | Temporary files written by queries. |
pgd_pg_stat_database_temp_bytes_total | Counter | Bytes written to temporary files by queries. |
pgd_pg_database_wraparound_age_datfrozenxid | Gauge | Age in transactions of the database's frozen-xid horizon. |
pgd_pg_database_wraparound_age_datminmxid | Gauge | Age in multixacts of the database's minimum-multixact horizon. |
pgd_pg_database_size_bytes | Gauge | Database size in bytes. |
Non-PGD replication slots
Labeled by slot_name, slot_type, and database. PGD's own slots already have dedicated pgd_replication_* families above, so this group catches external or orphaned slots instead, such as change data capture (CDC) consumers, removed subscribers, or physical standbys that silently retain WAL.
| Metric | Description |
|---|---|
pgd_pg_replication_slot_active | Whether the slot has an active connection. |
pgd_pg_replication_slot_retained_wal_bytes | WAL retained by the slot. |
pgd_pg_replication_slot_safe_wal_size_bytes | WAL the slot can still write before reaching max_slot_wal_keep_size. |
pgd_pg_replication_slot_wal_status | WAL availability of the slot (identity metric, labeled wal_status with values reserved, extended, unreserved, or lost). |
Instance-wide metrics
| Metric | Type | Description |
|---|---|---|
pgd_pg_wal_segments | Gauge | WAL segment files in pg_wal. |
pgd_pg_wal_size_bytes | Gauge | Total size of WAL segment files in pg_wal. |
pgd_pg_stat_archiver_archived_total | Counter | WAL files archived successfully. |
pgd_pg_stat_archiver_failed_total | Counter | Failed WAL archiving attempts. |
pgd_pg_stat_archiver_last_archive_age_seconds | Gauge | Seconds since the last successful WAL archive. Absent until one succeeds. |
pgd_pg_stat_checkpointer_timed_total | Counter | Scheduled checkpoints performed. |
pgd_pg_stat_checkpointer_requested_total | Counter | Requested checkpoints performed, driven by WAL volume rather than the schedule. |
pgd_pg_stat_checkpointer_write_time_seconds_total | Counter | Seconds spent writing checkpoint files to disk. |
pgd_pg_stat_checkpointer_sync_time_seconds_total | Counter | Seconds spent syncing checkpoint files to disk. |
pgd_pg_stat_checkpointer_buffers_written_total | Counter | Buffers written during checkpoints and restartpoints. |
pgd_pg_stat_bgwriter_buffers_clean_total | Counter | Buffers written by the background writer. |
pgd_pg_stat_bgwriter_maxwritten_clean_total | Counter | Background writer cleaning scans stopped at the write limit. |
pgd_pg_stat_bgwriter_buffers_alloc_total | Counter | Buffers allocated. |
pgd_pg_postmaster_start_time_seconds | Gauge | Unix timestamp of postmaster start, giving instance uptime. |
On Postgres versions before 17, the checkpointer counters come from pg_stat_bgwriter instead. Metric names stay identical across versions.
Activity and locks
| Metric | Labels | Description |
|---|---|---|
pgd_pg_stat_activity_backends | state | Client backends by state. |
pgd_pg_stat_activity_max_tx_duration_seconds | state | Age of the oldest open transaction among client backends, by state. |
pgd_pg_stat_activity_waiting_backends | wait_event_type | Backends currently waiting, by wait event type. Idle background workers always report Activity waits. Contention shows up as Lock, LWLock, and BufferPin. |
pgd_pg_locks | mode, granted | Locks held or awaited, by lock mode. Rows with granted="false" are backends waiting on a lock. |