Skip to content

Commit 3f937df

Browse files
committed
feature: drafted new autovacuum utilization metrics
1 parent e081a71 commit 3f937df

File tree

12 files changed

+140
-14
lines changed

12 files changed

+140
-14
lines changed

github-actions-tests/sources/metrics-linux-10.txt

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ pgsql.archive_command[count_files_to_archive]
66
pgsql.archive_command[failed_trying_to_archive]
77
pgsql.archive_command[size_files_to_archive]
88
pgsql.autovacuum.count[]
9+
pgsql.autovacuum.utilization[]
910
pgsql.bgwriter[buffers_alloc]
1011
pgsql.bgwriter[buffers_backend]
1112
pgsql.bgwriter[buffers_backend_fsync]

github-actions-tests/sources/metrics-linux-11.txt

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ pgsql.archive_command[count_files_to_archive]
66
pgsql.archive_command[failed_trying_to_archive]
77
pgsql.archive_command[size_files_to_archive]
88
pgsql.autovacuum.count[]
9+
pgsql.autovacuum.utilization[]
910
pgsql.bgwriter[buffers_alloc]
1011
pgsql.bgwriter[buffers_backend]
1112
pgsql.bgwriter[buffers_backend_fsync]

github-actions-tests/sources/metrics-linux-12.txt

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ pgsql.archive_command[count_files_to_archive]
66
pgsql.archive_command[failed_trying_to_archive]
77
pgsql.archive_command[size_files_to_archive]
88
pgsql.autovacuum.count[]
9+
pgsql.autovacuum.utilization[]
910
pgsql.bgwriter[buffers_alloc]
1011
pgsql.bgwriter[buffers_backend]
1112
pgsql.bgwriter[buffers_backend_fsync]

github-actions-tests/sources/metrics-linux-13.txt

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ pgsql.archive_command[count_files_to_archive]
66
pgsql.archive_command[failed_trying_to_archive]
77
pgsql.archive_command[size_files_to_archive]
88
pgsql.autovacuum.count[]
9+
pgsql.autovacuum.utilization[]
910
pgsql.bgwriter[buffers_alloc]
1011
pgsql.bgwriter[buffers_backend]
1112
pgsql.bgwriter[buffers_backend_fsync]

github-actions-tests/sources/metrics-linux-14.txt

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ pgsql.archive_command[count_files_to_archive]
66
pgsql.archive_command[failed_trying_to_archive]
77
pgsql.archive_command[size_files_to_archive]
88
pgsql.autovacuum.count[]
9+
pgsql.autovacuum.utilization[]
910
pgsql.bgwriter[buffers_alloc]
1011
pgsql.bgwriter[buffers_backend]
1112
pgsql.bgwriter[buffers_backend_fsync]

github-actions-tests/sources/metrics-linux-9.6.txt

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ pgsql.archive_command[count_files_to_archive]
66
pgsql.archive_command[failed_trying_to_archive]
77
pgsql.archive_command[size_files_to_archive]
88
pgsql.autovacuum.count[]
9+
pgsql.autovacuum.utilization[]
910
pgsql.bgwriter[buffers_alloc]
1011
pgsql.bgwriter[buffers_backend]
1112
pgsql.bgwriter[buffers_backend_fsync]

github-actions-tests/sources/metrics-linux-full-list.txt

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ pgsql.archive_command[count_files_to_archive]
66
pgsql.archive_command[failed_trying_to_archive]
77
pgsql.archive_command[size_files_to_archive]
88
pgsql.autovacuum.count[]
9+
pgsql.autovacuum.utilization[]
910
pgsql.bgwriter[buffers_alloc]
1011
pgsql.bgwriter[buffers_backend]
1112
pgsql.bgwriter[buffers_backend_fsync]

mamonsu/plugins/pgsql/autovacuum.py

+68-11
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,86 @@
33
from mamonsu.plugins.pgsql.plugin import PgsqlPlugin as Plugin
44
from .pool import Pooler
55
from mamonsu.lib.zbx_template import ZbxTemplate
6+
import logging
7+
68

79
class Autovacuum(Plugin):
810

911
AgentPluginType = "pg"
10-
key = "pgsql.autovacuum.count{0}"
12+
# TODO: unify keys and remove its direct mentioning in zbx.send() functions
13+
key_count = "pgsql.autovacuum.count{0}"
14+
key_utilization = "pgsql.autovacuum.utilization{0}"
15+
key_utilization_avg5 = "pgsql.autovacuum.utilization.avg5{0}"
16+
key_utilization_avg10 = "pgsql.autovacuum.utilization.avg10{0}"
17+
key_utilization_avg15 = "pgsql.autovacuum.utilization.avg15{0}"
18+
19+
DEFAULT_CONFIG = {
20+
"interval": str(60)
21+
}
1122

