Module: check_mk
Branch: master
Commit: 8323642972e776566b145e2bb015b18070f74887
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=8323642972e776…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Mon May 22 14:41:01 2017 +0200
4733 Check_MK graphs can now be exported as PNG images
It is now possible to export the Check_MK graphs as static PNG images. This mechanism
can be used to to integrate the graphs in 3rd party tools. For example, you can use it
to add graphs to NagVis maps or to the hover menu of NagVis.
The new page is named <tt>graph_image.py</tt>. The page is receiving a single
request
parameter that is structured equal to the JSON/python graph API (See werk #8643).
The request object is structured like this:
F+:
{
"specification": [..., ...],
"data_range": {
"time_range" : [..., ...],
}
}
F-:
The specification is using the Check_MK internal graph specification
format. The first element is the specification type (<tt>template</tt>,
<tt>custom</tt> or <tt>explicit</tt>. The structure of the second
element
depends on the type. Please take a look at the examples below to get an idea
of it.
The time range is given in two unix timestamps, the start time and the
end time. But the whole <tt>data_range</tt> specification is optional. In
case you don't provide it, the 25h graph will be rendered.
The answer to this request is a single, dynamically rendered, PNG image.
Please note that this request is done in the context of the currently logged
in user. So the user that opens a page containing this snippet needs to be
authenticated with the Check_MK GUI and able to see the image. Otherwise the
user won't be able to see the image.
The most common use case will be to add the image generated by this. The
following snippets show how it can be embedded:
F+:
<img
src="http://mycmkserver/mysite/check_mk/graph_image.py?request={%22specification%22:%20[%22template%22,%20{%22service_description%22:%20%22CPU%20load%22,%20%22site%22:%20%22mysite%22,%20%22host_name%22:%20%22myhost%22}]}">
F-:
This will try to open the image from the Check_MK site <tt>mysite</tt> on
the server <tt>mycmkserver</tt>. The graph is specified by the following
request object in URL encoded form:
F+:
{
"specification": ["template", {
"service_description": "CPU load",
"site": "mysite",
"host_name": "myhost"
}]
}
F-:
It is also possible to adapt the rendering attributes of the graph using the
<tt>render_options</tt> data structure. This example hides the legend and the
title of the graph and sets a custom image size:
F+:
<img
src="http://mycmkserver/mysite/check_mk/graph_image.py?request={%22specification%22:%20[%22template%22,%20{%22service_description%22:%20%22CPU%20load%22,%20%22site%22:%20%22mysite%22,%20%22host_name%22:%20%22myhost%22}],%20%22render_options%22:%20{%22show_legend%22:%20false,%20%22show_title%22:%20false,%20%22size%22:%20[50,15]}}">
F-:
Again, the human friendly formated request object:
F+:
{
"specification": ["template", {
"service_description": "CPU load",
"site": "mysite",
"host_name": "myhost"
}],
"render_options": {
"show_legend": false,
"show_title": false,
"size": [ 50, 15 ]
}
}
F-:
In case you want to render custom graphs, you can use a specification like this
in your request. Replace <tt>custom_graph_1</tt> with the ID of the custom
graph
you like to see:
F+:
["custom", "custom_graph_1"]
F-:
Change-Id: I148b6cf526b4ac19ea5ae604d948438c76f2a826
---
.werks/4733 | 97 ++++++++++++++++++++++++++++++++++++++++++++++++
tests/web/test_webapi.py | 67 +++++++++++++++++++++++++++++----
2 files changed, 156 insertions(+), 8 deletions(-)
diff --git a/.werks/4733 b/.werks/4733
new file mode 100644
index 0000000..23032a3
--- /dev/null
+++ b/.werks/4733
@@ -0,0 +1,97 @@
+Title: Check_MK graphs can now be exported as PNG images
+Level: 2
+Component: metrics
+Compatible: compat
+Edition: cee
+Version: 1.5.0i1
+Date: 1495455247
+Class: feature
+
+It is now possible to export the Check_MK graphs as static PNG images. This mechanism
+can be used to to integrate the graphs in 3rd party tools. For example, you can use it
+to add graphs to NagVis maps or to the hover menu of NagVis.
+
+The new page is named <tt>graph_image.py</tt>. The page is receiving a single
request
+parameter that is structured equal to the JSON/python graph API (See werk #8643).
+
+The request object is structured like this:
+
+F+:
+{
+ "specification": [..., ...],
+ "data_range": {
+ "time_range" : [..., ...],
+ }
+}
+F-:
+
+The specification is using the Check_MK internal graph specification
+format. The first element is the specification type (<tt>template</tt>,
+<tt>custom</tt> or <tt>explicit</tt>. The structure of the
second element
+depends on the type. Please take a look at the examples below to get an idea
+of it.
+
+The time range is given in two unix timestamps, the start time and the
+end time. But the whole <tt>data_range</tt> specification is optional. In
+case you don't provide it, the 25h graph will be rendered.
+
+The answer to this request is a single, dynamically rendered, PNG image.
+
+Please note that this request is done in the context of the currently logged
+in user. So the user that opens a page containing this snippet needs to be
+authenticated with the Check_MK GUI and able to see the image. Otherwise the
+user won't be able to see the image.
+
+The most common use case will be to add the image generated by this. The
+following snippets show how it can be embedded:
+
+F+:
+<img
src="http://mycmkserver/mysite/check_mk/graph_image.py?request={%22specification%22:%20[%22template%22,%20{%22service_description%22:%20%22CPU%20load%22,%20%22site%22:%20%22mysite%22,%20%22host_name%22:%20%22myhost%22}]}">
+F-:
+
+This will try to open the image from the Check_MK site <tt>mysite</tt> on
+the server <tt>mycmkserver</tt>. The graph is specified by the following
+request object in URL encoded form:
+
+F+:
+{
+ "specification": ["template", {
+ "service_description": "CPU load",
+ "site": "mysite",
+ "host_name": "myhost"
+ }]
+}
+F-:
+
+It is also possible to adapt the rendering attributes of the graph using the
+<tt>render_options</tt> data structure. This example hides the legend and
the
+title of the graph and sets a custom image size:
+
+F+:
+<img
src="http://mycmkserver/mysite/check_mk/graph_image.py?request={%22specification%22:%20[%22template%22,%20{%22service_description%22:%20%22CPU%20load%22,%20%22site%22:%20%22mysite%22,%20%22host_name%22:%20%22myhost%22}],%20%22render_options%22:%20{%22show_legend%22:%20false,%20%22show_title%22:%20false,%20%22size%22:%20[50,15]}}">
+F-:
+
+Again, the human friendly formated request object:
+
+F+:
+{
+ "specification": ["template", {
+ "service_description": "CPU load",
+ "site": "mysite",
+ "host_name": "myhost"
+ }],
+ "render_options": {
+ "show_legend": false,
+ "show_title": false,
+ "size": [ 50, 15 ]
+ }
+}
+F-:
+
+In case you want to render custom graphs, you can use a specification like this
+in your request. Replace <tt>custom_graph_1</tt> with the ID of the custom
graph
+you like to see:
+
+F+:
+["custom", "custom_graph_1"]
+F-:
diff --git a/tests/web/test_webapi.py b/tests/web/test_webapi.py
index 7d0d79b..d4bbf35 100644
--- a/tests/web/test_webapi.py
+++ b/tests/web/test_webapi.py
@@ -4,6 +4,10 @@
import pytest
import time
import os
+import json
+import base64
+from PIL import Image
+from StringIO import StringIO
from testlib import web, APIError
@@ -324,15 +328,62 @@ def test_get_graph(web, site):
assert
site.file_exists("var/check_mk/rrd/test-host-get-graph/Check_MK.rrd"), \
"RRD %s is still missing" %
"var/check_mk/rrd/test-host-get-graph/Check_MK.rrd"
- # Now we get a graph
- data = web.get_regular_graph("test-host-get-graph",
"Check_MK", 0)
-
- assert len(data["curves"]) == 4
- assert data["curves"][0]["title"] == "CPU time in user
space"
- assert data["curves"][1]["title"] == "CPU time in
operating system"
- assert data["curves"][2]["title"] == "Time spent waiting
for Check_MK agent"
- assert data["curves"][3]["title"] == "Total execution
time"
+ _test_get_graph_api(web)
+ _test_get_graph_image(web)
+ _test_get_graph_notification_image(web)
finally:
web.delete_host("test-host-get-graph")
web.activate_changes()
+
+
+def _test_get_graph_api(web):
+ # Now we get a graph
+ data = web.get_regular_graph("test-host-get-graph", "Check_MK",
0)
+
+ assert len(data["curves"]) == 4
+ assert data["curves"][0]["title"] == "CPU time in user
space"
+ assert data["curves"][1]["title"] == "CPU time in operating
system"
+ assert data["curves"][2]["title"] == "Time spent waiting for
Check_MK agent"
+ assert data["curves"][3]["title"] == "Total execution
time"
+
+
+def _test_get_graph_image(web):
+ result = web.post("graph_image.py", data={
+ "request": json.dumps({
+ "specification": ["template", {
+ "service_description" : "Check_MK",
+ "site" : web.site.id,
+ "graph_index" : 0,
+ "host_name" : "test-host-get-graph",
+ }],
+ }),
+ })
+
+ content = result.content
+
+ assert content.startswith('\x89PNG')
+
+ try:
+ im = Image.open(StringIO(content))
+ except IOError:
+ raise Exception("Failed to open image: %r" % content)
+
+
+def _test_get_graph_notification_image(web):
+ result =
web.get("ajax_graph_images.py?host=test-host-get-graph&service=Check_MK")
+
+ # Provides a json list containing base64 encoded PNG images of the current 24h
graphs
+ encoded_graph_list = json.loads(result.text)
+ assert type(encoded_graph_list) == list
+ assert len(encoded_graph_list) > 0
+
+ for encoded_graph_image in encoded_graph_list:
+ graph_image = base64.b64decode(encoded_graph_image)
+
+ assert graph_image.startswith('\x89PNG')
+
+ try:
+ im = Image.open(StringIO(graph_image))
+ except IOError:
+ raise Exception("Failed to open image: %r" % graph_image)