notebook

都内でWEB系エンジニアやってます。

CloudLogging+MonitoringでDataformの実行完了をSlack通知する

Dataformの実行結果はCloudLoggingに流れるので流れた結果をもとにログベースのAlertを作成しSlackへ通知する

Monitoring Alertの設定だけでSlackにDataformの実行が完了した旨の通知を行える(CloudFunctionsが不要)

設定で行ったことを残しておく

Dataform実行結果のログ

Monitoringのログエクスプローラで対象のDataform実行ログを探す

GUI上でフィールド検索の隣の項目からログ名フォームでdataformと検索したらそれっぽい項目が出てきたため選択した

logNameを指定することになる

logName="projects/project-111111/logs/dataform.googleapis.com%2Fworkflow_invocation_completion"

対象と思われるExecutionを発見した

{
  "insertId": "13yxu9zcnph",
  "jsonPayload": {
    "terminalState": "SUCCEEDED",
    "workflowInvocationId": "1709515650-8e29a9a5-5a84-4548-843b-e7a41dc16e90",
    "@type": "type.googleapis.com/google.cloud.dataform.logging.v1.WorkflowInvocationCompletionLogEntry"
  },
  "resource": {
    "type": "dataform.googleapis.com/Repository",
    "labels": {
      "resource_container": "800688344033",
      "location": "asia-northeast1",
      "repository_id": "github-projects"
    }
  },
  "timestamp": "2024-03-04T01:28:02.645125486Z",
  "severity": "INFO",
  "logName": "projects/project-111111/logs/dataform.googleapis.com%2Fworkflow_invocation_completion",
  "receiveTimestamp": "2024-03-04T01:28:03.343511633Z"
}

失敗時のログ

{
  "insertId": "13yxu9zcfiv",
  "jsonPayload": {
    "terminalState": "FAILED",
    "@type": "type.googleapis.com/google.cloud.dataform.logging.v1.WorkflowInvocationCompletionLogEntry",
    "workflowInvocationId": "1709415323-ca53cff8-fb05-47e9-8d2f-41f27faec3c6"
  },
  "resource": {
    "type": "dataform.googleapis.com/Repository",
    "labels": {
      "location": "asia-northeast1",
      "repository_id": "sample-dataform",
      "resource_container": "467341840626"
    }
  },
  "timestamp": "2024-03-02T21:35:44.831502320Z",
  "severity": "ERROR",
  "logName": "projects/project-111111/logs/dataform.googleapis.com%2Fworkflow_invocation_completion",
  "receiveTimestamp": "2024-03-02T21:35:45.439551331Z"
}

フォーマットに変化はない、そしてエラーの詳細はのっていない…

LogBaseのアラートポリシー設定

ログベースのアラート設定

特定条件のログが発生した際にアラートとして扱う

すでに通知先チャンネルにSlackのチャンネルは設定している前提

対象ログの選定

設定の順序的には前後してしまうが先に説明する

Choose logs to include in the alertでアラート対象とするログを特定するためのクエリを記述する

ログエクスプローラで確認して設定する

logName="projects/project-111111/logs/dataform.googleapis.com%2Fworkflow_invocation_completion" AND jsonPayload.terminalState: SUCCEEDED

logNameとログの中のステータスをもとに絞り込みした

ログの内容からラベル付けする

後の工程で使うために、特定の値を任意のラベルとして使用できるようにする

今回は下記のように指定した

ラベル: ログから取得できるデータのパス

  • location: resource.labels.location
  • repo: resource.labels.repository_id
    • 対象のリポジトリ名
  • config: jsonPayload.workflowConfigId
    • dataformのワークフロー構成の名前
  • invocationId: jsonPayload.workflowInvocationId
  • state: jsonPayload.terminalState
    • SUCCEEDED,FAILEDなど

ユーザー定義のアノテーション

ドキュメント内のテキストはカスタマイズできる、${varname}形式で変数を使うこともできる

指定できる値は下記ドキュメントを参照

ユーザー定義のドキュメントでアラートにアノテーションを付ける  |  Cloud Monitoring  |  Google Cloud

cloud.google.com

意味合い的にはこの形式のログの場合はこういう対応手順です、とかそういうのを乗せるのが想定できる

次のように設定した

${project}

${log.extracted_label.repo}

${log.extracted_label.config}

State: ${log.extracted_label.state}

https://console.cloud.google.com/bigquery/dataform/locations/${log.extracted_label.location}/repositories/${log.extracted_label.repo}/workflows/${log.extracted_label.invocationId}?hl=ja&project=${project}

log.extracted_label.というような指定方法で、前工程で指定したラベルの値を使用できる

どのワークフロー構成の実行か特定したい

実行時のワークフロー構成はDataformで特定のタグだけ実行する、すべて実行するなどで違う値となる(別途Dataform側で設定が必要)

通知のDocumentに含めておけば、どのワークフロー構成が失敗したかまでは通知だけで判断できるようになる

ラベル付けしたので、${log.extracted_label.config}名前の値が入ってくる

urlを作りたい

失敗してた場合、理由もしりたい

対象のログ自体には手がかりは何も乗っていないため、Dataformの実行リスト画面(WORKFLOW EXECUTION LOGS)から対象の実行に遷移し「詳細を表示」した後の画面まですぐ行けるようにしたい

アラート設定時にラベル付けした値を用いると、次のようなフォーマットでエラーを確認できるURLを生成できる

https://console.cloud.google.com/bigquery/dataform/locations/${log.extracted_label.location}/repositories/${log.extracted_label.repo}/workflows/${log.extracted_label.invocationId}?hl=ja&project=${project}

通知

実際の通知

来た

成功のログでもSlackのAttachementは赤の通知なのがちょっと微妙ではある、本来想定された用途とマッチしてない感がある

しかし、これだけのために通知用のFunctionを作るのも管理が増えるし微妙…

ということでいったん、成功時と失敗時のアラート設定を分けてタイトルで区別できるようにした…