commit eebe1afd5df8e42a68cdd03631bc5f444ac03adf Author: Thomas Jensen Date: Fri Jul 19 01:06:00 2019 +0200 initial commit diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..dc370ce --- /dev/null +++ b/Pipfile @@ -0,0 +1,13 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +paho-mqtt = "*" +prometheus-client = "*" + +[requires] +python_version = "3.6" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..6ad4ece --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,36 @@ +{ + "_meta": { + "hash": { + "sha256": "580f0831d7226ccb878b639f429faf10c3dde1880ddc99549be76d3a5cfc6ad7" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.6" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "paho-mqtt": { + "hashes": [ + "sha256:e440a052b46d222e184be3be38676378722072fcd4dfd2c8f509fb861a7b0b79" + ], + "index": "pypi", + "version": "==1.4.0" + }, + "prometheus-client": { + "hashes": [ + "sha256:71cd24a2b3eb335cb800c7159f423df1bd4dcd5171b234be15e3f31ec9f622da", + "sha256:82d609eb7bf5843d4d2a94fed9dfd352ca9f4865ed12ff99569c2249858a8e51" + ], + "index": "pypi", + "version": "==0.7.1" + } + }, + "develop": {} +} diff --git a/exporter.py b/exporter.py new file mode 100644 index 0000000..6b59199 --- /dev/null +++ b/exporter.py @@ -0,0 +1,60 @@ +from prometheus_client import start_http_server, Summary, Gauge +import paho.mqtt.publish as publish +import paho.mqtt.client as mqtt +import random +import time +from node_api import NodeAPI + +client_id = "exporter" +topics = [ + ("$SYS/broker/clients/connected", 0), + ("$CONNECTED/#", 0) + ] + +node_api = NodeAPI() + +MQTT_CONNECTED = Gauge('mqtt_node_connected', 'MQTT node connection status', ['node', 'description']) +MQTT_BROKER_CLIENTS = Gauge('mqtt_broker_clients', 'MQTT broker clients connected') + +def on_connect(client, userdata, flags, rc): + print("Connected with result code " + str(rc)) + + client.subscribe(topics) + if rc==0: + client.connected_flag=True + client.publish("$CONNECTED/"+client_id, 1, retain=True) + else: + client.bad_connection_flag=True + + +#def on_disconnect(client, userdata, rc): +# client.publish(connection_topic,0,retain=True) + +def on_message(client, userdata, msg): + topic = msg.topic.split('/') + + if topic[0] == "$CONNECTED": + MQTT_CONNECTED.labels(topic[1], node_api.get(topic[1])).set(int(msg.payload)) + + if msg.topic == "$SYS/broker/clients/connected": + MQTT_BROKER_CLIENTS.set(int(msg.payload)) + + print(msg.topic, int(msg.payload)) + + +client = mqtt.Client(client_id) + +client.on_connect = on_connect +#client.on_disconnect = on_disconnect +client.on_message = on_message +client.will_set("$CONNECTED/"+client_id, 0, qos=0, retain=True) +client.connect('localhost') +client.loop_start() + + +if __name__ == '__main__': + # Start up the server to expose the metrics. + start_http_server(8000) + + while True: + time.sleep(1) diff --git a/node_api.py b/node_api.py new file mode 100644 index 0000000..9c84d1b --- /dev/null +++ b/node_api.py @@ -0,0 +1,23 @@ +import urllib.request, urllib.parse, json + +nodes = {} + +class NodeAPI: + def get(self, node): + if node in nodes: + return nodes[node] + + try: + with urllib.request.urlopen("http://logistics.dev.uctrl.net/api/nodes/"+node) as url: + data = json.loads(url.read().decode()) + + response = { + 'title': data['data']['description'] if data['data']['description'] is not None else data['data']['project']['title'], + 'location': data['data']['location'] + } + nodes[node] = response['title'] + + return nodes[node] + + except urllib.error.HTTPError: + return node.capitalize()