11# -*- coding: utf-8 -*-
22
3+ from distutils .version import LooseVersion
34from mamonsu .plugins .pgsql .plugin import PgsqlPlugin as Plugin
45from .pool import Pooler
56from mamonsu .lib .zbx_template import ZbxTemplate
@@ -16,6 +17,10 @@ class Databases(Plugin):
1617 " datistemplate = false and datname = :'p1';"
1718 query_age = "select age(datfrozenxid) from pg_catalog.pg_database where datistemplate = false " \
1819 "and datname = :'p1';"
20+ query_invalid_indexes = "SELECT count (*) " \
21+ "FROM pg_catalog.pg_index i LEFT JOIN pg_catalog.pg_locks l " \
22+ "ON (i.indexrelid = l.relation) " \
23+ "WHERE NOT (i.indisvalid AND i.indisready) AND l.relation IS NULL;"
1924
2025 # queries for zabbix agent
2126 query_agent_discovery = "SELECT json_build_object ('data',json_agg(json_build_object('{#DATABASE}',d.datname)))" \
@@ -26,6 +31,7 @@ class Databases(Plugin):
2631 key_db_age = "pgsql.database.max_age{0}"
2732 key_db_bloating_tables = "pgsql.database.bloating_tables{0}"
2833 key_autovacumm = "pgsql.autovacumm.count{0}"
34+ key_invalid_indexes = "pgsql.database.invalid_indexes{0}"
2935
3036 DEFAULT_CONFIG = {'min_rows' : str (50 ), 'bloat_scale' : str (0.2 )}
3137
@@ -49,8 +55,14 @@ def run(self, zbx):
4955 zbx .send (
5056 'pgsql.database.bloating_tables[{0}]' .format (info [0 ]),
5157 int (bloat_count ))
58+ invalid_indexes_count = Pooler .query (
59+ self .query_invalid_indexes ,
60+ info [0 ])[0 ][0 ]
61+ zbx .send (
62+ 'pgsql.database.invalid_indexes[{0}]' .format (info [0 ]),
63+ int (invalid_indexes_count ))
5264 zbx .send ('pgsql.database.discovery[]' , zbx .json ({'data' : dbs }))
53- del dbs , bloat_count
65+ del dbs , bloat_count , invalid_indexes_count
5466
5567 result = Pooler .run_sql_type ('count_autovacuum' )
5668 zbx .send ('pgsql.autovacumm.count[]' , int (result [0 ][0 ]))
@@ -100,6 +112,9 @@ def discovery_rules(self, template, dashboard=False):
100112 'delay' : self .plugin_config ('interval' )},
101113 {'key' : self .right_type (self .key_db_bloating_tables , var_discovery = "{#DATABASE}," ),
102114 'name' : 'Count of bloating tables in database: {#DATABASE}' ,
115+ 'delay' : self .plugin_config ('interval' )},
116+ {'key' : self .right_type (self .key_invalid_indexes , var_discovery = "{#DATABASE}," ),
117+ 'name' : 'Count of invalid indexes in database: {#DATABASE}' ,
103118 'delay' : self .plugin_config ('interval' )}
104119 ]
105120 graphs = [
@@ -129,7 +144,12 @@ def discovery_rules(self, template, dashboard=False):
129144 'yaxisside' : 1 }]
130145 }
131146 ]
132- return template .discovery_rule (rule = rule , conditions = conditions , items = items , graphs = graphs )
147+ triggers = [{
148+ 'name' : 'PostgreSQL invalid indexes in database '
149+ '{#DATABASE} (hostname={HOSTNAME} value={ITEM.LASTVALUE})' ,
150+ 'expression' : '{#TEMPLATE:pgsql.database.invalid_indexes[{#DATABASE}].last()}>0' }
151+ ]
152+ return template .discovery_rule (rule = rule , conditions = conditions , items = items , graphs = graphs , triggers = triggers )
133153
134154 def keys_and_queries (self , template_zabbix ):
135155 result = ['{0},$2 $1 -c "{1}"' .format (self .key_autovacumm .format ("[*]" ), Pooler .SQL ['count_autovacuum' ][0 ]),
@@ -139,5 +159,7 @@ def keys_and_queries(self, template_zabbix):
139159 '{0},$3 $2 -d "$1" -c "{1}"' .format (self .key_db_bloating_tables .format ("[*]" ),
140160 self .query_bloating_tables .format (
141161 self .plugin_config ('bloat_scale' ),
142- self .plugin_config ('min_rows' )))]
162+ self .plugin_config ('min_rows' ))),
163+ '{0},$3 $2 -d "$1" -c "{1}"' .format (self .key_invalid_indexes .format ("[*]" ),
164+ self .query_invalid_indexes )]
143165 return template_zabbix .key_and_query (result )
0 commit comments