最近在考慮升級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")