1223
def run(self, zbx):
1324
if Pooler.server_version_greater("10.0"):
14-
result = Pooler.run_sql_type("count_autovacuum", args=["backend_type = 'autovacuum worker'"])
25+
result_count = Pooler.run_sql_type("count_autovacuum", args=["backend_type = 'autovacuum worker'"])
26+
result_utilization = Pooler.run_sql_type("autovacuum_utilization", args=["backend_type = 'autovacuum worker'"])
1527
else:
16-
result = Pooler.run_sql_type("count_autovacuum", args=[
28+
result_count = Pooler.run_sql_type("count_autovacuum", args=[
1729
"query LIKE '%%autovacuum%%' AND state <> 'idle' AND pid <> pg_catalog.pg_backend_pid()"])
18-
zbx.send("pgsql.autovacuum.count[]", int(result[0][0]))
19-
30+
result_utilization = Pooler.run_sql_type("autovacuum_utilization", args=[
31+
"query LIKE '%%autovacuum%%' AND state <> 'idle' AND pid <> pg_catalog.pg_backend_pid()"])
32+
zbx.send("pgsql.autovacuum.count[]", int(result_count[0][0]))
33+
zbx.send("pgsql.autovacuum.utilization[]", int(result_utilization[0][0]))
34+
2035
def items(self, template, dashboard=False):
36+
result = ""
2137
if not dashboard:
22-
return template.item({
38+
result += (template.item({
2339
"name": "PostgreSQL Autovacuum: Count of Autovacuum Workers",
24-
"key": self.right_type(self.key),
40+
"key": self.right_type(self.key_count),
2541
"delay": self.plugin_config("interval")
26-
})
42+
}))
43+
result += (template.item({
44+
"name": "PostgreSQL Autovacuum: Utilization per {0} seconds".format(self.plugin_config("interval")),
45+
"key": self.right_type(self.key_utilization),
46+
"value_type": Plugin.VALUE_TYPE.numeric_float,
47+
"units": Plugin.UNITS.percent,
48+
"delay": self.plugin_config("interval")
49+
}))
50+
result += (template.item({
51+
"name": "PostgreSQL Autovacuum: Average Utilization per 5 minutes",
52+
"key": self.right_type(self.key_utilization_avg5),
53+
"value_type": Plugin.VALUE_TYPE.numeric_float,
54+
"units": Plugin.UNITS.percent,
55+
"type": Plugin.TYPE.CALCULATED,
56+
"params": "avg(pgsql.autovacuum.utilization[], 5m)",
57+
"delay": self.plugin_config("interval")
58+
}))
59+
result += (template.item({
60+
"name": "PostgreSQL Autovacuum: Average Utilization per 10 minutes",
61+
"key": self.right_type(self.key_utilization_avg10),
62+
"value_type": Plugin.VALUE_TYPE.numeric_float,
63+
"units": Plugin.UNITS.percent,
64+
"type": Plugin.TYPE.CALCULATED,
65+
"params": "avg(pgsql.autovacuum.utilization[], 10m)",
66+
"delay": self.plugin_config("interval")
67+
}))
68+
result += (template.item({
69+
"name": "PostgreSQL Autovacuum: Average Utilization per 15 minutes",
70+
"key": self.right_type(self.key_utilization_avg15),
71+
"value_type": Plugin.VALUE_TYPE.numeric_float,
72+
"units": Plugin.UNITS.percent,
73+
"type": Plugin.TYPE.CALCULATED,
74+
"params": "avg(pgsql.autovacuum.utilization[], 15m)",
75+
"delay": self.plugin_config("interval")
76+
}))
77+
return result
2778
else:
2879
return []
2980

3081
def graphs(self, template, dashboard=False):
3182
result = template.graph({
3283
"name": "PostgreSQL Autovacuum: Count of Autovacuum Workers",
3384
"items": [{
34-
"key": self.right_type(self.key),
85+
"key": self.right_type(self.key_count),
3586
"color": "87C2B9",
3687
"drawtype": 2
3788
}]
@@ -49,9 +100,15 @@ def graphs(self, template, dashboard=False):
49100
def keys_and_queries(self, template_zabbix):
50101
result = []
51102
if LooseVersion(self.VersionPG) >= LooseVersion("10"):
52-
result.append("{0},$2 $1 -c \"{1}\"".format(self.key.format("[*]"),
103+
result.append("{0},$2 $1 -c \"{1}\"".format(self.key_count.format("[*]"),
53104
Pooler.SQL["count_autovacuum"][0].format("backend_type = 'autovacuum worker'")))
105+
result.append("{0},$2 $1 -c \"{1}\"".format(self.key_utilization.format("[*]"),
106+
Pooler.SQL["autovacuum_utilization"][0].format(
107+
"backend_type = 'autovacuum worker'")))
54108
else:
55-
result.append("{0},$2 $1 -c \"{1}\"".format(self.key.format("[*]"),
109+
result.append("{0},$2 $1 -c \"{1}\"".format(self.key_count.format("[*]"),
56110
Pooler.SQL["count_autovacuum"][0].format("query LIKE '%%autovacuum%%' AND state <> 'idle' AND pid <> pg_catalog.pg_backend_pid()")))
111+
result.append("{0},$2 $1 -c \"{1}\"".format(self.key_utilization.format("[*]"),
112+
Pooler.SQL["autovacuum_utilization"][0].format(
113+
"query LIKE '%%autovacuum%%' AND state <> 'idle' AND pid <> pg_catalog.pg_backend_pid()")))
57114
return template_zabbix.key_and_query(result)

mamonsu/plugins/pgsql/databases.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ def discovery_rules(self, template, dashboard=False):
130130
"key": self.right_type(self.key_db_bloating_tables, var_discovery="{#DATABASE},"),
131131
"drawtype": 2},
132132
{"color": "793F5D",
133-
"key": self.right_type(Autovacuum.key),
133+
"key": self.right_type(Autovacuum.key_count),
134134
"yaxisside": 1,
135135
"drawtype": 2}]
136136
},
@@ -141,7 +141,7 @@ def discovery_rules(self, template, dashboard=False):
141141
"key": self.right_type(self.key_db_age, var_discovery="{#DATABASE},"),
142142
"drawtype": 2},
143143
{"color": "793F5D",
144-
"key": self.right_type(Autovacuum.key),
144+
"key": self.right_type(Autovacuum.key_count),
145145
"yaxisside": 1,
146146
"drawtype": 2}]
147147
}]

mamonsu/plugins/pgsql/driver/pool.py

+19
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,25 @@ class Pool(object):
4747
SELECT mamonsu.count_autovacuum();
4848
"""
4949
),
50+
"autovacuum_utilization": (
51+
"""
52+
WITH count_tb AS (
53+
SELECT count(*)::float AS count
54+
FROM pg_catalog.pg_stat_activity
55+
WHERE {0}
56+
),
57+
settings_tb AS (
58+
SELECT setting::float
59+
FROM pg_catalog.pg_settings
60+
WHERE name = 'autovacuum_max_workers'
61+
)
62+
SELECT count_tb.count*100/settings_tb.setting
63+
FROM count_tb, settings_tb;
64+
""",
65+
"""
66+
SELECT mamonsu.autovacuum_utilization();
67+
"""
68+
),
5069
"buffer_cache": (
5170
"""
5271
SELECT sum(1) * (current_setting('block_size')::int8) AS size,

mamonsu/tools/bootstrap/sql.py

+43
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,49 @@
8181
END
8282
$do$;
8383
84+
DO
85+
$do$
86+
BEGIN
87+
IF (SELECT setting::integer FROM pg_settings WHERE name = 'server_version_num') >= 100000 THEN
88+
DROP FUNCTION IF EXISTS mamonsu.autovacuum_utilization();
89+
CREATE OR REPLACE FUNCTION mamonsu.autovacuum_utilization()
90+
RETURNS FLOAT AS $$
91+
WITH count_tb AS (
92+
SELECT count(*)::float AS count
93+
FROM pg_catalog.pg_stat_activity
94+
WHERE backend_type = 'autovacuum worker'
95+
),
96+
settings_tb AS (
97+
SELECT setting::float
98+
FROM pg_catalog.pg_settings
99+
WHERE name = 'autovacuum_max_workers'
100+
)
101+
SELECT count_tb.count*100/settings_tb.setting
102+
FROM count_tb, settings_tb
103+
$$ LANGUAGE SQL SECURITY DEFINER;
104+
ELSE
105+
DROP FUNCTION IF EXISTS mamonsu.count_autovacuum();
106+
CREATE OR REPLACE FUNCTION mamonsu.count_autovacuum()
107+
RETURNS FLOAT AS $$
108+
WITH count_tb AS (
109+
SELECT count(*)::float AS count
110+
FROM pg_catalog.pg_stat_activity
111+
WHERE query LIKE '%%autovacuum%%'
112+
AND state <> 'idle'
113+
AND pid <> pg_catalog.pg_backend_pid()
114+
),
115+
settings_tb AS (
116+
SELECT setting::float
117+
FROM pg_catalog.pg_settings
118+
WHERE name = 'autovacuum_max_workers'
119+
)
120+
SELECT count_tb.count*100/settings_tb.setting
121+
FROM count_tb, settings_tb
122+
$$ LANGUAGE SQL SECURITY DEFINER;
123+
END IF;
124+
END
125+
$do$;
126+
84127
DO
85128
$do$
86129
BEGIN

mamonsu/tools/zabbix_cli/dashboard.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1054,7 +1054,7 @@ def generate_dashboard(template, uuid):
10541054
Instance.graphs_name["transactions"],
10551055
Memory.graph_name_free_used,
10561056
ArchiveCommand.key.format("[" + ArchiveCommand.Items[2][0] + "]"),
1057-
Autovacuum.key.format("[]"),
1057+
Autovacuum.key_count.format("[]"),
10581058
BgWriter.graph_name_buffers,
10591059
BgWriter.graph_name_ws,
10601060
Instance.key + Instance.Items[1][1],

0 commit comments

Comments
 (0)