2022-11-23 19:03:53 +02:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright (C) 2019 tribe29 GmbH - License: GNU General Public License v2
|
|
|
|
# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
|
|
|
|
# conditions defined in the file COPYING, which is part of this source code package.
|
|
|
|
|
|
|
|
factory_settings['informix_transactions_default_levels'] = {
|
|
|
|
'levels': (70, 80),
|
|
|
|
}
|
|
|
|
#first line represents current log ID
|
|
|
|
#line[2]= sessionID
|
|
|
|
#line[3]= number of locks kept by sessionID
|
|
|
|
#line[4]= begin log position
|
|
|
|
#line[5]= current log position
|
|
|
|
|
|
|
|
|
|
|
|
def parse_informix_transactions(info):
|
|
|
|
parsed = {}
|
|
|
|
instance = None
|
|
|
|
entry = None
|
|
|
|
for line in info:
|
|
|
|
if line[0].startswith("[[[") and line[0].endswith("]]]"):
|
|
|
|
instance = line[0][3:-3]
|
|
|
|
|
|
|
|
elif instance is not None:
|
|
|
|
entry = {}
|
|
|
|
parsed.setdefault(instance, [])
|
|
|
|
parsed[instance].append(entry)
|
2023-05-26 12:24:19 +03:00
|
|
|
###in some cases, for some transaction lines there is no info, only a timestamp that should be ignored
|
|
|
|
if len(line) > 2:
|
|
|
|
if "C" in line[2]:
|
|
|
|
entry.setdefault("current_log_id", line[3])
|
|
|
|
elif entry is not None:
|
|
|
|
if ":" in str(line[4]):
|
|
|
|
line[4] = line[4].split(":",1)[0]
|
|
|
|
if ":" in str(line[5]):
|
|
|
|
line[5] = line[5].split(":",1)[0]
|
|
|
|
|
|
|
|
entry.setdefault("session", [line[2], line[3], line[4], line[5]])
|
2022-11-23 19:03:53 +02:00
|
|
|
return parsed
|
|
|
|
|
|
|
|
#############Transaction with more than 70 locks
|
|
|
|
def inventory_informix_transactions_locks(parsed):
|
|
|
|
return [(instance, {}) for instance in parsed]
|
|
|
|
|
|
|
|
|
|
|
|
def check_informix_transactions_locks(item, params, parsed):
|
|
|
|
if item in parsed:
|
|
|
|
warn, crit = params['levels']
|
|
|
|
data = parsed[item]
|
|
|
|
infotext = ""
|
|
|
|
state = 0
|
|
|
|
for session in data[1:]:
|
|
|
|
if "-" not in session["session"][1]:
|
|
|
|
if int(session["session"][1]) >= crit:
|
|
|
|
state = 2
|
|
|
|
infotext += 'Session with ID %s has %s locks; ' % (session["session"][0], session["session"][1])
|
|
|
|
elif int(session["session"][1]) >= warn:
|
|
|
|
state = 1
|
|
|
|
infotext += 'Session with ID %s has %s locks; ' % (session["session"][0], session["session"][1])
|
|
|
|
|
|
|
|
if state:
|
|
|
|
infotext += " (warn/crit at %s/%s)" % (warn, crit)
|
|
|
|
else:
|
|
|
|
infotext = 'There are no sessions with high number of locks'
|
|
|
|
return state, infotext, []
|
|
|
|
|
|
|
|
|
|
|
|
check_info['informix_transactions.locks'] = {
|
|
|
|
'parse_function': parse_informix_transactions,
|
|
|
|
'inventory_function': inventory_informix_transactions_locks,
|
|
|
|
'check_function': check_informix_transactions_locks,
|
|
|
|
'has_perfdata': False,
|
|
|
|
'service_description': 'Informix sessions nLocks %s',
|
|
|
|
"group": "informix_nlocks",
|
|
|
|
'default_levels_variable': 'informix_transactions_default_levels',
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#############Sesiuni fara activitate in logul curent
|
|
|
|
def inventory_informix_transactions_activity(parsed):
|
|
|
|
return [(instance, {}) for instance in parsed]
|
|
|
|
|
|
|
|
|
|
|
|
def check_informix_transactions_activity(item, no_params, parsed):
|
|
|
|
if item in parsed:
|
|
|
|
data = parsed[item]
|
|
|
|
state = 0
|
|
|
|
infotext = ''
|
|
|
|
for session in data[1:]:
|
|
|
|
if "-" not in session["session"][2]:
|
|
|
|
if int(session["session"][2]) < int(data[0]['current_log_id']):
|
|
|
|
state = 2
|
|
|
|
infotext += "Session %s doesn't have activity in current log; " % (session["session"][0])
|
|
|
|
|
|
|
|
|
|
|
|
if not state:
|
|
|
|
infotext = 'There are no sessions with no activity in current log; '
|
|
|
|
|
|
|
|
return state, infotext, []
|
|
|
|
|
|
|
|
|
|
|
|
check_info['informix_transactions.activity'] = {
|
|
|
|
'parse_function': parse_informix_transactions,
|
|
|
|
'inventory_function': inventory_informix_transactions_activity,
|
|
|
|
'check_function': check_informix_transactions_activity,
|
|
|
|
'has_perfdata': False,
|
|
|
|
'service_description': 'Informix sessions activity %s',
|
|
|
|
}
|
|
|
|
|
|
|
|
#############Long transactions (over 3 logical logs used)
|
|
|
|
def inventory_informix_long_transactions(parsed):
|
|
|
|
return [(instance, {}) for instance in parsed]
|
|
|
|
|
|
|
|
|
|
|
|
def check_informix_long_transactions(item, no_params, parsed):
|
|
|
|
if item in parsed:
|
|
|
|
data = parsed[item]
|
|
|
|
state = 0
|
|
|
|
infotext = ''
|
|
|
|
for session in data[1:]:
|
|
|
|
if "-" not in session["session"][2]:
|
|
|
|
if (int(session["session"][2]) - int(session["session"][3])) < 2:
|
|
|
|
state = 2
|
|
|
|
infotext += "Session %s is using more than 3 logical logs; " % (session["session"][0])
|
|
|
|
|
|
|
|
|
|
|
|
if not state:
|
|
|
|
infotext = 'There are no long running transactions; '
|
|
|
|
|
|
|
|
return state, infotext, []
|
|
|
|
|
|
|
|
|
|
|
|
check_info['informix_transactions.long_transactions'] = {
|
|
|
|
'parse_function': parse_informix_transactions,
|
|
|
|
'inventory_function': inventory_informix_long_transactions,
|
|
|
|
'check_function': check_informix_long_transactions,
|
|
|
|
'has_perfdata': False,
|
|
|
|
'service_description': 'Informix sessions Long transactions %s',
|
|
|
|
}
|