From 62da4a9f116bc11e037770aed922100336a7f298 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 15 Dec 2024 20:17:22 +0100 Subject: [PATCH] restart at failure --- ttn-vegapulsair-exporter.py | 129 ++++++++++++++++++++++++------------ 1 file changed, 85 insertions(+), 44 deletions(-) diff --git a/ttn-vegapulsair-exporter.py b/ttn-vegapulsair-exporter.py index 1d86c40..2d4ff07 100644 --- a/ttn-vegapulsair-exporter.py +++ b/ttn-vegapulsair-exporter.py @@ -29,24 +29,48 @@ class RequestHandler(BaseHTTPRequestHandler): self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() - self.wfile.write(bytes(config.exporter_prefix + "expoter_duration_seconds_sum " + str(int((datetime.now() - startTime).total_seconds())) + "\n", "utf-8")) - self.wfile.write(bytes(config.exporter_prefix + "exporter_request_count " + str(request_count) + "\n", "utf-8")) - self.wfile.write(bytes(config.exporter_prefix + "exporter_scrape_healthy " + str(int(scrape_healthy)) + "\n", "utf-8")) - + self.wfile.write( + bytes( + config.exporter_prefix + + "expoter_duration_seconds_sum " + + str(int((datetime.now() - startTime).total_seconds())) + + "\n", + "utf-8", + ) + ) + self.wfile.write( + bytes( + config.exporter_prefix + + "exporter_request_count " + + str(request_count) + + "\n", + "utf-8", + ) + ) + self.wfile.write( + bytes( + config.exporter_prefix + + "exporter_scrape_healthy " + + str(int(scrape_healthy)) + + "\n", + "utf-8", + ) + ) + for metric in node_metrics: - #print(metric) + # print(metric) self.wfile.write(bytes(config.exporter_prefix + metric + "\n", "utf-8")) mutex.release() - + def do_GET(self): global request_count global lastMqttReception global scrape_healthy request_count = request_count + 1 - #print("Request: " + self.path) - if (self.path.startswith("/metrics")): - #if (datetime.now() - lastMqttReception) > timedelta(hours=7): + # print("Request: " + self.path) + if self.path.startswith("/metrics"): + # if (datetime.now() - lastMqttReception) > timedelta(hours=7): # scrape_healthy = False self.get_metrics() else: @@ -54,22 +78,29 @@ class RequestHandler(BaseHTTPRequestHandler): self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write(bytes("", "utf-8")) - self.wfile.write(bytes("VEGAPULS Air exporter", "utf-8")) + self.wfile.write( + bytes("VEGAPULS Air exporter", "utf-8") + ) self.wfile.write(bytes("", "utf-8")) - self.wfile.write(bytes('

ttn-vegapulsair exporter based on data from LoRaWAN TTN node.

', "utf-8")) + self.wfile.write( + bytes( + "

ttn-vegapulsair exporter based on data from LoRaWAN TTN node.

", + "utf-8", + ) + ) self.wfile.write(bytes('

Metrics

