PromQL ベースの条件(API)でアラート ポリシーを作成する

このページでは、Cloud Monitoring API を使用して、PromQL ベースの条件でアラート ポリシーを作成する方法について説明します。アラート ポリシーで PromQL クエリを使用すると、比率、動的しきい値、指標評価などの機能を設定した複雑な条件を作成できます。

一般的な情報については、PromQL を使用したアラート ポリシーをご覧ください。

Cloud Monitoring 外部の Prometheus 環境で作業しており、Prometheus アラートルールを設定している場合は、Google Cloud CLI を使用して、アラートルールを PromQL クエリによる Monitoring アラート ポリシーに移行できます。詳細については、Prometheus からアラートのルールとレシーバーを移行するをご覧ください。

PromQL クエリを使用してアラート ポリシーを作成する

alertPolicies.create メソッドを使用して、アラート ポリシーをプログラムで作成します。

PromQL ベースの条件でアラート ポリシーを作成する場合と他のアラート ポリシーを作成する場合の唯一の違いは、Condition タイプが PrometheusQueryLanguageCondition でなければならないことです。この条件タイプを使用すると、PromQL でアラート ポリシーを定義できます。

kube-state エクスポータの指標を使用して、過去 30 分間にコンテナが再起動された回数を確認するアラート ポリシー条件に対する PromQL クエリを次に示します。

rate(kube_pod_container_status_restarts[30m]) * 1800 > 1

アラート ポリシーの作成

PromQL ベースの条件でアラート ポリシーを作成するには、AlertPolicy 条件タイプ PrometheusQueryLanguageCondition を使用します。PrometheusQueryLanguageCondition の構造は次のとおりです。

{
  "query": string,
  "duration": string,
  "evaluationInterval": string,
  "labels": {string: string},
  "ruleGroup": string,
  "alertRule": string
}

PrometheusQueryLanguageCondition フィールドの定義は次のとおりです。

  • query: 評価する PromQL 式。標準の Prometheus アラートルールの expr フィールドと同等です。
  • duration: アラート ポリシーがトリガーされるまでに、クエリの各評価で true 値が生成されるまでの時間を指定します。値は時間(分)で、秒単位で表されます。たとえば、600s は 10 分の期間です。詳細については、指標ベースのアラート ポリシーの動作をご覧ください。
  • evaluationInterval: クエリの PromQL 評価の間隔(秒単位)。デフォルト値は 30 秒です。Prometheus アラートルールを移行して PrometheusQueryLanguageCondition が作成された場合、この値は Prometheus アラートルールを含む Prometheus ルールグループから取得されます。
  • labels: PromQL 式の結果にラベルを追加または上書きするためのオプションの方法。
  • ruleGroup: アラート ポリシーが Prometheus 構成ファイルから移行された場合、このフィールドには Prometheus のルールグループname フィールドの値が含まれます。Cloud Monitoring API で PromQL アラート ポリシーを作成する場合、このフィールドは必須ではありません。
  • alertRule: アラート ポリシーが Prometheus 構成ファイルから移行された場合、このフィールドには Prometheus のアラートルールalert フィールドの値が含まれます。Cloud Monitoring API で PromQL アラート ポリシーを作成する場合、このフィールドは必須ではありません。

たとえば、次の条件では、PromQL クエリを使用して、コンテナが過去 30 分間に再起動された回数を検索します。

"conditionPrometheusQueryLanguage": {
  "query": "rate(kube_pod_container_status_restarts[30m]) * 1800 > 1",
  "duration": "10s",
  "alertRule": "ContainerRestartCount",
  "labels": {
    "action_required":"true",
    "severity":"critical/warning/info"}
}

この構造を条件内の conditionPrometheusQueryLanguage フィールドの値として使用します。この値は、アラート ポリシー構造に埋め込まれます。これらの構造の詳細については、AlertPolicy をご覧ください。

JSON 内で PrometheusQueryLanguageCondition 条件を使用する完全なポリシーを以下に示します。

{
  "displayName": "Container Restarts",
  "documentation": {
    "content": "Pod ${resource.label.namespace_name}/${resource.label.pod_name} has restarted more than once during the last 30 minutes.",
    "mimeType": "text/markdown",
    "subject": "Container ${resource.label.container_name} in Pod ${resource.label.namespace_name}/${resource.label.pod_name} has restarted more than once during the last 30 minutes."
  },
  "userLabels": {},
  "conditions": [
    {
      "displayName": "Container has restarted",
      "conditionPrometheusQueryLanguage": {
        "query": "rate(kubernetes_io:container_restart_count[30m]) * 1800",
        "duration": "10s",
        "alertRule": "ContainerRestart",
        "labels": {
          "action_required":"true",
          "severity":"critical/warning/info"}
      }
    }
  ],
  "alertStrategy": {
    "autoClose": "1800s"
  },
  "combiner": "OR",
  "enabled": true
}

アラート ポリシーを作成する

アラート ポリシーを作成するには、アラート ポリシー JSON を POLICY_NAME.json と呼ばれるファイルに追加し、次のコマンドを実行します。

curl -d @POLICY_NAME.json -H "Authorization: Bearer $TOKEN"
-H 'Content-Type: application/json'
-X POST https://monitoring.googleapis.com/v3/projects/${PROJECT}/alertPolicies

アラート ポリシー用の Monitoring API の詳細については、API によるアラート ポリシーの管理をご覧ください。

curl の使用の詳細については、curl の呼び出しをご覧ください。

Terraform を使用する

Terraform を使用して PromQL ベースのアラート ポリシーを構成する手順については、google_monitoring_alert_policy Terraform レジストリcondition_prometheus_query_language セクションをご覧ください。

Terraform と Google Cloud を使用する場合の一般的な情報については、Google Cloud での Terraform をご覧ください。

curl の呼び出し

curl 呼び出しには一連の引数が含まれ、API リソースの URL がそれに続きます。一般的な引数には、Google Cloud プロジェクト ID と認証トークンが含まれます。これらの値は、ここでは PROJECT_ID および TOKEN 環境変数で表されます。

HTTP リクエストのタイプ(たとえば、-X DELETE)を指定する場合など、他の引数を指定する必要がある場合もあります。デフォルトのリクエストは GET であるため、例では指定していません。

curl 呼び出しは、次の一般的な構造をしています。

curl --http1.1 --header "Authorization: Bearer ${TOKEN}" <other_args> https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/<request>

curl を使用するには、プロジェクト ID とアクセス トークンを指定する必要があります。入力とエラーを減らすために、これらを環境変数に入れて curl に渡すことができます。

これらの変数を設定するには、次のことを行います。

  1. 指標スコープのスコープ プロジェクト ID を保持する環境変数を作成します。次の手順では、変数 PROJECT_ID を呼び出します。

    PROJECT_ID=a-sample-project
    
  2. Google Cloud CLI に対して認証を行います。

    gcloud auth login
    
  3. 省略可。各 gcloud コマンドでのプロジェクト ID の指定を不要にするには、gcloud CLI を使用してプロジェクト ID をデフォルトとして設定します。

    gcloud config set project ${PROJECT_ID}
    
  4. 認証トークンを作成し、環境変数にキャプチャします。次の手順では、変数 TOKEN を呼び出します。

    TOKEN=`gcloud auth print-access-token`
    

    アクセス トークンは定期的に更新する必要があります。動作していたコマンドに急に未認証と報告された場合は、このコマンドを再発行します。

  5. アクセス トークンがあることを確認するには、TOKEN 変数をエコーします。

    echo ${TOKEN}
    ya29.GluiBj8o....