OneLake にファイルがアップされたらパイプラインを実行する

## はじめに

[Announcing new event categories in Fabric Real-Time Hub](https://blog.fabric.microsoft.com/ja-jp/blog/announcing-new-event-categories-in-fabric-real-time-hub?ft=Real-time-intelligence:category)にて、OneLake のファイルイベントの監視ができるようになったので、ファイルがアップされたらパイプラインを実行する手順を紹介します。

参考：https://learn.microsoft.com/en-us/fabric/real-time-hub/create-streams-fabric-onelake-events

## 準備

### レイクハウス

upload フォルダを作成しておきます。ここにファイルをアップします。

### データパイプラインの設定

upload フォルダからコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1657805e-37ae-851c-849a-c431df57c785.png)

コピーが完了したら削除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/07ad3c7e-e747-05f4-dc87-cc5f686fbb0e.png)


あて先設定では backup フォルダに実行IDフォルダを作成してコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8bc89499-b14b-0619-802f-488f0478e92f.png)


```


@concat('backup/',pipeline().RunId)

```

## 1. アップされたファイルごとにパイプラインを起動

まずはもっとも単純なパターン

1. リアルタイムハブにアクセスし、OneLake イベントのアラート作成を選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/686a2c5b-a0da-5d23-f857-f9b8ec232b84.png)

1. イベントソースの設定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/26401576-b654-b49d-cf44-93603f9f6abe.png)

1. イベント選択で、FileCreatedを選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/aedf8cde-68c9-3f59-b9cf-8f260232fd68.png)

1. 監視するイベントの選択から監視対象のフォルダを選択して保存
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a6dbed92-c8e2-a986-7cb0-41ec2b47c1ea.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/40c35aa0-db8c-54f3-c99e-740d8cc9dba9.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/56e2f432-da0b-8479-9113-75351ea8a798.png)

1. アクションで実行したいパイプラインを選択してこのルールを作成するアクティベータ（今回は新規作成）を決めて作成
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/13521acb-28b6-ddff-673a-12f18ec1f109.png)

1. ファイルをアップすると、ルールの画面で検知・起動されます
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/388f9d62-163c-051f-e348-1e09ec7c8ceb.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/91e109c2-41d0-284b-7838-d4b9d99e5ef2.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9c3a3ef9-4847-60ba-7a8f-23bb86b93e88.png)
    ※少しルールが有効になるのにラグがあるようなので、2ファイルめを追加で起動されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ce74b142-c052-747e-92ad-6dbd01c70e23.png)

1. 監視ハブとレイクハウスの状態からも実行確認
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a16facc7-48d9-a51d-88bf-eedd3ecff588.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7495f7fc-9338-7d33-c40f-e8ef96ee472a.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b5b05479-613a-1abc-7145-a09d0413861c.png)

### 問題点

この状態だと、3つのファイルをアップすると、三回パイプラインが起動されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/cb4e02ed-6445-cd7e-aad0-34839d12c4d7.png)

検知したイベント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/677e5479-b23c-fa46-ba34-3f49bf01422b.png)

パイプラインを起動した回数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b61ff349-f65d-ff80-93ab-712ed7b77b5a.png)

3回同時に起動したので3個のRunIDフォルダが生成されてしまった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b7197a0a-06c0-f1b6-c280-15c6a64339db.png)


次の方法でこれを対処します。

## 2. 一定時間ごとにファイルが一つでもアップされたら一回だけパイプラインを起動

1. 既存のアラートは削除します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/cf348534-7f3f-792f-5c03-8672a40485a5.png)
1. New object を選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3f95f4ab-e9bf-4c27-cf0f-913bc8a55527.png)
1. 一意のIDを_source(監視対象＝upload フォルダのこと)にして、ファイル作成イベントをすべて個別イベントとして扱ってカウントするのではなく、ファイル作成という1種類のイベントの回数をトラックしてやります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/cce86214-e0c1-9e9e-0e1b-06ca2f986656.png)

1. これにより、監視しているディレクトリで起きているファイル作成はすべて同一の対象として追跡されるようになります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/10631395-d7ab-ea83-3a85-b71fe2783150.png)
    
    :::note info

    文章だとわかりづらいですが、これを実施する前の追跡では、ファイルごとに個別のイベントとして記録されていたため、特定時間に何回そのイベントが起きたか、という数え方をしても1回+1回+1回という答えになってしまいます。なので、それぞれのイベントに対応する形でパイプラインが起動し、計3回の実行になりました。
    :::

1. プロパティとしてイベントを追跡すると、それぞれの個体ごとにデータの変動などを監視できます。これを応用して、ルール作成時に10分毎に対象ディレクトリが何回ファイル作成イベントを発生させたかという集計をしてやります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/35a0e1e4-cf2b-aa8b-61dc-b7488f1a2eb7.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/24365856-8007-a7d2-bd7c-391c0d95f2bc.png)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ec3f8142-d367-8721-d7d0-d23bcfb33b5e.png)


1. 集計されたイベントにより、10分枠で考えたときに5回イベントが発生した10分、なにも発生しなかった10分、次にアップが発生した10分・・・という結果が算出されました。1回以上イベントが発生を条件にしてやると、このようになります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/062c31e7-aeec-6dce-c3c3-2da93ddabeac.png)



1. これで、パイプライン起動を設定してやることで複数ファイルがアップされても1度の起動となるように構成されました。※10分毎に評価
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/22cfed2c-5cf5-d1b2-dfba-2f0e765cd762.png)

    アップロード
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/55d05034-cf10-b1e8-6c49-f39db07c740b.png)
    次の10分枠評価タイミングで、一つのRunIdのみ移動（5つ目のフォルダ）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/702f6bf6-7158-c569-79eb-219894b50ff3.png)

        
    
以上です。

## 補足

現状では、アクティベータからパイプラインにパラメータを渡すことはできないようでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/407b3b73-ef27-4d36-c9f7-5d16a405a517.png)