Power Automate クラウド フローの実行履歴を Log Analytics ワークスペースにインポートする (実装編)

# はじめに

[前回の投稿](https://qiita.com/tetsuya-ooooo/items/b29ae8beb93cdea39dc8)では、準備編として以下のことを行いました。

- Azure AD にアプリケーションを登録して、Postman などを用いて Power Automate Flow API へのアクセスを確認する
- カスタム コネクタを作成する

今回は、実装編としてロジックアプリから Power Automate クラウド フローの実行履歴を収集して、Azure Log Analytics ワークフローにインポートするところについて説明していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/ed56fbc9-c109-4e0e-9fce-2957adfc09f8.png)

- **準備編** ... [前回の投稿](https://qiita.com/tetsuya-ooooo/items/b29ae8beb93cdea39dc8)
- **実装編** ... この投稿


# ロジックアプリを作成する

Power Automate クラウド フローの状態をなるべく早く検知したいので、短い間隔で定期的に実行させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/efe9bcc2-2503-231a-1864-d937c9e8d3a6.png)


## Power Automate クラウド フローの情報を取得

[アクションの追加] で、作成したカスタム コネクタを選択して、[アクション] から「Get Flow」をクリックしてアクションを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/afb916c1-4e13-cf93-db29-431490c6a106.png)

「Get Flow」アクションの各パラメーターを以下のように入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/57591567-b480-86c9-893a-c5861f6bdba2.png)

| パラメーター | 設定値 |
|:-|:-|
| Environment name | Power Platform の環境名 |
| API version | 2016-11-01 (既定値) |
| Filter | たとえば、有効なクラウド フローのみを取得したい場合は<br>→ ```state eq Started```<br>※無効は ```Stoped``` |
| Order by | たとえば、フロー名の昇順でソートしたい場合は<br> ```name``` |

取得したクラウド フローの情報の中には (ここでは) 不要なものがあるので、クラウド フローの実行履歴を収集するために必要な情報だけピックアップして、変数 (配列) に入れておくと良いでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/6de5a81d-8906-17a2-6db6-734069c49e7f.png)

該当したクラウド フローの情報が 50 レコードを超える場合、```nextLink``` プロパティに続きのレコードを取得するための URL が記載されています。なので、下図のように「条件」アクションを使って ```nextLink``` プロパティの存在有無を確認 (```empty``` 関数を使う) します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/53c7f54f-9d15-1c88-4301-02b781586c32.png)

その後のページネーション処理は 「Do Until」アクションで、 ```nextLink``` プロパティが存在し無くなるまで「Get Flow」アクションを実行し続けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/60bf7498-12bb-0faa-f93a-1592467ec3e0.png)

2 回目以降の「Get Flow」アクションの実行では、前回の「Get Flow」アクションで取得した ```nextLink``` プロパティの URL の QueryString に ```$filter``` ```$orderby``` ```$skiptoken``` が含まれているので、これらの値を抽出し、「Get Flow」アクションの各パラメーターに指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/aae16744-c490-1e74-fdfc-43905a2b7eef.png)

| パラメーター | 設定値 |
|:-|:-|
| Environment name | Power Platform の環境名 |
| API version | 2016-11-01 (既定値) |
| Filter | 抽出した ```$filter``` の値 |
| Order by | 抽出した ```$orderby``` の値 |
| Skip token | 抽出した ```$skiptoken``` の値 |


## Power Automate クラウド フローの実行履歴を収集

ループでフローごとに処理していきます。

[アクションの追加] で、作成したカスタム コネクタを選択して、[アクション] から「Get Flow Run」をクリックしてアクションを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/f83720d5-e4d9-bf95-9eea-fe48eac22ea6.png)

「Get Flow Run」アクションの各パラメーターを以下のように入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/4c862ccc-59c3-1a8c-f7ed-7d7e48086f1e.png)

| パラメーター | 設定値 |
|:-|:-|
| Environment name | Power Platform の環境名 |
| Flow name | 「Get Flow」アクションで取得した Flow 名 |
| API version | 2016-11-01 (既定値) |
| Filter | たとえば *From* ≦ クラウド フローの開始日時 ＜ *To* で抽出する場合<br>→ ```startTime gt 2022-07-01T00:00:00Z and startTime lt 2022-07-01T00:05:00Z``` <br>※日時のタイムゾーンは「UTC」 |
| Order By | たとえばクラウド フローの開始日時の昇順でソートする場合<br>→ ```startTime``` |

