From 6fb5a751c624efce8bc41736d219b0acda7cebaa Mon Sep 17 00:00:00 2001
From: Peter Surda <surda@economicsofbitcoin.com>
Date: Wed, 20 Dec 2017 09:41:36 +0100
Subject: [PATCH] Add collectd monitoring script

---
 packages/collectd/pybitmessagestatus.py | 60 +++++++++++++++++++++++++
 1 file changed, 60 insertions(+)
 create mode 100644 packages/collectd/pybitmessagestatus.py

diff --git a/packages/collectd/pybitmessagestatus.py b/packages/collectd/pybitmessagestatus.py
new file mode 100644
index 00000000..1db9f5b1
--- /dev/null
+++ b/packages/collectd/pybitmessagestatus.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python2.7
+
+import collectd
+import json
+import xmlrpclib
+
+pybmurl = ""
+api = ""
+
+def init_callback():
+    global api
+    api = xmlrpclib.ServerProxy(pybmurl)
+    collectd.info('pybitmessagestatus.py init done')
+
+def config_callback(ObjConfiguration):
+    global pybmurl
+    apiUsername = ""
+    apiPassword = ""
+    apiInterface = "127.0.0.1"
+    apiPort = 8445
+    for node in ObjConfiguration.children:
+        key = node.key.lower()
+        if key.lower() == "apiusername" and node.values:
+            apiUsername = node.values[0]
+        elif key.lower() == "apipassword" and node.values:
+            apiPassword = node.values[0]
+        elif key.lower() == "apiinterface" and node.values:
+            apiInterface = node.values[0]
+        elif key.lower() == "apiport" and node.values:
+            apiPort = node.values[0]
+    pybmurl = "http://" + apiUsername + ":" + apiPassword + "@" + apiInterface+ ":" + str(int(apiPort)) + "/"
+    collectd.info('pybitmessagestatus.py config done')
+
+def read_callback():
+    try:
+        clientStatus = json.loads(api.clientStatus())
+    except:
+        collectd.info("Exception loading or parsing JSON")
+        return
+
+    for i in ["networkConnections", "numberOfPubkeysProcessed", "numberOfMessagesProcessed", "numberOfBroadcastsProcessed"]:
+        metric = collectd.Values()
+        metric.plugin = "pybitmessagestatus"
+        if i[0:6] == "number":
+            metric.type = 'counter'
+        else:
+            metric.type = 'gauge'
+        metric.type_instance = i.lower()
+        try:
+            metric.values = [clientStatus[i]]
+        except:
+            collectd.info("Value for %s missing" % (i))
+        metric.dispatch()
+
+if __name__ == "__main__":
+    main()
+else:
+    collectd.register_init(init_callback)
+    collectd.register_config(config_callback)
+    collectd.register_read(read_callback)