Add support for new checkpointer statistics for PostgreSQL.

Introduced logic to check the existence of `pg_stat_checkpointer` and fetch corresponding statistics when available. This ensures compatibility with newer PostgreSQL versions while maintaining backward support using `pg_stat_bgwriter`.
This commit is contained in:
2026-02-12 14:15:14 +01:00
parent 55f5652572
commit 528a720329
2 changed files with 49 additions and 9 deletions

View File

@@ -67,12 +67,33 @@ async def collect_target(target: Target) -> None:
WHERE datname = current_database()
"""
)
bgwriter = await conn.fetchrow(
"""
SELECT checkpoints_timed, checkpoints_req, buffers_checkpoint, buffers_clean, maxwritten_clean
FROM pg_stat_bgwriter
"""
)
checkpointer_view_exists = await conn.fetchval("SELECT to_regclass('pg_catalog.pg_stat_checkpointer') IS NOT NULL")
bgwriter = None
if checkpointer_view_exists:
try:
bgwriter = await conn.fetchrow(
"""
SELECT
num_timed AS checkpoints_timed,
num_requested AS checkpoints_req,
0::bigint AS buffers_checkpoint,
0::bigint AS buffers_clean,
0::bigint AS maxwritten_clean
FROM pg_stat_checkpointer
"""
)
except Exception:
bgwriter = None
if bgwriter is None:
try:
bgwriter = await conn.fetchrow(
"""
SELECT checkpoints_timed, checkpoints_req, buffers_checkpoint, buffers_clean, maxwritten_clean
FROM pg_stat_bgwriter
"""
)
except Exception:
bgwriter = None
if stat_db is None:
stat_db = {

View File

@@ -106,12 +106,31 @@ async def collect_overview(
errors,
"pg_stat_database_perf",
)
bgwriter = await _safe_fetchrow(
checkpointer_view_exists = await _safe_fetchval(
conn,
"SELECT checkpoints_timed, checkpoints_req FROM pg_stat_bgwriter",
"SELECT to_regclass('pg_catalog.pg_stat_checkpointer') IS NOT NULL",
errors,
"pg_stat_bgwriter",
"checkpointer_view_exists",
)
if checkpointer_view_exists:
bgwriter = await _safe_fetchrow(
conn,
"""
SELECT
num_timed AS checkpoints_timed,
num_requested AS checkpoints_req
FROM pg_stat_checkpointer
""",
errors,
"pg_stat_checkpointer",
)
else:
bgwriter = await _safe_fetchrow(
conn,
"SELECT checkpoints_timed, checkpoints_req FROM pg_stat_bgwriter",
errors,
"pg_stat_bgwriter",
)
autovac_workers = await _safe_fetchval(
conn,
"""