From b01d08c3e841d19d1c8f1e7c8101164417b00ad7 Mon Sep 17 00:00:00 2001 From: Kristian Glass Date: Tue, 22 Dec 2020 22:27:39 +0000 Subject: [PATCH] Expose Prometheus-compatible metrics at /metrics This is a rough first-draft change, with multiple flaws, intended to just start discussion around the feature request. Issues include: * It breaks compatibility, replacing the previous JSON /metrics * It crudely hand-generates Prometheus-formatted data * It would probably be better if it used https://pypi.org/project/prometheus-client/ But it works locally and I have some nice graphs! --- owrx/controllers/metrics.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/owrx/controllers/metrics.py b/owrx/controllers/metrics.py index e817e9b..d4a6105 100644 --- a/owrx/controllers/metrics.py +++ b/owrx/controllers/metrics.py @@ -1,9 +1,24 @@ from . import Controller -from owrx.metrics import Metrics -import json +from owrx.metrics import CounterMetric, DirectMetric, Metrics class MetricsController(Controller): def indexAction(self): - data = json.dumps(Metrics.getSharedInstance().getMetrics()) - self.send_response(data, content_type="application/json") + metrics = Metrics.getSharedInstance().metrics + + data = "# https://prometheus.io/docs/instrumenting/exposition_formats/\n" + for key,metric in metrics.items(): + + value = -1 + + if isinstance(metric, CounterMetric): + key += "_total" + value = metric.getValue()["count"] + elif isinstance(metric, DirectMetric): + value = metric.getValue() + else: + raise ValueError("Unexpected metric type for metric %s" % repr(metric)) + + data += "%s %s\n" % (key.replace(".", "_"), value) + + self.send_response(data, content_type="text/plain; version=0.0.4")