Skip to content
dbexplore

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. PostgreSQL 18 breaks: none

    Checkpoints requested, and the ones run

    For anyone who has divided checkpoint counts by an interval and trusted the answer.

  10. PostgreSQL 18 breaks: silent

    log_connections stopped being a boolean

    For anyone whose configuration management asserts that log_connections equals off.

  11. 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.

  12. PostgreSQL 18 breaks: none

    Parallel workers asked for, and granted

    For anyone whose analytical queries got slower and whose plans did not change.

  13. 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.

  14. 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.

  • ANALYZE
  • Actual Rows
  • BUFFERS
  • Disabled
  • EXPLAIN
  • Heap Fetches
  • Index Searches
  • Planning
  • REPLICA IDENTITY
  • Shared Hit Blocks
  • active
  • analyze_count
  • apply_error_count
  • authentication
  • authorization
  • auto_explain
  • autoanalyze_count
  • autovacuum_count
  • autovacuum_vacuum_cost_delay
  • autovacuum_vacuum_cost_limit
  • backend_type
  • block_size
  • boot_val
  • buffers_written
  • bulkread
  • bulkwrite
  • checkpoint_timeout
  • confl_delete_missing
  • confl_delete_origin_differs
  • confl_insert_exists
  • confl_multiple_unique_conflicts
  • confl_update_exists
  • confl_update_missing
  • confl_update_origin_differs
  • conflicting
  • context
  • current_setting
  • delay_time
  • extend_bytes
  • extend_time
  • extends
  • f_buffered
  • f_localmem
  • f_sync
  • fsyncs
  • handle_data_len
  • heap_blks_scanned
  • hits
  • idle_replication_slot_timeout
  • inactive_since
  • invalidation_reason
  • io_combine_limit
  • io_generation
  • io_id
  • io_max_combine_limit
  • io_max_concurrency
  • io_method
  • io_workers
  • length
  • log_autovacuum_min_duration
  • log_connections
  • logging_collector
  • max_parallel_workers
  • max_parallel_workers_per_gather
  • max_slot_wal_keep_size
  • min_parallel_table_scan_size
  • n_live_tup
  • num_done
  • num_requested
  • num_timed
  • object
  • off
  • op_bytes
  • operation
  • parallel_setup_cost
  • parallel_tuple_cost
  • parallel_workers_launched
  • parallel_workers_to_launch
  • pg_aios
  • pg_logical_slot_get_changes
  • pg_replication_slots
  • pg_settings
  • pg_stat_activity
  • pg_stat_all_tables
  • pg_stat_checkpointer
  • pg_stat_database
  • pg_stat_get_backend_io
  • pg_stat_get_backend_wal
  • pg_stat_io
  • pg_stat_progress_analyze
  • pg_stat_progress_vacuum
  • pg_stat_reset
  • pg_stat_reset_backend_stats
  • pg_stat_reset_shared
  • pg_stat_reset_single_table_counters
  • pg_stat_statements
  • pg_stat_subscription_stats
  • pg_stat_user_tables
  • pg_stat_wal
  • phase
  • raw_result
  • read_bytes
  • read_time
  • reads
  • receipt
  • restartpoints_done
  • restartpoints_req
  • restartpoints_timed
  • result
  • setup_durations
  • slot_name
  • slru_written
  • state
  • stats_reset
  • sync_error_count
  • sync_time
  • target
  • target_desc
  • total_analyze_time
  • total_autoanalyze_time
  • total_autovacuum_time
  • total_vacuum_time
  • track_cost_delay_timing
  • track_wal_io_timing
  • vacuum_cost_delay
  • vacuum_cost_limit
  • vacuum_count
  • vartype
  • wal_buffers_full
  • wal_bytes
  • wal_fpi
  • wal_records
  • wal_status
  • wal_sync
  • wal_sync_time
  • wal_write
  • wal_write_time
  • write_bytes
  • write_time
  • writes

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.