Module: check_mk
Branch: master
Commit: 009c2f9dda67a0d8a1ff9b5419b3444220b66bc6
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=009c2f9dda67a0…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Mon Mar 4 13:08:23 2013 +0100
Predictive monitoring also for diskstat (throughput)
---
checks/cpu | 4 +++-
checks/diskstat.include | 24 +++++++++++++-----------
checks/kernel | 4 +++-
modules/check_mk_base.py | 17 +++++++++++++----
modules/prediction.py | 8 ++++++++
web/htdocs/wato.py | 16 ++++++++++++++--
web/plugins/wato/check_parameters.py | 18 ++++++++----------
7 files changed, 62 insertions(+), 29 deletions(-)
diff --git a/checks/cpu b/checks/cpu
index 9e71b27..03d78f5 100644
--- a/checks/cpu
+++ b/checks/cpu
@@ -54,7 +54,9 @@ def check_cpu_load(item, params, info):
state, text, perf = check_levels(load[2], 'load15', params, factor =
num_cpus)
perfdata += perf
- infotext = "15min load %.2f at %d CPUs%s" % (load[2], num_cpus, text)
+ infotext = "15min load %.2f at %d CPUs" % (load[2], num_cpus)
+ if text:
+ infotext += ", " + text
return state, infotext, perfdata
def inventory_cpu_threads(info):
diff --git a/checks/diskstat.include b/checks/diskstat.include
index aac8092..8be5e57 100644
--- a/checks/diskstat.include
+++ b/checks/diskstat.include
@@ -94,12 +94,13 @@ def check_diskstat_line(this_time, item, params, line):
perfdata = []
infos = []
status = 0
+ prediction_perf = []
for what, ctr in [ ("read", line[1]), ("write", line[2]) ]:
countername = "diskstat.%s.%s" % (item, what)
# unpack levels now, need also for perfdata
levels = params.get(what)
- if levels:
+ if type(levels) == tuple:
warn, crit = levels
else:
warn, crit = None, None
@@ -109,22 +110,22 @@ def check_diskstat_line(this_time, item, params, line):
bytes_per_sec = sectors_per_sec * 512
infos.append("%s/sec %s" % (get_bytes_human_readable(bytes_per_sec),
what))
perfdata.append( (what, bytes_per_sec, warn, crit) )
+ dsname = what
# compute average of the rate over ___ minutes
if average_range != None:
timedif, avg = get_average(countername + ".avg", this_time,
bytes_per_sec, average_range)
- perfdata.append( (what + ".avg", avg) )
+ dsname = what + ".avg"
+ perfdata.append( (dsname, avg) )
bytes_per_sec = avg
# check levels
- if levels != None:
- mb_per_sec = bytes_per_sec / 1048576
- if mb_per_sec >= crit:
- status = 2
- infos[-1] += "(!!)"
- elif mb_per_sec >= warn:
- status = max(status, 1)
- infos[-1] += "(!)"
+ state, text, extraperf = check_levels(bytes_per_sec, dsname, levels,
+ unit = "MB/s", factor = 1.0 /
1048576, statemarkers=True)
+ if text:
+ infos.append(text)
+ status = max(state, status)
+ prediction_perf += extraperf
# Add performance data for averaged IO
if average_range != None:
@@ -191,8 +192,9 @@ def check_diskstat_line(this_time, item, params, line):
if params.get("ql_perfdata"):
perfdata.append((what + "_ql", ql))
+ perfdata += prediction_perf
- return (status, nagios_state_names[status] + " - " + ",
".join(infos) , perfdata)
+ return (status, ", ".join(infos) , perfdata)
def check_diskstat_generic(item, params, this_time, info):
diff --git a/checks/kernel b/checks/kernel
index 1b62e04..52a9d20 100644
--- a/checks/kernel
+++ b/checks/kernel
@@ -67,7 +67,9 @@ def check_kernel(item, params, info):
perfdata = [ (counter, per_sec, warn, crit) ]
state, text, extraperf = check_levels(per_sec, counter, params)
perfdata += extraperf
- infotext = "%.0f/s in last %d secs%s" % (per_sec, timedif, text)
+ infotext = "%.0f/s in last %d secs" % (per_sec, timedif)
+ if text:
+ infotext += ", " + text
return state, infotext, perfdata
kernel_util_default_levels = None
diff --git a/modules/check_mk_base.py b/modules/check_mk_base.py
index 4697eb8..9036ab9 100755
--- a/modules/check_mk_base.py
+++ b/modules/check_mk_base.py
@@ -1272,7 +1272,11 @@ def nodes_of(hostname):
# Generic function for checking a value against levels. This also support
# predictive levels.
-def check_levels(value, dsname, params, factor = 1.0):
+def check_levels(value, dsname, params, unit = "", factor = 1.0,
statemarkers=False):
+
+ if params == None or params == (None, None):
+ return 0, "", []
+
perfdata = []
infotext = ""
@@ -1287,12 +1291,12 @@ def check_levels(value, dsname, params, factor = 1.0):
ref_value, ((warn_upper, crit_upper), (warn_lower, crit_lower)) = \
get_predictive_levels(dsname, params, "MAX", levels_factor=factor)
if ref_value:
- infotext += ", predicted reference: %.2f" % ref_value
+ infotext += "predicted reference: %.2f%s" % (ref_value * factor,
unit)
else:
- infotext += ", no reference for prediction yet"
+ infotext += "no reference for prediction yet"
if ref_value:
- perfdata.append(('predict_load15', ref_value))
+ perfdata.append(('predict_' + dsname, ref_value))
# Critical cases
if crit_upper != None and value >= crit_upper:
@@ -1314,6 +1318,11 @@ def check_levels(value, dsname, params, factor = 1.0):
else:
state = 0
+ if state and statemarkers:
+ if state == 1:
+ infotext += "(!)"
+ else:
+ infotext += "(!!)"
return state, infotext, perfdata
diff --git a/modules/prediction.py b/modules/prediction.py
index 46f0731..482347e 100644
--- a/modules/prediction.py
+++ b/modules/prediction.py
@@ -129,6 +129,9 @@ def group_by_wday(t):
def group_by_day(t):
return "everyday", (t - time.timezone) % 86400
+def group_by_everyhour(t):
+ return "everyhour", (t - time.timezone) % 3600
+
prediction_periods = {
"wday" : {
"slice" : 86400,
@@ -139,6 +142,11 @@ prediction_periods = {
"slice" : 86400,
"groupby" : group_by_day,
"valid" : 1,
+ },
+ "hour" : {
+ "slice" : 3600,
+ "groupby" : group_by_everyhour,
+ "valid" : 1,
}
}
diff --git a/web/htdocs/wato.py b/web/htdocs/wato.py
index 1b6e5d8..c02a1ea 100644
--- a/web/htdocs/wato.py
+++ b/web/htdocs/wato.py
@@ -10824,7 +10824,8 @@ def PredictiveLevels(**args):
title = _("Base prediction on"),
choices = [
( "wday", _("Day of the week (00:00 - 24:00 in
local time)") ),
- ( "day", _("Hour of the day") ),
+ ( "day", _("Hour of the day") ),
+ ( "hour", _("Minute of the hour (00-59)") ),
]
)),
( "horizon",
@@ -10907,10 +10908,19 @@ def PredictiveLevels(**args):
# To be used as ValueSpec for levels on numeric values, with
# prediction
+def match_levels_alternative(v):
+ if type(v) == dict:
+ return 2
+ elif type(v) == tuple and v != (None, None):
+ return 1
+ else:
+ return 0
+
def Levels(**kwargs):
help = kwargs.get("help")
unit = kwargs.get("unit")
- default_levels = kwargs.get("default_levels", (None, None))
+ title = kwargs.get("title")
+ default_levels = kwargs.get("default_levels", (0.0, 0.0))
default_difference = kwargs.get("default_difference", (0,0))
if "default_value" in kwargs:
default_value = kwargs["default_value"]
@@ -10918,6 +10928,7 @@ def Levels(**kwargs):
default_value = default_levels and default_levels or None
return Alternative(
+ title = title,
help = help,
show_titles = False,
elements = [
@@ -10937,6 +10948,7 @@ def Levels(**kwargs):
default_difference = default_difference,
),
],
+ match = match_levels_alternative,
default_value = default_value,
)
diff --git a/web/plugins/wato/check_parameters.py b/web/plugins/wato/check_parameters.py
index 9ce1d63..6457856 100644
--- a/web/plugins/wato/check_parameters.py
+++ b/web/plugins/wato/check_parameters.py
@@ -2043,19 +2043,17 @@ checkgroups.append((
Dictionary(
elements = [
( "read",
- Tuple(
+ Levels(
title = _("Read throughput"),
- elements = [
- Float(title = _("warning at"), unit =
_("MB/s")),
- Float(title = _("critical at"), unit =
_("MB/s"))
- ])),
+ unit = _("MB/s"),
+ default_value = None,
+ default_levels = (50.0, 100.0))),
( "write",
- Tuple(
+ Levels(
title = _("Write throughput"),
- elements = [
- Float(title = _("warning at"), unit =
_("MB/s")),
- Float(title = _("critical at"), unit =
_("MB/s"))
- ])),
+ unit = _("MB/s"),
+ default_value = None,
+ default_levels = (50.0, 100.0))),
( "average",
Integer(
title = _("Average"),