160 lines
4.9 KiB
Python
160 lines
4.9 KiB
Python
#!/usr/bin/env python3
|
|
from flask import request, current_app, Response, jsonify
|
|
from flask_classful import FlaskView, route
|
|
from utils import json_required, influxdb_instance
|
|
from influxdb_client import Point
|
|
|
|
|
|
class ReportView(FlaskView):
|
|
|
|
# LINK
|
|
|
|
@route("/link", methods=['POST'])
|
|
@json_required
|
|
def link_post(self):
|
|
data = request.json
|
|
|
|
points = []
|
|
|
|
for type_ in ['latency', 'rate']:
|
|
if type_ in data['measurements']:
|
|
points.append(
|
|
Point(f"link_{type_}")
|
|
.tag("client", data['client'])
|
|
.tag("site", data['site'])
|
|
.field("value", data['measurements'][type_])
|
|
)
|
|
|
|
influxdb_instance.connection.write_api().write("alma", current_app.config['INFLUXDB_V2_ORG'], points)
|
|
return Response(status=201)
|
|
|
|
@route("/link", methods=['GET'])
|
|
def link_get(self):
|
|
response = {}
|
|
|
|
# Query latency
|
|
|
|
query = """from(bucket: "alma")
|
|
|> range(start: -2m, stop: now())
|
|
|> filter(fn: (r) => r["_measurement"] == "link_latency")
|
|
|> timedMovingAverage(every: 30s, period: 1m)
|
|
|> last()
|
|
|> yield()"""
|
|
latency_tables = influxdb_instance.query_api.query(query)
|
|
|
|
for table in latency_tables:
|
|
for row in table.records:
|
|
key = row.values['client'] + ":" + row.values['site']
|
|
if key in response:
|
|
response[key]['latency'] = row.values['_value']
|
|
else:
|
|
response[key] = {'latency': row.values['_value']}
|
|
|
|
# Query rate
|
|
|
|
query = """from(bucket: "alma")
|
|
|> range(start: -2m, stop: now())
|
|
|> filter(fn: (r) => r["_measurement"] == "link_rate")
|
|
|> timedMovingAverage(every: 30s, period: 1m)
|
|
|> last()
|
|
|> yield()"""
|
|
rate_tables = influxdb_instance.query_api.query(query)
|
|
|
|
for table in rate_tables:
|
|
for row in table.records:
|
|
key = row.values['client'] + ":" + row.values['site']
|
|
if key in response:
|
|
response[key]['rate'] = row.values['_value']
|
|
else:
|
|
response[key] = {'rate': row.values['_value']}
|
|
|
|
return jsonify(response)
|
|
|
|
# CLIENT
|
|
|
|
@route("/client", methods=['POST'])
|
|
@json_required
|
|
def client_post(self):
|
|
data = request.json
|
|
|
|
points = []
|
|
|
|
for type_ in ['queue']:
|
|
if type_ in data['measurements']:
|
|
points.append(
|
|
Point(f"client_{type_}")
|
|
.tag("client", data['client'])
|
|
.field("value", data['measurements'][type_])
|
|
)
|
|
|
|
influxdb_instance.connection.write_api().write("alma", current_app.config['INFLUXDB_V2_ORG'], points)
|
|
return Response(status=201)
|
|
|
|
@route("/client", methods=['GET'])
|
|
def client_get(self):
|
|
response = {}
|
|
|
|
# Query queue
|
|
|
|
query = """from(bucket: "alma")
|
|
|> range(start: -2m, stop: now())
|
|
|> filter(fn: (r) => r["_measurement"] == "client_queue")
|
|
|> timedMovingAverage(every: 30s, period: 1m)
|
|
|> last()
|
|
|> yield()"""
|
|
queue_tables = influxdb_instance.query_api.query(query)
|
|
|
|
for table in queue_tables:
|
|
for row in table.records:
|
|
key = row.values['client']
|
|
if key in response:
|
|
response[key]['queue'] = row.values['_value']
|
|
else:
|
|
response[key] = {'queue': row.values['_value']}
|
|
|
|
return jsonify(response)
|
|
|
|
# SITE
|
|
|
|
@route("/site", methods=['POST'])
|
|
@json_required
|
|
def site_post(self):
|
|
data = request.json
|
|
|
|
points = []
|
|
|
|
for type_ in ['queue']:
|
|
if type_ in data['measurements']:
|
|
points.append(
|
|
Point(f"site_{type_}")
|
|
.tag("site", data['site'])
|
|
.field("value", data['measurements'][type_])
|
|
)
|
|
|
|
influxdb_instance.connection.write_api().write("alma", current_app.config['INFLUXDB_V2_ORG'], points)
|
|
return Response(status=201)
|
|
|
|
@route("/site", methods=['GET'])
|
|
def site_get(self):
|
|
response = {}
|
|
|
|
# Query queue
|
|
|
|
query = """from(bucket: "alma")
|
|
|> range(start: -2m, stop: now())
|
|
|> filter(fn: (r) => r["_measurement"] == "site_queue")
|
|
|> timedMovingAverage(every: 30s, period: 1m)
|
|
|> last()
|
|
|> yield()"""
|
|
queue_tables = influxdb_instance.query_api.query(query)
|
|
|
|
for table in queue_tables:
|
|
for row in table.records:
|
|
key = row.values['site']
|
|
if key in response:
|
|
response[key]['queue'] = row.values['_value']
|
|
else:
|
|
response[key] = {'queue': row.values['_value']}
|
|
|
|
return jsonify(response)
|