2026.02.0 Release

Docker tag: quay.io/pganalyze/enterprise:v2026.02.0

Notes

  • This release does not require a database migration when coming from v2026.01.0

  • If upgrading from older releases, review the migration notes on the v2026.01.0 release notes

  • Postgres 14+ is now required for the internal statistics database used by Enterprise Server

    • Postgres 13 is marked end-of-life as of November 2025. If you are using Postgres 13 for the internal database, upgrade it before upgrading pganalyze.
  • This release changes some private GraphQL API fields. If you've built custom clients on top of the pganalyze GraphQL API, see notes at the end of the release notes.

Features

  • Index Advisor: Add cluster-aware index recommendations

    • Index Advisor now aggregates scan data across all servers in a cluster when generating index recommendations. This provides more accurate recommendations by considering query stats from both primary and replica servers.
    • Read the release announcement
  • Update combined collector from 0.67.0 to v0.69.0

    • Improve query text collection to reduce missing query texts
      • Add a fingerprint cache that retains known query IDs across collection cycles, increasing memory use by up to about 9 MB per server whilst reducing CPU overhead
      • For data from pg_stat_activity (Connections page in pganalyze), this reduces the occurrence of <truncated query>
      • For data from pg_stat_statements (Query Performance page in pganalyze), this reduces the likelihood of "query text unavailable" by re-using previous query texts already stored on the server side
    • Allow explicitly setting Cluster ID
      • The new api_cluster_id setting enables overriding the automatically detected cluster ID, or set it on platforms that don't have built-in detection.
      • This is stored by pganalyze for each server, and used for grouping servers together. Alternate mechanisms to create server groups in pganalyze will be offered in a future release.
    • Improve collector log analysis
      • Add matching for autovacuum messages produced by PG18 and newer AlloyDB versions
      • Handle changes in Postgres 14+ where "misses" became "reads" in buffer usage reporting
      • Capture SLRU and LSN information from checkpoint completion messages
      • Add new log event type for connection authenticated messages
      • Expand patterns for connection failure scenarios
    • Fix infrequent crash in query normalization when encountering certain utility statements
  • Improve server and database dropdown navigation to better support long server names

    • The server dropdown now dynamically sizes its width based on the longest server name, expanding up to the right edge of the database select. Primary and replica badges are visually distinct and always fully visible alongside server names.
  • Single Sign-On: Support SAML certificate update

    • When a SAML Identity Provider certificate is rotated or approaching expiration, it can now be updated directly from the Integrations page without needing to reconfigure the entire SAML integration. A warning banner is shown when the certificate expires within 14 days (or has already expired).
  • VACUUM/ANALYZE Activity: Show autovacuum_vacuum_max_threshold value for Postgres 18+

    • The dead rows graph now takes autovacuum_vacuum_max_threshold into account when available, improving visibility into when autovacuum is expected to run.
  • Persist search input in URL query string

    • This allows navigating back to a page of filtered results (e.g., in the Query Performance list) and maintain the filtered list.
  • Connections: Update wait event name list to support Postgres 18

    • Previously, some wait event names were not appearing correctly on the Connections page and were shown as Unknown (e.g. Activity / Unknown instead of Activity / BgwriterMain)
  • Expand combined/local collector configuration options

    • Add support for the api_cluster_id, max_buffer_cache_monitoring_gb, and ignore_schema_regexp collector settings with the local collector built-in with the pganalyze Enterprise Server container.

