PostgreSQL 18
What PostgreSQL 18 changed in monitoring
Released 25 September 2025, supported until 14 November 2030. 14 pages so far, each verified against PostgreSQL 18.6.
PostgreSQL 18 is the release that changed how the server does I/O, and the observability changes follow from that. An asynchronous I/O layer sits under sequential scans, bitmap heap scans and vacuum, selected by a new setting and visible through a view of in-flight requests. Because the write-ahead log now goes through the same accounting as everything else, its timing counters moved out of the view they had lived in since 14, which is the single change on this version most likely to blank a dashboard. Vacuum and analyze started reporting how long they ran and how much of that was spent asleep under the cost delay. Query identifiers are computed differently for constant lists and for same-named relations in different schemas, so a baseline keyed on them does not carry across the upgrade. Connection logging became a list of stages with a timing option. Replication slots gained an idle timeout as a new reason for invalidation. Each page under this hub takes one of those changes, runs the query on 18 and on the version before it, and says whether the old query fails loudly or returns nothing.
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 18 breaks: none
The I/O workers PostgreSQL 18 starts
For anyone whose process-count alert or backend_type panel is about to gain rows nobody added.
-
PostgreSQL 18 breaks: none
pg_aios answers only while you watch
For anyone who read that 18 added an I/O view and found nothing in it.
-
PostgreSQL 18 breaks: silent
A read stopped being a block in 18
For anyone whose I/O dashboard multiplies a read count by eight kilobytes.
-
PostgreSQL 18 breaks: errors
op_bytes is gone and bytes are counted
For anyone whose I/O volume panel is an operation count with a multiplication after it.
-
PostgreSQL 18 breaks: none
I/O attributed to one backend at last
For anyone who has watched one connection ruin a cluster and had only sampling to prove it.
-
PostgreSQL 18 breaks: silent
One reset call now clears half the log
For anyone whose measurement routine resets the log counters before it measures anything.
-
PostgreSQL 18 breaks: none
How much of a vacuum is spent asleep
For anyone whose autovacuum never finishes and who cannot tell whether it is busy or throttled.
-
PostgreSQL 18 breaks: none
What each table costs to keep vacuumed
For anyone who knows which table is vacuumed most often and not which one costs most.
-
PostgreSQL 18 breaks: none
Checkpoints requested, and the ones run
For anyone who has divided checkpoint counts by an interval and trusted the answer.
-
PostgreSQL 18 breaks: silent
log_connections stopped being a boolean
For anyone whose configuration management asserts that log_connections equals off.
-
PostgreSQL 18 breaks: silent
EXPLAIN ANALYZE says more than it did
For anyone who parses plan text, diffs plans between runs, or stores them for later.
-
PostgreSQL 18 breaks: none
Parallel workers asked for, and granted
For anyone whose analytical queries got slower and whose plans did not change.
-
PostgreSQL 18 breaks: none
Replication conflicts became countable
For anyone running logical replication who has been told the subscriber is fine because it is running.
-
PostgreSQL 18 breaks: none
Slots that expire when nobody reads
For anyone who has lost a primary to a slot left behind by a decommissioned standby.
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.
ANALYZEActual RowsBUFFERSDisabledEXPLAINHeap FetchesIndex SearchesPlanningREPLICA IDENTITYShared Hit Blocksactiveanalyze_countapply_error_countauthenticationauthorizationauto_explainautoanalyze_countautovacuum_countautovacuum_vacuum_cost_delayautovacuum_vacuum_cost_limitbackend_typeblock_sizeboot_valbuffers_writtenbulkreadbulkwritecheckpoint_timeoutconfl_delete_missingconfl_delete_origin_differsconfl_insert_existsconfl_multiple_unique_conflictsconfl_update_existsconfl_update_missingconfl_update_origin_differsconflictingcontextcurrent_settingdelay_timeextend_bytesextend_timeextendsf_bufferedf_localmemf_syncfsyncshandle_data_lenheap_blks_scannedhitsidle_replication_slot_timeoutinactive_sinceinvalidation_reasonio_combine_limitio_generationio_idio_max_combine_limitio_max_concurrencyio_methodio_workerslengthlog_autovacuum_min_durationlog_connectionslogging_collectormax_parallel_workersmax_parallel_workers_per_gathermax_slot_wal_keep_sizemin_parallel_table_scan_sizen_live_tupnum_donenum_requestednum_timedobjectoffop_bytesoperationparallel_setup_costparallel_tuple_costparallel_workers_launchedparallel_workers_to_launchpg_aiospg_logical_slot_get_changespg_replication_slotspg_settingspg_stat_activitypg_stat_all_tablespg_stat_checkpointerpg_stat_databasepg_stat_get_backend_iopg_stat_get_backend_walpg_stat_iopg_stat_progress_analyzepg_stat_progress_vacuumpg_stat_resetpg_stat_reset_backend_statspg_stat_reset_sharedpg_stat_reset_single_table_counterspg_stat_statementspg_stat_subscription_statspg_stat_user_tablespg_stat_walphaseraw_resultread_bytesread_timereadsreceiptrestartpoints_donerestartpoints_reqrestartpoints_timedresultsetup_durationsslot_nameslru_writtenstatestats_resetsync_error_countsync_timetargettarget_desctotal_analyze_timetotal_autoanalyze_timetotal_autovacuum_timetotal_vacuum_timetrack_cost_delay_timingtrack_wal_io_timingvacuum_cost_delayvacuum_cost_limitvacuum_countvartypewal_buffers_fullwal_byteswal_fpiwal_recordswal_statuswal_syncwal_sync_timewal_writewal_write_timewrite_byteswrite_timewrites
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.