【Databricks】Monitor alertsを試してみた

# 背景・目的
「[【Databricks】Lakehouse Monitoringを試してみた](https://qiita.com/zumax/items/abb01ece2d10d3b0375c)」の続きで、Lakehouse Monitoringでのアラートの監視を試してみます。

# まとめ
- 2024/1/5現在で、パブリックプレビューです。
- モニターアラートは、他のDatabricks SQLアラートと同じ方法で作成可能
    - Databricks SQLクエリは、モニタープロファイルメトリックテーブル、ドリフトメトリックテーブルに作成する
    - クエリのSQLアラートを作成する。
    - 必要な頻度でクエリーを評価し、アラートがトリガーされた場合に通知を送信するようにアラートを構成できる
- 通知先は下記の通り
    - メール（デフォルト）
    - Slack、Pagedutyなどにも送信可能


# 概要
[アラートの監視](https://docs.databricks.com/ja/lakehouse-monitoring/monitor-alerts.html)について整理します。


> このページでは、モニターメトリクステーブルからのメトリクスに基づいて Databricks SQL アラートを作成する方法について説明します。 モニターアラートの一般的な用途には、次のようなものがあります。

> - 統計が特定の範囲外に移動したときに通知を受け取ります。 たとえば、欠損値の割合が特定のレベルを超えたときに通知を受け取るとします。
> - データの変更の通知を受け取ります。 ドリフトメトリクステーブルには、データ分布の変化を追跡する統計が格納されます。
> - ベースライン テーブルと比較してデータがドリフトした場合に通知を受け取ります。 アラートを設定して、データの変更を調査したり、 InferenceLog 分析のためにモデルを再トレーニングする必要があることを示すことができます。


- モニターアラートの一般的な用途
    - 統計が特定の範囲外に移動したときに通知を受ける
    - データの変更の通知を受け取る
    - ベースラインテーブルと比較してデータがドリフトした場合に通知を受ける

> モニター アラートは、他の Databricks SQL アラートと同じ方法で作成および使用されます。 Databricks SQL クエリー は、モニター プロファイル メトリック テーブルまたはドリフト メトリック テーブルに作成します。次に、このクエリーの Databricks SQL アラートを作成します。 必要な頻度でクエリーを評価し、アラートがトリガーされた場合に通知を送信するようにアラートを構成できます。 デフォルトにより、Eメール通知が送信されます。 ウェブフックを設定したり、SlackやPagerdutyなどの他のアプリケーションに通知を送信したりすることもできます。

- モニターアラートは、他のDatabricks SQLアラートと同じ方法で作成可能
    - Databricks SQLクエリは、モニタープロファイルメトリックテーブル、ドリフトメトリックテーブルに作成する
    - クエリのSQLアラートを作成する。
    - 必要な頻度でクエリーを評価し、アラートがトリガーされた場合に通知を送信するようにアラートを構成できる
- 通知先は下記の通り
    - メール（デフォルト）
    - Slack、Pagedutyなどにも送信可能


# 実践
## 事前準備
1. Workspaceにサインインします。
1. [こちら](https://qiita.com/zumax/items/cbd9afb8924e2284ee4f)で作成したproductsテーブルを選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8a7581cd-9d70-b027-3313-ca58907adaf5.png)
1. ①「Quality」タブをクリックし、②「Get started」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/093b53a8-193f-f124-3373-f1ea71f60b04.png)
1. マニュアル更新で作成します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7069d1a9-1511-7e36-e2b2-59d70dbcbf73.png)
1. Refresh metricsをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9a960c1b-d9eb-dc47-b2db-b46cb871e723.png)
1. しばらくしてから、「View refresh history」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/51131244-b0e2-1f47-5d05-948508d8d68e.png)
1. Refreshが完了していました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5e42c74c-1724-ccd8-8d22-766546b70cb3.png)

1. View dashboardをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/685ad599-693a-f1c7-a296-3e40512041c6.png)

1. ダッシュボードが確認できました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/987a14f0-2c2e-0509-75b8-83cdf91b166f.png)

