From 8f19cef2dace46eb5ae1e122ed7743460996dd6c Mon Sep 17 00:00:00 2001 From: Nathan Higley Date: Fri, 14 Jan 2022 15:16:13 -0500 Subject: [PATCH] Finished code --- metrics.py | 77 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/metrics.py b/metrics.py index 4f70008..527c2ff 100644 --- a/metrics.py +++ b/metrics.py @@ -1,44 +1,61 @@ import requests -import os -from dotenv import load_dotenv -from flask import Flask -app = Flask(__name__) +from os import getenv +from time import sleep +from prometheus_client.core import GaugeMetricFamily, REGISTRY +from prometheus_client import start_http_server -load_dotenv() -ip = os.getenv('DEVICE_IP') -user = os.getenv('USER') -password = os.getenv('PASSWORD') +class TasmotaCollector(object): + def __init__(self): + self.ip = getenv('DEVICE_IP') + if not self.ip: + self.ip = "192.168.4.1" + self.user = getenv('USER') + self.password = getenv('PASSWORD') -def get_values(): + def collect(self): - url = 'http://' + ip + '/?m=1' + response = self.fetch() - session = requests.Session() - - if user and password: - session.auth = (user, password) + for key in response: + metric_name = "tasmota_" + key.lower().replace(" ", "_") + metric = response[key].split()[0] + unit = None + if len(response[key].split()) > 1: + unit = response[key].split()[1] + g = GaugeMetricFamily(metric_name, key, labels=['device'], unit=unit) + g.add_metric([self.ip], metric) + yield g - page = session.get(url) + def fetch(self): - values = {} + url = 'http://' + self.ip + '/?m=1' - string_values = str(page.text).split("{s}") - for i in range(1,len(string_values)-1): - label = string_values[i].split("{m}")[0] - value = string_values[i].split("{m}")[1].split("{e}")[0] - values[label] = value + session = requests.Session() + + if self.user and self.password: + session.auth = (self.user, self.password) - return values + page = session.get(url) -@app.route('/metrics') -def return_metrics(): + values = {} - response = "" + string_values = str(page.text).split("{s}") + for i in range(1,len(string_values)-1): + label = string_values[i].split("{m}")[0] + value = string_values[i].split("{m}")[1].split("{e}")[0] + values[label] = value - data = get_values() + return values - for key in data: - line = key.lower().replace(" ", "_") + " " + data[key].split()[0] + '\n' - response += line +if __name__ == '__main__': - return(response) + port = getenv('EXPORTER_PORT') + if not port: + port = 8000 + + start_http_server(int(port)) + REGISTRY.register(TasmotaCollector()) + + while(True): + sleep(1) + \ No newline at end of file