Module: check_mk
Branch: master
Commit: c3b5e4851327eb25f6c5c2d05350e7070ad96d76
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=c3b5e4851327eb…
Author: Konstantin Büttner <kb(a)mathias-kettner.de>
Date: Wed Dec 19 15:07:32 2018 +0100
6984 FIX docker_node_disk_usage, docker_node_info, docker_node_images, docker_node_network: Extract sections to plugin
Due to poor performance of commands such as <tt>docker system df</tt> in some environments, the
check_mk_agent would be slowed down to the point of unusability. To address this, these sections
have been extracted into the <tt>mk_docker_node</tt> agent plugin, allowing them to be run asynchronously.
If you update the agent and you need these sections, you will have to deploy the plugin to continue
monitoring docker node information.
CMK-1413
Change-Id: I0687e757951f3505e91a167c4d3e4a383a012dca
---
.werks/6984 | 16 ++++++++++++++
agents/check_mk_agent.linux | 26 -----------------------
agents/plugins/mk_docker_node | 49 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 65 insertions(+), 26 deletions(-)
diff --git a/.werks/6984 b/.werks/6984
new file mode 100644
index 0000000..7b93260
--- /dev/null
+++ b/.werks/6984
@@ -0,0 +1,16 @@
+Title: docker_node_disk_usage, docker_node_info, docker_node_images, docker_node_network: Extract sections to plugin
+Level: 2
+Component: checks
+Class: fix
+Compatible: incomp
+Edition: cre
+State: unknown
+Version: 1.6.0i1
+Date: 1545227106
+
+Due to poor performance of commands such as <tt>docker system df</tt> in some environments, the
+check_mk_agent would be slowed down to the point of unusability. To address this, these sections
+have been extracted into the <tt>mk_docker_node</tt> agent plugin, allowing them to be run asynchronously.
+
+If you update the agent and you need these sections, you will have to deploy the plugin to continue
+monitoring docker node information.
diff --git a/agents/check_mk_agent.linux b/agents/check_mk_agent.linux
index cc94e66..13e9f56 100755
--- a/agents/check_mk_agent.linux
+++ b/agents/check_mk_agent.linux
@@ -1032,32 +1032,6 @@ if type pvecm > /dev/null 2>&1 ; then
pvecm nodes
fi
-# Iterate all running containers and report piggyback data for them
-if type docker > /dev/null 2>&1; then
- echo "<<<docker_node_info:sep(58)>>>"
- # sed: protect leading whitespace
- docker info | sed 's/^/|/'
-
- echo "<<<docker_node_disk_usage:sep(0)>>>"
- docker system df
-
- echo "<<<docker_node_images>>>"
- echo "[[[images]]]"
- docker images --format "{{json .}}"
-
- echo "[[[image_inspect]]]"
- IMAGE_IDS=$(docker images | awk 'NR>1 {print $3}')
- docker image inspect $IMAGE_IDS
-
- echo "[[[containers]]]"
- # equivalent of 'docker ps' for newer docker versions: 'docker container ls'
- docker ps --all --format "{{json .}}"
-
- echo "<<<docker_node_network:sep(0)>>>"
- NETWORK_IDS=$(docker network ls -f 'driver=bridge' | awk 'NR>1 {print $1}')
- docker network inspect $NETWORK_IDS
-fi
-
# Start new liveupdate process in background on each agent execution. Starting
# a new live update process will terminate the old one automatically after
# max. 1 sec.
diff --git a/agents/plugins/mk_docker_node b/agents/plugins/mk_docker_node
new file mode 100755
index 0000000..7bc1080
--- /dev/null
+++ b/agents/plugins/mk_docker_node
@@ -0,0 +1,49 @@
+#!/bin/bash
+# +------------------------------------------------------------------+
+# | ____ _ _ __ __ _ __ |
+# | / ___| |__ ___ ___| | __ | \/ | |/ / |
+# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
+# | | |___| | | | __/ (__| < | | | | . \ |
+# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
+# | |
+# | Copyright Mathias Kettner 2016 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.
+
+if type docker > /dev/null 2>&1; then
+ echo "<<<docker_node_info:sep(58)>>>"
+ # sed: protect leading whitespace
+ docker info | sed 's/^/|/'
+
+ echo "<<<docker_node_disk_usage:sep(0)>>>"
+ docker system df
+
+ echo "<<<docker_node_images>>>"
+ echo "[[[images]]]"
+ docker images --format "{{json .}}"
+
+ echo "[[[image_inspect]]]"
+ IMAGE_IDS=$(docker images | awk 'NR>1 {print $3}')
+ docker image inspect $IMAGE_IDS
+
+ echo "[[[containers]]]"
+ # equivalent of 'docker ps' for newer docker versions: 'docker container ls'
+ docker ps --all --format "{{json .}}"
+
+ echo "<<<docker_node_network:sep(0)>>>"
+ NETWORK_IDS=$(docker network ls -f 'driver=bridge' | awk 'NR>1 {print $1}')
+ docker network inspect $NETWORK_IDS
+fi
Module: check_mk
Branch: master
Commit: 56506d8d046b3b9f64b18ca4ca887ad2f7de3561
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=56506d8d046b3b…
Author: Sven Panne <sp(a)mathias-kettner.de>
Date: Wed Dec 19 12:54:09 2018 +0100
Make test_locking a bit more stable.
Basically the test is fundamentally broken, we just make it a bit more
likely that it succeeds.
Change-Id: I8667dd3571af000dd7183078ec32d3507a7b18fc
---
tests/unit/cmk/utils/test_store.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/unit/cmk/utils/test_store.py b/tests/unit/cmk/utils/test_store.py
index d63dff4..90393ea 100644
--- a/tests/unit/cmk/utils/test_store.py
+++ b/tests/unit/cmk/utils/test_store.py
@@ -271,4 +271,5 @@ def test_locking(tmpdir):
break
time.sleep(0.01)
assert store1.have_lock(path) == False
+ time.sleep(0.2)
assert store2.have_lock(path) == True
Module: check_mk
Branch: master
Commit: b8446dfc74031b7c9ea9e3bc203df9f86af3245a
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=b8446dfc74031b…
Author: Tom Baerwinkel <tb(a)mathias-kettner.de>
Date: Tue Dec 18 16:22:10 2018 +0100
Refactoring of esx_vsphere_hostsystem_convert
Change-Id: I0d66476a8566869eb5733b6d7865899ab5d57f59
---
checks/esx_vsphere_hostsystem | 95 ++++++++++++++++++++++++-------------------
1 file changed, 54 insertions(+), 41 deletions(-)
diff --git a/checks/esx_vsphere_hostsystem b/checks/esx_vsphere_hostsystem
index 7e59b7b..5703002 100644
--- a/checks/esx_vsphere_hostsystem
+++ b/checks/esx_vsphere_hostsystem
@@ -413,52 +413,65 @@ check_info['esx_vsphere_hostsystem.maintenance'] = {
# vmhba32:C0:T0:L0 active
-def esx_vsphere_multipath_convert(info):
- data = esx_vsphere_hostsystem_convert(info)
- paths = {}
- data = data.get('config.multipathState.path')
- if not data:
- return paths
-
- data = zip(data[::2], data[1::2])
- for path, state in data:
- # vSphere6 uses a different format, e.g "vmhba32:C0:T0:L0 active"
- if len(path.split(":")) == 4 and path.startswith("vmhba"):
- hba_num = int(path.split(":")[0].replace("vmhba", ""))
- lun_id = path.split(":")[-1]
-
- # vmware specificies three different types of LUNs. Physical LUNs will
- # reserves vmhba number 0-31. The other two reserve numbers of base64.
- # The lower 32 range is reserved for pseudo logical LUNs. The upper 32
- # for logical LUNs. e.g. 32-63 for pseudo logical LUNs like USB and
- # 64-95 for logical LUNs like iSCSI.
- # These should be added as different multipath LUNs.
- if hba_num >= 32 and hba_num % 64 < 33:
- lun_id = "%s pseudo-logical" % lun_id
- elif hba_num >= 32 and hba_num % 64 > 32:
- lun_id = "%s logical" % lun_id
- else:
- lun_id = "%s physical" % lun_id
+def lun_id_for_new_format(path):
+ hba_num = int(path.split(":")[0].replace("vmhba", ""))
+ lun_id = path.split(":")[-1]
- paths.setdefault(lun_id, [])
- # Note: There is no path type information available in these esx paths
- paths[lun_id].append((state, None, path))
+ # vmware specificies three different types of LUNs. Physical LUNs will
+ # reserves vmhba number 0-31. The other two reserve numbers of base64.
+ # The lower 32 range is reserved for pseudo logical LUNs. The upper 32
+ # for logical LUNs. e.g. 32-63 for pseudo logical LUNs like USB and
+ # 64-95 for logical LUNs like iSCSI.
+ # These should be added as different multipath LUNs.
+ if hba_num >= 32 and hba_num % 64 < 33:
+ return "%s pseudo-logical" % lun_id
+ if hba_num >= 32 and hba_num % 64 > 32:
+ return "%s logical" % lun_id
+ return "%s physical" % lun_id
+
+
+ESXLegacyPathInfo = collections.namedtuple('LegacyPathInfo', ['path_type', 'hw_type', 'lun_id'])
+
+
+def has_new_format(path):
+ # vSphere6 uses a different format, e.g "vmhba32:C0:T0:L0 active"
+ return len(path.split(":")) == 4 and path.startswith("vmhba")
- # Legacy format for older vSphere versions:
- else:
- path_tokens = path.split('-')
- if "." not in path_tokens[-1]:
- continue # invalid format / unknown type
- # We've seen path tokens which include more than one "."
- # PATH_TYPE.A_NAME.AN_ID_WITH_UNDERSCORES_AND_NUMBERS
- path_type, lun_id = path_tokens[-1].rsplit('.', 1)
- hw_type = path.split('.')[0]
+def parse_legacy_format(path):
+ path_tokens = path.split('-')
+ if "." not in path_tokens[-1]:
+ return None # invalid format / unknown type
+ # We've seen path tokens which include more than one "."
+ # PATH_TYPE.A_NAME.AN_ID_WITH_UNDERSCORES_AND_NUMBERS
+ path_type, lun_id = path_tokens[-1].rsplit('.', 1)
+ hw_type = path.split('.')[0]
+ return ESXLegacyPathInfo(path_type, hw_type, lun_id)
- if path_type in ['naa', 'eui'] and not hw_type == 'unknown':
- paths.setdefault(lun_id, [])
- paths[lun_id].append((state, "%s/%s" % (path_type, hw_type), path))
+def legacy_path_matches(path_info):
+ return path_info.path_type in ['naa', 'eui'] and not path_info.hw_type == 'unknown'
+
+
+def esx_vsphere_multipath_convert(info):
+ data = esx_vsphere_hostsystem_convert(info)
+
+ raw_path_states = data.get('config.multipathState.path')
+ if not raw_path_states:
+ return {}
+ path_states = zip(raw_path_states[::2], raw_path_states[1::2])
+
+ paths = {}
+ for path, state in path_states:
+ if has_new_format(path):
+ # Note: There is no path type information available in these esx paths
+ lun_id = lun_id_for_new_format(path)
+ paths.setdefault(lun_id, []).append((state, None, path))
+ else:
+ path_info = parse_legacy_format(path)
+ if path_info and legacy_path_matches(path_info):
+ paths.setdefault(path_info.lun_id, []).append(
+ (state, "%s/%s" % (path_info.path_type, path_info.hw_type), path))
return paths