', "utf-8")) self.wfile.write(bytes("", "utf-8")) self.wfile.write(bytes("", "utf-8")) def update_metrics(payload, metadata): - #print("Payload: "+ str(payload)) - #print("Metadata: "+ str(metadata)) + # print("Payload: "+ str(payload)) + # print("Metadata: "+ str(metadata)) global node_metrics global mutex global scrape_healthy mutex.acquire() - #scrape_healthy = False + # scrape_healthy = False node_metrics.clear() if "Distance" in payload: @@ -78,7 +109,9 @@ def update_metrics(payload, metadata): if "Inclination_degree" in payload: print("set Inclination_degree: " + str(int(payload["Inclination_degree"]))) - node_metrics.append("inclination_degree " + str(int(payload["Inclination_degree"]))) + node_metrics.append( + "inclination_degree " + str(int(payload["Inclination_degree"])) + ) if "MvLinProcent" in payload: print("set MvLinProcent: " + str(int(payload["MvLinProcent"]))) @@ -91,14 +124,16 @@ def update_metrics(payload, metadata): if "MvScaled" in payload: print("set MvScaled: " + str(float(payload["MvScaled"]))) node_metrics.append("scaled " + str(float(payload["MvScaled"]))) - + if "MvScaledUnit" in payload: print("set MvScaledUnit: " + str(int(payload["MvScaledUnit"]))) node_metrics.append("scaled_unit " + str(int(payload["MvScaledUnit"]))) if "PacketIdentifier" in payload: print("set PacketIdentifier: " + str(int(payload["PacketIdentifier"]))) - node_metrics.append("packet_identifier " + str(int(payload["PacketIdentifier"]))) + node_metrics.append( + "packet_identifier " + str(int(payload["PacketIdentifier"])) + ) if "RemainingPower" in payload: print("set RemainingPower: " + str(int(payload["RemainingPower"]))) @@ -138,11 +173,11 @@ def on_connect(client, userdata, flags, reason_code, properties): print("\nNot connected to MQTT: reason_code = " + str(reason_code)) def on_message(mqttc, obj, msg): - #print("\nMessage: " + msg.topic + " " + str(msg.qos)) + # print("\nMessage: " + msg.topic + " " + str(msg.qos)) parsedJSON = json.loads(msg.payload) - #print(json.dumps(parsedJSON, indent=4)) + # print(json.dumps(parsedJSON, indent=4)) - try: + try: uplink_message = parsedJSON["uplink_message"] update_metrics(uplink_message["decoded_payload"], uplink_message["rx_metadata"]) lastMqttReception = datetime.now() @@ -163,33 +198,39 @@ def on_disconnect(client, userdata, flags, reason_code, properties): client.reconnect() def main(): - print("starting ...") + while True: + try: + print("starting ...") + mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) + mqttc.on_connect = on_connect + mqttc.on_subscribe = on_subscribe + mqttc.on_message = on_message + mqttc.on_disconnect = on_disconnect + mqttc.username_pw_set(config.ttn_user, config.ttn_key) + mqttc.tls_set() + mqttc.connect( + config.ttn_region.lower() + ".cloud.thethings.network", 8883, 60 + ) + mqttc.subscribe("#", 0) # all device uplinks - mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) - mqttc.on_connect = on_connect - mqttc.on_subscribe = on_subscribe - mqttc.on_message = on_message - mqttc.on_disconnect = on_disconnect - mqttc.username_pw_set(config.ttn_user, config.ttn_key) - mqttc.tls_set() - mqttc.connect(config.ttn_region.lower() + ".cloud.thethings.network", 8883, 60) - mqttc.subscribe("#", 0) # all device uplinks + # run mqtt in thread forever + poll_mqtt_thread = threading.Thread(target=poll_mqtt, args=((mqttc,))) + poll_mqtt_thread.start() - # run mqtt in thread forever - poll_mqtt_thread = threading.Thread(target=poll_mqtt, args=((mqttc,))) - poll_mqtt_thread.start() + webServer = HTTPServer((config.hostName, config.serverPort), RequestHandler) + print("Server started http://%s:%s" % (config.hostName, config.serverPort)) - webServer = HTTPServer((config.hostName, config.serverPort), RequestHandler) - print("Server started http://%s:%s" % (config.hostName, config.serverPort)) + try: + webServer.serve_forever() + except KeyboardInterrupt: + sys.exit(-1) - try: - webServer.serve_forever() - except KeyboardInterrupt: - sys.exit(-1) - - webServer.server_close() - print("Server stopped.") - poll_mqtt_thread.join() + webServer.server_close() + print("Server stopped.") + poll_mqtt_thread.join() + except Exception as e: + print(e) + time.sleep(60) if __name__ == "__main__": - main() + main()