Skip to content

Commit f9e8623

Browse files
committed
feat: add support for pgpro_stats 1.8
1 parent 3465255 commit f9e8623

File tree

3 files changed

+89
-11
lines changed

3 files changed

+89
-11
lines changed

mamonsu/plugins/pgsql/driver/pool.py

+22
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ def __init__(self, params=None):
110110
"bootstrap": {"storage": {}, "counter": 0, "cache": 10, "version": False},
111111
"recovery": {"storage": {}, "counter": 0, "cache": 10},
112112
"extension_schema": {"pg_buffercache": {}, "pg_stat_statements": {}, "pg_wait_sampling": {}, "pgpro_stats": {}},
113+
"extension_versions" : {},
113114
"pgpro": {"storage": {}},
114115
"pgproee": {"storage": {}}
115116
}
@@ -135,6 +136,19 @@ def server_version(self, db=None):
135136
result.decode("ascii"))
136137
return self._cache["server_version"]["storage"][db]
137138

139+
def extension_version(self, extension, db=None):
140+
db = self._normalize_db(db)
141+
if extension in self._cache["extension_versions"] and db in self._cache["extension_versions"][extension][db]:
142+
return self._cache["extension_versions"][extension][db]
143+
144+
version_string = self.query("select extversion from pg_catalog.pg_extension where lower(extname) = lower('{0}');".format(extension), db)[0][0]
145+
result = bytes(
146+
version_string.split(" ")[0], "utf-8")
147+
self._cache["extension_versions"][extension] = {}
148+
self._cache["extension_versions"][extension][db] = "{0}".format(
149+
result.decode("ascii"))
150+
return self._cache["extension_versions"][extension][db]
151+
138152
def server_version_greater(self, version, db=None):
139153
db = self._normalize_db(db)
140154
return packaging.version.parse(self.server_version(db)) >= packaging.version.parse(version)
@@ -229,6 +243,14 @@ def is_pgpro_ee(self, db=None):
229243
self._cache["pgproee"][db] = False
230244
return self._cache["pgproee"][db]
231245

