Merge pull request #55 from michbeck100/feature/prometheus-export

adds /metrics endpoint with prometheus format
This commit is contained in:
bohdan-s
2022-07-07 13:57:26 +10:00
committed by GitHub
2 changed files with 23 additions and 10 deletions
+1
View File
@@ -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....
+22 -10
View File
@@ -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 = "<h3>Sungather v" + __version__ + "</h3></p><table><th>Address</th><tr><th>Register</th><th>Value</th></tr>"
metrics = ""
for register, value in inverter.latest_scrape.items():
body = body + f"<tr><td>{str(inverter.getRegisterAddress(register))}</td><td>{str(register)}</td><td>{str(value)} {str(inverter.getRegisterUnit(register))}</td></tr>"
body += f"<tr><td>{str(inverter.getRegisterAddress(register))}</td><td>{str(register)}</td><td>{str(value)} {str(inverter.getRegisterUnit(register))}</td></tr>"
metrics += f"{str(register)}{{address=\"{str(inverter.getRegisterAddress(register))}\", unit=\"{str(inverter.getRegisterUnit(register))}\"}} {str(value)}\n"
export_webserver.html_body = body + f"</table><p>Total {len(inverter.latest_scrape)} registers"
export_webserver.metrics = metrics
body = "</p></p><table><tr><th>Configuration</th><th>Value</th></tr>"
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"<tr><td>{str(setting)}</td><td>{str(value)}</td></tr>"
export_webserver.html_body = export_webserver.html_body + body + f"</table></p>"
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("<html><head><title>SunGather</title><meta charset='UTF-8'><meta http-equiv='refresh' content='15'></head>", "utf-8"))
self.wfile.write(bytes("<body>", "utf-8"))
self.wfile.write(bytes(export_webserver.html_body, "utf-8"))
self.wfile.write(bytes("</table>", "utf-8"))
self.wfile.write(bytes("</body></html>", "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("<html><head><title>SunGather</title><meta charset='UTF-8'><meta http-equiv='refresh' content='15'></head>", "utf-8"))
self.wfile.write(bytes("<body>", "utf-8"))
self.wfile.write(bytes(export_webserver.html_body, "utf-8"))
self.wfile.write(bytes("</table>", "utf-8"))
self.wfile.write(bytes("</body></html>", "utf-8"))
def log_message(self, format, *args):
pass