TT Lab
はじめる
学ぶ 学習パス コース

Grafana — ダッシュボードは問いだ

クリックで繋いだデータソースはどこにも残らない

TT Labで続きを見る

一言でいうと

Grafanaのデータソース・ダッシュボード・アラートは、すべてファイルで宣言できます。クリックで作ったものは、Grafanaのデータベースの中にしか残りません。

なぜ必要なのか

Grafanaを新しく立ててみるとわかります。UIで追加したデータソースは、grafana.db(既定ではSQLite)の中にしかありません。そのファイルが消えると(Podが作り直されたり、ボリュームが削除されたり、別のクラスターへ移したりすると)、データソースもダッシュボードも一緒に消えます。

もっと静かな問題が別にあります。誰がいつこのURLを変えたのか、誰にもわかりません。ある日ダッシュボードが空の画面になり、データソースの設定を開いてみると、アドレスが古いクラスターを指しています。コードレビューも、履歴も、元に戻す方法もありません。運用中の設定が唯一その状態で残っている場所が管理UIなら、それは設定ではなく、ただの記憶です。

どう動くのか

プロビジョニングのディレクトリは3つに分かれています。場所はGF_PATHS_PROVISIONINGで決めます。

provisioning/
  datasources/*.yml   ← 데이터소스 정의 그 자체
  dashboards/*.yml    ← 대시보드 JSON 이 아니라 "어느 디렉터리를 볼지"
  alerting/*.yml      ← 알림 규칙·연락처·알림 정책

データソースのファイルは、次のような形をしています。

apiVersion: 1
datasources:
  - name: Lab-Prometheus
    uid: labprom            # ← 직접 정한다. 아래 설명 참고
    type: prometheus
    access: proxy
    url: http://127.0.0.1:9090
    isDefault: true

こうして追加したデータソースは、APIで見ると"readOnly": trueと出ます。UIでは直せないという意味であり、同時にファイルが正本だという意味でもあります。クリックで追加したものはfalseです。その1語が、「この設定がどこにあるのか」を分けます。

起動時に1回読み込む

プロビジョニングのファイルを直したのに画面が変わらず、長く悩むことがよくあります。これらのファイルはGrafanaの起動時に読み込まれます。直したら、再起動するか、管理者アカウントで再読み込みさせます。

curl -XPOST -u admin:admin \
  http://127.0.0.1:3000/api/admin/provisioning/datasources/reload

匿名アクセスでは403が返ります。このエンドポイントは、組織管理者ではなくサーバー管理者の権限を要求します。ダッシュボードのプロバイダー(provider)にはupdateIntervalSecondsが別にあり、そのディレクトリを定期的に調べ直します。そのため、JSONファイルを新しく置くことは再起動なしで反映されますが、プロバイダーのファイル自体を新しく置いたときは、起動かreloadが必要です。

よくある勘違い

「UIで作って、あとでexportすればいい」という考えは通用しません。その「あと」は来ません。来たとしても、exportしたJSONをコミットする人が、そのときその場にいなければなりません。

「プロビジョニングするとUIで直せなくて不便だ」という不満は、そのまま目的です。直せないということは、ファイルを直す以外に変わる道がないという意味であり、だからこそファイルと画面がずれません。

実務で本当に大切なこと

データソースのuidを自分で決めてください。書かないとGrafanaがランダムに作ってくれますが、ダッシュボードJSONはデータソースを名前ではなくuidで指します。開発環境と本番環境でuidが違うと、同じダッシュボードJSONが片方でしか描画されません。「私の画面では動くのに」で終わるダッシュボード事故の半分は、これです。

uidをprometheusのように環境ごとに同じ値で固定しておけば、ダッシュボードJSONが環境をそのまま行き来します。