From c0a541f4825733c0c6332e303e8333727a5a656b Mon Sep 17 00:00:00 2001 From: Marc Cousin Date: Wed, 29 Jan 2025 14:13:09 +0100 Subject: [PATCH] Fix the oldest query display It didn't take into account whether the session was idle, so it was inaccurate Also add some workaround for issue https://github.com/powa-team/powa-archivist/issues/98 until the archivist is fixed --- powa/database.py | 12 ++++++------ powa/server.py | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/powa/database.py b/powa/database.py index 368a7954..0d201cbd 100644 --- a/powa/database.py +++ b/powa/database.py @@ -399,14 +399,14 @@ def _get_metrics(cls, handler, **params): @property def query(self): query = powa_get_pgsa_sample(per_db=True) - + # Those greatests are to avoid having negative values returned, see https://github.com/powa-team/powa-archivist/issues/98 cols = [ "extract(epoch FROM ts) AS ts", - "max(backend_xid_age) AS backend_xid_age", - "max(backend_xmin_age) AS backend_xmin_age", - "max(backend_start_age) FILTER (WHERE datid IS NOT NULL) AS oldest_backend", - "max(xact_start_age) FILTER (WHERE datid IS NOT NULL) AS oldest_xact", - "max(query_start_age) FILTER (WHERE datid IS NOT NULL) AS oldest_query", + "greatest(max(backend_xid_age),0) AS backend_xid_age", + "greatest(max(backend_xmin_age),0) AS backend_xmin_age", + "greatest(max(backend_start_age) FILTER (WHERE datid IS NOT NULL),0) AS oldest_backend", + "greatest(max(xact_start_age) FILTER (WHERE datid IS NOT NULL),0) AS oldest_xact", + "greatest(max(query_start_age) FILTER (WHERE datid IS NOT NULL AND state !~ 'idle'),0) AS oldest_query", "count(*) FILTER (WHERE state = 'idle') AS nb_idle", "count(*) FILTER (WHERE state = 'active') AS nb_active", "count(*) FILTER (WHERE state = 'idle in transaction') AS nb_idle_xact", diff --git a/powa/server.py b/powa/server.py index 6bc25e20..5bae8871 100644 --- a/powa/server.py +++ b/powa/server.py @@ -674,14 +674,14 @@ def _get_metrics(cls, handler, **params): @property def query(self): query = powa_get_pgsa_sample() - + # Those greatests are to avoid having negative values returned, see https://github.com/powa-team/powa-archivist/issues/98 cols = [ "extract(epoch FROM ts) AS ts", - "max(backend_xid_age) AS backend_xid_age", - "max(backend_xmin_age) AS backend_xmin_age", - "max(backend_start_age) FILTER (WHERE datid IS NOT NULL) AS oldest_backend", - "max(xact_start_age) FILTER (WHERE datid IS NOT NULL) AS oldest_xact", - "max(query_start_age) FILTER (WHERE datid IS NOT NULL) AS oldest_query", + "greatest(max(backend_xid_age),0) AS backend_xid_age", + "greatest(max(backend_xmin_age),0) AS backend_xmin_age", + "greatest(max(backend_start_age) FILTER (WHERE datid IS NOT NULL),0) AS oldest_backend", + "greatest(max(xact_start_age) FILTER (WHERE datid IS NOT NULL),0) AS oldest_xact", + "greatest(max(query_start_age) FILTER (WHERE datid IS NOT NULL AND state !~ 'idle'),0) AS oldest_query", "count(*) FILTER (WHERE state = 'idle') AS nb_idle", "count(*) FILTER (WHERE state = 'active') AS nb_active", "count(*) FILTER (WHERE state = 'idle in transaction') AS nb_idle_xact",