From 92321a3b4e537593ac62509ae68385e5156890d3 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 4 Aug 2019 18:36:03 +0200 Subject: [PATCH] simple metrics api to interface with collectd and grafana --- owrx/controllers.py | 7 +++++++ owrx/http.py | 2 ++ owrx/metrics.py | 32 ++++++++++++++++++++++++++++++++ owrx/wsjt.py | 3 +++ 4 files changed, 44 insertions(+) create mode 100644 owrx/metrics.py diff --git a/owrx/controllers.py b/owrx/controllers.py index c6c0da5..f7ce7e0 100644 --- a/owrx/controllers.py +++ b/owrx/controllers.py @@ -9,6 +9,7 @@ from owrx.source import ClientRegistry from owrx.connection import WebSocketMessageHandler from owrx.version import openwebrx_version from owrx.feature import FeatureDetector +from owrx.metrics import Metrics import logging @@ -124,6 +125,12 @@ class ApiController(Controller): self.send_response(data, content_type="application/json") +class MetricsController(Controller): + def handle_request(self): + data = json.dumps(Metrics.getSharedInstance().getMetrics()) + self.send_response(data, content_type="application/json") + + class WebSocketController(Controller): def handle_request(self): conn = WebSocketConnection(self.handler, WebSocketMessageHandler()) diff --git a/owrx/http.py b/owrx/http.py index 99c1003..ce96acc 100644 --- a/owrx/http.py +++ b/owrx/http.py @@ -6,6 +6,7 @@ from owrx.controllers import ( MapController, FeatureController, ApiController, + MetricsController, ) from http.server import BaseHTTPRequestHandler import re @@ -43,6 +44,7 @@ class Router(object): {"route": "/map", "controller": MapController}, {"route": "/features", "controller": FeatureController}, {"route": "/api/features", "controller": ApiController}, + {"route": "/metrics", "controller": MetricsController}, ] def find_controller(self, path): diff --git a/owrx/metrics.py b/owrx/metrics.py new file mode 100644 index 0000000..a8923d0 --- /dev/null +++ b/owrx/metrics.py @@ -0,0 +1,32 @@ +class Metrics(object): + sharedInstance = None + + @staticmethod + def getSharedInstance(): + if Metrics.sharedInstance is None: + Metrics.sharedInstance = Metrics() + return Metrics.sharedInstance + + def __init__(self): + self.metrics = {} + + def pushDecodes(self, band, mode, count = 1): + if band is None: + band = 'unknown' + else: + band = band.getName() + + if mode is None: + mode = 'unknown' + + if not band in self.metrics: + self.metrics[band] = {} + if not mode in self.metrics[band]: + self.metrics[band][mode] = { + "count": 0 + } + + self.metrics[band][mode]["count"] += count + + def getMetrics(self): + return self.metrics diff --git a/owrx/wsjt.py b/owrx/wsjt.py index 2c26b2f..082e59f 100644 --- a/owrx/wsjt.py +++ b/owrx/wsjt.py @@ -10,6 +10,7 @@ from owrx.map import Map, LocatorLocation import re from owrx.config import PropertyManager from owrx.bands import Bandplan +from owrx.metrics import Metrics import logging @@ -228,6 +229,7 @@ class WsjtParser(object): mode = WsjtParser.modes[modeChar] if modeChar in WsjtParser.modes else "unknown" wsjt_msg = msg[17:53].strip() self.parseLocator(wsjt_msg, mode) + Metrics.getSharedInstance().pushDecodes(self.band, mode) return { "timestamp": timestamp, "db": float(msg[0:3]), @@ -253,6 +255,7 @@ class WsjtParser(object): # '0052 -29 2.6 0.001486 0 G02CWT IO92 23' wsjt_msg = msg[29:].strip() self.parseWsprMessage(wsjt_msg) + Metrics.getSharedInstance().pushDecodes(self.band, 'WSPR') return { "timestamp": self.parse_timestamp(msg[0:4], "%H%M"), "db": float(msg[5:8]),