simple metrics api to interface with collectd and grafana
This commit is contained in:
parent
766300bdff
commit
92321a3b4e
@ -9,6 +9,7 @@ from owrx.source import ClientRegistry
|
|||||||
from owrx.connection import WebSocketMessageHandler
|
from owrx.connection import WebSocketMessageHandler
|
||||||
from owrx.version import openwebrx_version
|
from owrx.version import openwebrx_version
|
||||||
from owrx.feature import FeatureDetector
|
from owrx.feature import FeatureDetector
|
||||||
|
from owrx.metrics import Metrics
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
@ -124,6 +125,12 @@ class ApiController(Controller):
|
|||||||
self.send_response(data, content_type="application/json")
|
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):
|
class WebSocketController(Controller):
|
||||||
def handle_request(self):
|
def handle_request(self):
|
||||||
conn = WebSocketConnection(self.handler, WebSocketMessageHandler())
|
conn = WebSocketConnection(self.handler, WebSocketMessageHandler())
|
||||||
|
@ -6,6 +6,7 @@ from owrx.controllers import (
|
|||||||
MapController,
|
MapController,
|
||||||
FeatureController,
|
FeatureController,
|
||||||
ApiController,
|
ApiController,
|
||||||
|
MetricsController,
|
||||||
)
|
)
|
||||||
from http.server import BaseHTTPRequestHandler
|
from http.server import BaseHTTPRequestHandler
|
||||||
import re
|
import re
|
||||||
@ -43,6 +44,7 @@ class Router(object):
|
|||||||
{"route": "/map", "controller": MapController},
|
{"route": "/map", "controller": MapController},
|
||||||
{"route": "/features", "controller": FeatureController},
|
{"route": "/features", "controller": FeatureController},
|
||||||
{"route": "/api/features", "controller": ApiController},
|
{"route": "/api/features", "controller": ApiController},
|
||||||
|
{"route": "/metrics", "controller": MetricsController},
|
||||||
]
|
]
|
||||||
|
|
||||||
def find_controller(self, path):
|
def find_controller(self, path):
|
||||||
|
32
owrx/metrics.py
Normal file
32
owrx/metrics.py
Normal file
@ -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
|
@ -10,6 +10,7 @@ from owrx.map import Map, LocatorLocation
|
|||||||
import re
|
import re
|
||||||
from owrx.config import PropertyManager
|
from owrx.config import PropertyManager
|
||||||
from owrx.bands import Bandplan
|
from owrx.bands import Bandplan
|
||||||
|
from owrx.metrics import Metrics
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
@ -228,6 +229,7 @@ class WsjtParser(object):
|
|||||||
mode = WsjtParser.modes[modeChar] if modeChar in WsjtParser.modes else "unknown"
|
mode = WsjtParser.modes[modeChar] if modeChar in WsjtParser.modes else "unknown"
|
||||||
wsjt_msg = msg[17:53].strip()
|
wsjt_msg = msg[17:53].strip()
|
||||||
self.parseLocator(wsjt_msg, mode)
|
self.parseLocator(wsjt_msg, mode)
|
||||||
|
Metrics.getSharedInstance().pushDecodes(self.band, mode)
|
||||||
return {
|
return {
|
||||||
"timestamp": timestamp,
|
"timestamp": timestamp,
|
||||||
"db": float(msg[0:3]),
|
"db": float(msg[0:3]),
|
||||||
@ -253,6 +255,7 @@ class WsjtParser(object):
|
|||||||
# '0052 -29 2.6 0.001486 0 G02CWT IO92 23'
|
# '0052 -29 2.6 0.001486 0 G02CWT IO92 23'
|
||||||
wsjt_msg = msg[29:].strip()
|
wsjt_msg = msg[29:].strip()
|
||||||
self.parseWsprMessage(wsjt_msg)
|
self.parseWsprMessage(wsjt_msg)
|
||||||
|
Metrics.getSharedInstance().pushDecodes(self.band, 'WSPR')
|
||||||
return {
|
return {
|
||||||
"timestamp": self.parse_timestamp(msg[0:4], "%H%M"),
|
"timestamp": self.parse_timestamp(msg[0:4], "%H%M"),
|
||||||
"db": float(msg[5:8]),
|
"db": float(msg[5:8]),
|
||||||
|
Loading…
Reference in New Issue
Block a user