Application Insightsのログ検索(Log Analytics)でJSONを展開する方法

Application Insightsのログ検索(Log Analytics)はKusto Query Languageという言語のようです。

Application Insightsのログ検索機能ですが、SDK使えば簡単にログ情報を構造化して保存できて、後で検索もしやすいです。使えるようになれば、凄い便利なのに調べるのに時間がかかるのは、自分の調査能力不足なのでしょうか・・・

前置きが長くなりましたが、JSONを展開する方法がわからなくて調べたので書いておきます。

答え

ここから色々触ったこと書きますが、とりあえず答えが知りたい人は以下のリンクからPlayGround動かしてみるのが一番早いです。

PlayGround

ユースケース

今回のケースは、Nodejsのアプリケーションから、こんな感じでEventを発行した時のケースです。

let appInsights = require("applicationinsights");
appInsights.setup().start(); 
let client = appInsights.defaultClient;

client.trackEvent({name: "customEvent", properties: {user: "user1",message: "Test Message"}});

結果を抜粋すると、このようなJSONを含んだ形のデータになると思います。実際にはusermessageを列として出力したい場面もあるかと思います。そのために今回はこのJSONを展開します。

name customDimensions
customEvent {"user":"user1","message","Test Message A"}
customEvent {"user":"user2","message","Test Message B"}
customEvent {"user":"user3","message","Test Message C"}

customDimensionsの型

JSON部分の型を確認してみるとJSON部分は実はstringではなく dictionary 型であることがわかります。

customEvents
| project type = gettype(customDimensions)
| limit 1

プレイグラウンドでイベントをエミュレート

実はログ検索にはプレイグラウンドが用意されています。

ここ使ってエミュレートしてみます。その際、 datatable という命令文で生成可能です。

https://analytics.applicationinsights.io/demo#/discover/query/main

string 型のjsonプロパティで定義して、後からdictionary型にparseしています。

datatable(name:string, json:string) 
[
  "customEvent",' {"user":"user1","message":"Test Message A"} ',
  "customEvent",' {"user":"user2","message":"Test Message B"} ',
  "customEvent",' {"user":"user3","message":"Test Message C"} ',
]
| project name,customDimensions=parse_json(json) 

これで準備ができました。

JSONを展開する

JSONを展開するにはparsejson を使って、extend( extend newColmun=Expression )で新しい列として割り当てます。

datatable(name:string, json:string) 
[
  "customEvent",' {"user":"user1","message":"Test Message A"} ',
  "customEvent",' {"user":"user2","message":"Test Message B"} ',
  "customEvent",' {"user":"user3","message":"Test Message C"} ',
]
| project name,customDimensions=parse_json(json) 
| extend user=parsejson(customDimensions.['user'])
| extend message=parsejson(customDimensions.['message'])
| project user,message

こんなテーブルが出力されるはずです。

user message
user1 Test Message A
user2 Test Message B
user3 Test Message C

実際のイベントにも以下のように適用できます。

customEvents
| extend user=parsejson(customDimensions.['user'])
| extend message=parsejson(customDimensions.['message'])
| project user,message

参照リンク

クエリ言語のリファレンス

https://docs.microsoft.com/ja-jp/azure/kusto/query/

プレイグラウンド

https://analytics.applicationinsights.io/demo#/discover/query/main