diff --git a/owrx/controllers/metrics.py b/owrx/controllers/metrics.py index e817e9b..4d41a2a 100644 --- a/owrx/controllers/metrics.py +++ b/owrx/controllers/metrics.py @@ -1,9 +1,30 @@ from . import Controller -from owrx.metrics import Metrics +from owrx.metrics import CounterMetric, DirectMetric, Metrics import json class MetricsController(Controller): def indexAction(self): - data = json.dumps(Metrics.getSharedInstance().getMetrics()) + data = json.dumps(Metrics.getSharedInstance().getHierarchicalMetrics()) self.send_response(data, content_type="application/json") + + def prometheusAction(self): + metrics = Metrics.getSharedInstance().getFlatMetrics() + + def prometheusFormat(key, metric): + value = metric.getValue() + if isinstance(metric, CounterMetric): + key += "_total" + value = value["count"] + elif isinstance(metric, DirectMetric): + pass + else: + raise ValueError("Unexpected metric type for metric {}".format(repr(metric))) + + return "{key} {value}".format(key=key.replace(".", "_"), value=value) + + data = ["# https://prometheus.io/docs/instrumenting/exposition_formats/"] + [ + prometheusFormat(k, v) for k, v in metrics.items() + ] + + self.send_response("\n".join(data), content_type="text/plain; version=0.0.4") diff --git a/owrx/http.py b/owrx/http.py index c31802e..5ced309 100644 --- a/owrx/http.py +++ b/owrx/http.py @@ -98,6 +98,7 @@ class Router(object): StaticRoute("/features", FeatureController), StaticRoute("/api/features", ApiController), StaticRoute("/api/receiverdetails", ApiController, options={"action": "receiverDetails"}), + StaticRoute("/metrics", MetricsController, options={"action": "prometheusAction"}), StaticRoute("/metrics.json", MetricsController), StaticRoute("/settings", SettingsController), StaticRoute("/generalsettings", GeneralSettingsController), diff --git a/owrx/metrics.py b/owrx/metrics.py index 48e0db0..6600e85 100644 --- a/owrx/metrics.py +++ b/owrx/metrics.py @@ -52,7 +52,10 @@ class Metrics(object): return None return self.metrics[name] - def getMetrics(self): + def getFlatMetrics(self): + return self.metrics + + def getHierarchicalMetrics(self): result = {} for (key, metric) in self.metrics.items():