はじめに
Azureに日々溜まるログと格闘している皆さん こんにちは
Log Analytics(以下 LA)やApplication Insights(同 AI)のログどうやって分析してますか?
TL;DR;
- LA/AIのポータルでの分析は不満がある
- KQLマジック+Azure Notebooksで解決!
- 最初は認証が分かりにくかった
ポータル上でのログ クエリ
LAやAIではポータル組み込みのログ分析機能が提供されています。
LAやAIは Azure Data Explorer(Kusto)を基盤としているので、クエリ言語も同じKQL(Kusto Query Language)が利用できます。
インテリセンスもあり、ほどほどに使えますが、不満もあります。
-
不満点1 結果の保存
実行結果の保存はCSVかPowerBIへのエクスポートのみです。 -
不満点2 結果を保持できない
テーブルで表示した後にグラフで見ようとすると、再度クエリが走ります。
render演算子で最初から描画すれば別ですが…
2種類のクエリの結果を突き合わせようにも、保存されないので、
統合したクエリを書いて、クエリ実行になるので、分析としては効率が悪いです。 -
不満点3 クエリの保存がいまいち
保存先が共有
,ユーザー
と2種類選べますが、いずれもリソース固有になります。
QAと本番等複数環境作っている場合、環境毎に管理することになり煩雑です。
また、リソースの内部にクエリが保存されるので、客先サブスク上の作業では汚すのに抵抗があります。
具体的には以下に保存されています。- Application Insights
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/microsoft.insights/components/{workspaceName}/analyticsItems
- LogAnalytics
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}/savedSearches/
特にこちらはLog Analytics Alert API関連でも参照する子リソースで、
テンプレートで投入する場所でもあり避けたいところです。
KQLマジック
上記不満を解消して、サクサク分析できる方法を紹介します。
**jupyter-Kqlmagic**です。
Jupyter Notebookから、KustoやApplication Insights、LogAnalyticsにKQLを投げられます。
ちなみに、Azure Notebooksでは、あらかじめインストールしてあるので、すぐ使えます。
(Notebook作成時はPython 3.6を選びましょう)
つかいかた ざっくり
# インストール(アップデート)して
!pip install Kqlmagic --no-cache-dir --upgrade
# ロードして
%reload_ext Kqlmagic
# 接続(認証)して
%kql loganalytics://code;workspace='ワークスペースID';alias='YYYY';

# クエリ投げる!
%%kql AppServiceHTTPLogs
| summarize count() by bin(TimeGenerated,1h)

# DataFrameにして、プロットとか
df = _.to_dataframe()
df.plot(x=0,y=1)

# KQLのrenderも使える
%%kql AppServiceHTTPLogs
| summarize count() by bin(TimeGenerated,1h)
| render timechart

認証
GitHubの説明では、認証方式として5種類提示されています。
基本的にはAADのコード
方式で良いと思います。
AADのコード(デバイス コードフロー)
KQLMagicの出力するデバイスコードを認証画面に入力した後、AADにログインする方式です。
%kql loganalytics://code;workspace='全般>プロパティ>ワークスペースID';alias='YYYY';
%kql appinsights://code;appid='構成>APIアクセス>アプリケーションID';alias='YYYY';
# LAやAIの存在するAADテナントにゲストとして参加している場合
%kql loganalytics://code;workspace='全般>プロパティ>ワークスペースID';alias='YYYY';tenant='AADのテナントID'
%kql appinsights://code;appid='構成>APIアクセス>アプリケーションID';alias='YYYY';tenant='AADのテナントID'
AADのゲストアカウントはリソースのテナントIDをあらかじめ教えておかないと、以下の様なエラーが出ます。
{"error":{"message":"The provided authentication is not valid for this resource","code":"InvalidTokenError"}}
AADのID/PW
ヘルプには組織ネットワークでしか機能しないと書かれていますが、
組織ネットワーク上ってことはADなのか何なのか、結局この方式では認証を通すことができませんでした。
パスワードnotebookに書くのも気持ち悪い。
%kql loganalytics://username='<username>';password='<password>';workspace='<workspace-id>';alias='<workspace-friendly-name>'
%kql appinsights://username='<username>';password='<password>';appid='<app-id>';alias='<appid-friendly-name>'
AADのサービスプリンシパル(シークレット)
外部ゲストとして招待された、アプリ登録できないAADテナントのサブスクにある、LAやAIにアクセスしたかったので試していません。
%kql loganalytics://tenant='<tenant-id>';clientid='<aad-appid>';clientsecret='<aad-appkey>';workspace='<workspace-id>';alias='<workspace-friendly-name>'
%kql appinsights://tenant='<tenant-id>';clientid='<aad-appid>';clientsecret='<aad-appkey>';appid='<app-id>';alias='<appid-friendly-name>'
AppId/Key(AIのみ)
LAで使えないので…
%kql appinsights://username='<username>';password='<password>';appid='<app-id>';alias='<appid-friendly-name>'
匿名(anonymous)
%kql loganalytics://anonymous;workspace='<workspace-id>';alias='<workspace-friendly-name>'
%kql appinsights://anonymous;appid='<app-id>';alias='<appid-friendly-name>'
ヘルプにはローカルクラスタとか書かれてるけど、使いどころが不明…
参考
GitHub jupyter-Kqlmagic
Docs Azure Notebooks を使用した Kusto のクエリ
AzureDiagnosticsテーブル
そういえば、
Azure Monitorリソースログ(診断ログ)にリソース ログ収集モードというのが増えてますね。
今まではAzureDiagnosticsだったのが、リソースタイプ固有のテーブルに格納されるようになるとか。
移行の一環として、一部のリソースでは診断設定でモードを選択できる
らしいです。
再登場したAppServiceの診断ログは最初からリソース固有モード
ですね。
他にはBastionHost
がMicrosoftAzureBastionAuditLogs
テーブルに出てたり、
StorageBlobLogs
テーブルが増えてるので、Blobの$logsにしか出せなかったログがLAに出せるように(アラートが使えるように)なりそう。
どのリソースが対応してるのか一覧がないので、使うリソースがどういう状態か 度々調べたほうがよさそうです。
既存のアラートルールの突然死が怖いので、アナウンスなしで固有モード固定に変更とかはしないでね。。
実は、テーブルあたり500 のプロパティ制限
があるから、
複数のサービスからリソースログを収集している場合、AzureDiagnostics は、この制限を超えることがあり、データが失われる可能性が
あるそうで。DataFactoryを使ってると影響を受けやすい らしい。もうちょっと大きな声でアナウンスしてほしい。
おわりに
VSCodeでもJupyter Notebookが使えるらしいので、PCスペックが高い方は そちらも良いでしょう。
私の客先貸与のノートPCは、ストレージがHDDで、Electron系アプリが死ぬほど重いので無理ですが。
Azure Notebooksがあってよかった。
KQLマジックを使って、良いログ分析ライフをお過ごしください!!