From 86c99c8feebee880811e08046c3ee3625fc42726 Mon Sep 17 00:00:00 2001 From: Luna Mendes Date: Wed, 8 Aug 2018 17:30:51 -0300 Subject: [PATCH] blueprints.api: add calc_uptime, uptime field on api --- elstat/blueprints/api.py | 45 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/elstat/blueprints/api.py b/elstat/blueprints/api.py index cf6678f..c2083ab 100644 --- a/elstat/blueprints/api.py +++ b/elstat/blueprints/api.py @@ -1,3 +1,4 @@ +from decimal import Decimal from sanic import Blueprint, response bp = Blueprint(__name__) @@ -42,10 +43,51 @@ def get_graphs(manager): return res +def calc_uptime(manager): + res = {} + + for name, worker in manager.workers.items(): + cur = manager.conn.cursor() + + # get total period we've been polling the service + cur.execute(f""" + SELECT min(timestamp), max(timestamp) from {name} + """) + + row = cur.fetchone() + min_tstamp, max_tstamp = row[0], row[1] + t_period = max_tstamp - min_tstamp + + # get all polls that failed + cur.execute(f""" + SELECT COUNT(*) FROM {name} + WHERE status = false + """) + + row = cur.fetchone() + down_hits = row[0] + + # total downtime in seconds + downtime = down_hits * worker.service['poll'] + + # calculate total downtime in percentage + percent = Decimal(downtime) / Decimal(t_period) + + # uptime - downtime = real uptime + res[name] = str(Decimal(100) - percent) + + return res + + @bp.get('/api/current_status') async def get_cur_status(request): manager = request.app.manager - return response.json(get_status(manager)) + return response.json({ + **get_status(manager), + **{ + 'uptime': calc_uptime(manager) + } + }) @bp.get('/api/status') @@ -55,4 +97,5 @@ async def get_full_status(request): return response.json({ 'status': get_status(manager), 'graph': get_graphs(manager), + 'uptime': calc_uptime(manager) })