Grafana中的alert rules導出方法參考

2024年2月6日 21点热度 0人点赞

最近在考慮升級grafana到8版本,之所以選擇grafana8版本,主要還是因為elasticsearch數據源,grafana8還支持低版本的es,grafana9以上的es隻支持es7以上了,筆者的es版本還是5.5。grafana8的alert模塊進行了大的修改,改為類alertmanager風格,所以想把當前grafana7裡跑的alert rules導出來。

找了一圈UI沒有發現導出的功能。api的方式暫時放棄,後來查看了grafana的數據庫,有張alert表,alert表的有個settings字段,settings字段的詳情是json數據存儲。

原文是一行json數據,json格式化之後如下:

{
   "conditions": [
      {
         "evaluator": {
            "params": [
               75
            ],
            "type": "gt"
         },
         "operator": {
            "type": "and"
         },
         "query": {
            "datasourceId": 1,
            "model": {
               "expr": "100 - (avg by (instance) (irate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
               "format": "time_series",
               "intervalFactor": 1,
               "legendFormat": "service-{{instance}}",
               "refId": "A"
            },
            "params": [
               "A",
               "5m",
               "now"
            ]
         },
         "reducer": {
            "params": [],
            "type": "avg"
         },
         "type": "query"
      }
   ],
   "executionErrorState": "alerting",
   "for": "5m",
   "frequency": "1m",
   "handler": 1,
   "message": "節點CPU使用率超過75%",
   "name": "節點CPU使用率超過75%",
   "noDataState": "no_data",
   "notifications": [
      {
         "id": 14
      }
   ]
}

這坨json裡我們隻需要['datasourceId', 'name', 'expr', 'message', 'legendFormat'],一條條去摘錄太麻煩了,上程序處理吧。

把alert表的setting字段導出到文件alert.json內。

如下是python解析json,把['datasourceId', 'name', 'expr', 'message', 'legendFormat']字段輸出到csv文件裡。

參考python腳本:

import json
import csv
# 假設您的JSON數據文件名為data.jsonl
output_file = 'alert.csv'
fieldnames = ['datasourceId', 'name', 'expr', 'message', 'legendFormat']
with open('alert.json', 'r') as file, open(output_file, 'w', newline='') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for line in file:
        # 解析每一行的JSON數據
        data = json.loads(line)
        try:
            row_data = {
                'datasourceId': data['conditions'][0]['query']['datasourceId'],
                'name': data['name'],
                'expr': data['conditions'][0]['query']['model']['expr'],
                'message': data['message'],
                'legendFormat': data['conditions'][0]['query']['model']['legendFormat'],
            }
            # 寫入CSV文件
            writer.writerow(row_data)
        except KeyError as e:
            print(f"Missing key: {e} in the current JSON object")