Kusto の使い方と連携のTips


# はじめに
本記事は、Microsoft Azure Tech Advent Calendar 2020 の投稿です。
今回は普段からよく使っているKusto の使い方と連携に関するTipsを書きたいと思います。


## 1. Kusto とは
AzureではKusto クエリ言語を使用してデータ分析を容易に行うことが出来ます。

KustoはAzure Data Explorer という大規模なデータに対する対話型分析を行うためのサービスやAzure Log Anayticsというログ管理ソリューションで用いられている言語です。シンプルな構文でデータ分析を行うことができ、以前からマイクロソフト社内でも多く使用されてきました。

今回の記事ではKustoを使ったことがある前提で記載しているため、初めての方は以下の公開情報を適宜ご参照下さい。

Kusto を使ってログを効率的に検索する
https://qiita.com/ykataoka/items/689bdec7c467edddc2fd

Kusto の概要
https://docs.microsoft.com/ja-jp/azure/data-explorer/kusto/concepts/


## 2. Kustoの使い方Tips


### cluster名 と database名
主に複数Azure Data Explorer（Kustoクラスター）を使っている方向けですが、Kustoクエリでは、クラスター名とデータベース名をクエリ内で指定することが出来ます。よく使うクエリを共有している場合もあると思いますが、クエリだけではテーブル名のみが含まれており、実行先のサーバー名が分からない場合が出てくるため、よく使うクエリに対してはこうして情報を記載しておくと便利です。

構文 : cluster('クラスター名').database('データベース名').テーブル名 

```Kusto:sample1.csl
StormEvents
| where StartTime >= datetime(2007-01-01)
| where EventType == 'Heavy Rain'
```

```Kusto:sample２.csl
cluster('help').database('Samples').StormEvents
| where StartTime >= datetime(2007-01-01)
| where EventType == 'Heavy Rain'
```

### has（Contains）/in/has_anyを使って絞る
has（Contains）/in/has_anyを用いることで検索対象を絞ることが可能です。
具体的には、has（Contains）は特定のキーワードを含むレコードを探す際に、in/has_anyは指定したいずれかの条件に合致するレコードを探す際に利用します。例えば以下のような構文です。

```Kusto:sample3.csl
// Contains - testを含むレコードをEventTypeのフィールドから検索する
cluster('help').database('Samples').StormEvents
| where EventType contains "test"

// Has - testを含むレコードをEventTypeのフィールドから検索する
cluster('help').database('Samples').StormEvents
| where EventType has "test"

// In  - EventTypeがA, B, C のいずれかであるレコードを検索する
cluster('help').database('Samples').StormEvents
| where EventType in ("A", "B", "C")
```
もし、条件に合致しないものを探す場合には ! をつけます。（例：!has, !contains, !in）
もし、テーブルを絞り切れない場合には * を該当フィールドに指定することが可能です。（例：where * has "test"）

なお、上でHasとContainsを部分一致の演算子として紹介しましたが、一般的にHasの方が高速です。Hasがつく演算子は内部的で作成・保持されているインデックスを用いた処理になるため、ベストプラクティスとしてもHasの使用がおすすめです。
また、in と has_any は大文字と小文字が区別されるか否かが異なります。


### パフォーマンスを上げる - and / or を用いて条件はシンプルに
Kustoクエリは "|" を用いて簡単に検索条件を追加することが出来ますが、場合によっては計算量が多くなり、検索処理に時間がかかる場合があります。（その他のデータベースと同様にクエリの書き方によっては処理時間が変動します）もし、Whereを用いて2行以上に渡って条件を記載している場合、以下のようにand/or を使って一行にまとめることでパフォーマンスが改善する可能性があります。

```Kusto:and_sample_bad.csl
cluster('help').database('Samples').StormEvents
| where StartTime >= datetime(2007-01-01)
| where EventType == 'Heavy Rain'
```

