diff --git a/README.md b/README.md index fd6b6bf..5f02360 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Supported platforms: Supported Zabbix server versions: 4.0.44 - 6.4.13 -Supported PostgreSQL versions: 12 - 17 +Supported PostgreSQL versions: 12 - 18 *** ***Table of Contents*** diff --git a/mamonsu/plugins/pgsql/driver/pool.py b/mamonsu/plugins/pgsql/driver/pool.py index a8433d9..11eefd8 100644 --- a/mamonsu/plugins/pgsql/driver/pool.py +++ b/mamonsu/plugins/pgsql/driver/pool.py @@ -155,6 +155,7 @@ def server_version(self, db=None): return self._cache["server_version"]["storage"][db] version_string = self.query("show server_version", db)[0][0] + version_string = version_string.rstrip("devel") result = bytes( version_string.split(" ")[0], "utf-8") self._cache["server_version"]["storage"][db] = "{0}".format( @@ -248,7 +249,7 @@ def is_pgpro(self, db=None): return self._cache["pgpro"][db] try: self.query(""" - SELECT pgpro_version(); + SHOW pgpro_version; """) self._cache["pgpro"][db] = True except: @@ -264,7 +265,7 @@ def is_pgpro_ee(self, db=None): return self._cache["pgproee"][db] try: ed = self.query(""" - SELECT pgpro_edition(); + SHOW pgpro_edition; """)[0][0] self._connections[db].log.info("pgpro_edition is {}".format(ed)) self._cache["pgproee"][db] = (ed.lower() == "enterprise") diff --git a/mamonsu/plugins/pgsql/statements.py b/mamonsu/plugins/pgsql/statements.py index 784f226..dbcc526 100644 --- a/mamonsu/plugins/pgsql/statements.py +++ b/mamonsu/plugins/pgsql/statements.py @@ -45,16 +45,16 @@ class Statements(Plugin): "Dirty bytes/s", Plugin.UNITS.bytes_per_second, Plugin.DELTA.speed_per_second, ("PostgreSQL Statements: Bytes", "9C8A4E", 0)), - ("stat[read_time]", - "(sum(blk_read_time)/float4(100))::bigint", + ["stat[read_time]", + "(sum({0})/float4(100))::bigint", "Read IO Time", Plugin.UNITS.s, Plugin.DELTA.speed_per_second, - ("PostgreSQL Statements: Spent Time", "87C2B9", 0)), - ("stat[write_time]", - "(sum(blk_write_time)/float4(100))::bigint", + ("PostgreSQL Statements: Spent Time", "87C2B9", 0)], + ["stat[write_time]", + "(sum({0})/float4(100))::bigint", "Write IO Time", Plugin.UNITS.s, Plugin.DELTA.speed_per_second, - ("PostgreSQL Statements: Spent Time", "793F5D", 0)), + ("PostgreSQL Statements: Spent Time", "793F5D", 0)], ["stat[other_time]", - "(sum({0}-blk_read_time-blk_write_time)/float4(100))::bigint", + "(sum({0}-{1})/float4(100))::bigint", "Other (mostly CPU) Time", Plugin.UNITS.s, Plugin.DELTA.speed_per_second, ("PostgreSQL Statements: Spent Time", "9C8A4E", 0)]] @@ -160,7 +160,14 @@ def run(self, zbx): all_items += self.Items_pg_13 elif Pooler.server_version_greater("14"): - self.Items[5][1] = self.Items[5][1].format("total_exec_time+total_plan_time") + if Pooler.server_version_greater("17"): + self.Items[3][1] = self.Items[3][1].format("shared_blk_read_time+local_blk_read_time+temp_blk_read_time") + self.Items[4][1] = self.Items[4][1].format("shared_blk_write_time+local_blk_write_time+temp_blk_write_time") + self.Items[5][1] = self.Items[5][1].format("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") + else: + self.Items[3][1] = self.Items[3][1].format("blk_read_time") + self.Items[4][1] = self.Items[4][1].format("blk_write_time") + self.Items[5][1] = self.Items[5][1].format("total_exec_time+total_plan_time", "blk_read_time-blk_write_time") all_items += self.Items_pg_13 info_view = 'pgpro_stats_info' if self.extension == "pg_stat_statements": @@ -177,11 +184,17 @@ def run(self, zbx): zbx.send(zbx_key, value, info_items[key][4]) elif Pooler.server_version_greater("13"): - self.Items[5][1] = self.Items[5][1].format("total_exec_time+total_plan_time") + self.Items[3][1] = self.Items[3][1].format("blk_read_time") + self.Items[4][1] = self.Items[4][1].format("blk_write_time") + self.Items[5][1] = self.Items[5][1].format("total_exec_time+total_plan_time", "blk_read_time-blk_write_time") + all_items += self.Items_pg_13 else: - self.Items[5][1] = self.Items[5][1].format("total_time") + self.Items[3][1] = self.Items[3][1].format("blk_read_time") + self.Items[4][1] = self.Items[4][1].format("blk_write_time") + self.Items[5][1] = self.Items[5][1].format("total_time", "blk_read_time-blk_write_time") + columns = [x[1] for x in all_items] result = Pooler.query(self.query[self.extension + "_bootstrap"].format( columns=", ".join([x[0][x[0].find("[") + 1:x[0].find("]")] for x in all_items]), diff --git a/mamonsu/plugins/pgsql/wal.py b/mamonsu/plugins/pgsql/wal.py index 6f62165..0600eaf 100644 --- a/mamonsu/plugins/pgsql/wal.py +++ b/mamonsu/plugins/pgsql/wal.py @@ -74,15 +74,26 @@ def run(self, zbx): result = Pooler.query(""" SELECT wal_buffers_full FROM pg_stat_wal; """) - zbx.send(self.key_wal_buffers_full.format("[]"), int(result[0][0]), self.DELTA_SPEED) - result = Pooler.query(""" - SELECT wal_write_time FROM pg_stat_wal; - """) - zbx.send(self.key_wal_write_time.format("[]"), int(result[0][0]), self.DELTA_SPEED) - result = Pooler.query(""" - SELECT wal_sync_time FROM pg_stat_wal; - """) - zbx.send(self.key_wal_sync_time.format("[]"), int(result[0][0]), self.DELTA_SPEED) + if Pooler.server_version_greater("18"): + zbx.send(self.key_wal_buffers_full.format("[]"), int(result[0][0]), self.DELTA_SPEED) + result = Pooler.query(""" + SELECT SUM(write_time) AS wal_write_time FROM pg_stat_io WHERE object = 'wal'; + """) + zbx.send(self.key_wal_write_time.format("[]"), int(result[0][0]), self.DELTA_SPEED) + result = Pooler.query(""" + SELECT SUM(fsync_time) AS wal_sync_time FROM pg_stat_io WHERE object = 'wal'; + """) + zbx.send(self.key_wal_sync_time.format("[]"), int(result[0][0]), self.DELTA_SPEED) + else: + zbx.send(self.key_wal_buffers_full.format("[]"), int(result[0][0]), self.DELTA_SPEED) + result = Pooler.query(""" + SELECT wal_write_time FROM pg_stat_wal; + """) + zbx.send(self.key_wal_write_time.format("[]"), int(result[0][0]), self.DELTA_SPEED) + result = Pooler.query(""" + SELECT wal_sync_time FROM pg_stat_wal; + """) + zbx.send(self.key_wal_sync_time.format("[]"), int(result[0][0]), self.DELTA_SPEED) def items(self, template, dashboard=False): result = ""