Grafana にて8.xから9.xへダッシュボードを移行したい。ダッシュボードはexport/importでいけるがアラートがインポートされなくて困った

9.x以降のAlertは設定方法が変わった。 exportの機能がついたが、以前のバージョンからインポートするのは簡単じゃなさそう

https://community.grafana.com/t/ngalert-grafana-8-alert-feature-how-to-export-import-alerts-as-yml-json/51677/22 このコメントの通りにすればできそう

9.0より前のバージョンではAlerting APIが使えた

9.xの場合

アラートをSlackで通知するには以下を設定する必要がありそう

  • Notification Template
  • Contact Points
  • Alert

こちらのAPIを使えばそれぞれ設定できる様子

より詳しくはこちら Grafana Alertを設定する

Provisioning

Provision Grafana | Grafana documentation

構築時にyamlで設定しておくとよいよ

helmの場合はこちらの alerting の項目

https://github.com/grafana/helm-charts/blob/main/charts/grafana/values.yaml

kube-prometheus-stack を使っている場合、subchartとしてgrafanaが定義されているので、以下のように設定できる。

grafana:
  alerting:
    rules.yaml:
      apiVersion: 1
      groups:
        - orgId: 1
    # ...

ダッシュボードとアラートをexport/importするshell script

以上踏まえてこんな感じに作った

import.sh

BASE_URL=$1
# GrafanaのAPI KEY
TOKEN=$2
 
# フォルダを作成
curl -XPOST -H "Authorization: Bearer ${TOKEN}" -H 'Content-Type: application/json' -Ss -d '@folders.json' "$BASE_URL/api/folders"
 
# ダッシュボードを作成
curl -XPOST -H "Authorization: Bearer ${TOKEN}" -H 'Content-Type: application/json' -Ss -d "@dashboard.json" "$BASE_URL/api/dashboards/db"
 
# Alert Ruleを作成
for i in $(seq $(cat alert-rules.json | jq '. | length')); do
  rule=$(cat alert-rules.json | jq --argjson index $(($i-1)) '.[$index]')
  echo "$rule" | curl -XPOST -H "Authorization: Bearer ${TOKEN}" -H 'Content-Type: application/json' -H 'X-Disable-Provenance: none' -Ss -d @- "$BASE_URL/api/v1/provisioning/alert-rules"
done

export.sh

BASE_URL=$1
# GrafanaのAPI KEY
TOKEN=$2
 
# ダッシュボード
curl -XGET -H "Authorization: Bearer ${TOKEN}" -Ss "$BASE_URL/api/dashboards/uid/my-board" | jq 'del(.meta, .dashboard.id)' | jq '. |= .+ {"folderUid": "solr", "overwrite": true}' > dashboard.json
 
# Alert Rule
curl -XGET -H "Authorization: Bearer ${TOKEN}" -Ss "$BASE_URL/api/v1/provisioning/alert-rules" > alert-rules.json