mirror of
https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
synced 2025-10-30 18:27:53 +00:00
270 lines
9.6 KiB
Python
Executable File
270 lines
9.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import sys
|
|
import os
|
|
import importlib
|
|
import argparse
|
|
import json
|
|
import random
|
|
import string
|
|
|
|
if sys.version_info[0] != 3:
|
|
print("This script requires Python 3")
|
|
exit(1)
|
|
|
|
|
|
sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../")))
|
|
|
|
lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base")
|
|
LFCliBase = lfcli_base.LFCliBase
|
|
csv_to_influx = importlib.import_module("py-scripts.csv_to_influx")
|
|
CSVtoInflux = csv_to_influx.CSVtoInflux
|
|
influx_add_parser_args = csv_to_influx.influx_add_parser_args
|
|
grafana_profile = importlib.import_module("py-scripts.grafana_profile")
|
|
UseGrafana = grafana_profile.UseGrafana
|
|
influx = importlib.import_module("py-scripts.influx")
|
|
RecordInflux = influx.RecordInflux
|
|
InfluxRequest = importlib.import_module("py-dashboard.InfluxRequest")
|
|
influx_add_parser_args = InfluxRequest.influx_add_parser_args
|
|
|
|
|
|
class data_to_grafana(LFCliBase):
|
|
def __init__(self,
|
|
_bucket=None,
|
|
_script=None,
|
|
_panel_name=None):
|
|
self.bucket = _bucket
|
|
self.script = _script
|
|
self.panel_name = _panel_name
|
|
pass
|
|
|
|
@property
|
|
def json_parser(self):
|
|
options = string.ascii_lowercase+string.ascii_uppercase+string.digits
|
|
uid = ''.join(random.choice(options) for i in range(9))
|
|
print(uid)
|
|
json_dict = {
|
|
"annotations": {
|
|
"list": [
|
|
{
|
|
"builtIn": 1,
|
|
"datasource": "-- Grafana --",
|
|
"enable": True,
|
|
"hide": True,
|
|
"iconColor": "rgba(0, 211, 255, 1)",
|
|
"name": "Annotations & Alerts",
|
|
"type": "dashboard"
|
|
}
|
|
]
|
|
},
|
|
"editable": True,
|
|
"gnetId": None,
|
|
"graphTooltip": 0,
|
|
"id": 10,
|
|
"links": [],
|
|
"panels": [
|
|
{
|
|
"aliasColors": {},
|
|
"bars": False,
|
|
"dashLength": 10,
|
|
"dashes": False,
|
|
"datasource": "InfluxDB",
|
|
"fieldConfig": {
|
|
"defaults": {},
|
|
"overrides": []
|
|
},
|
|
"fill": 1,
|
|
"fillGradient": 0,
|
|
"gridPos": {
|
|
"h": 8,
|
|
"w": 12,
|
|
"x": 0,
|
|
"y": 0
|
|
},
|
|
"hiddenSeries": False,
|
|
"id": 2,
|
|
"legend": {
|
|
"avg": False,
|
|
"current": False,
|
|
"max": False,
|
|
"min": False,
|
|
"show": True,
|
|
"total": False,
|
|
"values": False
|
|
},
|
|
"lines": True,
|
|
"linewidth": 1,
|
|
"NonePointMode": "None",
|
|
"options": {
|
|
"alertThreshold": True
|
|
},
|
|
"percentage": False,
|
|
"pluginVersion": "7.5.4",
|
|
"pointradius": 2,
|
|
"points": False,
|
|
"renderer": "flot",
|
|
"seriesOverrides": [],
|
|
"spaceLength": 10,
|
|
"stack": False,
|
|
"steppedLine": False,
|
|
"targets": [
|
|
{
|
|
"delimiter": ",",
|
|
"groupBy": [
|
|
{
|
|
"params": [
|
|
"$__interval"
|
|
],
|
|
"type": "time"
|
|
},
|
|
{
|
|
"params": [
|
|
"None"
|
|
],
|
|
"type": "fill"
|
|
}
|
|
],
|
|
"header": True,
|
|
"ignoreUnknown": False,
|
|
"orderByTime": "ASC",
|
|
"policy": "default",
|
|
"query": ("from(bucket: \" %s \")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"script\"] == \" %s\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: False)\n |> yield(name: \"mean\")\n " % self.bucket, self.script ),
|
|
"refId": "A",
|
|
"resultFormat": "time_series",
|
|
"schema": [],
|
|
"select": [
|
|
[
|
|
{
|
|
"params": [
|
|
"value"
|
|
],
|
|
"type": "field"
|
|
},
|
|
{
|
|
"params": [],
|
|
"type": "mean"
|
|
}
|
|
]
|
|
],
|
|
"skipRows": 0,
|
|
"tags": []
|
|
}
|
|
],
|
|
"thresholds": [],
|
|
"timeRegions": [],
|
|
"title": "json test",
|
|
"tooltip": {
|
|
"shared": True,
|
|
"sort": 0,
|
|
"value_type": "individual"
|
|
},
|
|
"type": "graph",
|
|
"xaxis": {
|
|
"buckets": None,
|
|
"mode": "time",
|
|
"name": None,
|
|
"show": True,
|
|
"values": []
|
|
},
|
|
"yaxes": [
|
|
{
|
|
"format": "short",
|
|
"label": None,
|
|
"logBase": 1,
|
|
"max": None,
|
|
"min": None,
|
|
"show": True
|
|
},
|
|
{
|
|
"format": "short",
|
|
"label": None,
|
|
"logBase": 1,
|
|
"max": None,
|
|
"min": None,
|
|
"show": True
|
|
}
|
|
],
|
|
"yaxis": {
|
|
"align": False,
|
|
"alignLevel": None
|
|
}
|
|
}
|
|
],
|
|
"refresh": False,
|
|
"schemaVersion": 27,
|
|
"style": "dark",
|
|
"tags": [],
|
|
"templating": {
|
|
"list": []
|
|
},
|
|
"time": {
|
|
"from": "now-6h",
|
|
"to": "now"
|
|
},
|
|
"timepicker": {},
|
|
"timezone": "",
|
|
"title": str(self.script),
|
|
"uid": uid,
|
|
"version": 2
|
|
}
|
|
return json.dumps(json_dict)
|
|
|
|
|
|
def main():
|
|
parser = LFCliBase.create_basic_argparse(
|
|
prog='csv_to_grafana.py',
|
|
formatter_class=argparse.RawTextHelpFormatter,
|
|
epilog='''Auto-create Grafana dashboard from a CSV''',
|
|
description='''\
|
|
csv_to_grafana.py
|
|
--------------------
|
|
Command example:
|
|
./csv_to_grafana.py
|
|
--grafana_token
|
|
--influx_host
|
|
--influx_org
|
|
--influx_token
|
|
--influx_bucket
|
|
--target_csv
|
|
--panel_name'''
|
|
)
|
|
required = parser.add_argument_group('required arguments')
|
|
required.add_argument('--grafana_token', help='token to access your Grafana database', required=True)
|
|
|
|
optional = parser.add_argument_group('optional arguments')
|
|
optional.add_argument('--grafana_port', help='Grafana port if different from 3000', default=3000)
|
|
optional.add_argument('--grafana_host', help='Grafana host', default='localhost')
|
|
optional.add_argument('--panel_name', help='Custom name of the panel', default=None)
|
|
|
|
influx_add_parser_args(parser)
|
|
|
|
# This argument is specific to this script, so not part of the generic influxdb parser args
|
|
# method above.
|
|
parser.add_argument('--target_csv', help='CSV file to record to influx database', default="")
|
|
|
|
args = parser.parse_args()
|
|
|
|
influxdb = RecordInflux(_influx_host=args.influx_host,
|
|
_influx_port=args.influx_port,
|
|
_influx_org=args.influx_org,
|
|
_influx_token=args.influx_token,
|
|
_influx_bucket=args.influx_bucket)
|
|
|
|
csvtoinflux = CSVtoInflux(influxdb=influxdb,
|
|
target_csv=args.target_csv,
|
|
_influx_tag=args.influx_tag)
|
|
|
|
GrafanaDB = UseGrafana(args.grafana_token,
|
|
args.grafana_port,
|
|
args.grafana_host)
|
|
|
|
scriptname = csvtoinflux.script_name()
|
|
|
|
csvtoinflux.post_to_influx()
|
|
|
|
GrafanaDB.create_custom_dashboard(scripts=[scriptname],
|
|
title=args.panel_name,
|
|
bucket=args.influx_bucket)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|