
Grafana Git SyncのDashboard previews in pull requestsを使ってみた
はじめに
先日ブログを書いたGrafana Git Sync機能の1つにDashboard previews in pull requestsという機能が含まれています。
機能の正式名称は無さそうなのでこの記事ではプルリクプレビュー機能と省略します。
この機能はGitHubのプルリクエストにダッシュボードの変更前後のプレビュー画像を自動的に添付する機能で、mainブランチのダッシュボードに適用する前に変更内容を確認できる素晴らしい機能です!
意外とセットアップに手こずってしまったので、今回はセットアップ手順と実際に使ってみた内容を書いていきます。
セットアップ
プルリクプレビュー機能を利用するにはいくつかステップを踏む必要があります。
全体の大まかな流れは
- Git Syncの有効化
- Grafana Image Rendererのインストール
- Webhookの設定
- ngrokの設定
- GitHubのWebhookの設定
Git Syncの有効化
今回はDockerでGit Syncの有効化を行います。
コードの詳細は次の項目で紹介します。
ローカルインスタンスでのGit Syncの有効化方法は以前ブログを書きましたのでそちらをご参照ください。
Grafana Image Rendererのインストール
Grafana Image Rendererは、GrafanaのパネルをPNG画像として自動レンダリングするためのプラグインです。
パネル画像を共有する場合やダッシュボードのレポート作成に利用されます。
Grafanaのプラグインの一覧にはありますが、そこからは有効化できず、別途インストールする必要があります。
インストール方法はプラグインのinstallセクションをご確認ください。
今回はGit Syncと合わせて環境を準備したかったのでDockerでまとめて構築します。
ディレクトリ構造は単純です。
├── config
│ └── grafana.ini
└── docker-compose.yml
docker-compose.ymlでGit SyncとImage Rendererに必要な設定を行います。
services:
renderer:
image: grafana/grafana-image-renderer:latest
container_name: grafana-image-renderer
restart: unless-stopped
ports:
- "8081:8081"
networks:
- grafana
grafana:
image: grafana/grafana:12.1.0-ubuntu
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
environment:
# Git Sync feature toggles
- GF_FEATURE_TOGGLES_PROVISIONING=true
- GF_FEATURE_TOGGLES_KUBERNETESDASHBOARDS=true
# Image Renderer configuration
- GF_RENDERING_SERVER_URL=http://renderer:8081/render
- GF_RENDERING_CALLBACK_URL=http://grafana:3000/
volumes:
- grafana-storage:/var/lib/grafana
- grafana-logs:/var/log/grafana
- ./config/grafana.ini:/etc/grafana/grafana.ini
depends_on:
- renderer
networks:
- grafana
volumes:
grafana-storage:
driver: local
grafana-logs:
driver: local
networks:
grafana:
driver: bridge
grafana.iniは後ほどngrockを設定する際に必要になります。
# ngrokのURL
root_url = https://xxxxxxxxxxxx.ngrok-free.app
Webhookの設定
プルリクプレビュー機能はプルリクエストをフックしてImage Rendererプラグインで画像を生成します。
GitHubのWebhookからImage Rendererプラグインで画像を生成する際、WebhookからローカルのGrafanaインスタンスにアクセスする必要がありますが、直接アクセスすることはできません。
そこで、ローカルのGrafanaインスタンにアクセスする方法としてWebhookとローカルのGrafanaインスタンスを繋ぐエンドポイントを作成します。
エンドポイントとして公式ドキュメントで紹介されているngrokを使います。
ngrokを利用することでローカルでホストしているGrafanaインスタンスに直接Webhookを受信するためのURLを発行することができます。
ngrokのアカウント登録
singupからアカウントを登録します。
auth token取得
Your Authtokenを選択して、表示されるトークンをコピーします。
以下のコマンドで認証トークンを設定します。
ngrok config add-authtoken $YOUR_AUTHTOKEN
ngrokを使って3000番ポートをパブリックからアクセスできるようにします。
以下のコマンドを実行するとhttp://localhost:3000に対応するURLが発行されます。
発行されたURLは後ほど利用するのでコピーしておきます。
$ ngrok http 3000
🤫 Decouple policy and sensitive data with vaults: https://ngrok.com/r/secrets
Session Status online
Account example@example.com (Plan: Free)
Version 3.26.0
Region Japan (jp)
Latency 66ms
Web Interface http://127.0.0.1:4040
Forwarding https://xxxxxxxxxxxxx.ngrok-free.app -> http://localhost:3000
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
発行されたURLへアクセスしてみます。
「Visit Site」をクリックするとlocalhost:3000にフォワーディングされてGrafanaへ遷移します。
これでGrafanaへインターネットからアクセスできるようになりました。
では、先ほどコピーしたngrokのURLをgrafana.iniのroot_urlに追記します。
# ngrokのURL
root_url = https://xxxxxxxxxxxx.ngrok-free.app
root_urlはWebブラウザからGrafanaにアクセスする際に使用するURLです。
GitHubのWebhooks設定
ngrokでURLを発行したので、GitHubのWebhooksにURLをセットします。
GitSyncの機能で利用するGitHubリポジトリにアクセスします。
GitHubで対象のリポジトリを開いて、Settings > Webhooks を選択します。
以下の設定でWebhookを作成します。
Payload URLには <ngrok>で取得したURL
/api/webhooks/git を入力します。
Webhookの作成は完了です。
プルリクプレビューを有効にする
Grafana > Administration > Provisioning の順に進み
Enable dashboard previews in pull requests
にチェックを入れて保存します。
まずはテストデータでTime seriesのパネルを作成して、mainブランチを作成します。
次に可視化形式をBar chartに変更してダッシュボードを保存します。
保存時にブランチを切ってプルリクエストを出せるようにします。
保存が完了したので、Open pull request in GitHub をクリックしてプルリクエストを出します。
Pull requestの内容を確認するとBeforeとAfterのダッシュボードが表示されていますね!
これは便利ですね!
色々試してみた
プルリクプレビュー機能で気になったことをいくつか試してみました。
細かい修正
細かい変更を行なった場合、変更内容を見つけられるか試してみました。
この変更では折れ線グラフの線の太さやグラフ背景の枠線を透明に変更していますが、この画像だけで判断するのは至難の業ですね。
ダッシュボードをGitHubで管理する場合、一般的なコードのレビューと違いコードから編集箇所を判断するのはなかなか大変な作業です。
特に細かい修正を行なった場合は、どこを修正したかプルリクエストのコメントに書くように気をつけましょう。
レビューする側はコメント+プレビュー画像で確認するとレビュー作業がかなり捗ると思います。
変数
変数を必要とするパネルが存在する場合、どのような表示になるのか気になったので試してみました。
これは想定通りですが、値が何も入っていない状態で表示されました。
表示を確認したい場合はあらかじめ値を入れておくと良さそうです。
縦に長いダッシュボード
縦に長いダッシュボードを編集した場合、プルリクエストに表示される画像がどうなるのか試してみました。
縦長のダッシュボードも全て画像化されています。
まとめ
今回はGit Syncのプルリクプレビュー機能を使ってみました。
思っていた以上に設定に苦戦してしまいました。
Grafana Cloudで使えるようになればImage Rendererプラグインのインストールやgrokの設定が省略されることを期待したいですね。
機能自体は非常に使いやすいと感じました。GitHubと連携できるようになったことで開発のライフサイクルに導入する場合はダッシュボードに適用する前に必ずレビューが必要になります。
ダッシュボードのコードを人間が理解するのは難しいので、画像という形で表現することでレビュー時の認知負荷がかなり下がると思います。