API でダッシュボードを作成して管理する

このドキュメントでは、Cloud Monitoring API の Dashboard リソースを使用して、カスタム ダッシュボードと、そのダッシュボードのウィジェットを作成、管理する方法について説明します。以下の例は、curl を使用して API を呼び出すことでダッシュボードを管理する方法と、Google Cloud CLI を使用する方法を示しています。 Google Cloud コンソールを使用してカスタム ダッシュボードを管理することもできますが、API を使用すると、プログラムで複数のダッシュボードを同時に管理できます。

エンドポイントでは、ダッシュボードを管理および構成するための、次のメソッドがサポートされています。

API は、curl ユーティリティまたは Google Cloud CLI を使用して直接呼び出せます。

事前定義されたダッシュボードを取得、編集、削除することはできません。

この機能は Google Cloud プロジェクトでのみサポートされています。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。

ダッシュボードについて

ダッシュボードを作成するときは、表示するコンポーネント、またはウィジェットとそのウィジェットのレイアウトを指定する必要があります。ダッシュボードにラベルとフィルタを追加することもできます。ラベルを使用すると、ダッシュボードを見つけたり、ダッシュボードのコンテンツの種類を示したりできます。

ダッシュボードのレイアウト

レイアウトは、ダッシュボードのコンポーネントの順序を定義します。API では、次のレイアウトが提供されます。

  • GridLayout: 利用可能なスペースを等幅の縦の列に分割し、行優先戦略を使用してウィジェットのセットを配置します。

  • MosaicLayout: 利用可能なスペースをグリッドに分割します。各ウィジェットは 1 つ以上のグリッド ブロックを占有出来ます。

  • RowLayout: 利用可能なスペースを行に分割し、ウィジェットのセットを各行に水平に配置します。

  • ColumnLayout: 利用可能なスペースを縦の列に分割し、各列にウィジェットのセットを縦に並べます。

たとえば、3 つの Text ウィジェットを使用した RowLayout のダッシュボードの JSON 表現は以下のとおりです。

{
  "displayName": "Row-layout example",
  "rowLayout": {
    "rows": [
      {
        "widgets": [
          {
            "text": {
              "content": "Text Widget 1",
              "format": "RAW"
            }
          },
          {
            "text": {
              "content": "**Text Widget 2**",
              "format": "MARKDOWN"
            }
          },
          {
            "text": {
              "content": "_Text Widget 3_",
              "format": "MARKDOWN"
            }
          }
        ]
      }
    ]
  }
}

マイレポートのウィジェット

ウィジェットには 1 つのダッシュボード コンポーネントと、ダッシュボードにコンポーネントを表示する方法の構成が含まれています。ダッシュボードには複数のウィジェットを指定できます。Widget オブジェクトには複数のタイプがあります。

  • XyChart ウィジェットは、X 軸と Y 軸にデータを表示します。

    このウィジェットには、時系列データまたは SQL クエリで生成されたデータセットが表示されます。このウィジェットを使用すると、グラフ化されたデータを左 Y 軸または右 Y 軸に関連付けることができます。複数の指標タイプをグラフ化する場合、両方の Y 軸を使用できます。XyChart ウィジェットは、次の表示スタイルをサポートしています。

    • 折れ線グラフ
    • 横棒グラフ
    • 積み上げ面グラフ
    • ヒートマップ
  • 最新の値など、1 つのディメンションから表示するウィジェット:

    • PieChart: 時系列のコレクションの最新の値が表示されます。ここで、各時系列は円グラフに 1 つのスライスをもたらします。

    • Scorecard: 1 つの時系列の最新の値と、この値が 1 つ以上のしきい値とどのように関連するかを示します。

    • TimeSeriesTable: 各時系列の最新の値または集計値を表示します。表はカスタマイズをサポートしています。たとえば、セルに色分けしたり、列名やデータの配置を構成したりできます。

  • アラート ポリシーまたはインシデント情報を表示するウィジェット:

    • AlertChart: 単一条件のアラート ポリシーの概要を表示します。このウィジェットでは、データを折れ線グラフとして表示し、しきい値を表示して、対応待ちのインシデントの数を一覧表示します。

    • IncidentList: インシデントのリストを表示します。特定のアラート ポリシーまたは特定のリソースタイプのインシデントを表示するようにウィジェットを構成できます。

  • ログエントリとエラーを表示するウィジェット:

  • テキスト ウィジェットと組織ウィジェット:

    • CollapsibleGroup: ウィジェットのコレクションを表示します。 グループのビューは折りたたむことができます。

    • SingleViewGroup: ウィジェットのコレクション内の 1 つのウィジェットを表示します。表示するウィジェットを選択できます。

    • SectionHeader: ダッシュボードに横方向の分割線を作成し、ダッシュボードの目次にエントリを作成します。

    • Text: 生のテキスト文字列またはマークダウン文字列としてテキスト コンテンツを表示します。

    ダッシュボードにテキスト ウィジェットと組織ウィジェットを含めるには、ダッシュボードに MosaicLayout が必要です。

これらのオブジェクトに加えて、空白のプレースホルダをダッシュボードに追加することもできます。

たとえば、右の Y 軸が構成されている XyChart ウィジェットの JSON 表現は以下のとおりです。

