113 lines
4.1 KiB
Python
113 lines
4.1 KiB
Python
"""Application exporter"""
|
|
|
|
import os
|
|
import time
|
|
from prometheus_client import start_http_server, Gauge, Enum, Info
|
|
# import requests
|
|
|
|
import asyncio
|
|
import aiohttp
|
|
import eternalegypt
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
class NetgearLTEMetrics:
|
|
"""
|
|
Representation of Prometheus metrics and loop to fetch and transform
|
|
application metrics into Prometheus metrics.
|
|
"""
|
|
|
|
def __init__(self, app_port=80, polling_interval_seconds=5 ):
|
|
self.app_port = app_port
|
|
self.polling_interval_seconds = polling_interval_seconds
|
|
|
|
#Netgear LTE
|
|
self.rx_level = Gauge("netgear_lte_rx_level", "RX Level")
|
|
self.tx_level = Gauge("netgear_lte_tx_level", "TX Level")
|
|
self.radio_quality = Gauge("netgear_lte_radio_quality", "Radio Quality")
|
|
self.data_usage = Gauge("netgear_lte_data_usage", "Data Usage")
|
|
|
|
self.spn_info = Info("netgear_lte_spn_info", "Information on SPN")
|
|
self.modem_info = Info("netgear_lte_modem_info", "Information on the modem")
|
|
|
|
|
|
self.wwan_info = Info("netgear_lte_wwan_info", "Connection information")
|
|
self.wwan_sessDuration = Gauge("netgear_lte_wwan_sess_duration", "Session Duration")
|
|
self.wwan_sessStartTime = Gauge("netgear_lte_sess_start_time", "Session Start Time")
|
|
self.wwan_dataTransferred_total = Gauge("netgear_lte_data_total", "Data transferred total")
|
|
self.wwan_dataTransferred_rxb = Gauge("netgear_lte_data_rxb", "Data transferred rxb")
|
|
self.wwan_dataTransferred_txb = Gauge("netgear_lte_data_txb", "Data transferred txb")
|
|
|
|
|
|
def run_metrics_loop(self):
|
|
"""Metrics fetching loop"""
|
|
|
|
while True:
|
|
asyncio.get_event_loop().run_until_complete(self.fetch())
|
|
time.sleep(self.polling_interval_seconds)
|
|
|
|
async def fetch(self):
|
|
"""
|
|
Get metrics from application and refresh Prometheus metrics with
|
|
new values.
|
|
"""
|
|
|
|
jar = aiohttp.CookieJar(unsafe=True)
|
|
websession = aiohttp.ClientSession(cookie_jar=jar)
|
|
|
|
try:
|
|
modem = eternalegypt.Modem(hostname=os.getenv("MODEM_HOST"), websession=websession)
|
|
await modem.login(password=os.getenv("MODEM_PASS"))
|
|
result = await modem.information()
|
|
|
|
await websession.close()
|
|
|
|
self.rx_level.set(result.rx_level)
|
|
self.tx_level.set(result.tx_level)
|
|
self.radio_quality.set(result.radio_quality)
|
|
self.data_usage.set(result.usage)
|
|
|
|
# self.spn_info.info({'spn_name':})
|
|
self.modem_info.info({
|
|
'model':result.items['general.model'],
|
|
'fw_version':result.items['general.fwversion'],
|
|
'app_version':result.items['general.appversion'],
|
|
'network_display':result.items['wwan.registernetworkdisplay']
|
|
})
|
|
|
|
self.wwan_info.info({
|
|
'connection_text':result.items['wwan.connectiontext'],
|
|
'curBand':result.items['wwanadv.curband']
|
|
})
|
|
self.wwan_sessDuration.set(result.items['wwan.sessduration'])
|
|
self.wwan_sessStartTime.set(result.items['wwan.sessstarttime'])
|
|
self.wwan_dataTransferred_total.set(result.items['wwan.datatransferred.totalb'])
|
|
self.wwan_dataTransferred_rxb.set(result.items['wwan.datatransferred.rxb'])
|
|
self.wwan_dataTransferred_txb.set(result.items['wwan.datatransferred.txb'])
|
|
|
|
|
|
await modem.logout()
|
|
except eternalegypt.Error:
|
|
print("Could not login")
|
|
|
|
await websession.close()
|
|
|
|
|
|
def main():
|
|
"""Main entry point"""
|
|
|
|
polling_interval_seconds = int(os.getenv("POLLING_INTERVAL_SECONDS", "10"))
|
|
app_port = int(os.getenv("APP_PORT", "80"))
|
|
exporter_port = int(os.getenv("EXPORTER_PORT", "9877"))
|
|
|
|
app_metrics = NetgearLTEMetrics(
|
|
app_port=app_port,
|
|
polling_interval_seconds=polling_interval_seconds
|
|
)
|
|
start_http_server(exporter_port)
|
|
app_metrics.run_metrics_loop()
|
|
|
|
if __name__ == "__main__":
|
|
main() |