246+
def extension_version_greater(self, extension, version, db=None):
247+
db = self._normalize_db(db)
248+
return packaging.version.parse(self.extension_version(extension, db)) >= packaging.version.parse(version)
249+
250+
def extension_version_less(self, extension, version, db=None):
251+
db = self._normalize_db(db)
252+
return packaging.version.parse(self.extension_version(extension, db)) <= packaging.version.parse(version)
253+
232254
def extension_installed(self, ext, db=None):
233255
db = self._normalize_db(db)
234256
result = self.query("""

mamonsu/plugins/pgsql/statements.py

+60-10
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class Statements(Plugin):
2727

2828
query_info = """
2929
SELECT {metrics}
30-
FROM {extension_schema}.pg_stat_statements_info;
30+
FROM {extension_schema}.{info_view_name};
3131
"""
3232
key = "pgsql."
3333
# zbx_key, sql, desc, unit, delta, (Graph, color, side)
@@ -88,6 +88,32 @@ class Statements(Plugin):
8888
("PostgreSQL Statements Info: Last Statistics Reset Time", "9C8A4E", 0))
8989
]
9090

91+
Items_pgpro_stats_1_8 = [
92+
("stat[read_bytes]",
93+
"(sum(shared_blks_read+local_blks_read+temp_blks_read)*8*1024)::bigint",
94+
"Read bytes/s", Plugin.UNITS.bytes_per_second, Plugin.DELTA.speed_per_second,
95+
("PostgreSQL Statements: Bytes", "87C2B9", 0)),
96+
("stat[write_bytes]",
97+
"(sum(shared_blks_written+local_blks_written+temp_blks_written)*8*1024)::bigint",
98+
"Write bytes/s", Plugin.UNITS.bytes_per_second, Plugin.DELTA.speed_per_second,
99+
("PostgreSQL Statements: Bytes", "793F5D", 0)),
100+
("stat[dirty_bytes]",
101+
"(sum(shared_blks_dirtied+local_blks_dirtied)*8*1024)::bigint",
102+
"Dirty bytes/s", Plugin.UNITS.bytes_per_second, Plugin.DELTA.speed_per_second,
103+
("PostgreSQL Statements: Bytes", "9C8A4E", 0)),
104+
("stat[read_time]",
105+
"(sum(shared_blk_read_time+local_blk_read_time+temp_blk_read_time)/float4(100))::bigint",
106+
"Read IO Time", Plugin.UNITS.s, Plugin.DELTA.speed_per_second,
107+
("PostgreSQL Statements: Spent Time", "87C2B9", 0)),
108+
("stat[write_time]",
109+
"(sum(shared_blk_write_time+local_blk_write_time+temp_blk_write_time)/float4(100))::bigint",
110+
"Write IO Time", Plugin.UNITS.s, Plugin.DELTA.speed_per_second,
111+
("PostgreSQL Statements: Spent Time", "793F5D", 0)),
112+
["stat[other_time]",
113+
"(sum(total_exec_time+total_plan_time-shared_blk_read_time-local_blk_read_time-temp_blk_read_time-shared_blk_write_time-local_blk_write_time-temp_blk_write_time)/float4(100))::bigint",
114+
"Other (mostly CPU) Time", Plugin.UNITS.s, Plugin.DELTA.speed_per_second,
115+
("PostgreSQL Statements: Spent Time", "9C8A4E", 0)]]
116+
91117
all_graphs = [
92118
("PostgreSQL Statements: Bytes", None),
93119
("PostgreSQL Statements: Spent Time", 1),
@@ -115,21 +141,45 @@ def run(self, zbx):
115141

116142
# TODO: add 13 and 14 items when pgpro_stats added new WAL metrics
117143
all_items = self.Items.copy()
118-
if Pooler.server_version_greater("14"):
144+
145+
if Pooler.extension_version_greater("pgpro_stats", "1.8"):
146+
info_view = 'pg_stat_statements_info'
147+
if self.extension == "pgpro_stats":
148+
info_view = 'pgpro_stats_info'
149+
150+
info_items = self.Items_pg_14
151+
info_params = [x[1] for x in info_items]
152+
info_result = Pooler.query(
153+
self.query_info.format(metrics=(", ".join(info_params)), extension_schema=extension_schema, info_view_name=info_view))
154+
for key, value in enumerate(info_result[0]):
155+
zbx_key, value = "pgsql.{0}".format(
156+
info_items[key][0]), int(value)
157+
zbx.send(zbx_key, value, info_items[key][4])
158+
159+
all_items = self.Items_pgpro_stats_1_8.copy()
160+
all_items += self.Items_pg_13
161+
162+
elif Pooler.server_version_greater("14"):
119163
self.Items[5][1] = self.Items[5][1].format("total_exec_time+total_plan_time")
120164
all_items += self.Items_pg_13
165+
info_view = 'pgpro_stats_info'
121166
if self.extension == "pg_stat_statements":
122-
info_items = self.Items_pg_14
123-
info_params = [x[1] for x in info_items]
124-
info_result = Pooler.query(
125-
self.query_info.format(metrics=(", ".join(info_params)), extension_schema=extension_schema))
126-
for key, value in enumerate(info_result[0]):
127-
zbx_key, value = "pgsql.{0}".format(
128-
info_items[key][0]), int(value)
129-
zbx.send(zbx_key, value, info_items[key][4])
167+
info_view = 'pg_stat_statements_info'
168+
info_items = self.Items_pg_14
169+
info_params = [x[1] for x in info_items]
170+
info_result = Pooler.query(
171+
self.query_info.format(metrics=(", ".join(info_params)),
172+
extension_schema=extension_schema,
173+
info_view_name=info_view))
174+
for key, value in enumerate(info_result[0]):
175+
zbx_key, value = "pgsql.{0}".format(
176+
info_items[key][0]), int(value)
177+
zbx.send(zbx_key, value, info_items[key][4])
178+
130179
elif Pooler.server_version_greater("13"):
131180
self.Items[5][1] = self.Items[5][1].format("total_exec_time+total_plan_time")
132181
all_items += self.Items_pg_13
182+
133183
else:
134184
self.Items[5][1] = self.Items[5][1].format("total_time")
135185
columns = [x[1] for x in all_items]

mamonsu/tools/bootstrap/start.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,13 @@ def run_deploy():
237237
if Pooler.is_pgpro() or Pooler.is_pgpro_ee():
238238
bootstrap_extension_queries = fill_query_params(CreateWaitSamplingFunctionsSQL)
239239
Pooler.query(bootstrap_extension_queries)
240-
if Pooler.server_version_greater("12"):
240+
if Pooler.extension_version_greater("pgpro_stats", "1.8"):
241+
statements_items = [x[1] for x in Statements.Items_pgpro_stats_1_8] + [x[1] for x in Statements.Items_pg_13]
242+
statements_columns = [x[0][x[0].find("[")+1:x[0].find("]")] for x in Statements.Items_pgpro_stats_1_8] + [x[0][x[0].find("[")+1:x[0].find("]")] for x in Statements.Items_pg_13]
243+
bootstrap_extension_queries = CreateStatementsFunctionsSQL.format(
244+
columns=" bigint, ".join(statements_columns) + " bigint", metrics=(", ".join(statements_items)))
245+
Pooler.query(bootstrap_extension_queries)
246+
elif Pooler.server_version_greater("12"):
241247
statements_items = [x[1] for x in Statements.Items] + ([x[1] for x in Statements.Items_pg_13] if Pooler.server_version_greater("13") else [])
242248
statements_items[5] = statements_items[5].format("total_exec_time+total_plan_time")
243249
statements_columns = [x[0][x[0].find("[")+1:x[0].find("]")] for x in Statements.Items] + ([x[0][x[0].find("[")+1:x[0].find("]")] for x in Statements.Items_pg_13] if Pooler.server_version_greater("13") else [])

0 commit comments

Comments
 (0)