1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

KQLマジックを使ってAzureのログを分析する

Posted at

はじめに

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の診断ログは最初からリソース固有モードですね。
他にはBastionHostMicrosoftAzureBastionAuditLogsテーブルに出てたり、
StorageBlobLogsテーブルが増えてるので、Blobの$logsにしか出せなかったログがLAに出せるように(アラートが使えるように)なりそう。

どのリソースが対応してるのか一覧がないので、使うリソースがどういう状態か 度々調べたほうがよさそうです。
既存のアラートルールの突然死が怖いので、アナウンスなしで固有モード固定に変更とかはしないでね。。

実は、テーブルあたり500 のプロパティ制限があるから、
複数のサービスからリソースログを収集している場合、AzureDiagnostics は、この制限を超えることがあり、データが失われる可能性が
あるそうで。DataFactoryを使ってると影響を受けやすい らしい。もうちょっと大きな声でアナウンスしてほしい。

おわりに

VSCodeでもJupyter Notebookが使えるらしいので、PCスペックが高い方は そちらも良いでしょう。
私の客先貸与のノートPCは、ストレージがHDDで、Electron系アプリが死ぬほど重いので無理ですが。
Azure Notebooksがあってよかった。

KQLマジックを使って、良いログ分析ライフをお過ごしください!!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?