Skip to content

Commit 489fa46

Browse files
committed
feature: upgraded Connections plugin with new PG 10+ feature pg_stat_activity.backend_type
1 parent 0850ec2 commit 489fa46

File tree

2 files changed

+54
-21
lines changed

2 files changed

+54
-21
lines changed

mamonsu/plugins/pgsql/connections.py

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,25 @@ class Connections(Plugin):
2626
]
2727
Max_connections = None
2828

29-
query_agent = "select count(*) from pg_catalog.pg_stat_activity where state = '{0}';"
30-
query_agent_total = "select count(*) from pg_catalog.pg_stat_activity where state is not null ;"
31-
query_agent_waiting_new_v = "select count(*) from pg_catalog.pg_stat_activity where state is not null and " \
29+
query_agent = "select count(*) from pg_catalog.pg_stat_activity where state = '{0}' {1};"
30+
query_agent_total = "select count(*) from pg_catalog.pg_stat_activity where {0};"
31+
query_agent_waiting_new_v = "select count(*) from pg_catalog.pg_stat_activity where {0} and " \
3232
" wait_event_type is not null"
33-
query_agent_waiting_old_v = "select count(*) from pg_catalog.pg_stat_activity where waiting and state is not null "
33+
query_agent_waiting_old_v = "select count(*) from pg_catalog.pg_stat_activity where waiting and {0} "
3434
query_agent_max_conn = "select setting::INT from pg_settings where name = 'max_connections' "
3535
key = 'pgsql.connections{0}'
3636

3737
def run(self, zbx):
3838
if Pooler.is_bootstraped() and Pooler.bootstrap_version_greater('2.3.4'):
3939
result = Pooler.query(
4040
'select state, count(*) '
41-
'from mamonsu.get_connections_states() where state is not null group by state')
41+
'from mamonsu.get_connections_states() group by state')
4242
else:
4343
result = Pooler.query(
4444
'select state, count(*) '
45-
'from pg_catalog.pg_stat_activity where state is not null group by state')
45+
'from pg_catalog.pg_stat_activity where {0} group by state'.format(
46+
"backend_type = 'client backend'" if Pooler.server_version_greater(
47+
'10.0') else "state IS NOT NULL"))
4648

4749
for item in self.Items:
4850
state, key, val = item[0], item[1], 0
@@ -61,15 +63,17 @@ def run(self, zbx):
6163
result = Pooler.query(
6264
'select count(*) '
6365
'from mamonsu.get_connections_states() '
64-
'where waiting and state is not null')
66+
'where waiting is not null')
6567
else:
6668
if Pooler.server_version_less('9.5.0'):
6769
result = Pooler.query(
6870
'select count(*) '
6971
'from pg_catalog.pg_stat_activity where waiting and state is not null')
7072
else:
71-
result = Pooler.query('select count(*) from pg_catalog.pg_stat_activity where state is not null and '
72-
'wait_event_type is not null')
73+
result = Pooler.query('select count(*) from pg_catalog.pg_stat_activity where {0} and '
74+
'wait_event_type is not null'.format(
75+
"backend_type = 'client backend'" if Pooler.server_version_greater(
76+
'10.0') else "state IS NOT NULL"))
7377
zbx.send('pgsql.connections[waiting]', int(result[0][0]))
7478
if self.Max_connections is None:
7579
result = Pooler.query("select setting from pg_settings where name = 'max_connections'")
@@ -144,12 +148,26 @@ def triggers(self, template, dashboard=False):
144148
def keys_and_queries(self, template_zabbix):
145149
result = []
146150
for item in self.Items:
147-
result.append(
148-
'{0}[*],$2 $1 -c "{1}"'.format(self.key.format("." + item[1]), self.query_agent.format(item[1])))
149-
result.append('{0}[*],$2 $1 -c "{1}"'.format(self.key.format('.total'), self.query_agent_total))
151+
result.append('{0}[*],$2 $1 -c "{1}"'.format(self.key.format("." + item[1]),
152+
self.query_agent.format(item[1],
153+
"AND backend_type = 'client backend'" if LooseVersion(
154+
self.VersionPG) >= LooseVersion(
155+
'10') else "")))
156+
result.append('{0}[*],$2 $1 -c "{1}"'.format(self.key.format('.total'), self.query_agent_total.format(
157+
"backend_type = 'client backend'" if LooseVersion(
158+
self.VersionPG) >= LooseVersion(
159+
'10') else "state IS NOT NULL")))
150160
if LooseVersion(self.VersionPG) < LooseVersion('9.6'):
151-
result.append('{0}[*],$2 $1 -c "{1}"'.format(self.key.format('.waiting'), self.query_agent_waiting_old_v))
161+
result.append(
162+
'{0}[*],$2 $1 -c "{1}"'.format(self.key.format('.waiting'), self.query_agent_waiting_old_v.format(
163+
"backend_type = 'client backend'" if LooseVersion(
164+
self.VersionPG) >= LooseVersion(
165+
'10') else "state IS NOT NULL")))
152166
else:
153-
result.append('{0}[*],$2 $1 -c "{1}"'.format(self.key.format('.waiting'), self.query_agent_waiting_new_v))
167+
result.append(
168+
'{0}[*],$2 $1 -c "{1}"'.format(self.key.format('.waiting'), self.query_agent_waiting_new_v.format(
169+
"backend_type = 'client backend'" if LooseVersion(
170+
self.VersionPG) >= LooseVersion(
171+
'10') else "state IS NOT NULL")))
154172
result.append('{0}[*],$2 $1 -c "{1}"'.format(self.key.format('.max_connections'), self.query_agent_max_conn))
155173
return template_zabbix.key_and_query(result)

mamonsu/tools/bootstrap/sql.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,28 @@
7979
END
8080
$do$;
8181
82-
CREATE OR REPLACE FUNCTION mamonsu.get_connections_states()
83-
RETURNS TABLE(state text, waiting boolean) AS $$
84-
SELECT
85-
state,
86-
{5}
87-
FROM pg_catalog.pg_stat_activity
88-
$$ LANGUAGE SQL SECURITY DEFINER;
82+
DO
83+
$do$
84+
BEGIN
85+
IF (SELECT setting::integer FROM pg_settings WHERE name = 'server_version_num') >= 100000 THEN
86+
CREATE OR REPLACE FUNCTION mamonsu.get_connections_states()
87+
RETURNS TABLE(state text, waiting boolean) AS $$
88+
SELECT state,
89+
{5}
90+
FROM pg_catalog.pg_stat_activity
91+
WHERE backend_type = 'client backend'
92+
$$ LANGUAGE SQL SECURITY DEFINER;
93+
ELSE
94+
CREATE OR REPLACE FUNCTION mamonsu.get_connections_states()
95+
RETURNS TABLE(state text, waiting boolean) AS $$
96+
SELECT state,
97+
{5}
98+
FROM pg_catalog.pg_stat_activity
99+
WHERE state is not null
100+
$$ LANGUAGE SQL SECURITY DEFINER;
101+
END IF;
102+
END
103+
$do$;
89104
90105
CREATE or REPLACE FUNCTION mamonsu.get_oldest_xid()
91106
RETURNS BIGINT AS $$

0 commit comments

Comments
 (0)