#!/usr/bin/python """ Plugin to monitor ArangoDB servers. It works with the new server statistics interface of ArangoDB 1.3. Not every value seems senseful, but there are nice graphs generated... Author: Ralf Geschke Version: 2013062601 This program 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, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Usage: - Link or copy to /etc/munin/plugins - To enable extra graphs, also link to one or more of the possible links (given below) - Then restart munin-node Links possible: arangodb_conn HTTP client connections arangodb_time_total Total request/queue/connection time arangodb_bytes_total Total sent/received bytes Configuration: - No configuration required. Just enable the admin interface of ArangoDB. Thanks to the authors of other Python munin plugins. I've used some of them as inspiring example. Possible todos: - support of munin-like configuration parameters - add more statistics """ from os.path import basename import urllib2 import sys try: import json except ImportError: import simplejson as json def getServerStatus(group): raw = urllib2.urlopen( "http://127.0.0.1:8529/_admin/statistics" ).read() return json.loads( raw )[group] def doData(plugin_name): if plugin_name == 'arangodb_conn': print "connections.value " + str( getServerStatus('client')["httpConnections"] ) elif plugin_name== 'arangodb_time_total': data = getServerStatus('client') timeTotal = data['totalTime']['sum'] timeConnection = data['connectionTime']['sum'] timeRequest = data['requestTime']['sum'] timeQueue = data['queueTime']['sum'] print "total.value " + str(int(round(timeTotal))) print "connection.value " + str(int(round(timeConnection))) print "request.value " + str(int(round(timeRequest))) print "queue.value " + str(int(round(timeQueue))) elif plugin_name== 'arangodb_bytes_total': data = getServerStatus('client') bytesReceived = data['bytesReceived']['sum'] bytesSent = data['bytesSent']['sum'] print "received.value " + str(int(round(bytesReceived))) print "sent.value " + str(int(round(bytesSent))) else: pass def doConfig(plugin_name): if plugin_name == 'arangodb_conn': print "graph_title ArangoDB current connections" print "graph_args --base 1000 -l 0" print "graph_vlabel connections" print "graph_category db" print "connections.label connections" elif plugin_name == 'arangodb_time_total': print "graph_title ArangoDB total time" print "graph_args --base 1000 -l 0" print "graph_vlabel seconds" print "graph_category db" print "total.label total" print "connection.label connection" print "request.label request" print "queue.label queue" elif plugin_name == 'arangodb_bytes_total': print "graph_title ArangoDB total bytes" print "graph_args --base 1024" print "graph_vlabel total bytes received (-) / sent (+)" print "graph_category db" print "graph_order received sent" print "received.graph no" print "received.draw LINE2" print "received.type DERIVE" print "received.min 0" print "received.label Bytes received" print "received.cdef received,8,*" print "sent.draw LINE2" print "sent.type DERIVE" print "sent.min 0" print "sent.label bytes" print "sent.cdef sent,8,*" print "sent.negative received" else: pass plugin_name = basename(sys.argv[0]) if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] == "config": doConfig(plugin_name) else: doData(plugin_name)