## アラートの設定
アラートを設定します。

1. Row countの①「：」メニューをクリックし、②「View query」をクリックしSQLエディタを開きます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a25457a9-9561-5481-a618-6899042967a9.png)

1. ①「：」メニューをクリックし、②「Create alert」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2c8f262a-c347-59a4-958f-19096996a432.png)

1. 10件超えたらアラートを出すように設定します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f9232b3c-bbc6-63cf-4425-31b7ed69e787.png)
1. 画面右上の「Refresh」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3a92a63d-0d93-c87d-8f41-6f6e48c116df.png)

1. OKになりました。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a793960c-5333-2fb0-6a70-4e1df8329381.png" width=400 >

## アラートの確認
1. 下記のクエリを実行し、20件の追加します。
    ```
    INSERT INTO test.retail.products (product_id, product_name, price, stock)
    VALUES
    (103, 'ラズベリー', 91.74, 145),
    (104, 'マンゴー', 132.79, 77),
    (105, 'ブルーベリー', 140.19, 186),
    (106, 'アボカド', 206.82, 114),
    (107, 'パパイア', 229.05, 49),
    (108, 'プラム', 251.57, 193),
    (109, 'アボカド', 154.91, 83),
    (110, 'ブルーベリー', 119.88, 44),
    (111, 'ラズベリー', 96.07, 104),
    (112, 'パパイア', 150.68, 58),
    (113, '梨', 157.68, 11),
    (114, 'ブルーベリー', 259.92, 26),
    (115, 'プラム', 214.2, 72),
    (116, 'グレープフルーツ', 70.72, 186),
    (117, 'オレンジ', 253.94, 25),
    (118, 'イチゴ', 95.68, 168),
    (119, 'キウイ', 220.74, 25),
    (120, 'スイカ', 267.77, 100),
    (121, 'アボカド', 196.17, 100),
    (122, 'ラズベリー', 197.52, 76);
    ```
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1600346c-88fe-0c40-3b99-30f7768a8a8d.png" width=400 />

1. 再び「Refresh」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3f96cce5-54d1-3c3f-d1c6-e437d72cc468.png" width=300 />

1. OKのままです。期待としてはエラーになってほしいところでした。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a793960c-5333-2fb0-6a70-4e1df8329381.png" width=400 >

1. Catalog Explorerに戻り、「Refresh metrics」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b963b49c-c9ab-fb74-5baf-06ec58aa2cb2.png)
1. 完了しました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4b381ddb-a819-2ad6-bf7a-cbc7ae82b942.png)
1. 再びAlertに戻り、「Refresh」をクリックします。
1. 「TRIGGERED」になりました。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/dfdaae51-7875-c416-c48a-5ed4846d6039.png" width=400 />

1. ダッシュボードを確認し、「Refresh」をクリックすると、件数は22件になりました。期待値としてはグラフ上でアラートがわかるようにしてほしいところ。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f3fe19cc-9204-0ccb-0783-39147aa955b1.png)


# 考察
今回、Lakehouse monitoringで作成した項目に対してしきい値を設けてAlertを発生することを確認しました。
Lakehouse monitoringで蓄積されたデータを活かしたアラートの検知ができると便利だと感じました。

- Alertが発生したら Lakehouse monitoringのダッシュボードで目視で確認できること
    - 例えば、背景や文字の色を変えるなど
- ~~静的な比較以外にも動的な式を設定できること~~
   ~~- 例えば、AWS GlueのAnomaly Detectionのように、過去の値のうち最小値と最大値を設定し、そのレンジから外れた場合に、エラーにするなど~~
    - こちらは、カスタムでAlertを作れば実装できますね。

今後、機能が追加されることを期待しています。

# 参考
https://docs.databricks.com/ja/lakehouse-monitoring/monitor-alerts.html

https://docs.databricks.com/ja/sql/user/alerts/index.html

https://qiita.com/zumax/items/abb01ece2d10d3b0375c

https://qiita.com/zumax/items/cbd9afb8924e2284ee4f