【GCP】モニタリングのダッシュボードをコマンドから操作してJSON形式でコード化する

IT

Google Cloud Platformで、モニタリングダッシュボードの定義をWebUIではなくコマンドから操作する。

最初はWebUIでダッシュボードを作成する

ざっと枠組みだけはWebUIで作っておく。

操作対象のダッシュボードのIDを特定する

WebUIもしくはコマンドラインから、対象ダッシュボードのIDを特定する。

WebUIからダッシュボードのIDを特定する場合

WebUIでダッシュボードを開いた際のURLは以下のような構成になっている。

https://console.cloud.google.com/monitoring/dashboards/builder/{ダッシュボードID}?...

ダッシュボードIDを控えておく。

コマンドラインからダッシュボードのIDを特定する場合

以下のようなコマンドでダッシュボードのリストが出力される。

% gcloud monitoring dashboards list

複数のダッシュボード定義が出力されるので、操作対象のダッシュボード定義の末尾にあるダッシュボードID(またはname全体)を控えておく。

name: projects/{プロジェクトID}/dashboards/{ダッシュボードID}

ダッシュボードを操作する

describe:対象のダッシュボード定義を出力する

以下のようなコマンドで、対象ダッシュボード単体の定義をJSON形式で出力する。

% gcloud monitoring dashboards describe {ダッシュボードIDまたはname} --format json > MY_DASHBOARD.json

update:対象のダッシュボードを更新する

先程出力したJSONファイルを適当に変更し、GCP上のダッシュボードを上書きしてみる。

% gcloud monitoring dashboards update {ダッシュボードIDまたはname} --config-from-file MY_DASHBOARD.json

–config-from-fileの形式(yaml | json)は自動認識される模様。応答として以下が返る。

標準出力更新後のダッシュボード定義
デフォルトはyaml形式。
--format jsonオプションを付ければJSON形式で返る。
標準エラー出力以下のような文言。
Updated dashboard [{ダッシュボードID}].

FAILED_PRECONDITIONエラー

もし以下のようなエラーが返ってきた場合は「前回JSONを出力した後に、このダッシュボードは既に変更されてしまっているよ。だからよく確認してね。」ということである。

ERROR: (gcloud.monitoring.dashboards.update) FAILED_PRECONDITION: The supplied etag is not up to date. Please get the updated version of {project name}. {最新のetag}

この場合は以下のような選択肢がある。

  1. (実際のダッシュボードの状態を尊重する場合)もう一度JSONの出力からやり直す。
  2. (手元のJSONを尊重して強制的に上書きする場合)手元のJSONファイルのetagを、エラーメッセージの最後に記述されている{最新のetag}の値で書き換えて、再度updateを実行する。

delete:対象のダッシュボードを削除する

GCP上のダッシュボードを消すには以下。

% gcloud monitoring dashboards delete {ダッシュボードIDまたはname} --quiet

--quietを付けなかった場合は「本当に消すの?」みたいな確認が入る。

create:ダッシュボードを新規作成する

ダッシュボードを新規作成するなら以下。

% gcloud monitoring dashboards create --config-from-file MY_DASHBOARD.json

ただし、describeした定義ファイルを無邪気に渡すと以下のようなエラーが返る。

ERROR: (gcloud.monitoring.dashboards.create) INVALID_ARGUMENT: Create Dashboard should not specify a etag.

→「createなのにetag指定しないでよ」という意味。定義ファイルからetag行を削除して再実行。

ERROR: (gcloud.monitoring.dashboards.create) Resource in projects [{プロジェクト名}] is the subject of a conflict: Requested entity already exists

→「もうそのダッシュボードありますよ」という意味。nameで判定している模様。以下の選択肢がある。

  1. 定義ファイル内のname行を削除して再実行(同名のダッシュボードが複数作られるので注意)
  2. 既存のGCP上のダッシュボードを削除して再実行

【おまけ】繰り返しupdateを実行する場合は

毎回最新のetag値を受け取る必要がある。要はupdateコマンドの標準出力でもって手元のJSONを書き換えればよい。以下のようにワンライナーでやってしまおう。

% TMP=$(mktemp); gcloud monitoring dashboards update {ダッシュボードIDまたはname} --format json --config-from-file MY_DASHBOARD.json > $TMP && mv $TMP MY_DASHBOARD.json

その他の注意点

displayNameについて

displayNameは各種操作に利用できないので、プロジェクトIDもしくはnameを使うこと。displayNameを各種コマンドの引数に指定しても以下のようなエラーが返る。

ERROR: (gcloud.monitoring.dashboards.update) NOT_FOUND: Requested entity was not found.

displayNameはユニークではない(WebUIからも、同じ名前のダッシュボードを複数作ることは可能である)ので、この仕様は当然と言える。

nameについて

projects/{プロジェクトID}/dashboards/{ダッシュボードID}

ダッシュボードID

createの際、nameを指定しなければダッシュボードIDは自動的に生成されるが、任意のダッシュボードIDを含めてnameを指定して作成することもできる。

プロジェクトID

数字のIDだけでなく、プロジェクト名をセットしても認識されるようだ。


【参考サイト】

Managing dashboards by API  |  Cloud Monitoring  |  Google Cloud