Module: check_mk
Branch: master
Commit: 8ccaa7c9f5b43e43538b9c00e6ac67729be66ea9
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=8ccaa7c9f5b43e…
Author: Simon Betz <si(a)mathias-kettner.de>
Date: Thu Sep 13 08:58:34 2018 +0200
6498 fileinfo.groups: Conjunctions of different levels are configurable
Change-Id: I1f46fb14daabeb18b44769447d1fc7d3d77067ae
---
.werks/6498 | 25 +++++++++++++++++++++++++
checks/fileinfo | 32 ++++++++++++++++++++++++++++----
cmk/gui/plugins/wato/check_parameters.py | 30 ++++++++++++++++++++++++++++++
3 files changed, 83 insertions(+), 4 deletions(-)
diff --git a/.werks/6498 b/.werks/6498
new file mode 100644
index 0000000..d40b26e
--- /dev/null
+++ b/.werks/6498
@@ -0,0 +1,25 @@
+Title: fileinfo.groups: Conjunctions of different levels are configurable
+Level: 1
+Component: checks
+Compatible: compat
+Edition: cre
+Version: 1.6.0i1
+Date: 1536821894
+Class: feature
+
+File group statistics such as
+<ul>
+<li>count</li>
+<li>size</li>
+<li>largest size</li>
+<li>smallest size</li>
+<li>oldest age</li>
+<li>newest age</li>
+</ul>
+can be checked by upper and lower thresholds which consists of two values: warn
+and crit. These levels are independent of each other.
+
+In order to check dependent file group statistics you can configure
+conjunctions of single levels now. A conjunction consists of a monitoring state
+and any number of upper or lower levels. If all of the configured levels within
+a conjunction are reached then the related state is reported.
diff --git a/checks/fileinfo b/checks/fileinfo
index c5bec7e..091d5ec 100644
--- a/checks/fileinfo
+++ b/checks/fileinfo
@@ -251,9 +251,9 @@ def check_fileinfo(item, params, parsed):
age = reftime - file_stat.time
check_definition = [
("Size", "size", file_stat.size,
get_filesize_human_readable),
- ("Age", "age", age, get_age_human_readable)
+ ("Age", "age", age, get_age_human_readable),
]
- return fileinfo_check_function(check_definition, params, outof_range_txt)
+ return _fileinfo_check_function(check_definition, params, outof_range_txt)
else:
if outof_range_txt:
return 0, "File not found - %s" % outof_range_txt
@@ -398,7 +398,10 @@ def check_fileinfo_groups(_item, params, parsed):
if files_stat_failed:
yield 1, "Files with unknown stat: %s" % ",
".join(files_stat_failed)
- yield fileinfo_check_function(check_definition, params, outof_range_txt)
+ yield _fileinfo_check_function(check_definition, params, outof_range_txt)
+
+ for res in _fileinfo_check_conjunctions(check_definition, params):
+ yield res
long_output = []
if any(include_patterns):
@@ -417,7 +420,7 @@ def check_fileinfo_groups(_item, params, parsed):
yield 0, "\n%s" % "\n".join(long_output)
-def fileinfo_check_function(check_definition, params, outof_range_txt):
+def _fileinfo_check_function(check_definition, params, outof_range_txt):
infotexts = []
states = [0]
perfdata = []
@@ -464,6 +467,27 @@ def inventory_fileinfo(parsed):
return inventory_fileinfo_common(parsed, "single")
+def _fileinfo_check_conjunctions(check_definition, params):
+ conjunctions = params.get("conjunctions", [])
+ for conjunction_state, levels in conjunctions:
+ levels = dict(levels)
+ match_texts = []
+ matches = 0
+ for title, key, value, readable_f in check_definition:
+ level = levels.get(key)
+ if level is not None and value >= level:
+ match_texts.append("%s at %s" % (title.lower(),
readable_f(level)))
+ matches += 1
+
+ level_lower = levels.get("%s_lower" % key)
+ if level_lower is not None and value < level_lower:
+ match_texts.append("%s below %s" % (title.lower(),
readable_f(level_lower)))
+ matches += 1
+
+ if matches == len(levels):
+ yield conjunction_state, "Conjunction: %s" % " AND
".join(match_texts)
+
+
check_info["fileinfo"] = {
"parse_function" : parse_fileinfo,
"check_function" : check_fileinfo,
diff --git a/cmk/gui/plugins/wato/check_parameters.py
b/cmk/gui/plugins/wato/check_parameters.py
index 9f94be3..5b63ea8 100644
--- a/cmk/gui/plugins/wato/check_parameters.py
+++ b/cmk/gui/plugins/wato/check_parameters.py
@@ -7293,6 +7293,36 @@ register_check_parameters(
title = _("Only check during the following times of the
day"),
help = _("Outside these ranges the check will always be
OK"),
)),
+ ("conjunctions", ListOf(Tuple(
+ elements=[
+ MonitoringState(title=_("Monitoring state"),
default_value=2),
+ ListOf(
+ CascadingDropdown(
+ orientation="hroizontal",
+ choices=[
+ ("count", _("File count
at"), Integer()),
+ ("count_lower", _("File count
below"), Integer()),
+ ("size", _("File size
at"), Filesize()),
+ ("size_lower", _("File size
below"), Filesize()),
+ ("largest_size", _("Largest file
size at"), Filesize()),
+ ("largest_size_lower", _("Largest file
size below"), Filesize()),
+ ("smallest_size", _("Smallest file
size at"), Filesize()),
+ ("smallest_size_lower", _("Smallest file
size below"), Filesize()),
+ ("oldest_age", _("Oldest file age
at"), Age()),
+ ("oldest_age_lower", _("Oldest file age
below"), Age()),
+ ("newest_age", _("Newest file age
at"), Age()),
+ ("newest_age_lower", _("Newest file age
below"), Age()),
+ ]
+ ),
+ magic="@#@#",
+ )
+ ]),
+ title=_("Level conjunctions"),
+ help=_("In order to check dependent file group statistics you can
configure "
+ "conjunctions of single levels now. A conjunction consists of
a monitoring state "
+ "and any number of upper or lower levels. If all of the
configured levels within "
+ "a conjunction are reached then the related state is
reported."),
+ )),
],
ignored_keys = ["precompiled_patterns"]
),