Module: check_mk
Branch: master
Commit: 0d17996b086a11aee3816225fb9b4c7ab8c956cc
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=0d17996b086a11…
Author: Moritz Kiemer <mo(a)mathias-kettner.de>
Date: Tue Feb 5 12:30:27 2019 +0100
mk_docker.py: introduce capability to parse new plugin output
Change-Id: Ia840afc07e5a5a94248f703d4e02244b585424e2
---
checks/docker_container_status | 12 +++++++-----
checks/docker_node_disk_usage | 9 +++++++--
checks/docker_node_info | 14 ++++++++++++--
inventory/docker_container_labels | 4 +++-
inventory/docker_container_network | 5 ++++-
inventory/docker_container_node_name | 8 ++++++--
inventory/docker_node_images | 25 +++++++++++++++++++++----
inventory/docker_node_network | 12 +++++++++---
8 files changed, 69 insertions(+), 20 deletions(-)
diff --git a/checks/docker_container_status b/checks/docker_container_status
index 9a22335..9920e05 100644
--- a/checks/docker_container_status
+++ b/checks/docker_container_status
@@ -33,11 +33,13 @@ def parse_docker_container_status(info):
When a container got piggyback data from multiple hosts (e.g. a cluster) this
results
in multiple JSON objects handed over to this check.
'''
- if not info or not info[0]:
- return
+ version = docker_get_version(info) # pylint: disable=undefined-variable
- parsed = docker_json_get_obj(info[0]) or {}
+ index = 0 if version is None else 1
+ parsed = docker_json_get_obj(info[index]) or {} if info[index:] else {} # pylint:
disable=undefined-variable
+ if version is None:
+ return DeprecatedDict(parsed) # pylint: disable=undefined-variable
return parsed
@@ -77,7 +79,7 @@ check_info["docker_container_status.health"] = {
"inventory_function": inventory_docker_container_status_health,
"check_function": check_docker_container_status_health,
"service_description": "Docker container health",
- 'includes': ['docker.include'],
+ 'includes': ['docker.include', 'legacy_docker.include'],
}
#.
@@ -108,5 +110,5 @@ check_info['docker_container_status'] = {
'inventory_function': discover_single,
'check_function': check_docker_container_status,
'service_description': 'Docker container status',
- 'includes': ['docker.include'],
+ 'includes': ['docker.include', 'legacy_docker.include'],
}
diff --git a/checks/docker_node_disk_usage b/checks/docker_node_disk_usage
index 3712103..21e770b 100644
--- a/checks/docker_node_disk_usage
+++ b/checks/docker_node_disk_usage
@@ -26,8 +26,13 @@
def parse_docker_node_disk_usage(info):
+ version = docker_get_version(info) # pylint: disable=undefined-variable
- return parse_legacy_docker_system_df(info) # pylint: disable=undefined-variable
+ if version is None:
+ return parse_legacy_docker_system_df(info) # pylint: disable=undefined-variable
+
+ table_rows = map(docker_json_get_obj, info[1:]) # pylint:
disable=undefined-variable
+ return {r.get('type'): r for r in table_rows if r is not None}
@get_parsed_item_data
@@ -60,7 +65,7 @@ check_info["docker_node_disk_usage"] = {
"inventory_function": discover(),
"check_function": check_docker_node_disk_usage,
"service_description": "Docker disk usage - %s",
- "includes": ["legacy_docker.include"],
+ "includes": ['docker.include', 'legacy_docker.include'],
"has_perfdata": True,
"group": "docker_node_disk_usage",
}
diff --git a/checks/docker_node_info b/checks/docker_node_info
index 531bd10..ce80041 100644
--- a/checks/docker_node_info
+++ b/checks/docker_node_info
@@ -26,8 +26,16 @@
def parse_docker_node_info(info):
+ version = docker_get_version(info) # pylint: disable=undefined-variable
- return parse_legacy_docker_node_info(info) # pylint: disable=undefined-variable
+ if version is None:
+ return parse_legacy_docker_node_info(info) # pylint: disable=undefined-variable
+
+ if len(info) < 2:
+ return {}
+
+ loaded = docker_json_get_obj(info[1]) # pylint: disable=undefined-variable
+ return loaded or {}
def check_docker_node_info(_no_item, _no_params, parsed):
@@ -40,7 +48,7 @@ def check_docker_node_info(_no_item, _no_params, parsed):
check_info['docker_node_info'] = {
- 'includes': ['legacy_docker.include'],
+ 'includes': ['docker.include', 'legacy_docker.include'],
'parse_function': parse_docker_node_info,
'inventory_function': discover_single,
'check_function': check_docker_node_info,
@@ -68,6 +76,7 @@ def check_docker_node_containers(_no_item, params, parsed):
("paused", "ContainersPaused", 'paused_'),
("stopped", "ContainersStopped", 'stopped_'),
):
+
count = parsed.get(key)
if count is None:
yield 3, "%s: count not present in agent output" % title
@@ -89,4 +98,5 @@ check_info["docker_node_info.containers"] = {
"service_description": "Docker containers",
"has_perfdata": True,
"group": "docker_node_containers",
+ 'includes': ['docker.include', 'legacy_docker.include'],
}
diff --git a/inventory/docker_container_labels b/inventory/docker_container_labels
index b4d1655..197f692 100644
--- a/inventory/docker_container_labels
+++ b/inventory/docker_container_labels
@@ -28,7 +28,9 @@
def parse_docker_container_labels(info):
- data = docker_json_get_obj(info[0]) if info[0:] else None
+ version = docker_get_version(info)
+ index = 0 if version is None else 1
+ data = docker_json_get_obj(info[index]) if info[index:] else None
return data
diff --git a/inventory/docker_container_network b/inventory/docker_container_network
index 70dc702..3ee9d44 100644
--- a/inventory/docker_container_network
+++ b/inventory/docker_container_network
@@ -26,7 +26,10 @@
def parse_docker_container_network(info):
- parsed = docker_json_get_obj(info[0]) or {} # pylint: disable=undefined-variable
+ # pylint: disable=undefined-variable
+ version = docker_get_version(info)
+ index = 0 if version is None else 1
+ parsed = docker_json_get_obj(info[index]) or {}
return parsed
diff --git a/inventory/docker_container_node_name b/inventory/docker_container_node_name
index 03f7f9e..7454978 100644
--- a/inventory/docker_container_node_name
+++ b/inventory/docker_container_node_name
@@ -27,7 +27,11 @@
def parse_docker_container_node_name(info):
# pylint: disable=undefined-variable
- return {"NodeName": parse_legacy_docker_container_node_name(info)}
+ version = docker_get_version(info)
+ if version is None:
+ return {"NodeName": parse_legacy_docker_container_node_name(info)}
+
+ return docker_json_get_obj(info[1]) or {}
def inv_docker_container_node_name(info, inventory_tree):
@@ -39,6 +43,6 @@ def inv_docker_container_node_name(info, inventory_tree):
inv_info['docker_container_node_name'] = { # pylint: disable=undefined-variable
- 'includes': ['legacy_docker.include'],
+ 'includes': ['docker.include', 'legacy_docker.include'],
'inv_function': inv_docker_container_node_name,
}
diff --git a/inventory/docker_node_images b/inventory/docker_node_images
index a56cdd7..addcf62 100644
--- a/inventory/docker_node_images
+++ b/inventory/docker_node_images
@@ -39,9 +39,25 @@ def _split_subsections(info):
def parse_docker_node_images(info):
+ # pylint: disable=undefined-variable
+ version = docker_get_version(info)
- subsections = _split_subsections(info)
- return parse_legacy_docker_node_images(subsections) # pylint:
disable=undefined-variable
+ if version is None:
+ subsections = _split_subsections(info)
+ return parse_legacy_docker_node_images(subsections)
+
+ subsections = _split_subsections(info[1:])
+ i_images = (docker_json_get_obj(i) for i in subsections.get('images', []))
+ images = {i["Id"]: i for i in i_images if i is not None}
+ i_containers = (docker_json_get_obj(c) for c in subsections.get('containers',
[]))
+ containers = {c["Id"]: c for c in i_containers if c is not None}
+
+ running_images = [c['Image'] for c in containers.itervalues()]
+
+ for image_id in images:
+ images[image_id]['amount_containers'] = running_images.count(image_id)
+
+ return {'images': images, 'containers': containers}
def inv_docker_node_images(info, inventory_tree, status_data_tree):
@@ -72,7 +88,8 @@ def inv_docker_node_images(info, inventory_tree, status_data_tree):
for container_id, container in sorted(containers.iteritems()):
status_node.append({
"id": docker_get_short_id(container_id), # pylint:
disable=undefined-variable
- "name": container["Names"],
+ "image": docker_get_short_id(container["Image"]), #
pylint: disable=undefined-variable
+ "name": container["Name"],
"creation": container["Created"],
"labels": docker_format_labels(container), # pylint:
disable=undefined-variable
"status": container.get("State",
{}).get("Status"),
@@ -80,7 +97,7 @@ def inv_docker_node_images(info, inventory_tree, status_data_tree):
inv_info['docker_node_images'] = { # pylint: disable=undefined-variable
- 'includes': ['docker.include', 'legacy_docker.include'],
+ 'includes': ['legacy_docker.include', 'docker.include'],
'inv_function': inv_docker_node_images,
'has_status_data': True,
}
diff --git a/inventory/docker_node_network b/inventory/docker_node_network
index 6b076dd..a585fb8 100644
--- a/inventory/docker_node_network
+++ b/inventory/docker_node_network
@@ -26,13 +26,19 @@
def parse_docker_network(info):
+ version = docker_get_version(info) # pylint: disable=undefined-variable
- networks = parse_legacy_docker_network_inspect(info) # pylint:
disable=undefined-variable
- return dict((n["Id"], n) for n in networks)
+ if version is None:
+ networks = parse_legacy_docker_network_inspect(info) # pylint:
disable=undefined-variable
+ return DeprecatedDict((n["Id"], n) for n in networks)
+
+ networks = (docker_json_get_obj(line) for line in info[1:]) # pylint:
disable=undefined-variable
+ return {n["Id"]: n for n in networks if n is not None}
def inv_docker_node_network_networks(info, inventory_tree, status_data_tree):
parsed = parse_docker_network(info)
+
for network_id, network in parsed.iteritems():
containers = []
@@ -75,6 +81,6 @@ def inv_docker_node_network_networks(info, inventory_tree,
status_data_tree):
inv_info["docker_node_network.networks"] = { # pylint:
disable=undefined-variable
- "includes": ["docker.include",
"legacy_docker.include"],
+ "includes": ['docker.include', 'legacy_docker.include'],
"inv_function": inv_docker_node_network_networks,
}