Application Insightsのログ検索(Log Analytics)はKusto Query Languageという言語のようです。
Application Insightsのログ検索機能ですが、SDK使えば簡単にログ情報を構造化して保存できて、後で検索もしやすいです。使えるようになれば、凄い便利なのに調べるのに時間がかかるのは、自分の調査能力不足なのでしょうか・・・
前置きが長くなりましたが、JSONを展開する方法がわからなくて調べたので書いておきます。
答え
ここから色々触ったこと書きますが、とりあえず答えが知りたい人は以下のリンクから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を含んだ形のデータになると思います。実際にはuser
やmessage
を列として出力したい場面もあるかと思います。そのために今回はこの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