Grafana APIを活用しアラートを操作する方法4選
2022-10-18
azblob://2022/11/11/eyecatch/2022-10-18-grafana-alerting-api.jpg

こんにちは、浴衣が欲しくて毎日インスタで浴衣の写真を見ている西村です。

リソースの監視に便利なGrafanaくんですが、スケーリングの度に手動でアラートの有効/無効を変更するのが面倒非効率のため、APIを活用しプログラム化する方法を調べました。

API Keyの作成

Configuration -> API Keys

コードでAPI Keyを作成する方法もございますが、今回はGUI上からKeyを作成します。

Grafanaを開き、Configuration(歯車マーク) -> API Keysを選択し画像のような画面に遷移します。青色で表示された「New APIKey」を押し

- Key name: 任意の名前

- Role: Viewer / Editor / Admin の中から任意の権限を選択

- Time to live: 有効期限を指定

3種類の情報を入力し、Keyを作成してください。

(作成画面を閉じたら2度とKeyの内容を確認できないため、必ずメモをしてください)

1. アラートの一括取得

アラートを一括取得するためには/api/alerts&GETリクエストをすることでアラートの情報を一括取得できます。

サンプルリクエスト

$HEADER = @{
  Authorization = "Bearer ${API_KEY}"
}

$URL = "<GrafanaURL>/api/alerts"

Invoke-RestMethod -Method Get -Uri $URL -Headers $HEADER -ContentType "application/json"

サンプルレスポンス

id             : <alertId>
dashboardId    : <dashboardId>
dashboardUid   : <dashboardUid>
dashboardSlug  : <dashboardSlug>
panelId        : <panelId>
name           : <PanelName>
state          : <アラートが有効ならok / アラートが無効ならpaused>
newStateDate   : <更新日時>
evalDate       : 0001/01/01 0:00:00
evalData       : @{noData=True}
executionError : 
url            : <サブディレクトリ>

このようなレスポンスがアラートの個数分返ってきます。

2. アラートの個別取得

アラートを個別取得するためには/api/alerts/$alertId&GETリクエストをすることで指定したIDのアラートの情報を取得できます。

サンプルリクエスト

$HEADER = @{
  Authorization = "Bearer ${API_KEY}"
}

$URL = "<GrafanaURL>/api/alerts/${AlertId}"

Invoke-RestMethod -Method Get -Uri $URL -Headers $HEADER -ContentType "application/json"

サンプルレスポンス

Id             : <alertId>
Version        : <Panelのバージョン情報>
OrgId          : <組織のID>
DashboardId    : <dashboardId>
PanelId        : <panelId>
Name           : <PanelName>
Message        : 
Severity       : 
State          : <アラートが有効ならok / アラートが無効ならpaused>
Handler        : 1
Silenced       : False
ExecutionError : 
Frequency      : 60
For            : 300000000000
EvalData       : @{noData=True}
NewStateDate   : <更新日>
StateChanges   : <更新回数>
Created        : <作成日時>
Updated        : <更新日時>
Settings       : <パネルの設定関連>

3. アラートの有効/無効の操作

アラートの有効/無効の操作をするためには/api/alerts/$AlertId/pause&POSTリクエストを行い、BODYの中で有効(false)か無効(true)を指定しないといけません。

サンプルリクエスト

$HEADER = @{
  Authorization = "Bearer ${API_KEY}"
}

$URL = "<GrafanaURL>/api/alerts/${AlertId}/pause"

$BODY = @{
    paused = $true
} | ConvertTo-Json -Depth 100

Invoke-RestMethod -Method Post -Uri $URL -Headers $HEADER -Body $BODY -ContentType "application/json"

サンプルレスポンス

alertId : <alertId>
message : Alert un-paused
state   : unknown

4. 正常性の確認

正常性の確認を行うためには/api/alerts/test&POSTリクエストを行い、BODYの中でダッシュボードを構成するJSONpanelIDを指定しないといけません。
(「Test Rule」をAPIで実行する方法です)

サンプルリクエスト

$HEADER = @{
  Authorization = "Bearer ${API_KEY}"
}

$URL = "<GrafanaURL>/api/alerts/test"

$BODY = @{
    dashboard = <ダッシュボードを構成するJSON>
    panelId = <panelID>
} | ConvertTo-Json -Depth 100

Invoke-RestMethod -Method Post -Uri $URL -Headers $HEADER -Body $BODY -ContentType "application/json"

サンプルレスポンス

firing         : False
state          : <Test Alertの結果>
conditionEvals : <アラートの条件>
timeMs         : <処理時間>
logs           : <ログ関連の設定>

注意点

現状ダッシュボードを構成するJSONをエクスポートする方法がない

執筆時点でGrafanaAPIを活用し、ダッシュボードを構成するJSONをエクスポートする方法はありません。そのため、実行環境にダッシュボードを構成するJSONがないとこのAPIは使えません。

最後に

運用保守に便利なGrafanaさんの小技4選でした。今後も手動対応している部分をコード化し、業務改善して楽できるように頑張っていきたいと思います。