{
  "displayName": "Demo dashboard",
  "gridLayout": {
    "widgets": [
      {
        "title": "Sample line chart",
        "xyChart": {
          "dataSets": [
            {
              "timeSeriesQuery": {
                "timeSeriesFilter": {
                  "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" resource.type=\"gce_instance\"",
                  "aggregation": {
                    "perSeriesAligner": "ALIGN_MEAN",
                    "crossSeriesReducer": "REDUCE_MAX",
                    "groupByFields": [
                      "resource.label.zone"
                    ]
                  }
                },
                "unitOverride": "1"
              },
              "plotType": "LINE"
            }
          ],
          "timeshiftDuration": "0s",
          "yAxis": {
            "label": "y1Axis",
            "scale": "LINEAR"
          },
          "chartOptions": {
            "mode": "COLOR"
          }
        }
      }
    ]
  }
}

ダッシュボード ラベル

ラベルは、ダッシュボードの管理と整理に役立ちます。たとえば、本番環境リソースの時系列データとログデータを表示するダッシュボードを示すラベル prod を追加できます。または、ラベル playbook を追加して、ダッシュボードに障害のトラブルシューティングに役立つ情報が含まれていることを示すこともできます。

ダッシュボードにラベルを追加することは任意です。

たとえば、次の図は、playbook という名前のラベルを指定する Dashboard オブジェクトを示しています。

{
  "displayName": "Example",
  "mosaicLayout": {
    "columns": 12,
    "tiles": [
      ...
    ]
  },
  "dashboardFilters": [],
  "labels": {
    "playbook": ""
  }
}

前の例に示すように、labels フィールドは map として実装されます。ここで、key フィールドと value フィールドはどちらも文字列です。ダッシュボードにラベルを追加する場合は、key をラベルの名前に設定し、value フィールドを空の文字列に設定します。

ダッシュボードのフィルタと変数

ダッシュボードを設計する際、ダッシュボードに表示するデータの表示方法を複数特定できる場合があります。たとえば、ダッシュボードに仮想マシン(VM)インスタンスの時系列データが表示されているとします。すべての VM の時系列データを表示することも、特定のゾーンにあるデータのみを表示することもできます。このような状況では、固定フィルタまたは変数を作成し、そのフィルタのデフォルト値を最もよく表示されるゾーンに設定することをおすすめします。

固定フィルタは、ウィジェットに同じラベルキーのフィルタが含まれていない限り、フィルタで指定されたラベルをサポートするすべてのダッシュボード ウィジェットに適用されます。たとえば、グラフにフィルタ zone = us-central1-a が含まれている場合、そのグラフではラベルキーが zone の固定フィルタが無視されます。同様に、このフィルタは、キーが zone のラベルがないグラフでは無視されます。

変数は固定フィルタに似ていますが、特定のウィジェットにのみ適用されます。変数は、固定フィルタのようにラベルに基づいて設定することも、値のみを設定することもできます。値のみの変数には、1 つ以上のデフォルト値と、可能なすべての値のリストが含まれます。デフォルト値を指定しない場合、デフォルトはワイルドカード演算子 (*) に設定されます。可能な値のセットを定義するには、値の配列を指定するか、SQL クエリを作成します。

データをクエリするウィジェットの場合、ウィジェットのクエリに変数を含めることができます。また、変数を使用してウィジェットの表示を制御することもできます。クエリが変数に依存している場合、変数の値を変更すると、ウィジェットがリクエストするデータが変更されます。その結果、表示されるデータも変化します。変数を使用してウィジェットの表示を制御すると、ツールバーに [表示] アイコンが表示されます。公開設定に関する制限については、ウィジェットの表示 / 非表示を設定するをご覧ください。

固定されたフィルタと変数の両方について、ダッシュボード ツールバーに各変数とメニューが表示されます。このメニューでは、変数の値を一時的に変更できます。固定されたフィルタと変数を表すために、同じデータ構造が使用されます。フィルタと変数を区別できるように、ダッシュボードのツールバーでは、変数名の先頭にドル記号 $ が付加されます。詳細については、DashboardFilter をご覧ください。

変数を使用してウィジェットの表示を制御する方法を示す例については、ウィジェットの表示が構成されたダッシュボードをご覧ください。

ラベルベースの変数または値のみの変数を使用してウィジェットのクエリを更新する方法については、次のセクションをご覧ください。

フィルタと変数を作成する

コンソール

Google Cloud コンソールを使用して固定フィルタと変数を作成する方法については、次のドキュメントをご覧ください。

API

固定されたフィルタと変数を定義するには、dashboardFilters データ構造を使用します。

  • 変数を作成するには、templateVariable フィールドの値を変数の名前に設定します。固定フィルタを作成する場合は、このフィールドを省略するか、値を空の文字列に設定します。
  • 固定フィルタまたはラベルベースの変数を作成するには、labelKey フィールドを指定する必要があります。値のみの変数を指定する場合は、このフィールドを省略します。
  • フィルタまたは変数のデフォルト値を設定します。このフィールドの構成によって、ユーザーが値のメニューから 1 つのオプションのみを選択できるか、複数の値を選択できるかが決まります。

    • デフォルト値を 1 つ設定し、ユーザーが値メニューで 1 つのオプションのみを選択できるように制限するには、valueType フィールドを STRING に設定し、stringValue フィールドも設定します。
    "valueType": "STRING",
    "stringValue": "my-default-value",
    
    • デフォルト値を 1 つ以上設定し、ユーザーが値メニューで複数のオプションを選択できるようにするには、valueType フィールドを STRING_ARRAY に設定し、stringArrayValue フィールドも設定します。次の例では、3 つのデフォルト値があります。
    "valueType": "STRING_ARRAY",
    "stringArrayValue": {
      "values": [ "a", "b", "c" ]
    },
    
  • 省略可: 値のみの変数で使用可能なすべての値のリストを指定するには、stringArray フィールドまたは timeSeriesQuery フィールドのいずれかを設定します。クエリを指定する場合は、分析クエリにする必要があります。