```Kusto:and_sample_good.csl
cluster('help').database('Samples').StormEvents
| where StartTime >= datetime(2007-01-01) and EventType == 'Heavy Rain'
```


### パフォーマンスを上げる2 - 大文字と小文字が区別される演算子を用いる
Kustoの演算子の中には、大文字と小文字が区別されるものとされないものが存在しますが、もし区別される演算子を用いて意図した結果が得られるのであれば、そちらを選択しましょう。実際のデータ量にも依存するかと思いますが、パフォーマンスが多少なりとも早くなる可能性があります。

その他のベストプラクティスはこちらにまとまっているので、ぜひご参照下さい。
https://docs.microsoft.com/ja-jp/azure/data-explorer/kusto/query/best-practices


## 3. Kustoの連携Tips

Azure Logic AppやMicrosoft Automateを用いることで、Kustoクエリを用いて様々なアクションを実行することが出来ます。以下のように、Azure Data Explorer（Kustoクラスター）やAzure Monitor Logs（Log Analytics/Application Insights）へ接続するためのコネクターが用意されているため、特別な実装をすることなく、各種サービスと連携することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309963/d8a7a89b-6e26-1443-b1b4-9ae7df533291.png)

今回は、Logic Appを用いてAzure Monitorのログを格納しているLog Analyticsへ接続し、その結果をメールで送付するサンプルを作成してみます。

#### サンプル作成
Logic Appsを作成し、任意のトリガー設定後に以下のアクションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309963/70083d9b-bf18-5cae-ef05-92a7023751fb.png)

次に実行したいKustoクエリや表示したいChart Type（テーブルやパイチャートなど）を以下のように選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309963/bd1cd7e9-db29-9acf-5f1e-8d4c0049a30f.png)

パイチャートを張り付ける場合、メールを送付するアクションの前に、変数（String型）のアクションを実行し、以下のように値を定義します。
そして、メールのBodyへの貼り付けと添付ファイルを設定を行います。（詳細は以下で補足します。）

```LogicApp:Variable_Value
<img src="cid:@{body('Run_query_and_visualize_results')?['attachmentName']} "/>
```

変数は以下のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309963/3c774880-fe6c-6273-1c1c-9768e3c11268.png)


最後にメールを送付するため、Office 365 Outlookのメールを送信するアクションを選びます。
もし、上のステップでHTML TableをChart Typeとして選択している場合には、Attchment Nameの動的変数をBodyに追加するだけでOKです。
もし、Pie Chartなど選択している場合には、事前に用意していたString型の変数をBodyに貼り付けます。

そして、メールの添付ファイルとしてAttachment Content/Attachment のプロパティを指定します。同名の動的変数が選択できるため、それぞれ選択するだけでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309963/7b1743a8-f058-7864-0f26-b92f322137d8.png)


このLogic Appが実行されると以下のようなメールが送られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309963/a4790e7a-f0b0-070c-d94d-d3d00f1121df.png)


こちらが少しでも参考になれば幸いです！
[Kusto][link]との距離が少しでも縮まりますように！ 
[link]:https://dataexplorer.azure.com/clusters/help/databases/Samples?query=H4sIAAAAAAAAA42STQqDQAyF9z3Fw9m00EV//FlIj9AbzEaKlIKVork/NZqZiTMWOuAzhvA+k0zXEt6nM27IbG/JkjEAWMxyOGdJPjFFUdb2Wb3rZpcLu2BlIiLlYgnE7nMYjK7bRlLN2fS4aikWTpqJWblmmVD8P0vegeWj5VGwQsHUL7ox+DmvUa4azjuBhYkqWKlhMMk6dG8hs+rhB0hBqnRVkWU0z60t+ch3idDMZ3j1hHs7js2znWgjDY+G9tOlPfKdY7my5CwFS8lSHeovnyXRaNwCAAA=
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309963/bbdfbe9f-9df8-b456-9e4a-afa92323db44.png)