from typing import Tuple from grafanalib.core import Dashboard from grafanalib._gen import DashboardEncoder import json import requests import os import dotenv def get_dashboard_json(dashboard, overwrite=False, message="Updated by grafanlib", folder=0): ''' get_dashboard_json generates JSON from grafanalib Dashboard object :param dashboard - Dashboard() created via grafanalib ''' # grafanalib generates json which need to pack to "dashboard" root element return json.dumps( { "dashboard": dashboard.to_json_data(), "overwrite": overwrite, "message": message, "folderId": folder, }, sort_keys=True, indent=2, cls=DashboardEncoder) def upload_to_grafana(json, server, api_key, verify=True): ''' upload_to_grafana tries to upload dashboard to grafana and prints response :param json - dashboard json generated by grafanalib :param server - grafana server name :param api_key - grafana api key with read and write privileges ''' headers = {'Authorization': f"Bearer {api_key}", 'Content-Type': 'application/json'} r = requests.post(f"https://{server}/api/dashboards/db", data=json, headers=headers, verify=verify) # TODO: add error handling print(f"{r.status_code} - {r.content}") def get_folder_list(server, api_key, verify=True): ''' upload_to_grafana tries to upload dashboard to grafana and prints response :param server - grafana server name :param api_key - grafana api key with read and write privileges ''' headers = {'Authorization': f"Bearer {api_key}", 'Content-Type': 'application/json'} r = requests.get(f"https://{server}/api/folders", headers=headers, verify=verify) # TODO: add error handling print(f"{r.status_code} - {r.content}") def load_config_from_env(env_path: str = ".env") -> Tuple[str, str]: if os.path.exists(env_path): dotenv.load_dotenv(env_path) grafana_api_key = os.getenv("GRAFANA_API_KEY") grafana_server = os.getenv("GRAFANA_SERVER") return grafana_server, grafana_api_key def upload_dashboard(dashboard: Dashboard, folder: int) -> None: grafana_server, grafana_api_key = load_config_from_env() dashboard_json = get_dashboard_json(dashboard, overwrite=True, folder=folder) upload_to_grafana(dashboard_json, grafana_server, grafana_api_key)