1
1
# -*- coding: utf-8 -*-
2
2
3
+ from distutils .version import LooseVersion
3
4
from mamonsu .plugins .pgsql .plugin import PgsqlPlugin as Plugin
4
5
from .pool import Pooler
5
6
from mamonsu .lib .zbx_template import ZbxTemplate
@@ -16,6 +17,10 @@ class Databases(Plugin):
16
17
" datistemplate = false and datname = :'p1';"
17
18
query_age = "select age(datfrozenxid) from pg_catalog.pg_database where datistemplate = false " \
18
19
"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;"
19
24
20
25
# queries for zabbix agent
21
26
query_agent_discovery = "SELECT json_build_object ('data',json_agg(json_build_object('{#DATABASE}',d.datname)))" \
@@ -26,6 +31,7 @@ class Databases(Plugin):
26
31
key_db_age = "pgsql.database.max_age{0}"
27
32
key_db_bloating_tables = "pgsql.database.bloating_tables{0}"
28
33
key_autovacumm = "pgsql.autovacumm.count{0}"
34
+ key_invalid_indexes = "pgsql.database.invalid_indexes{0}"
29
35
30
36
DEFAULT_CONFIG = {'min_rows' : str (50 ), 'bloat_scale' : str (0.2 )}
31
37
@@ -49,8 +55,14 @@ def run(self, zbx):
49
55
zbx .send (
50
56
'pgsql.database.bloating_tables[{0}]' .format (info [0 ]),
51
57
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 ))
52
64
zbx .send ('pgsql.database.discovery[]' , zbx .json ({'data' : dbs }))
53
- del dbs , bloat_count
65
+ del dbs , bloat_count , invalid_indexes_count
54
66
55
67
result = Pooler .run_sql_type ('count_autovacuum' )
56
68
zbx .send ('pgsql.autovacumm.count[]' , int (result [0 ][0 ]))
@@ -100,6 +112,9 @@ def discovery_rules(self, template, dashboard=False):
100
112
'delay' : self .plugin_config ('interval' )},
101
113
{'key' : self .right_type (self .key_db_bloating_tables , var_discovery = "{#DATABASE}," ),
102
114
'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}' ,
103
118
'delay' : self .plugin_config ('interval' )}
104
119
]
105
120
graphs = [
@@ -129,7 +144,12 @@ def discovery_rules(self, template, dashboard=False):
129
144
'yaxisside' : 1 }]
130
145
}
131
146
]
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 )
133
153
134
154
def keys_and_queries (self , template_zabbix ):
135
155
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):
139
159
'{0},$3 $2 -d "$1" -c "{1}"' .format (self .key_db_bloating_tables .format ("[*]" ),
140
160
self .query_bloating_tables .format (
141
161
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 )]
143
165
return template_zabbix .key_and_query (result )
0 commit comments