Module: check_mk
Branch: master
Commit: 7545606a440215b8d74247a30f27f7ad0855073d
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=7545606a440215…
Author: Florian Kromer <fk(a)mathias-kettner.de>
Date: Tue Feb 19 11:37:30 2019 +0100
7041 ucs_c_rack_server_temp: Temperatures
This werk adds support for monitoring of Cisco C-Series Rack Server
temperatures. This check considers the temperatures of processors,
memory units and the motherboards ambient temperature.
CMK-1067
Change-Id: I976fc876376aae8e4fe46242767d5315fecaaa88
---
.werks/7041 | 14 ++++
checkman/ucs_c_rack_server_temp | 32 ++++++++
checks/ucs_c_rack_server_temp | 91 ++++++++++++++++++++++
.../datasets/ucs_c_rack_server_temp.py | 46 +++++++++++
4 files changed, 183 insertions(+)
diff --git a/.werks/7041 b/.werks/7041
new file mode 100644
index 0000000..42fbc38
--- /dev/null
+++ b/.werks/7041
@@ -0,0 +1,14 @@
+Title: ucs_c_rack_server_temp: Temperatures
+Level: 1
+Component: checks
+Compatible: compat
+Edition: cre
+Version: 1.6.0i1
+Date: 1550572115
+Class: feature
+
+This werk adds support for monitoring of Cisco UCS C-Series Rack Server
+temperatures. This check considers the temperatures of processors, memory
+units and the motherboards ambient temperature.
+
+CMK-1067
diff --git a/checkman/ucs_c_rack_server_temp b/checkman/ucs_c_rack_server_temp
new file mode 100644
index 0000000..cdff2be
--- /dev/null
+++ b/checkman/ucs_c_rack_server_temp
@@ -0,0 +1,32 @@
+title: UCS C-Series Rack Server: Processor Temperature
+agents: agent_ucs_bladecenter
+catalog: hw/server/cisco
+license: GPL
+distribution: check_mk
+description:
+ This check provides information about the temperatures of processors, motherboards and
+ memory array dimms of rack units of an UCS C-Series Rack Server compute.
+
+ This check supports the following C-Series Rack Server models providing XML API 2.0
+ [Cisco UCS Rack-Mount Servers Cisco IMC XML API 2.0]:
+ - Cisco UCS C220 M5 Rack Server
+ - Cisco UCS C240 M5 Rack Server
+ - Cisco UCS C480 M5 Rack Server
+ - Cisco UCS C480 ML M5 Rack Server
+ - Cisco UCS C220 M4 Rack Server
+ - Cisco UCS C240 M4 Rack Server
+ - Cisco UCS C460 M4 Rack Server
+
+ This check does not support the C-Series Rack Server model "Cisco UCS C125 M5 Rack
Server Node"
+ which is used as part of a "Cisco UCS C4200 Series Rack Server Chassis".
+
+ Check status:
+ - {OK} in case the monitored temperature is within the configured valid temperature
range.
+ - {WARN} in case the monitored temperature is equal or higher than the configured warn
value.
+ - {CRIT} in case the monitored temperature is equal or higher than the configured crit
value.
+
+inventory:
+ All rack units of the rack server are found automatically.
+
+item:
+ One service for every rack unit temperature of the rack server.
diff --git a/checks/ucs_c_rack_server_temp b/checks/ucs_c_rack_server_temp
new file mode 100644
index 0000000..01f9e27
--- /dev/null
+++ b/checks/ucs_c_rack_server_temp
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+# +------------------------------------------------------------------+
+# | ____ _ _ __ __ _ __ |
+# | / ___| |__ ___ ___| | __ | \/ | |/ / |
+# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
+# | | |___| | | | __/ (__| < | | | | . \ |
+# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
+# | |
+# | Copyright Mathias Kettner 2019 mk(a)mathias-kettner.de |
+# +------------------------------------------------------------------+
+#
+# This file is part of Check_MK.
+# The official homepage is at
http://mathias-kettner.de/check_mk.
+#
+# check_mk is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation in version 2. check_mk is distributed
+# in the hope that it will be useful, but WITHOUT ANY WARRANTY; with-
+# out even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE. See the GNU General Public License for more de-
+# tails. You should have received a copy of the GNU General Public
+# License along with GNU Make; see the file COPYING. If not, write
+# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+# Boston, MA 02110-1301 USA.
+
+# exemplary output of special agent agent_ucs_bladecenter (<TAB> is tabulator):
+#
+# <<<ucsc_server_temp:sep(9)>>>
+# processorEnvStats<TAB>dn sys/rack-unit-1/board/cpu-1/env-stats<TAB>id
1<TAB>description blalub<TAB>temperature 58.4
+# processorEnvStats<TAB>dn sys/rack-unit-1/board/cpu-2/env-stats<TAB>id
2<TAB>description blalub<TAB>temperature 50.4
+# memoryUnitEnvStats<TAB>dn
sys/rack-unit-1/board/memarray-1/mem-1/dimm-env-stats<TAB>id 1<TAB>description
blalub<TAB>temperature 40.4
+# memoryUnitEnvStats<TAB>dn
sys/rack-unit-1/board/memarray-1/mem-2/dimm-env-stats<TAB>id 2<TAB>description
blalub<TAB>temperature 41.4
+# computeRackUnitMbTempStats<TAB>dn
sys/rack-unit-1/board/temp-stats<TAB>ambientTemp 50.0<TAB>frontTemp
50.0<TAB>ioh1Temp 50.0<TAB>ioh2Temp 50.0<TAB>rearTemp 50.0
+# computeRackUnitMbTempStats<TAB>dn
sys/rack-unit-2/board/temp-stats<TAB>ambientTemp 50.0<TAB>frontTemp
50.0<TAB>ioh1Temp 50.0<TAB>ioh2Temp 50.0<TAB>rearTemp 50.0
+
+
+def parse_ucs_c_rack_server_temp(info):
+ """
+ Returns dict with indexed processors, memory units and motherboards mapped to keys
and
+ temperature as value.
+ """
+ parsed = {}
+ for line in info:
+ key_value_pairs = [kv.split(" ", 1) for kv in line[1:]]
+ if "cpu-" in key_value_pairs[0][1]:
+ cpu = key_value_pairs[0][1].replace("sys/",
+
"").replace("rack-unit-", "Rack Unit ").replace(
+ "/board",
"").replace("/cpu-", " CPU ").replace(
+ "/env-stats",
"")
+ try:
+ parsed[cpu] = float(key_value_pairs[3][1])
+ except (ValueError, KeyError):
+ continue # skip potentially invalid agent output
+ elif "mem-" in key_value_pairs[0][1]:
+ mem = key_value_pairs[0][1].replace("sys/", "").replace(
+ "rack-unit-", "Rack Unit
").replace("/board", "").replace(
+ "/memarray-", " Memory Array
").replace("/mem-", " Memory DIMM ").replace(
+ "/dimm-env-stats", "")
+ try:
+ parsed[mem] = float(key_value_pairs[3][1])
+ except (ValueError, KeyError):
+ continue # skip potentially invalid agent output
+ elif "board" in key_value_pairs[0][1]:
+ mb = key_value_pairs[0][1].replace("sys/",
+
"").replace("rack-unit-", "Rack Unit ").replace(
+ "/board/temp-stats", "
Motherboard")
+ try:
+ parsed[mb] = float(key_value_pairs[2][1])
+ except (ValueError, KeyError):
+ continue # skip potentially invalid agent output
+ else:
+ continue # skip potentially invalid agent output
+ return parsed
+
+
+@get_parsed_item_data
+def check_ucs_c_rack_server_temp(item, params, temperature):
+ yield check_temperature(temperature, params,
+ 'ucs_c_rack_server_%s' % item.lower().replace("
", "_"))
+
+
+check_info["ucs_c_rack_server_temp"] = {
+ 'parse_function': parse_ucs_c_rack_server_temp,
+ 'inventory_function': discover(),
+ 'check_function': check_ucs_c_rack_server_temp,
+ 'group': 'temperature',
+ 'service_description': 'Temperature %s',
+ 'has_perfdata': True,
+ 'includes': ['temperature.include'],
+}
diff --git a/tests/unit/checks/generictests/datasets/ucs_c_rack_server_temp.py
b/tests/unit/checks/generictests/datasets/ucs_c_rack_server_temp.py
new file mode 100644
index 0000000..bc5a4c5
--- /dev/null
+++ b/tests/unit/checks/generictests/datasets/ucs_c_rack_server_temp.py
@@ -0,0 +1,46 @@
+checkname = 'ucs_c_rack_server_temp'
+
+info = [[
+ 'processorEnvStats', 'dn sys/rack-unit-1/board/cpu-1/env-stats',
'id 1', 'description blalub',
+ 'temperature 58.4'
+],
+ [
+ 'processorEnvStats', 'dn
sys/rack-unit-1/board/cpu-2/env-stats', 'id 2',
+ 'description blalub', 'temperature 60.4'
+ ],
+ [
+ 'memoryUnitEnvStats', 'dn
sys/rack-unit-1/board/memarray-1/mem-1/dimm-env-stats',
+ 'id 1', 'description blalub', 'temperature 40.4'
+ ],
+ [
+ 'memoryUnitEnvStats', 'dn
sys/rack-unit-1/board/memarray-1/mem-2/dimm-env-stats',
+ 'id 2', 'description blalub', 'temperature 61.4'
+ ],
+ [
+ 'computeRackUnitMbTempStats', 'dn
sys/rack-unit-1/board/temp-stats', 'ambientTemp 40.0',
+ 'frontTemp 50.0', 'ioh1Temp 50.0', 'ioh2Temp 50.0',
'rearTemp 50.0'
+ ],
+ [
+ 'computeRackUnitMbTempStats', 'dn
sys/rack-unit-2/board/temp-stats', 'ambientTemp 60.0',
+ 'frontTemp 50.0', 'ioh1Temp 50.0', 'ioh2Temp 50.0',
'rearTemp 50.0'
+ ]]
+
+discovery = {
+ '': [('Rack Unit 1 CPU 1', {}), ('Rack Unit 1 CPU 2', {}),
+ ('Rack Unit 1 Memory Array 1 Memory DIMM 1', {}),
+ ('Rack Unit 1 Memory Array 1 Memory DIMM 2', {}), ('Rack Unit 1
Motherboard', {}),
+ ('Rack Unit 2 Motherboard', {})]
+}
+
+checks = {
+ '': [('Rack Unit 1 CPU 1', {}, [(0, u'58.4 \xb0C',
[('temp', 58.4, None, None, None, None)])]),
+ ('Rack Unit 1 CPU 2', {}, [(0, u'60.4 \xb0C', [('temp',
60.4, None, None, None, None)])]),
+ ('Rack Unit 1 Memory Array 1 Memory DIMM 1', {},
+ [(0, u'40.4 \xb0C', [('temp', 40.4, None, None, None,
None)])]),
+ ('Rack Unit 1 Memory Array 1 Memory DIMM 2', {},
+ [(0, u'61.4 \xb0C', [('temp', 61.4, None, None, None,
None)])]),
+ ('Rack Unit 1 Motherboard', {}, [(0, u'50.0 \xb0C',
[('temp', 50.0, None, None, None,
+ None)])]),
+ ('Rack Unit 2 Motherboard', {}, [(0, u'50.0 \xb0C',
[('temp', 50.0, None, None, None,
+ None)])])]
+}