イベントハウスを使用したデータパイプラインの結果の保管・分析

## はじめに

イベントハウスにパイプラインからアクティビティの出力を記録する方法を記載します。


## 準備

1. [Microsoft Fabric でパイプラインを使用してデータを取り込む](https://microsoftlearning.github.io/mslearn-fabric.ja-jp/Instructions/Labs/04-ingest-pipeline.html) を参考にデータを取り込むパイプラインを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b951c6ca-769f-a747-7576-11bb671f66d7.png)


1. ノートブックの最後には 終了で結果を返すようにしておきます。
    ```python:pyspark
    
    import json
    
    count = df.count()
    
    # ノートブックの実行結果を返す
    result = {
        "df_count" : count,
    }
    result_str=json.dumps(result)
    mssparkutils.notebook.exit(result_str)
    
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/fa171404-18ab-163d-456a-cacfed1762dc.png)
1. 実行を確認して、出力値を確認しておきます。これらが KQLに入力したい値です。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d61ed261-f703-916d-2916-e9f651e9645a.png)

## 手順

1. イベントハウスを作成します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9d72d09c-70da-e616-46e9-e3f7de522aa5.png)

1. KQL データベース上で、テーブルを作成します。

    ```SQL:KQL
    
    // Create table command
    ////////////////////////////////////////////////////////////
    .create table ['pipeline']  (['result']:dynamic)
    
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a2dc69ad-86fe-6371-ac00-04691f569f05.png)
1. パイプラインに戻って、KQL スクリプトアクティビティを追加します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d18c13fe-21f0-1283-f9bd-a78a5f43f3f5.png)
    
    :::note info
    
    エラー時の情報を取得する場合は、以下のようにエラー分岐ごとに KQL を設置するほかないようです。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1a292596-6eea-c807-a846-6da6970e6d9e.png)
    :::
1. 設定で、あてさきのKQLデータベースを選択し、動的なコンテンツを開きます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a5ab3e0b-63a8-20de-32e3-4367d97c102c.png)

1. 動的なコンテンツに以下を入力します。

    ```json:pipeline式
    
    @concat('
    .ingest inline into table pipeline with (format = "json") <|
    {"result":{'
    ,' "workspaceId":"',pipeline().DataFactory,'"'
    ,',"pipelineId":"',pipeline().Pipeline,'"'
    ,',"pipelineRunId":"',pipeline().RunId,'"'
    ,',"pipelineTriggerTime":"',pipeline().TriggerTime,'"'
    ,',"pipelineEndTime":"',utcNow(),'"'
    ,',"status":"success"'
    ,',"activities":['
    ,' {"name":"<アクティビティ名を入れる>"'
    ,',"result":',,'}'
    ,']}}'
    )
    
    ```
1. 入力したい出力をもつアクティビティを追加します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c7d87e92-432c-e62d-187f-5efd3483dd0b.png)



1. 複数入れる場合は、カンマの数などに注意して追加していきます。以下のようになりました。（activities 先頭のオブジェクトだけカンマ無し、後はあり。）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b8166ba7-183f-2395-9f37-b90b96455bfd.png)
   

1. パラメータなどほかの値を入れる場合はこのようにします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f322b077-da0d-7a7e-53e0-b8532a43fc3d.png)

1. 実行し、成功すると、KQL データベース上のテーブルに結果が格納されます。
    ```sql:kql
    
    // Use 'take' to view a sample number of records in the table and check the data.
    pipeline
    | take 100
    
    
    ```
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5a766069-781f-4eaf-5c5d-2b55d2a37390.png)
        
    :::note info
    KQL でエラーがある場合、HasErrorsでのみわかる点に注意    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/19b0d0a0-1504-0552-6d54-ecf9368a0612.png)
    :::
7. KQL例
    
    ```sql:kql
    
    
    pipeline
    | project 
        pipelineTriggerTime = todatetime(result.pipelineTriggerTime)
        ,pipelineRunId = tostring(result.pipelineRunId)
        ,duration =  bin(todatetime(result.pipelineEndTime)-todatetime(result.pipelineTriggerTime),1s) 
        ,status = tostring(result.status)
        ,delete_result = result.activities[0].result 
        ,copy_result = result.activities[1].result 
        ,notebook_result = result.activities[2].result 
        ,url = strcat('https://app.powerbi.com/workloads/data-pipeline/monitoring/workspaces/',result.workspaceId,'/pipelines/',result.pipelineId,'/',result.pipelineRunId)
    | order by ingestion_time()desc 
    
    ```
    delete result
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4d8955ed-fb52-0344-ee8e-68efd70ec244.png)
    copy_result    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/03973bd6-a10e-815a-321b-8ae1696196b7.png)
    notebook_result
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/07d7ed03-9a1b-05fc-abc1-e7a21fc6d9eb.png)

1. KQL を基にダッシュボード化することも可能です。この例では URL を作りこんでいるので、直接監視ハブに遷移可能です。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7b0749e2-8052-73bc-8c1a-b6491d64307a.png)