Ops/Monitoring

[Monitoring] Grafana 대시보드 백업 자동화

장그래 2022. 11. 7. 14:42
반응형

개요

Grafana 대시보드를 20-30개 정도 커스텀해서 사용하다 보니, 대시보드 백업이 필요했다.
대시보드의 Export 기능을 사용해 수동으로 백업해도 되지만, HTTP API를 이용해 백업을 자동화하였다.
HTTP API를 통해 JSON 파일로 백업한 후, 수동으로 git에 푸시하는 구조로 개발하였다. 

HTTP API

https://grafana.com/docs/grafana/latest/developers/http_api/ << Grafana 공식 문서를 통해 API를 참조하면 된다.

API KEY 생성

1. Grafana 메인 화면에서 Configuration -> Api  Key를 클릭한다.

2. Add API key를 클릭한다.

3. 아래를 참고하여 정보를 추가해주자.
Key Name : 원하는 Key의 이름
Role : 우리는 백업 용도로 사용하니깐, Viewer를 선택해주면 된다.  
Time to live : 만료일자. 

4. 생성이 되었자면 Key정보를 따로 기록해두자. Key 값을 잃어버리면 다시 생성해야 한다.

개발

*사용한 Grafana API
- Dashboard의 UID를 가져올 수 있는 dashboard_search 

- UID로 Dashboard는 조회하는 dashboard_api

* 백업 조건 
대시보드 Tags에 backup이라는 단어가 있어야 백업함(모든 대시보드를 백업할 필요 없음)
대시보드 타이틀에 공백과 /(slash)가 있으면 안 된다.(타이틀 바탕으로 JSON 파일로 떨구기 때문에)

 

import os
import json
import requests
from dotenv import load_dotenv
from requests.structures import CaseInsensitiveDict

#get apikey
load_dotenv()
org_domain = os.environ.get('org_domain')
org_apikey = os.environ.get('org_apikey')


def get(api_url, api_key):
  try:
      headers = CaseInsensitiveDict()
      headers["Accept"] = "application/json"
      headers["Content-Type"] = "application/json"
      headers["Authorization"] = api_key
      resp = requests.get(api_url, headers=headers)
      return resp.json()
  except Exception as e:
      print(e)
def search_uid_list(api_url, api_key):
  try:
      new_url = api_url + "search"
      data_list = get(new_url, api_key)
      return data_list #data[i]['uid']
  except Exception as e:
      print(e)
    
def backup_dashboard(api_url, api_key):
   try:
       data_list = search_uid_list(api_url, api_key)
       for d in data_list:
          new_url = api_url + "dashboards" + "/uid/" + d['uid']
          dashboard = get(new_url, api_key)
          #dashboard filtering 
          if (dashboard['meta']['isFolder']):
            continue
          tags = dashboard['dashboard']['tags'] 
          for t in tags:
             if(t=="backup"): 
                with open('/data001/mmx_monitoring/mmx_monitor/dashboards/'+d['title']+'.json', 'w') as f:
                  f.write(json.dumps(dashboard['dashboard']))
   except Exception as e:
      print(e)

if __name__ == '__main__':
  print("====Grafana Backup START====")
  backup_dashboard(org_domain, org_apikey)
  print("====Grafana Backup Complete====")
반응형