たとえば、次の dashboardFilters オブジェクトについて考えてみます。

{
  "dashboardFilters": [
      {
        "labelKey": "zone"
        "stringValue": "us-central1-c",
        "valueType": "STRING",
        "filterType": "RESOURCE_LABEL"
      },
      {
        "labelKey": "instance_id",
        "stringValue": "3133577226154888113",
        "valueType": "STRING",
        "filterType": "RESOURCE_LABEL",
        "templateVariable": "my_label_based_variable"
      },
      {
        "filterType": "VALUE_ONLY",
        "templateVariable": "my_value_only_variable",
        timeSeriesQuery: {
          opsAnalyticsQuery: {
            sql: "
              SELECT log_name
              FROM `MY_TABLE`
              GROUP BY log_name
            ",
          }
        }
      }
    ],
  "displayName": "Illustrate Variables",
  ...
}

上記の JSON では、1 つの固定フィルタと 2 つの変数を定義しています。

  • 固定されたフィルタには zone のラベルキーがあり、ツールバーに表示されます。valueType フィールドと stringValue フィールドは、単一のデフォルト値を指定します。詳細については、dashboardFilters データ構造の API リファレンス ページをご覧ください。

  • ラベルベースの変数の名前は my_label_based_variable で、ラベルキーは instance_id です。この変数のデフォルト値は、特定のインスタンス ID に設定されます。配列を使用してデフォルト値を構成することもできます。ツールバーに、フィルタが my_label_based_variable という名前で表示されます。

  • 値のみの変数は my_value_only_variable という名前です。このエントリではデフォルト値が指定されていないため、ワイルドカード演算子 (*) が自動的に適用されます。また、この変数は SQL クエリを使用して、変数の可能な値のリストを生成します。

dashboardFilters オブジェクトには、変数を適用するウィジェットが記載されません。代わりに、変数に依存するようにウィジェットのクエリを更新します。

変数を逆参照する一般的な構文

SQL で定義されたウィジェットを除くすべてのウィジェットで、次の構文を使用してクエリに変数を適用します。

  • ラベルベースの変数を適用し、ラベルキーとラベル値をクエリ言語の有効なフィルタ式に解決するには、${my_label_based_variable} を使用します。

  • ラベルベースの変数の値のみを適用するには、${my_label_based_variable.value} を使用します。比較には正規表現を使用する必要があります。

  • 値のみの変数の値のみを適用するには、${my_value_only_variable} を使用します。値のみの変数の場合は、.value 句を含めないでください。比較には正規表現を使用する必要があります。

ログパネル ウィジェット

変数をログパネル ウィジェットに適用するには、[クエリ] ペインを更新します。これらのウィジェットの構文は、一般的な構文で指定されている構文に従います。

コンソール

たとえば、次のクエリでは、正規表現を使用して、jsonPayload.message フィールドの値をラベルベースの変数の値を含む文字列値と比較します。

jsonPayload.message=~"Connected to instance: ${my_label_based_variable.value}"

別の例として、値のみの変数 value_only_severity_variable を考えます。値のメニューで ERRORINFONOTICE の 3 つの値が選択されているとします。次に、ログパネル ウィジェットのクエリ ペインに次の内容を追加します。

severity =~ "${value_only_severity_variable}"

以下に、レンダリングされたフォームを示します。

severity =~ "^(ERROR|INFO|NOTICE)$"

API

たとえば、次の JSON は、ラベルベースの変数を使用してログパネル ウィジェットのクエリを更新する方法を示しています。

"logsPanel": {
  "filter": "${my_label_based_variable}",
  "resourceNames": [
    "projects/1234512345"
  ]
},

たとえば、次のクエリでは、正規表現を使用して、jsonPayload.message フィールドの値をラベルベースの変数の値を含む文字列値と比較します。

"logsPanel": {
  "filter": "resource.type=\"gce_instance\"\n
             resource.labels.project_id=~\"${my_label_based_variable.value}\"\n",
  "resourceNames": [
    "projects/012345"
  ]
}

別の例として、値のみの変数 value_only_severity_variable を考えます。メニューで ERRORINFONOTICE の 3 つの値が選択されているとします。次に、ログパネル ウィジェットのクエリ ペインに次の内容を追加します。

"logsPanel": {
  "filter": "severity =~ \"${value_only_severity_variable}\"\n",
  ...
}

次の図は、ログパネル ウィジェットによって実行されるクエリを示しています。

severity =~ "^(ERROR|INFO|NOTICE)$"

ログパネルのクエリを構成してから、ボタンを選択してログ エクスプローラを開くと、ログ エクスプローラが開く前に変数が解決されます。

次の表は、ログパネルでサンプル変数がどのように解決されるかを示しています。前述のように、変数の値のみを使用する場合は、比較演算子として正規表現を使用する必要があります。

構文 選択された
解決されたログパネル式
${my_label_based_variable} 12345 resource.labels."instance_id"="12345"

この変数の例は、リソースラベル instance_id に基づいています。

