JSON ファイルからダッシュボードをプロビジョニングする
ディスクからダッシュボードを読み込み、ディレクトリからフォルダーを対応付け、変更を失わずに作成します。
ダッシュボードは JSON ドキュメントなので、Git に保存しやすいものです。ダッシュボードプロバイダーは、Grafana に監視するフォルダーを伝え、Grafana はそこで見つけたすべての JSON ファイルを読み込み、その後も変更を確認し続けます。このガイドでは、プロバイダーのファイル、フォルダーの対応付け、ダッシュボードの JSON そのもの、そして UI のみの編集に終わらずにダッシュボードを作成するためのワークフローを説明します。
プロバイダーのファイル
provisioning/dashboards/providers.yaml:
apiVersion: 1
providers:
- name: default
orgId: 1
type: file
disableDeletion: false
updateIntervalSeconds: 30
allowUiUpdates: false
options:
path: /var/lib/grafana/dashboards
foldersFromFilesStructure: true
各フィールドの役割:
nameは必須で、プロバイダー間で一意である必要があります。options.pathは、Grafana が JSON ファイルを探してスキャンするディレクトリです。コンテナ内に存在している必要があります。updateIntervalSecondsは、Grafana がパスを再スキャンする頻度です。すべてのダッシュボードは起動時に読み込まれ、その後の変更は、再起動なしで取り込まれます。allowUiUpdates:falseの場合、プロビジョニングされたダッシュボードは UI から保存できず、Git が権威を持ち続けます。trueの場合、UI での保存は、ソースファイルが変更されるまでデータベースに保持され、変更された時点で、ファイルがそれを上書きします。disableDeletion:trueの場合、ファイルを削除しても、そのダッシュボードは Grafana から削除されません。Git が真実であるべきなら、falseのままにします。folderまたはfolderUidは、すべてのダッシュボードを 1 つの名前付きフォルダーに配置します。これらがなければ、ダッシュボードはルートに入ります。foldersFromFilesStructure: trueは、pathのサブディレクトリを Grafana のフォルダーに対応付けます。これを使うときは、folderとfolderUidを空のままにしてください。入れ子のフォルダーはサポートされていないため、サブディレクトリは 1 階層が限度です。
リポジトリをフォルダーごとに整理する
foldersFromFilesStructure: true の場合、この構成は:
dashboards/
├── infrastructure/
│ ├── node-exporter.json
│ └── kubernetes.json
└── applications/
└── webapp.json
2 つの Grafana フォルダー、infrastructure と applications を作成し、その中にダッシュボードを置きます。グループごとに異なる設定が必要な場合、たとえば「scratch」エリア用に allowUiUpdates: true を持つ 1 つのプロバイダーを使うような場合は、代わりに別々のプロバイダーを使います。
ダッシュボードの JSON の要点
プロビジョニングされるファイルには、ダッシュボードのモデル自体が含まれ、最上位に uid と title がある必要があります。HTTP API が使う {"dashboard": {...}, "overwrite": true} のエンベロープで包まないでください。これは、「Dashboard title cannot be empty」エラーの一般的な原因です。
{
"uid": "webapp-overview",
"title": "Webapp Overview",
"tags": ["webapp", "provisioned"],
"schemaVersion": 39,
"version": 1,
"refresh": "30s",
"time": { "from": "now-6h", "to": "now" },
"templating": {
"list": [
{
"name": "namespace",
"type": "query",
"datasource": { "type": "prometheus", "uid": "prometheus" },
"query": "label_values(kube_pod_info, namespace)"
}
]
},
"panels": [
{
"id": 1,
"type": "timeseries",
"title": "Request rate",
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 },
"datasource": { "type": "prometheus", "uid": "prometheus" },
"targets": [
{
"refId": "A",
"expr": "sum(rate(http_requests_total{namespace=\"$namespace\"}[5m]))",
"datasource": { "type": "prometheus", "uid": "prometheus" }
}
]
}
]
}
コードとして適切に動作するダッシュボードのためのガイドライン:
- 安定した
uidを設定する。 Grafana は、読み込みのたびに、その UID のダッシュボードを更新します。ファイル間で UID を再利用したり、同じフォルダーで同じタイトルを 2 回使ったりしないでください。 - 数値の
idを省略する。 データベースが割り当てるもので、インスタンス間で異なります。 - データソースは UID で参照する。 プロビジョニングした
uidと一致させます({"type": "prometheus", "uid": "prometheus"})。共有用にエクスポートされたダッシュボードには、${DS_PROMETHEUS}のようなプレースホルダーが含まれていることがあり、実際の UID か、データソースのテンプレート変数に置き換える必要があります。 - 環境変数の補間は、ダッシュボードの JSON の中では機能しません。 環境ごとの違いには、ダッシュボードのテンプレート変数を使います。
- Grafana 13 は、内部でダッシュボードをより新しいスキーマで保存し、古い JSON を読み込み時に移行するため、既存のファイルは引き続き機能します。
UI で作成してから、結果を Git に戻す
パネルの JSON を手で書くのは遅いため、ほとんどのチームは UI で下書きしてエクスポートします。ファイルを真実に保つワークフローは次のとおりです。
- プロバイダーが
allowUiUpdates: trueを持つテスト用のインスタンス(前のガイドの compose の構成)を実行します。 - UI でダッシュボードを構築または調整します。
- ダッシュボードの共有またはエクスポートのメニューから、JSON としてエクスポートします。データソースを入力に置き換えたい場合は、外部への共有用にエクスポートするオプションを選び、その後、実際の UID を設定します。
- 数値の
idを削除し、安定したuidを設定して、ファイルをリポジトリのフォルダーに commit します。 - プルリクエストを開きます。本番の Grafana はマージ後にそれを取り込み、そこでの
allowUiUpdates: falseが、誰も乖離させないようにします。
API を通じて既存のダッシュボードを取得することもできます。
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD \
http://localhost:3000/api/dashboards/uid/webapp-overview \
| jq '.dashboard | del(.id)' > dashboards/applications/webapp.json
diff が実際の変更を示すように、JSON を一貫して整形してください(たとえば jq -S .)。
コードからダッシュボードを生成する
多くのダッシュボードが同じ形を共有しているなら、コピーする代わりに JSON を生成します。Grafana Foundation SDK(Go、TypeScript、Python、PHP、Java)は、型付きのコードからダッシュボードを構築し、その出力は、プロバイダーのフォルダーに置くのと同じ JSON です。このシリーズの Foundation SDK のガイドで説明します。
CI で検証する
Grafana に届く前に、ミスを見つけます。
# 有効な JSON か?
jq empty dashboards/**/*.json
# すべてのファイルに uid と title があるか?
for f in dashboards/*/*.json; do
jq -e '.uid and .title' "$f" >/dev/null || echo "missing uid/title: $f"
done
# uid の重複は?
jq -r '.uid' dashboards/*/*.json | sort | uniq -d
適用して確認する
変更は、updateIntervalSeconds 以内に取り込まれます。再スキャンを強制するには:
curl -X POST -u admin:$GRAFANA_ADMIN_PASSWORD \
http://localhost:3000/api/admin/provisioning/dashboards/reload
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD \
"http://localhost:3000/api/search?type=dash-db" | jq '.[] | {title, uid, folderTitle}'
ダッシュボードが現れない場合は、プロビジョニングのロガーからの、起動時と再スキャン時のログの行を確認してください。よくある原因は、コンテナ内に存在しないパス、API のエンベロープで包まれた JSON、uid を共有する 2 つのファイルです。
人気のガイド
-
Grafana をコードとして運用する:全体像 ファイルに置けるもの、API が必要なもの、そしてそれらがどう組み合わさるか。 -
grafana.ini と環境変数で Grafana サーバーを設定する 設定ファイルの場所、上書きの順序、設定を Git に保つ方法を理解します。 -
アラートルール、コンタクトポイント、通知ポリシーをプロビジョニングする アラートのパイプライン全体を YAML で定義し、コードのようにレビューしてバージョン管理します。 -
Helm とプロビジョニングの values で Grafana を Kubernetes にデプロイする データソース、ダッシュボード、設定のすべてが values ファイルから来る、Helm チャートで Grafana を実行します。 -
コマンドラインからプロビジョニングを再読み込み、確認、トラブルシューティングする Grafana が何を読み込んだかを調べ、再起動せずに再読み込みし、よくあるプロビジョニングのエラーを修正します。