ここではBigQueryに何か取り込みの障害や取り込みが完了したという通知を受け取りたい場合があるとする。
そういった場合の保守運用で、BigQueryで何かあった際にメールやslackなどへ通知ができたらなーと思うかと思います。
そこでここでは、BigQueryでデータが取り込まれた時にメールで通知が行くようにしてみたいと思います!
BigQueryでインポート完了通知を受け取るには以下のようなステップでの構築が必要になります。
上記のことを要素分解すると、
- まず、BigQueryのテーブル作成されたタイミングのログをLoggingの内容を確認する。
- 次に、BigQueryのテーブル作成されたタイミングのログを抽出するフィルタを作成する
- そして、そのログの件数をカスタムのメトリクスを作成して取得する
- 最後に、そのメトリクスをトリガーにして、slackやメールへ通知を行う。
上記のステップを踏んで構築をしてみたいと思います。
上記のことを知っただけでも、ロギングの内容の確認や、メトリクスの作成、そして通知などいろんなことが学べるのでぜひ、時間があったらやってみるとGCPの運用上楽になるかと思います!
Contents
\(①\) BigQueryのデータが入ったタイミングのログを確認する
すでに入っているBigQueryテーブルを確認してみて、ロギング上ではBigQueryにテーブルが作成された時にどのようにログが残っているかを確認してみましょう。
例としてGA4のローデータを吐き出しているので、そのテーブルが作成された時間を確認します。
以下のように赤枠を見ると、2022/4/11 朝6:00とあります。
続いて、ロギングの期間を上記の2022/4/11 朝6:00を含む形で短時間にしてログを見てみます。
そうすると朝6:00ジャストにログがあります。
そしてテーブル名events_20220409とあります。これをみてみましょう!
ログの中身を見ると、「create」という記載があったりしますね。
これがGA4のローデータが吐き出されて作成されたテーブルのログになります。
以下の赤枠にtableCreationとありますね!まさにテーブル作成ログです。
ログはjson形式で、protoPayload.metadata.tableCreationです。
このcreateログが作成されるたびに、トリガーして何か処理をするように、カスタム指標を作ってみたいと思います!
ちなみに、GA4のローデータは作成されたらそれで終わりではありません。何回か更新が走るので、その後も追う必要があるわけです。
一番上の画像を見ると、最終更新が2022/4/11 11:15:30とあり、このログを見ると、
テーブル作成の場合はtableCreationとありましたが、更新の場合はtableChangeとあります。
\(②\) 作成ログをフィルタかけて作成する
上記で、テーブル作成ログを確認することができました。
続いては、フィルタをかけて、その作成ログだけを抜き取る作業をしてみます。
上ではtableCreationが作成ログとわかったので、こちらの情報でフィルタをかけてみましょう!
上での説明で、protoPayload.metadata.tableCreationの中を見ると、作成されたテーブル名がログに残ってるので、
protoPayload.serviceName = "bigquery.googleapis.com" protoPayload.metadata.tableCreation.table.tableName =~ "projects/< あなたのGCPプロジェクトID >/datasets/< あなたのGA4ローデータのデータセット名 >/tables/events_*"
とクエリを以下のように書いて、右上のクエリ実行をしてみます。
上のクエリは、
=は純粋に値が一致するか判定、=~は正規表現で判定
になります。
そして、今回はBigQuery上にテーブルが作成されたログを抽出するので、サービス名をbigquery.googleapis.comでフィルタします。
そうすると、以下のようにBigQueryにテーブルの作成されたログが残ります。
これで、BigQuery上にテーブルが作成されたタイミングのログの抽出ができました。
\(③\) ログの件数からカスタムのメトリクスを作成する
\(④\) メトリクスをトリガーにしてメールへ通知をする
※ slackへの通知も可能ですので、是非やってみてください!
Cloud Loggingの情報はjson形式なので、クエリのフィルタをかける場合は、jsonを参照するような形で、
protoPayload.getDataというようにして、フィルタの指定を行います。
フィルタのクエリは基本的にはかつ条件となります。
メールの通知はNotificationでのj配信設定となります。