Other improvements and bugfixes

  • Connections page: Improve performance with many connections

    • When the connection count at a given time exceeds thousands, the page was very slow or sometimes unable to load. Now it supports rendering multiple thousands of connections.
  • Date range / retention handling

    • Schema Statistics: Fix tree map links to tables and indexes to preserve date range selection
    • Fix occasional issues that caused parts of the app to be shown with limited seven day retention instead of normal retention.
  • Index Advisor:

    • Fix broken links to query detail pages
      • This fixes some Index Advisor pages that had incorrectly-generated links to the queries involved.
    • Support schema names with uppercase letters
      • Previously, when the referenced tables or functions are in the schema with uppercase letters, we were unable to run the query analysis of the query, therefore the Index Advisor was failing to run with such queries.
    • Fix handling of fully qualified table names not in search path
      • Previously the query analysis process (part of Index Advisor) did not correctly handle such cases, leading to errors because the referenced tables could not be found.
    • Fix handling of table names that need quoting (uppercase, special characters, etc)
  • Fix GraphQL CSRF validation failing for installations using non-standard ports

    • The newly introduced CSRF validation in the 2026.01.0 Enterprise Server release did not work as expected in certain situations, specifically it always failed when a non-standard port (e.g. 8080) was used for the Enterprise Server installation, showing an "Internal Server Error" after logging in. This fixes the CSRF check to work as expected.
  • Query Advisor: Avoid internal error when referenced EXPLAIN plans have aged out

    • On resolved Query Advisor issues you may not be able to access the associated EXPLAIN plan anymore (which is only retained for 7 days currently). Instead of showing an error, show a notice explaining this.
  • Fix "Replication - High Lag" check-up graph rendering issue

  • Ensure JWT tokens generated by application use integers for exp field

    • The exp field was previously incorrectly serialized as a string in the JWT token, which is a violation of the JWT spec, and may cause issues with proxies between the application and the end-user browser.
  • Fix Copy to Clipboard button not rendering in non-HTTPS environments

    • The Copy to Clipboard button previously required a secure context (HTTPS or localhost) and would not render at all in other environments. It now falls back to an alternative approach when the primary method is unavailable.
  • Always set search_path to public for internal database connections

    • This avoids issues where migrations incorrectly placed pganalyze internal tables in the pganalyze schema
  • Run background workers through cluster script and restart on failure

    • This intends to avoid issues where a crash of the workers causes the whole Enterprise Server container to restart
  • Snapshot API: Don't update special queries like <query text unavailable>

    • This ensures that if the collector sends us a special query string as a placeholder, we don't mess with an existing entry that may be the real query text instead of the placeholder. Specifically this matters in the case where the recently added collector query fingerprint cache (v0.69.0 and newer) is able to help with the queryid => fingerprint mapping, despite the text having aged out of pg_stat_statements already.

Security

GraphQL API changes

  • Add getQueryExplainFromTrace resolver to get EXPLAIN plans from "db.postgresql.plan" trace spans

    • When the pganalyze OpenTelemetry tracing integration is utilized, the pganalyze-collector will insert special links into the respective traces to link back to the full EXPLAIN plan in pganalyze. These links can be easily followed with a browser, but can be challenging for AI tools to resolve.
    • To assist AI tools / MCP servers, provide a dedicated getQueryExplainFromTrace GraphQL resolver that takes the necessary arguments from the link (datname, timestamp, fingerprint) and returns an EXPLAIN plan.
  • Add new summary field to getSchemaTableIndexSelection resolver

    • This provides an easier mechanism to get the index recommendations for a particular table, without having to parse the complex data field.
    • Note this is currently still a private API, but we intend to stabilize this in the near future.
  • This release changes some GraphQL API fields from a JSON-encoded string type that needs parsing, to instead be inlined in the GraphQL response. If you're currently using a private API accessing the following types, you might have to update your client:

    • CheckConfigType: settings_json renamed to settings and returning inlined JSON
    • IntegrationConfigType: config changed to return inlined JSON
    • IssueReferenceType: New details field returning inlined JSON, existing details_json returning serialized JSON kept for compatibility but deprecated
    • IssueType: grouping_key changed to return inlined JSON, details_json renamed to details and returning inlined JSON
    • LogLineType: details changed to return inlined JSON
    • QueryExplainType: output_json, annotated_json and advisor_insights changed to return inlined JSON
    • QueryPlanType: annotated_json changed to return inlined JSON
    • QueryTagsetType: comment_data changed to return inlined JSON
    • QueryType: query_analysis changed to return inlined JSON
    • SnapshotType: system_json changed to return inlined JSON
    • WorkbookResultType: output_json, annotated_json and node_insights changed to return inlined JSON

Couldn't find what you were looking for or want to talk about something specific?
Start a conversation with us →