Cloud Monitoring ダッシュボードを定義ファイルから作成する

6 min read読了の目安(約5800字

前書き

Google Cloud の Cloud Monitoring では、ダッシュボードを Web 上の GUI でグラフィカルに作成することができる。これは大変便利な機能なのだが、

  • 複数環境に同一のダッシュボードを用意したい場合(例えば開発環境・本番環境に同じダッシュボードを作成したい場合)、各環境でダッシュボードを作成・更新する必要がある。
  • ダッシュボードのバージョン管理が行えず、更新時のレビューの実施などがやりづらい。

など、これだけでは少々痒いところに手の届かない場面もある。

これらの欠点を補うものとして、Cloud Monitoring ではダッシュボードを扱う API が用意されており、ダッシュボードを定義ファイルから生成することができる。

https://cloud.google.com/monitoring/dashboards/api-dashboard?hl=ja

ダッシュボード作成の流れ

とはいえ、JSON ファイルを一から作成するのは面倒なので、

  1. 一度、Web GUI (Cloud Console) を使って手作業でダッシュボードを作成
  2. 作成したダッシュボードから定義ファイルをエクスポート
  3. 定義ファイルを用いて API からダッシュボードを再作成

という流れをとるのがよいだろう。

一度ダッシュボードを API から作成した後は、定義ファイルの方を修正してダッシュボードを更新していくことになる。

前提条件

Cloud Console から手作業でダッシュボードを作成

まずは Cloud Console 上でグラフを見ながらダッシュボードを作り上げていく。
グラフの配置もグラフィカルに行えるので、最終的に必要とするダッシュボードをまずは作り上げてしまおう。

既存のダッシュボードから定義ファイルをエクスポート

ダッシュボードのリソース名を取得

ダッシュボードを作成したら、まずはそのダッシュボードの「リソース名」をgcloudコマンドを使って取得する。

gcloud monitoring dashboards list --format="table[box](displayName,name)"
  • 上記コマンド結果の displayName が表示名で、name がリソース名。
コマンド実行例
$ gcloud monitoring dashboards list --format="table[box](displayName,name)"
┌────────────────────┬───────────────────────────────────────────────────────────────────────┐
│    DISPLAY_NAME    │                                  NAME                                 │
├────────────────────┼───────────────────────────────────────────────────────────────────────┤
│ Sample Dashboard   │ projects/xx4500xxxxxx/dashboards/1dxxf15x-773x-49cx-b97x-035xxfbf6bax │
│ Sample Dashboard 2 │ projects/xx4500xxxxxx/dashboards/exxx699x-ac7x-4xx8-bxx4-xxf78xxx334d │
└────────────────────┴───────────────────────────────────────────────────────────────────────┘

https://cloud.google.com/sdk/gcloud/reference/monitoring/dashboards/list?hl=ja

ダッシュボード定義のエクスポート

次に、取得したリソース名を指定して、ダッシュボード定義をエクスポートする。
フォーマットには JSON を指定する。

gcloud monitoring dashboards describe $DASHBOARD_RESOURCE_NAME --format="json" | jq "del(.etag,.name)" > ./dashboard.json
  • $DASHBOARD_RESOURCE_NAMEには先ほど取得したダッシュボードのリソース名を指定する。
  • etag, nameフィールドはダッシュボードの新規作成には不要なので削除してしまう。
コマンド実行例
$ gcloud monitoring dashboards describe projects/xx4500xxxxxx/dashboards/1dxxf15x-773x-49cx-b97x-035xxfbf6bax --format="json" | jq "del(.etag,.name)" 
{
  "displayName": "Sample Dashboard",
  "mosaicLayout": {
    "columns": 12,
    "tiles": [
      {
        "height": 4,
        "widget": {
          "title": "Audited Log bytes",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "plotType": "STACKED_AREA",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_RATE"
                    },
                    "filter": "metric.type=\"logging.googleapis.com/byte_count\" resource.type=\"audited_resource\"",
                    "secondaryAggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_MEAN"
                    }
                  }
                }
              }
            ],
            "timeshiftDuration": "0s",
            "yAxis": {
              "label": "y1Axis",
              "scale": "LINEAR"
            }
          }
        },
        "width": 5
      },
      {
        "height": 4,
        "widget": {
          "title": "Log entries [MEAN]",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR"
            },
            "dataSets": [
              {
                "minAlignmentPeriod": "60s",
                "plotType": "LINE",
                "timeSeriesQuery": {
                  "timeSeriesFilter": {
                    "aggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_RATE"
                    },
                    "filter": "metric.type=\"logging.googleapis.com/log_entry_count\" resource.type=\"global\"",
                    "secondaryAggregation": {
                      "alignmentPeriod": "60s",
                      "perSeriesAligner": "ALIGN_MEAN"
                    }
                  }
                }
              }
            ],
            "timeshiftDuration": "0s",
            "yAxis": {
              "label": "y1Axis",
              "scale": "LINEAR"
            }
          }
        },
        "width": 4,
        "xPos": 5
      }
    ]
  }
}

これで定義ファイルの取得完了だ。

https://cloud.google.com/sdk/gcloud/reference/monitoring/dashboards/describe?hl=ja

定義ファイルからダッシュボードを作成

前手順でダッシュボードの定義ファイルがエクスポートできたので、このファイルを使って改めてダッシュボードを再作成しよう。

gcloud

gcloudコマンドでダッシュボードの作成が可能だ。

gcloud monitoring dashboards create --config-from-file ./dashboard.json
コマンド実行例

gcloud monitoring dashboards create --config-from-file ./dashboard.json
Created [83xxc447-8x14-4x4a-90cx-0bx064dxx0c9].

--config-from-fileオプションで先ほどエクスポートした定義ファイルのパスを指定する。今回は JSON ファイルを使用したが、gcloudコマンドの場合は YAML ファイルでも可能。

https://cloud.google.com/sdk/gcloud/reference/monitoring/dashboards/create

Terraform

Terraform も対応している。

resource "google_monitoring_dashboard" "dashboard" {
  dashboard_json = file("./dashboard.json")
}

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/monitoring_dashboard

参考

https://stackoverflow.com/questions/61592910/how-to-export-and-import-google-cloud-monitoring-dashboards-between-projects-usi