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
意味合い的にはこの形式のログの場合はこういう対応手順です、とかそういうのを乗せるのが想定できる
次のように設定した
${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を作るのも管理が増えるし微妙…
ということでいったん、成功時と失敗時のアラート設定を分けてタイトルで区別できるようにした…