取得したクラウド フローの情報および実行履歴の中から、ログとして保存したい情報をピックアップして、変数 (配列) に入れておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/5143c6a5-18db-9c09-141d-f37d0275e654.png)

こちらも同じように、該当したクラウド フローの実行履歴が 50 レコードを超える場合、```nextLink``` プロパティに続きのレコードを取得するための URL が記載されています。なので、下図のように「条件」アクションを使って ```nextLink``` プロパティの存在有無を確認 (```empty``` 関数を使う) します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/19536121-dafd-6186-c81e-ae605d119e90.png)

こちらも同じように、その後のページネーション処理は 「Do Until」アクションで、```nextLink``` プロパティが存在し無くなるまで「Get Flow Run」アクションを実行し続けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/bf56d974-406e-efdb-3603-fe4dfef5bcd9.png)

2 回目以降の「Get Flow Run」アクションでは、前回の「Get Flow Run」アクションで取得した ```nextLink``` プロパティの URL の QueryString に ```$filter``` ```$orderby``` ```$skiptoken``` が含まれているので、これらの値を抽出し、「Get Flow Run」アクションの各パラメーターに指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/c5d90ac9-51fe-b9ad-7370-371d4b21daba.png)

| パラメーター | 設定値 |
|:-|:-|
| Environment name | Power Platform の環境名 |
| Flow name | 「Get Flow」アクションで取得した Flow 名 |
| API version | 2016-11-01 (既定値) |
| Filter | 抽出した ```$filter``` の値 |
| Order By | 抽出した ```$orderby``` の値 |
| Skip Token | 抽出した ```$skiptoken``` の値 |


## Log Analytics ワークフローにインポート

Azure Log Analytics ワークフローにログをインポートする場合は、「Azure Log Analytics Data Collector」コネクタの「Send Data (送信データ)」アクションを使います。

https://docs.microsoft.com/ja-jp/connectors/azureloganalyticsdatacollector/?WT.mc_id=AZ-MVP-5003113

「Send Data (送信データ)」アクションの各パラメーターを以下のように入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/3afb6092-5359-8258-492d-2de982b4c2a9.png)

| パラメーター | 設定値 |
|:-|:-|
| JSON 要求本文 | [「Get Flow Run」アクションの実行](#power-automate-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89-%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E5%AE%9F%E8%A1%8C%E5%B1%A5%E6%AD%B4%E3%82%92%E5%8F%8E%E9%9B%86)後にログとしてピックアップした情報を格納した変数 |
| カスタム ログの名前 | ユーザー定義ログ (カスタムテーブル) の名前<br>→ (例) ```FlowRunHistory``` |
| 時間生成フィールド | 今回は指定しない (空欄) |

「時間生成フィールド」は、```TimeGenerated``` フィールド (ログが記録されたときのタイムスタンプ) に挿入される値 (日時) で、「JSON 要求本文」の設定値内からフィールドを指定することができます。指定しない場合は、ログデータを取り込んだ時の日時が格納されます。なお、「JSON 要求本文」内のものを指定する場合、その指定したものはフィールドの値として格納されないので、```TimeGenerated``` フィールドに挿入される値を指定したい場合は、別途フィールドを設けたほうが良いでしょう。


# Azure Log Analytics ワークスペースで検索してみる

送信されたログデータが格納されているか確認するため、以下のクエリを実行します。
※ ```project``` は、単に列 (プロパティ) を並べ替えるだけに使っています。
※テーブル名は、[「Send Data (送信データ)」アクション](#log-analytics-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AB%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88)の「カスタム ログの名前」パラメーターで指定した値 ```FlowRunHistory``` の末尾に ```_CL``` が付きます。
※各プロパティ名にはデータ型に応じて、末尾にサフィックスが付きます。

```
FlowRunHistory_CL 
| order by TimeGenerated desc nulls last 
| project TimeGenerated, DisplayName_s, RunName_s, StartTime_t, EndTime_t, Status_s, EnvironmentName_g, FlowName_g
```

このように、Power Automate クラウド フローの実行履歴が格納されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/d74b0db4-913d-9975-cb8c-adcf5de163e5.png)


# まとめ

[前回の投稿](https://qiita.com/tetsuya-ooooo/items/b29ae8beb93cdea39dc8)を含め、Power Automate クラウド フローの実行履歴を Azure Log Analytics ワークスペースに格納することができました。これで Azure Monitor のアラート機能を使って、エラーが発生した際にすぐに何らかのアクションを実施することができます。