diff --git a/pgactivity/Data.py b/pgactivity/Data.py index 4d1751b8..9d905797 100644 --- a/pgactivity/Data.py +++ b/pgactivity/Data.py @@ -317,12 +317,22 @@ def pg_get_active_connections(self,): """ Get total of active connections. """ - query = """ - SELECT - COUNT(*) as active_connections - FROM pg_stat_activity - WHERE state = 'active' - """ + + if self.pg_num_version < 90200: + # prior to PostgreSQL 9.1, there was no state column + query = """ + SELECT + COUNT(*) as active_connections + FROM pg_stat_activity + WHERE current_query NOT LIKE '%%' + """ + else: + query = """ + SELECT + COUNT(*) as active_connections + FROM pg_stat_activity + WHERE state = 'active' + """ cur = self.pg_conn.cursor() cur.execute(query,) @@ -488,7 +498,18 @@ def pg_get_activities(self, duration_mode=1): EXTRACT(epoch FROM (NOW() - pg_stat_activity.{duration_column})) AS duration, pg_stat_activity.waiting AS wait, pg_stat_activity.usename AS user, - pg_stat_activity.current_query AS query, + CASE + WHEN pg_stat_activity.current_query = ' in transaction (aborted)' THEN 'idle in transaction (aborted)' + WHEN pg_stat_activity.current_query = ' in transaction' THEN 'idle in transaction' + WHEN pg_stat_activity.current_query = '' THEN 'idle' + ELSE 'active' + END + AS state, + CASE + WHEN pg_stat_activity.current_query LIKE '%%' THEN 'None' + ELSE pg_stat_activity.current_query + END + AS query, false AS is_parallel_worker FROM pg_stat_activity @@ -560,8 +581,18 @@ def pg_get_waiting(self, duration_mode=1): pg_locks.locktype AS type, pg_locks.relation::regclass AS relation, EXTRACT(epoch FROM (NOW() - pg_stat_activity.{duration_column})) AS duration, - NULL AS state, - pg_stat_activity.current_query AS query + CASE + WHEN pg_stat_activity.current_query = ' in transaction (aborted)' THEN 'idle in transaction (aborted)' + WHEN pg_stat_activity.current_query = ' in transaction' THEN 'idle in transaction' + WHEN pg_stat_activity.current_query = '' THEN 'idle' + ELSE 'active' + END + AS state, + CASE + WHEN pg_stat_activity.current_query LIKE '%%' THEN 'None' + ELSE pg_stat_activity.current_query + END + AS query FROM pg_catalog.pg_locks JOIN pg_catalog.pg_stat_activity ON(pg_catalog.pg_locks.pid = pg_catalog.pg_stat_activity.procpid) @@ -682,6 +713,7 @@ def pg_get_blocking(self, duration_mode=1): query = """ SELECT pid, + appname, CASE WHEN LENGTH(datname) > 16 THEN SUBSTRING(datname FROM 0 FOR 6)||'...'||SUBSTRING(datname FROM '........$') @@ -693,8 +725,18 @@ def pg_get_blocking(self, duration_mode=1): mode, locktype AS type, duration, - state, - query + CASE + WHEN sq.query = ' in transaction (aborted)' THEN 'idle in transaction (aborted)' + WHEN sq.query = ' in transaction' THEN 'idle in transaction' + WHEN sq.query = '' THEN 'idle' + ELSE 'active' + END + AS state, + CASE + WHEN sq.query LIKE '%%' THEN 'None' + ELSE sq.query + END + AS query FROM ( SELECT