PostgreSQL 17
What PostgreSQL 17 changed in monitoring
Released 26 September 2024, supported until 8 November 2029. 14 pages so far, each verified against PostgreSQL 17.11.
PostgreSQL 17 is where a decade of assumptions about the background writer view stopped holding. The checkpoint counters left it for a view of their own, and the two columns that counted backend writes were dropped outright, so an exporter written for 16 either errors or scrapes nothing depending on how carefully it was written. The same release changed vacuum in two ways an operator feels: the memory that holds dead row pointers is no longer capped at a gigabyte, so a large table needs fewer index passes, and the progress view reports that memory in bytes instead of tuple counts. The statements extension renamed its block timing columns to distinguish shared from local buffers, and gained a column recording when each row began accumulating. Wait events got a catalog view with descriptions. Replication slots now say why they were invalidated and when they went idle. And the upgrade tool learned to carry logical slots forward, but only from a 17 source, which is misreported often enough to be worth a page. Every page here runs its queries on a 17 container and a 16 container so the difference is shown rather than described.
The release notes for this version are at postgresql.org; every page below cites the section it draws on by name. The hub for every supported version carries the support calendar.
-
PostgreSQL 17 breaks: errors
pg_stat_checkpointer replaced pg_stat_bgwriter
For anyone who runs an exporter, a Datadog check or a collector against a cluster that is about to become a PostgreSQL 17 cluster.
-
PostgreSQL 17 breaks: errors
The statements view renamed its I/O timers
For anyone who ranks slow statements by the time they spend waiting on blocks.
-
PostgreSQL 17 breaks: none
Knowing how old a statements row really is
For anyone computing a rate from pg_stat_statements without knowing the denominator.
-
PostgreSQL 17 breaks: errors
Vacuum progress stopped counting in tuples
For anyone who watches a long vacuum by polling the progress view.
-
PostgreSQL 17 breaks: none
Vacuum finally says how many indexes are left
For anyone who has waited out the index phase of a vacuum blind.
-
PostgreSQL 17 breaks: none
Wait events that arrive with their own glossary
For anyone who has met an unfamiliar wait event name on a dashboard.
-
PostgreSQL 17 breaks: none
Slots that say why they died and when
For anyone who has found a slot in the lost state and wanted the reason.
-
PostgreSQL 17 breaks: none
Vacuum is no longer capped at one gigabyte
For anyone who raised maintenance_work_mem on a huge table and saw nothing change.
-
PostgreSQL 17 breaks: silent
Every SLRU cache but one changed its name
For anyone whose cache panel is keyed on a string literal typed years ago.
-
PostgreSQL 17 breaks: none
EXPLAIN can price the wire and the planner
For anyone holding a fast plan for a query the application times as slow.
-
PostgreSQL 17 breaks: none
A reset call that now wipes everything
For anyone with a scheduled job that resets statistics on a cluster.
-
PostgreSQL 17 breaks: none
pg_upgrade carries logical slots only from 17
For anyone planning an upgrade around the promise that slots now survive.
-
PostgreSQL 17 breaks: silent
log_connections now logs trust connections
For anyone who ships Postgres logs to a SIEM and has to answer an auditor out of them.
-
PostgreSQL 17 breaks: errors
pg_stat_subscription gained a worker type
For anyone running logical replication who has ever asked why the subscription has three processes.
Grep your monitoring configuration for these
Every view, column and setting the pages above touch, in one list. A hit in an exporter query file, a dashboard definition or an alert rule is a place to read the page that names it.
EXPLAIN BUFFERSEXPLAIN MEMORYEXPLAIN SERIALIZEPlanning MemorySERIALIZE BINARYautovacuum_work_membackend_typeblk_read_timeblk_write_timeblks_zeroedbuffers_backendbuffers_backend_fsyncbuffers_checkpointcallscheckpoint_sync_timecheckpoint_write_timecheckpoints_reqcheckpoints_timedconfirmed_flush_lsnconflictingconnection authenticatedconnection authorizeddead_tuple_bytesdescriptionheap_blks_scannedheap_blks_totalheap_blks_vacuumedhot_standby_feedbackinactive_sinceindex_vacuum_countindexes_processedindexes_totalinvalidation_reasonleader_pidlocal_blk_read_timelocal_blk_write_timelocal_blks_hitlog_connectionsmaintenance_work_memmax_dead_tuple_bytesmax_dead_tuplesmax_exec_timemax_parallel_maintenance_workersmax_replication_slotsmin_exec_timeminmax_onlyminmax_stats_sincenamenum_dead_item_idsnum_dead_tuplespg_create_logical_replication_slotpg_current_logfilepg_hba_file_rulespg_replication_slotspg_stat_activity.wait_eventpg_stat_activity.wait_event_typepg_stat_archiverpg_stat_bgwriterpg_stat_checkpointerpg_stat_iopg_stat_progress_vacuumpg_stat_reset_sharedpg_stat_reset_slrupg_stat_slrupg_stat_statementspg_stat_statements_infopg_stat_statements_resetpg_stat_subscription.worker_typepg_stat_walpg_subscription_relpg_wait_eventsphasepluginrecovery_prefetchrelidrestart_lsnsafe_wal_sizeshared_blk_read_timeshared_blk_write_timeshared_blks_readstats_resetstats_sincetemp_blks_writtentemporarywait_eventwal_levelwal_status
The failure modes these changes touch are in the reference guides; the terms the release notes assume are in the glossary. Across a fleet, the version is what decides where a signal lives, which is why engine discovery establishes it first.
Put every Postgres you run on autopilot.
We onboard teams in small batches. Tell us about your fleet and we will reach out when a seat opens. One email, no drip campaign.