From bca665ade308027a5ce4b143e6d99a073a262727 Mon Sep 17 00:00:00 2001
From: Michael Kotten
Date: Wed, 22 Jun 2022 08:27:36 +0200
Subject: [PATCH] adds /metrics endpoint with prometheus format
---
README.md | 1 +
SunGather/exports/webserver.py | 32 ++++++++++++++++++++++----------
2 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/README.md b/README.md
index 2ec8bbc..a2b6245 100644
--- a/README.md
+++ b/README.md
@@ -39,6 +39,7 @@ Has multiple export locations out of the box:
* MQTT - Load into MQTT, and optionally Home Assistance including Discovery
* PVOutput - Load into PVOutput.org
* InfluxDB - Load data directly into InfluxDB (v1.8 or v2.x)
+* Prometheus - Scrape from /metrics endpoint
* Simple webserver showing collected data
* Rasberry Pi Docker support
* and more coming....
diff --git a/SunGather/exports/webserver.py b/SunGather/exports/webserver.py
index 2f6b88b..3200918 100644
--- a/SunGather/exports/webserver.py
+++ b/SunGather/exports/webserver.py
@@ -7,6 +7,7 @@ import logging
class export_webserver(object):
html_body = "Pending Data Retrieval"
+ metrics = ""
def __init__(self):
False
@@ -25,9 +26,12 @@ class export_webserver(object):
def publish(self, inverter):
body = "Sungather v" + __version__ + "
| Address | | Register | Value |
"
+ metrics = ""
for register, value in inverter.latest_scrape.items():
- body = body + f"| {str(inverter.getRegisterAddress(register))} | {str(register)} | {str(value)} {str(inverter.getRegisterUnit(register))} |
"
+ body += f"| {str(inverter.getRegisterAddress(register))} | {str(register)} | {str(value)} {str(inverter.getRegisterUnit(register))} |
"
+ metrics += f"{str(register)}{{address=\"{str(inverter.getRegisterAddress(register))}\", unit=\"{str(inverter.getRegisterUnit(register))}\"}} {str(value)}\n"
export_webserver.html_body = body + f"
Total {len(inverter.latest_scrape)} registers"
+ export_webserver.metrics = metrics
body = "
| Configuration | Value |
"
for setting, value in inverter.client_config.items():
@@ -35,18 +39,26 @@ class export_webserver(object):
for setting, value in inverter.inverter_config.items():
body = body + f"| {str(setting)} | {str(value)} |
"
export_webserver.html_body = export_webserver.html_body + body + f"
"
-
+
return True
class MyServer(BaseHTTPRequestHandler):
def do_GET(self):
- self.send_response(200)
- self.send_header("Content-type", "text/html")
- self.end_headers()
- self.wfile.write(bytes("SunGather", "utf-8"))
- self.wfile.write(bytes("", "utf-8"))
- self.wfile.write(bytes(export_webserver.html_body, "utf-8"))
- self.wfile.write(bytes("", "utf-8"))
- self.wfile.write(bytes("", "utf-8"))
+ if self.path == '/metrics':
+ self.send_response(200)
+ self.send_header("Content-type", "text/plain")
+ self.end_headers()
+ self.wfile.write(bytes(export_webserver.metrics, "utf-8"))
+ else:
+ self.send_response(200)
+ self.send_header("Content-type", "text/html")
+ self.end_headers()
+ self.wfile.write(bytes("SunGather", "utf-8"))
+ self.wfile.write(bytes("", "utf-8"))
+ self.wfile.write(bytes(export_webserver.html_body, "utf-8"))
+ self.wfile.write(bytes("", "utf-8"))
+ self.wfile.write(bytes("", "utf-8"))
+
+
def log_message(self, format, *args):
pass