${my_label_based_variable} * ""
${my_label_based_variable.value}
${my_value_based_variable}
12345 12345
${my_label_based_variable.value}
${my_value_based_variable}
* .*

PromQL クエリを含むグラフ

PromQL クエリを含むグラフをラベルベースの変数に依存するように更新するには、一般的な構文に記載されているガイダンスに従います。

コンソール

たとえば、次のクエリは、ラベルベースの変数 my_label_based_variable がフィルタ式に解決されることを前提としています。

compute_googleapis_com:instance_cpu_utilization{
    monitored_resource="gce_instance", ${my_label_based_variable} }

クエリを変更して、変数の値のみを解決することもできます。次の例では、正規表現を使用して、ラベルベースのクエリの値を instance_id と比較します。

compute_googleapis_com:instance_cpu_utilization{
    instance_id=~"${my_label_based_variable.value}"
}

値のみの変数がある場合は、.value 句を省略します。たとえば、値のみの変数を使用してゾーンでフィルタリングする場合、クエリには次のようなものが含まれます。

zone=~"${my_value_only_variable}"

API

たとえば、次の JSON は、ラベルベースの変数 my_label_based_variable がフィルタ式に解決されるクエリを示しています。

"timeSeriesQuery": {
  "prometheusQuery": "avg_over_time(
    compute_googleapis_com:instance_cpu_utilization{
      monitored_resource=\"gce_instance\",
      ${my_label_based_variable}
      }[${__interval}])",
  "unitOverride": "",
  "outputFullDuration": false
},

クエリを変更して、変数の値のみを解決することもできます。次の例では、正規表現を使用して、ラベルベースのクエリの値を instance_id と比較します。

"timeSeriesQuery": {
  "prometheusQuery": "avg_over_time(
    compute_googleapis_com:instance_cpu_utilization{
    monitored_resource=\"gce_instance\",
    instance_id=~\"${my_label_based_variable.value}\"
    }[${__interval}])",
  "unitOverride": "",
  "outputFullDuration": false
},

値のみの変数がある場合は、.value 句を省略します。たとえば、値のみの変数を使用してゾーンでフィルタリングする場合、クエリには次のようなものが含まれます。

zone=~\"${my_value_only_variable}\"

次の表は、PromQL によってサンプル変数がどのように解決されるかを示しています。前述のように、変数の値のみを使用する場合は、比較演算子として正規表現を使用する必要があります。

構文 選択された
解決された PromQL 式
${my_label_based_variable} 12345 instance_id == '12345'

この変数の例は、リソースラベル instance_id に基づいています。

${my_label_based_variable} * noop_filter=~".*"
${my_label_based_variable.value}
${my_value_based_variable}
12345 12345
${my_label_based_variable.value}
${my_value_based_variable}
* .+

SQL クエリを含むグラフ

SQL で定義されたウィジェットを更新して変数に依存させる場合は、WHERE 句を更新して変数の値を参照します。すべての変数について、変数名の前に「@」記号を付けます(例: @variable_name)。ラベルベースの変数の場合は、変数名 @my_label_based_variabe.value.value を追加します。

SQL クエリの場合、変数置換は BigQuery に依存しており、SQL インジェクションに対して安全です。詳細については、パラメータ化クエリの実行をご覧ください。

コンソール

SQL ではワイルドカード演算子は「任意の値」を意味するものとして解釈されないため、SQL クエリで変数を使用する場合は、常に IF ステートメントを使用することをおすすめします。次の例は、データ型が文字列の値のみの変数の使用方法を示しています。

WHERE IF(@my_value_only_variable = "*", TRUE, log_name = @my_value_only_variable)

変数のメニュー オプションでユーザーが複数の値を選択できる場合は、CAST 関数を使用して、変数の値を GoogleSQL データ型にキャストする必要があります。次のクエリは、この構文を示しています。

IF(ARRAY_LENGTH(CAST(@my_value_only_variable)) = 0, TRUE,
   severity IN UNNEST(@my_value_only_variable))

SQL ではワイルドカード演算子が「任意の値」を意味するものとして解釈されないため、上記の例に示す IF ステートメントをおすすめします。したがって、IF ステートメントを省略し、ワイルドカード演算子を選択すると、クエリの結果は空のテーブルになります。2 番目の例では、UNNEST 関数が配列をテーブルに変換します。

適切な形式の WHERE 句を追加する手順は次のとおりです。

  1. ウィジェットを編集します。
  2. ツールバーで [変数フィルタを挿入] を選択し、WHERE 句を更新する変数を選択します。
  3. 表示されたダイアログで、生成されたコードを確認し、[コピーして閉じる] をクリックします。
  4. コピーしたコードを [クエリ] ペインに貼り付け、必要に応じて編集します。

    たとえば、ログ名のリストを生成し、log_name という名前の単一の列を含むテーブルで結果を出力する LogName という名前の変数を作成するとします。次に、グラフを作成し、[変数フィルタを挿入] を選択して、変数 LogName を選択します。次のコードが生成されます。

    WHERE IF(@LogName = '*', TRUE, LogName = @LogName)
    

    この例では、テーブル結合が行われるように、生成されたコードを編集して LogName =log_name = に置き換える必要があります。

    WHERE IF(@LogName = '*', TRUE, log_name = @LogName)
    
  5. [実行]、[適用] の順にクリックします。

  6. 変更したダッシュボードを保存するには、ツールバーで [保存] をクリックします。

API

