背景
Grafana の運用を開始していい感じの dashboard もいくつかできてきたところで、
「この dashboard 設定まるごと吹き飛んだら泣いちゃうな・・・」となった。
しかしながら、Grafana から dashboard を JSON Export しようとすると、各 dashbaord にアクセスしてポチポチ export するしかない。
手動でそんなことはやりたくないので API 叩いてなんとかした。
成果物と雑な解説
#!/bin/bash
each_jq(){
jq -c '.[]'
}
cd /path/to/backup_folder
source ./grafana_token
folders=$(curl -X GET -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ${GRAFANA_TOKEN}" http://localhost:3000/api/folders)
echo $folders | each_jq | while read -r folder
do
id=$(echo $folder | jq .id)
name=$(echo $folder | jq -r .title)
base="grafana_dashboards/$name"
mkdir -p $base
dashboards=$(curl -X GET -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ${GRAFANA_TOKEN}" "http://localhost:3000/api/search?folderIds=$id")
echo $dashboards | each_jq | while read -r dashboard
do
uid=$(echo $dashboard | jq -r .uid)
name=$(echo $dashboard | jq -r .title)
path="${base}/${name}.json"
d=$(curl -X GET -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ${GRAFANA_TOKEN}" http://localhost:3000/api/dashboards/uid/$uid | jq .dashboard)
echo $d > "$path"
done
done
GRAFANA_TOKEN
に dashboard アクセス可能な token が入るようにして実行すれば、各フォルダ内の dashboard を逐次取得して grafana_dashboards/[folder name]/[dashboard name].json
に保存される。
/api/dashboards/uid/$uid
API の結果をまるごと保存すると情報も含まれてしまうため、response.dashboard の内容が JSON Export された内容と一致していたので、そこを採用した。
このスクリプトだと General
フォルダの dashboard が入ってこないので、General
は sandbox 的な場所とする、という社内ルールを策定した。(General
はバックアップされない前提)
また、たぶん !
とか ?
とか "
とか入ると死ぬので、フォルダ・グラフ名にはそれらの記号をつけてはいけないという社内ルールを策定した。
取得後は適当に git push する cron を回している。
Grafana API に dashboard の一覧を返すやつがあればこんなにグルグルループしなくて済むんだが・・・。