radio_exporter/src/PrometheusServer.py

49 lines
1.6 KiB
Python
Raw Normal View History

2022-06-30 21:06:30 +00:00
import socket
import signal
from ipaddress import ip_address
2022-07-16 16:27:05 +00:00
from http.server import HTTPServer, BaseHTTPRequestHandler
2022-06-30 21:06:30 +00:00
from selectors import DefaultSelector, EVENT_READ
2022-07-16 16:27:05 +00:00
from src import Collector
2022-06-30 21:06:30 +00:00
2022-07-16 16:27:05 +00:00
class PromServer(HTTPServer):
2022-06-30 21:06:30 +00:00
def __init__(self, address):
2022-07-16 16:27:05 +00:00
if ip_address(address[0]).version == 6:
2022-06-30 21:06:30 +00:00
self.address_family = socket.AF_INET6
super().__init__(address, self.RequestHandler)
class RequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path != "/metrics":
return self.send_error(404)
metrics = [x.format_prom() for x in self.server.collector.collect()]
2022-07-16 16:27:05 +00:00
output = "\n".join(metrics) + "\n"
2022-06-30 21:06:30 +00:00
self.send_response(200)
self.end_headers()
self.wfile.write(output.encode())
def signal_handler(self, signum, frame):
2022-07-16 16:27:05 +00:00
print("Signal handler called with signal", signum)
self.interrupt_write.send(b"\0")
2022-06-30 21:06:30 +00:00
def serve_forever(self):
sel = DefaultSelector()
sel.register(self.interrupt_read, EVENT_READ)
sel.register(self, EVENT_READ)
while True:
for key, _ in sel.select():
if key.fileobj == self.interrupt_read:
self.interrupt_read.recv(1)
return
if key.fileobj == self:
self.handle_request()
def start(self):
2022-07-16 16:27:05 +00:00
self.collector = Collector.Collector()
2022-06-30 21:06:30 +00:00
self.interrupt_read, self.interrupt_write = socket.socketpair()
signal.signal(signal.SIGINT, self.signal_handler)
self.serve_forever()