Azure Databricks のジョブ監視方法まとめ

みなさん、こんにちは！
Azure Databricks でジョブ実行を監視し、失敗した場合に通知する方法についてまとめました。
通知方法は主に以下の2通りです：

* ログベースのアラート通知
* ジョブ設定によるアラート通知

それぞれについて、以降で詳しく解説します。

## ログベースのアラート通知
Log Analytics を利用し、5分毎にジョブの実行ログを確認して失敗した記録があればアラート通知を送信する方法です。

設定手順は以下の通りです。
### 1. アクショングループ作成
通知先となるアクショングループを作成します。
Azure ポータルで「モニター」を開き、「アクショングループ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/4c73ca62-d253-46c0-8148-bf5e7a6934cd.png)

「作成」をクリックし、必要な設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/a436b849-4748-4f47-9e99-d4fabe512eec.png)

基本設定を入力したら「通知」タブに移動し、通知タイプと内容を設定します（今回はメールで通知したいため、「電子メール/SMS メッセージ/プッシュ/音声」で設定）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/7eb01d52-b640-4088-b883-08a34fae8cad.png)

内容を確認後、問題なければ「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/7a063266-b12c-4773-8a9e-48a8c8a45762.png)

以上でアクショングループの作成は完了です。

### 2. Log Analytics ワークスペース作成
Databricks のログ格納場所となる Log Analytics ワークスペースを作成します。

### 3. アラート設定
対象のワークスペースを開き、「ログ」で以下のクエリを実行します。
```ruby:qiita.rb
DatabricksJobs
| where ActionName contains "Failed" and TimeGenerated > ago(5m)
```
上記はジョブ実行履歴のうち失敗（Failed）となったもので、5分以内のログを検索するクエリです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/aab04ad0-d4c5-48a0-83c9-bb444e8295fb.png)
一度実行したら、「新しいアラートルール」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/c5b297b5-4999-434c-94f3-0f208a735ed3.png)

検索クエリが先ほど実行したものと合っていることを確認します。

測定はクエリに関する設定で、以下のように設定します。
* メジャー：テーブルの行
* 集計の種類：カウント
* 集計の粒度：5分

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/ebdb8cad-6789-4574-879f-08a1c4a5d258.png)

アラートロジックは以下の通り設定します。
* 演算子：次の値より大きい
* しきい値：0
* 評価の頻度：5分

上記設定によりクエリが5分ごとに実行され、5分の間に実行結果が1件でもあればアラート通知が送られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/5947b73d-7636-4883-99a4-0e94cfe60235.png)
アクションには設定したアクショングループを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/9c690613-7abd-4c38-8b43-f36a2dba01ef.png)
「詳細」で以下の項目を設定します。
* サブスクリプション：対象のサブスクリプション
* リソースグループ：対象のリソースグループ
* 重大度：通知の重要度。今回はエラーとする。
* アラートルール名：通知の際に表示されるアラートルール名
* リージョン：アラートルールのリージョン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/86d1966f-3d87-496d-bbff-4b046ccd539c.png)

「確認および作成」をクリックし、問題がなければ「作成」をクリックします。
以上でアラートの設定は完了です。

上記の設定後にジョブ実行が失敗した場合、以下のような通知メールが送信されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/c22fdf52-52c1-4508-849e-fdfed503ae50.png)

## ジョブ設定によるアラート通知
Databricks で、ジョブごとにアラート設定を行うことも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/d0804bcf-f6ea-4cc3-81b0-d984522d85d2.png)
ジョブ作成画面の「ジョブ通知」で、「通知を編集」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/b25016d9-2663-4375-bbd9-e2297a864028.png)
ポップアップで「通知を追加」をクリックし、配信先を設定することができます。配信先はメールアドレスに加えてWebhook、Slack、Teamsなどが選べます。

設定後にジョブ実行が失敗した場合、以下のような通知メールが送信されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/5893c739-84dd-4853-92de-005520a5a84a.png)

「View run in Databricks」のリンクから該当ジョブの実行結果詳細を確認可能です。

## 補足
Databricks のシステムテーブル`system.lakeflow.job_run_timeline`にもジョブの実行履歴は記録されますが、診断ログに比べて反映のタイミングが遅いです。

実際に試した結果は以下の通りで、診断ログはジョブ失敗から6分後には反映されてメール通知されたのに対し、システムテーブルに反映されたのはジョブ失敗から約20分後です。
| イベント | 時刻 |
|:-|:-|
| ジョブ失敗  | 	13:48  |
| 診断ログ反映　 | 13:54  |
| メール通知  | 	13:55  |
| システムテーブル反映  | 14:07  |

システムテーブルに対して定期的にクエリをかけ、ジョブが失敗した記録があれば通知・・・という方法も検討しましたが、コストの観点からも、システムテーブルより診断ログを利用した方法のほうが良さそうです。

## 参考
* [【Azure Databricks】ジョブ監視をしてみる(後編) | Azure導入支援デスク](https://cloud.sojitz-ti.com/blog/azure-databricks-job-monitoring-02/)