#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Author: Hendrik Schutter, mail@hendrikschutter.com Date of creation: 2022/03/01 Date of last modification: 2023/03/01 """ from http.server import BaseHTTPRequestHandler, HTTPServer import time import threading from datetime import datetime from urllib.parse import urlsplit, parse_qs from random import randrange import os, sys, logging, time import paho.mqtt.client as mqtt import json import csv from datetime import datetime hostName = "127.0.0.1" serverPort = 9101 exporter_prefix = "msv_clubhouse_" User = "APP UUID @ttn" Password = "API Key" theRegion = "EU1" # The region you are using scrape_healthy = True startTime = datetime.now() node_metrics = list() mutex = threading.Lock() request_count = 0 # MQTT event functions def on_connect(mqttc, obj, flags, rc): print("\nConnect: rc = " + str(rc)) def on_message(mqttc, obj, msg): print("\nMessage: " + msg.topic + " " + str(msg.qos)) # + " " + str(msg.payload)) parsedJSON = json.loads(msg.payload) print(json.dumps(parsedJSON, indent=4)) # Uncomment this to fill your terminal screen with JSON uplink_message = parsedJSON["uplink_message"]; frm_payload = uplink_message["frm_payload"]; print("MSG: " + frm_payload) print("MSG: " + str(type(frm_payload))) def on_subscribe(mqttc, obj, mid, granted_qos): print("\nSubscribe: " + str(mid) + " " + str(granted_qos)) def on_log(mqttc, obj, level, string): print("\nLog: "+ string) logging_level = mqtt.LOGGING_LEVEL[level] logging.log(logging_level, string) class RequestHandler(BaseHTTPRequestHandler): def get_metrics(self): global request_count global node_metrics global exporter_prefix global mutex mutex.acquire() self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write(bytes(exporter_prefix + "expoter_duration_seconds_sum " + str(int((datetime.now() - startTime).total_seconds())) + "\n", "utf-8")) self.wfile.write(bytes(exporter_prefix + "exporter_request_count " + str(request_count) + "\n", "utf-8")) self.wfile.write(bytes(exporter_prefix + "exporter_scrape_healthy " + str(int(scrape_healthy)) + "\n", "utf-8")) for metric in node_metrics: #print(metric) self.wfile.write(bytes(exporter_prefix + metric + "\n", "utf-8")) mutex.release() def do_GET(self): global request_count request_count = request_count + 1 print("Request: " + self.path) if (self.path.startswith("/metrics")): self.get_metrics() else: self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write(bytes("", "utf-8")) self.wfile.write(bytes("