2013-06-26 22:43:55 +02:00
|
|
|
#!/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 <ralf@kuerbis.org>
|
|
|
|
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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
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"
|
2017-02-22 04:04:04 +01:00
|
|
|
print "graph_category db"
|
2013-06-26 22:43:55 +02:00
|
|
|
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"
|
2017-02-22 04:04:04 +01:00
|
|
|
print "graph_category db"
|
2013-06-26 22:43:55 +02:00
|
|
|
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 (+)"
|
2017-02-22 04:04:04 +01:00
|
|
|
print "graph_category db"
|
2013-06-26 22:43:55 +02:00
|
|
|
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)
|
|
|
|
|
|
|
|
|