Module: check_mk
Branch: master
Commit: 093d38f369bf47bb21f065a90aee54b365459210
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=093d38f369bf47…
Author: Óscar Nájera <on(a)mathias-kettner.de>
Date: Thu Nov 22 09:38:12 2018 +0100
6651 FIX Single CPU utilization, apply Werk 6735: don't double count guest cputime
Linux kernel includes guest cputime in user cputime and thus guest cputime
must not be added when calculating total cputime for each core. This bugfix
was already implement in Werk 6735 for the all cores combined total CPU
utilization.
Test are included to verify the correct behavior.
CMK-1284
Change-Id: I6fc7737e4dcb2a77e1a555774fc0705b28247767
---
.werks/6651 | 15 ++++++++++
checks/cpu_util.include | 6 ++--
tests/unit/checks/test_kernel_check.py | 54 +++++++++++++++++++++++++++++-----
3 files changed, 64 insertions(+), 11 deletions(-)
diff --git a/.werks/6651 b/.werks/6651
new file mode 100644
index 0000000..4532733
--- /dev/null
+++ b/.werks/6651
@@ -0,0 +1,15 @@
+Title: Single CPU utilization, apply Werk 6735: don't double count guest cputime in
total cputime
+Level: 1
+Component: checks
+Compatible: compat
+Edition: cre
+Version: 1.6.0i1
+Date: 1542875627
+Class: fix
+
+Linux kernel includes guest cputime in user cputime and thus guest cputime
+must not be added when calculating total cputime for each core. This bugfix
+was already implement in Werk 6735 for the all cores combined total CPU
+utilization.
+
+Test are included to verify the correct behavior.
diff --git a/checks/cpu_util.include b/checks/cpu_util.include
index 30090ae..75beb21 100644
--- a/checks/cpu_util.include
+++ b/checks/cpu_util.include
@@ -231,9 +231,9 @@ def check_cpu_util_unix(values, params, cores=None):
core_counter = 0
cores_padded = [line + [0] * (11 - len(line)) for line in cores]
for core, user, nice, system, _idle, iowait,\
- irq, softirq, steal, guest, guest_nice in cores_padded:
+ irq, softirq, steal, _guest, _guest_nice in cores_padded:
- total = user + nice + system + iowait + irq + softirq + steal + guest +
guest_nice
+ total = user + nice + system + iowait + irq + softirq + steal
prev_total = get_item_state("cpu.util.%s.total" % core, 0)
total_diff = total - prev_total
set_item_state("cpu.util.%s.total" % core, total)
@@ -253,7 +253,7 @@ def check_cpu_util_unix(values, params, cores=None):
state = 0
if total_perc >= crit:
state = 2
- if total_perc >= warn:
+ elif total_perc >= warn:
state = 1
if state > 0:
yield state, "Core %s: %s (warn/crit at %s/%s)" % \
diff --git a/tests/unit/checks/test_kernel_check.py
b/tests/unit/checks/test_kernel_check.py
index 4eaebd2..e46ac71 100644
--- a/tests/unit/checks/test_kernel_check.py
+++ b/tests/unit/checks/test_kernel_check.py
@@ -1,19 +1,57 @@
import pytest
from cmk_base.check_api import MKCounterWrapped
-import checktestlib
+from checktestlib import CheckResult, assertCheckResultsEqual
pytestmark = pytest.mark.checks
-(a)pytest.mark.parametrize("time_to_info,params,predicate"cate", [
-(lambda t: [["cpu", 15*t, 10*t, 5*t, 5*t, 5*t, 5*t, 5*t]], {}, lambda cr:
True),
-(lambda t: [["cpu", 15*t, 10*t, 5*t, 5*t, 5*t, 5*t, 5*t]],
{'core_util_graph': True, 'iowait': (30.0, 50.0)}, lambda cr: True),
+def cpu_info(t):
+ return [
+ ["cpu", 10 * t, 4 * t, 6 * t, 8 * t, 5 * t, 8 * t, 3 * t, 6 * t, 2 * t,
4 * t],
+ ["cpu0", 6 * t, 3 * t, 3 * t, 2 * t, 3 * t, 3 * t, 1 * t, 5 * t, 1 * t,
2 * t],
+ ["cpu1", 4 * t, 1 * t, 3 * t, 6 * t, 2 * t, 5 * t, 2 * t, 1 * t, 1 * t,
2 * t],
+ ]
+
+
+def reference_result(deviation):
+ reference = [
+ (0, 'user: 16.0%, system: 34.0%', [('user', 16.0, None, None,
None, None),
+ ('system', 34.0, None, None, None,
None),
+ ('wait', 10.0, None, None, None,
None)]),
+ (0, 'wait: 10.0%', []),
+ (0, 'steal: 12.0%', [('steal', 12.0, None, None, None, None)]),
+ (0, 'guest: 12.0%', [('guest', 12.0, None, None, None, None)]),
+ (0, 'total: 84.0%', []),
+ ]
+ if isinstance(deviation, tuple):
+ reference[deviation[0]] = deviation[1]
+ if callable(deviation):
+ deviation(reference)
+
+ return reference
+
+
+(a)pytest.mark.parametrize("paramsarams, change", [
+ ({
+ 'levels_single': (20.0, 55.0)
+ }, lambda x: x.extend([(2, 'Core cpu0: 96.0% (warn/crit at 20.0%/55.0%)',
[]), (2, 'Core cpu1: 72.0% (warn/crit at 20.0%/55.0%)', [])])),
+ ({}, None),
+ ({
+ 'iowait': (5, 6)
+ }, (1, (2, 'wait: 10.0%', []))),
+ ({
+ 'core_util_time_total': (100.0, 300, 900)
+ }, None),
])
-def test_kernel_util_check(check_manager, time_to_info, params, predicate):
+def test_kernel_util_check(check_manager, params, change):
check = check_manager.get_check("kernel.util")
+ assert check.run_discovery(cpu_info(0)) == [(None, {})]
try:
- list(check.run_check(None, params, time_to_info(0)))
+ list(check.run_check(None, params, cpu_info(0)))
except MKCounterWrapped:
pass
- result = checktestlib.CheckResult(check.run_check(None, params, time_to_info(60)))
- assert predicate(result)
+ result = CheckResult(check.run_check(None, params, cpu_info(10)))
+
+ reference = CheckResult(reference_result(change))
+
+ assertCheckResultsEqual(result, reference)