SQL ではワイルドカード演算子は「任意の値」を意味するものとして解釈されないため、SQL クエリで変数を使用する場合は、常に IF ステートメントを使用することをおすすめします。次の例は、データ型が文字列の値のみの変数の使用方法を示しています。

WHERE IF(@my_value_only_variable = "*", TRUE, log_name = @my_value_only_variable)

たとえば、次の例は、SQL クエリの結果を表示するグラフの JSON 表現の一部を示しています。ログ名で結果をフィルタできるように、LogName という名前の変数を参照する WHERE 句が追加されました。

"plotType": "STACKED_BAR",
"targetAxis": "Y1",
"timeSeriesQuery": {
  "opsAnalyticsQuery": {
    "queryExecutionRules": {},
    "queryHandle": "",
    "sql": "SELECT\n timestamp, severity, resource.type, log_name, text_payload, proto_payload, json_payload\n
            FROM\n `my-project.global._Default._Default`\n
            WHERE \n IF (@LogName = \"*\", TRUE, log_name=@LogName)\nLIMIT 10000"
  }
}

変数 LogName は、可能なログ名のリストを特定するクエリも発行します。

"dashboardFilters": [
  {
    "filterType": "VALUE_ONLY",
    "templateVariable": "LogName",
    "valueType": "STRING",
    "timeSeriesQuery": {
      "opsAnalyticsQuery": {
        "savedQueryId": "",
        "sql": "SELECT log_name FROM `my-project.global._Default._Default` GROUP BY log_name LIMIT 1000",
        "queryHandle": ""
      },
      "unitOverride": "",
      "outputFullDuration": false
    }
  }
],

変数のメニュー オプションでユーザーが複数の値を選択できる場合は、CAST 関数を使用して、変数の値を GoogleSQL データ型にキャストする必要があります。次のクエリは、この構文を示しています。

IF(ARRAY_LENGTH(CAST(@my_value_only_variable)) = 0, TRUE,
   severity IN UNNEST(@my_value_only_variable))

SQL ではワイルドカード演算子が「任意の値」を意味するものとして解釈されないため、上記の例に示す IF ステートメントをおすすめします。したがって、IF ステートメントを省略し、ワイルドカード演算子を選択すると、クエリの結果は空のテーブルになります。2 番目の例では、UNNEST 関数が配列をテーブルに変換します。

MQL クエリを含むグラフ

ラベルベースの変数を使用する MQL クエリを含むグラフの場合は、パイプ(|)と (|) を追加し、一般的な構文に記載されているガイダンスに従います。

メニュー ドリブンのインターフェースを使用して時系列データを表示するグラフを作成すると、選択内容がモニタリング フィルタに変換されます。

コンソール

たとえば、次のクエリは、ラベルベースの変数 my_label_based_variable がフィルタ式に解決されることを前提としています。

fetch gce_instance
| metric 'compute.googleapis.com/instance/cpu/utilization'
| every 1m
| ${my_label_based_variable}

クエリを変更して、変数の値のみを解決することもできます。次の例では、正規表現を使用して、ラベルベースのクエリの値を instance_id と比較します。

fetch gce_instance
| metric 'compute.googleapis.com/instance/cpu/utilization'
| filter resource.instance_id=~'${my_label_based_variable.value}'
| group_by 1m, [value_utilization_mean: mean(value.utilization)]
| every 1m

値のみの変数がある場合は、.value 句を省略します。たとえば、値のみの変数を使用してゾーンでフィルタリングする場合、クエリには次のようなものが含まれます。

resource.zone=~'${my_value_only_variable}'

API

たとえば、次の JSON は、ラベルベースの変数 my_label_based_variable がフィルタ式に解決されるクエリを示しています。

"timeSeriesQuery": {
  "timeSeriesQueryLanguage": "fetch gce_instance\n
    | metric 'compute.googleapis.com/instance/cpu/utilization'\n
    | group_by 1m, [value_utilization_mean: mean(value.utilization)]\n
    | every 1m\n
    | ${my_label_based_variable}",
  "unitOverride": "",
  "outputFullDuration": false
},

クエリを変更して、変数の値のみを解決することもできます。次の例では、正規表現を使用して、ラベルベースのクエリの値を instance_id と比較します。

"timeSeriesQuery": {
  "timeSeriesQueryLanguage": "fetch gce_instance\n
    | metric 'compute.googleapis.com/instance/cpu/utilization'\n
    | filter resource.instance_id=~'${my_label_based_variable.value}'\n
    | group_by 1m, [value_utilization_mean: mean(value.utilization)]\n
    | every 1m\n",
  "unitOverride": "",
  "outputFullDuration": false
},

値のみの変数がある場合は、.value 句を省略します。たとえば、値のみの変数を使用してゾーンでフィルタリングする場合、クエリには次のようなものが含まれます。

resource.zone=~'${my_value_only_variable}'

次の表に、MQL での変数解決の例を示します。前述のように、変数の値のみを使用する場合は、比較演算子として正規表現を使用する必要があります。

構文 選択された
解決された MQL 式
${my_label_based_variable} 12345 filter (resource.instance_id == '12345')

この変数の例は、リソースラベル instance_id に基づいています。

${my_label_based_variable} * filter (true)
${my_label_based_variable.value}
${my_value_based_variable}
12345 12345
${my_label_based_variable.value}
${my_value_based_variable}
* .*

モニタリング フィルタクエリを含むグラフ

Monitoring フィルタ形式のクエリを含むグラフを更新して、ラベルベースの変数に依存させるには、一般的な構文に記載されているガイダンスに従います。

コンソール

Google Cloud コンソールを使用してグラフを作成し、メニュー ドリブン インターフェースを使用している場合は、変数の [グラフに適用] フィールドを使用するか、ウィジェットを編集して [フィルタ] メニューからラベルベースの変数を選択することで、グラフのクエリを更新できます。[フィルタ] メニューには、すべてのラベルベースの変数とすべてのラベルキーが一覧表示されます。

値ベースの変数に依存するようにグラフのクエリを更新する手順は次のとおりです。

  1. グラフの編集。
  2. クエリ ペインで、[フィルタを追加] をクリックしてラベルキーを選択します。たとえば、ゾーンを選択します。
  3. [] メニューで、値のみの変数を選択します。
  4. [適用] をクリックします。
  5. 変更したダッシュボードを保存するには、ツールバーで [保存] をクリックします。

たとえば、次の JSON は、ラベルベースの変数 my_label_based_variable がフィルタ式に解決されるクエリを示しています。

metric.type="compute.googleapis.com/instance/cpu/utilization"
resource.type="gce_instance" ${my_label_based_variable}"

Monitoring フィルタの形式でクエリを使用するウィジェットでは、ラベルベースの変数の値で時系列をフィルタリングできませんが、値のみの変数でフィルタリングすることはできます。たとえば、次のクエリは、値のみの変数の値に基づいて zone でフィルタするクエリの [フィルタ] フィールドの値を示しています。

metric.type="compute.googleapis.com/instance/cpu/utilization"
resource.type="gce_instance"
resource.label."zone"=monitoring.regex.full_match(${my_value_only_variable})

API

たとえば、次の JSON は、ラベルベースの変数 my_label_based_variable がフィルタ式に解決されるクエリを示しています。

"timeSeriesQuery": {
  "timeSeriesFilter": {
    "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\"
               resource.type=\"gce_instance\"
               ${my_label_based_variable} ",
    "aggregation": {
      "alignmentPeriod": "60s",
      "perSeriesAligner": "ALIGN_MEAN",
      "groupByFields": []
    }
  },
  "unitOverride": "",
  "outputFullDuration": false
},

Monitoring フィルタの形式でクエリを使用するウィジェットでは、ラベルベースの変数の値で時系列をフィルタリングできませんが、値のみの変数でフィルタリングすることはできます。たとえば、次のクエリは、値のみの変数の値に基づいて zone でフィルタリングするクエリの "filter" フィールドを示しています。

"filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\"
          resource.type=\"gce_instance\"
          resource.labels.\"zone\"=monitoring.regex.full_match(${my_value_only_variable})"

次の表は、Monitoring フィルタによってサンプル変数がどのように解決されるかを示しています。前述のように、変数の値のみを使用する場合は、比較演算子として正規表現を使用する必要があります。

構文 選択された
解決されたフィルタ式
${my_label_based_variable} 12345 resource.instance_id == "12345"

この変数の例は、リソースラベル instance_id に基づいています。

${my_label_based_variable} * 除外
${my_label_based_variable.value} 12345 非対応
${my_label_based_variable.value} * 非対応
${my_value_based_variable} 12345 "12345"
${my_value_based_variable} * ".*"

始める前に

ダッシュボードを作成または管理する Google Cloud プロジェクトで、次の操作を行います。

  • Select the tab for how you plan to use the samples on this page:

    gcloud

      In the Google Cloud console, activate Cloud Shell.

      Activate Cloud Shell

      At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

      Terraform

      ローカル開発環境でこのページの Terraform サンプルを使用するには、gcloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

      1. Install the Google Cloud CLI.

      2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      3. To initialize the gcloud CLI, run the following command:

        gcloud init
      4. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

        If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

      詳細については、 Google Cloud 認証ドキュメントのローカル開発環境の ADC の設定をご覧ください。

      REST

      このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

        After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      詳細については、 Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。

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

新しいカスタム ダッシュボードを作成するには、dashboards.create メソッドを呼び出し、それをレイアウトとウィジェットに指定してダッシュボードに表示します。

name フィールドは省略可能です。名前フィールドの値の構造は次のとおりです。

"name": "projects/PROJECT_ID_OR_NUMBER/dashboards/DASHBOARD_ID"

ダッシュボードを作成すると、API が自動的に DASHBOARD_ID コンポーネントを生成します。カスタム DASHBOARD_ID を指定する場合は、Dashboard オブジェクトの name フィールドを指定できます。

gcloud

プロジェクトでダッシュボードを作成するには、gcloud monitoring dashboards create コマンドを使用します。

gcloud monitoring dashboards create --config-from-file=my-dashboard.json --project=PROJECT_ID

前述のコマンドを実行する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクトの ID。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。

たとえば、ダッシュボードを複製する場合は、次の操作を行います。

  1. ダッシュボードを取得するの手順を完了して、元のダッシュボードの定義をダウンロードします。
  2. 返された JSON を編集して etag フィールドと name フィールドを削除し、displayName フィールドの値を変更します。
  3. コマンドを実行してダッシュボードを作成します。

詳細については、gcloud monitoring dashboards create リファレンスをご覧ください。

Terraform

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。詳細については、Terraform プロバイダのリファレンス ドキュメントをご覧ください。

Terraform を使用してダッシュボードを作成するには、次の操作を行います。

  1. プロジェクトに Terraform をインストールして構成します。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。
  2. google_monitoring_dashboard Terraform リソースを使用します。

    コマンドで、次のフィールドを設定します。

    • dashboard_json: Dashboards 形式を使用したダッシュボードの JSON 表現。

      この形式の例については、API Explorer を使用してダッシュボードを一覧表示するか、 Google Cloud コンソールでダッシュボードを開いて JSON 表現を表示します。

    • parent: プロジェクトの完全修飾名。たとえば、このフィールドを "projects/PROJECT_ID" に設定します。ここで、PROJECT_ID は Google Cloud プロジェクトの ID です。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。

REST

新しいダッシュボードを作成するには、POST リクエストをDashboard エンドポイントに送信します。

curl -d @my-dashboard.json -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' -X POST https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards

前述のコマンドを実行する前に、次のように構成します。

  • ${PROJECT_ID}: ダッシュボードを作成するプロジェクト ID を保存する環境変数。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。

この例では、my-dashboard.json ファイルを使用してサンプルのダッシュボードを作成します。 Google Cloud コンソールからダッシュボードを管理できるようになりました。

ダッシュボードのその他の構成については、ダッシュボードとレイアウトのサンプルをご覧ください。

ダッシュボードの削除

カスタム ダッシュボードを削除するには、dashboards.delete メソッドを呼び出して、削除するダッシュボードを指定します。

gcloud

カスタム ダッシュボードを削除するには、gcloud monitoring dashboards delete を使用して、削除するダッシュボードの完全修飾 ID を指定します。

gcloud monitoring dashboards delete DASHBOARD_ID --project=PROJECT_ID

前述のコマンドを実行する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクトの ID。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。
  • DASHBOARD_ID: ダッシュボードの ID。

詳細については、gcloud monitoring dashboards delete リファレンスをご覧ください。

Terraform

Terraform を使用してリソースを削除できます。リソースの削除については、Terraform コマンドの destroy をご覧ください。

REST

カスタム ダッシュボードを削除するには、削除するダッシュボードの ID で修飾された Dashboard エンドポイントに DELETE リクエストを送信します。

curl -H "Authorization: Bearer $ACCESS_TOKEN" -X DELETE https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards/${DASHBOARD_ID}

前述のコマンドを実行する前に、次のように構成します。

  • ${PROJECT_ID}: ダッシュボードを作成するプロジェクト ID を保存する環境変数。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。
  • ${DASHBOARD_ID}: ダッシュボードの ID を格納する環境変数。

成功すると、このメソッドは空のレスポンスを返します。それ以外の場合は、エラーを返します。

ダッシュボードの一覧表示

プロジェクトに属するすべてのカスタム ダッシュボードを一覧表示するには、dashboards.list メソッドを呼び出し、プロジェクト ID を指定します。

gcloud

プロジェクトのすべてのカスタム ダッシュボードを一覧表示するには、gcloud monitoring dashboards list コマンドを使用します。

gcloud monitoring dashboards list --project=PROJECT_ID

前述のコマンドを実行する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクトの ID。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。

詳細については、gcloud monitoring dashboards list リファレンスをご覧ください。

Terraform

Terraform を使用してプロジェクトにクエリを送信し、ダッシュボードのリストをレスポンスとして取得することはできません。ただし、これらのダッシュボードは Google Cloud コンソールを使用して表示できます。

REST

プロジェクトのすべてのカスタムダッシュボードを一覧表示するには、プロジェクト ID を Dashboard エンドポイントに送信します。

curl -H "Authorization: Bearer $ACCESS_TOKEN" https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards

前述のコマンドを実行する前に、次のように構成します。

  • ${PROJECT_ID}: ダッシュボードを作成するプロジェクト ID を保存する環境変数。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。

この例ではプロジェクトに関連付けられたカスタム ダッシュボードが返されます。

リスト レスポンスのページ分け

dashboards.list メソッドはページ分けをサポートしているので、すべての結果を一度にではなく、1 ページずつ結果を取得できます。

gcloud

ページあたりのリソース数を指定するには、コマンドで --page-size フラグを渡します。次に例を示します。

gcloud monitoring dashboards list --page-size=1 --project=PROJECT_ID

前述のコマンドを実行する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクトの ID。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。

Terraform

Terraform を使用してプロジェクトにクエリを送信し、ダッシュボードのページネーション リストをレスポンスとして取得することはできません。ただし、これらのダッシュボードは Google Cloud コンソールを使用して表示できます。

REST

結果リストの最初のページで、リクエストに pageSize クエリ パラメータを指定します。

curl -H "Authorization: Bearer $ACCESS_TOKEN" https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards?page_size=1

前述のコマンドを実行する前に、次のように構成します。

  • ${PROJECT_ID}: ダッシュボードを作成するプロジェクト ID を保存する環境変数。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。

メソッドは、リストの最初のページと nextPageToken を返します。次に例を示します。

{
  "dashboards" : [
    {
       "displayName" : "Grid Layout Example",
       "gridLayout" : {
         "widgets" : [
            { ... },
            { ... },
            { ... },
          ]
       }
    }
  ]
},
"nextPageToken": "ChYqFDEyMzkzMzUwNzg0OTE1MDI4MjM3"

残りの各ページには、リクエストに対応する nextPageToken を指定する必要があります。

ダッシュボードを取得する

プロジェクトの特定のカスタム ダッシュボードを取得するには、ダッシュボード ID で修飾された dashboards.get メソッドを呼び出します。

gcloud

特定のカスタム ダッシュボードを取得するには、gcloud monitoring dashboards describe コマンドを使用してダッシュボード ID を指定します。

gcloud monitoring dashboards describe DASHBOARD_ID --format=json --project=PROJECT_ID

前述のコマンドを実行する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクトの ID。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。
  • DASHBOARD_ID: ダッシュボードの ID。

このコマンドにより、リクエストされたダッシュボードが返されます。

{
  "columnLayout": {
    "columns": [
      {
        "widgets": [
          {
            "text": {
              "content": "Text Widget 1",
              "format": "RAW"
            }
          },
          {
            "text": {
              "content": "**Text Widget 2**",
              "format": "MARKDOWN"
            }
          },
          {
            "text": {
              "content": "_Text Widget 3_",
              "format": "MARKDOWN"
            }
          }
        ]
      }
    ]
  },
  "displayName": "Column-layout example",
  "etag": "cb3070baf15de7c79d78761baac3a386",
  "name": "projects/730041941835/dashboards/e4cd063e-5414-4e07-9e1e-450d6d3a531d"
}

詳細については、gcloud monitoring dashboards describe リファレンスをご覧ください。

Terraform

Terraform を使用して、レスポンスが個々のダッシュボードであるクエリをプロジェクトに送信することはできません。ただし、これらのダッシュボードは Google Cloud コンソールを使用して表示できます。

REST

特定のカスタム ダッシュボードを取得するには、ダッシュボード ID を Dashboard エンドポイントに送信します。

curl -H "Authorization: Bearer $ACCESS_TOKEN" https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards/${DASHBOARD_ID}

前述のコマンドを実行する前に、次のように構成します。

  • ${PROJECT_ID}: ダッシュボードを作成するプロジェクト ID を保存する環境変数。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。
  • ${DASHBOARD_ID}: ダッシュボードの ID を格納する環境変数。

上記の式で、${DASHBOARD_ID} はダッシュボードの完全修飾名を格納する環境変数です。

このメソッドは、次の例に類似したレスポンスを返します。

{
  "columnLayout": {
    "columns": [
      {
        "widgets": [
          {
            "text": {
              "content": "Text Widget 1",
              "format": "RAW"
            }
          },
          {
            "text": {
              "content": "**Text Widget 2**",
              "format": "MARKDOWN"
            }
          },
          {
            "text": {
              "content": "_Text Widget 3_",
              "format": "MARKDOWN"
            }
          }
        ]
      }
    ]
  },
  "displayName": "Column-layout example",
  "etag": "cb3070baf15de7c79d78761baac3a386",
  "name": "projects/730041941835/dashboards/e4cd063e-5414-4e07-9e1e-450d6d3a531d"
}

ダッシュボードの更新

既存のカスタム ダッシュボードを更新するには、dashboards.patch メソッドを呼び出します。現在の etag の値を取得するには、dashboards.get メソッドを呼び出すと、レスポンス内で確認できます。

gcloud

カスタム ダッシュボードを更新するには、gcloud monitoring dashboards update を使用して更新するダッシュボードの ID を指定し、ダッシュボードに変更を送信します。

gcloud monitoring dashboards update DASHBOARD_ID --config-from-file=my-updated-dashboard.json --project=PROJECT_ID

前述のコマンドを実行する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクトの ID。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。
  • DASHBOARD_ID: ダッシュボードの ID。

詳細については、gcloud monitoring dashboards update リファレンスをご覧ください。

前の例では、my-updated-dashboard.json ファイルを使用して既存のカスタム ダッシュボードを更新しています。レスポンス(新しい etag 値を含む)は、更新されたダッシュボードの一覧のコピーです。

Terraform

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。詳細については、Terraform プロバイダのリファレンス ドキュメントをご覧ください。

Terraform を使用してダッシュボードを更新する手順は次のとおりです。

  1. プロジェクトに Terraform をインストールして構成します。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。
  2. google_monitoring_dashboard Terraform リソースを使用します。

    コマンドで、次のフィールドを設定します。

    • dashboard_json: Dashboards 形式を使用したダッシュボードの JSON 表現。

    • parent: プロジェクトの完全修飾名。たとえば、このフィールドを "projects/PROJECT_ID" に設定します。ここで、PROJECT_ID は Google Cloud プロジェクトの ID です。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。

REST

カスタム ダッシュボードを更新するには、PATCH リクエストを Dashboard エンドポイントに送信し、修正した Dashboard オブジェクトと最新 dashboards.get レスポンスの etag 値を指定します。

curl -d @my-updated-dashboard.json -H "Authorization: Bearer $ACCESS_TOKEN" -H 'Content-Type: application/json' -X PATCH https://monitoring.googleapis.com/v1/projects/${PROJECT_ID}/dashboards/${DASHBOARD_ID}

前述のコマンドを実行する前に、次のように構成します。

  • ${PROJECT_ID}: ダッシュボードを作成するプロジェクト ID を保存する環境変数。App Hub 構成の場合は、App Hub ホスト プロジェクトまたはアプリ管理用フォルダの管理プロジェクトを選択します。
  • ${DASHBOARD_ID}: ダッシュボードの ID を格納する環境変数。

前の例では、my-updated-dashboard.json ファイルを使用して既存のカスタム ダッシュボードを更新しています。レスポンス(新しい etag 値を含む)は、更新されたダッシュボードの一覧のコピーです。

次のステップ