チュートリアル: ノートブックを使用して Azure Monitor ログ データを分析する

ノートブックは、ライブ コード、数式、視覚化、テキストを使用してドキュメントを作成および共有できる統合環境です。 ノートブックと Log Analytics ワークスペースを統合すると、前の手順の結果に基づいて各ステップでコードを実行するマルチステップ プロセスを作成できます。 このような合理化されたプロセスを使用して、機械学習パイプライン、高度な分析ツール、サポート ニーズに対応したトラブルシューティング ガイド (TSG) などを構築できます。

ノートブックと Log Analytics ワークスペースを統合すると、次のことができます。

  • 任意の言語で KQL クエリとカスタム コードを実行します。
  • 新しい機械学習モデル、カスタム タイムライン、プロセス ツリーなど、新しい分析と視覚化機能を導入します。
  • オンプレミスのデータ セットなど、Azure Monitor ログの外部にデータ セットを統合します。
  • クエリ API の制限を使用して、Azure portal と比較してサービスの制限を増やします。

このチュートリアルでは、以下の内容を学習します。

ノートブックを使用して Azure Monitor ログのデータを分析する機械学習パイプラインをビルドする方法の例については、「サンプル ノートブック: 機械学習手法を使用して Azure Monitor ログの異常を検出する」を参照してください。

前提条件

このチュートリアルには、次のものが必要です。

ツールとノートブック

このチュートリアルでは、次のツールを使用します。

ツール 説明
Azure Monitor クエリ クライアント ライブラリ Azure Monitor ログ内のデータに対して読み取り専用クエリを実行できます。
Azure ID クライアント ライブラリ Azure SDK クライアントが Microsoft Entra ID で認証できるようにします。
Azure Monitor インジェスト クライアント ライブラリ ログ インジェスト API を使用して、カスタム ログを Azure Monitor に送信できます。 Log Analytics ワークスペース内のカスタム テーブルに分析されたデータを取り込むには必須 (省略可能)
データ収集ルールデータ収集エンドポイント、および 登録済みアプリケーション Log Analytics ワークスペース内のカスタム テーブルに分析されたデータを取り込むには必須 (省略可能)

使用できるその他のクエリ ライブラリは次のとおりです。

  • Kqlmagic ライブラリ を使用すると、Log Analytics ツールから KQL クエリを実行するのと同じ方法で、ノートブック内で KQL クエリを直接実行できます。
  • MSTICPY ライブラリ は、組み込みの KQL 時系列および機械学習機能を呼び出すテンプレート化されたクエリを提供し、Log Analytics ワークスペース内のデータの高度な視覚化ツールと分析を提供します。

高度な分析のためのその他の Microsoft ノートブック エクスペリエンスは次のとおりです。

1. Log Analytics ワークスペースをノートブックと統合する

Log Analytics ワークスペースに対してクエリを実行するようにノートブックを設定します。

  1. Pandas データ分析ライブラリ Plotly 視覚化ライブラリと共に、Azure Monitor クエリ、Azure Identity、Azure Monitor インジェスト クライアント ライブラリをインストールします。

    import sys
    
    !{sys.executable} -m pip install --upgrade azure-monitor-query azure-identity azure-monitor-ingestion
    
    !{sys.executable} -m pip install --upgrade pandas plotly 
    
  2. 次の LOGS_WORKSPACE_ID 変数を Log Analytics ワークスペースの ID に設定します。 変数は現在、ノートブックのデモに使用できる Azure Monitor デモ ワークスペースを使用するように設定されています。

    LOGS_WORKSPACE_ID = "DEMO_WORKSPACE"
    
  3. Azure Monitor ログの認証とクエリを実行するように LogsQueryClient を設定します。

    このコードは、 DefaultAzureCredential を使用して認証するように LogsQueryClient を設定します。

    from azure.core.credentials import AzureKeyCredential
    from azure.core.pipeline.policies import AzureKeyCredentialPolicy
    from azure.identity import DefaultAzureCredential
    from azure.monitor.query import LogsQueryClient
    
    if LOGS_WORKSPACE_ID == "DEMO_WORKSPACE":
        credential = AzureKeyCredential("DEMO_KEY")
        authentication_policy = AzureKeyCredentialPolicy(name="X-Api-Key", credential=credential)
    else:
        credential = DefaultAzureCredential()
        authentication_policy = None
    
    logs_query_client = LogsQueryClient(credential, authentication_policy=authentication_policy)
    

    通常、LogsQueryClient は Microsoft Entra トークン資格情報を使った認証のみをサポートします。 ただし、カスタム認証ポリシーを渡して API キーの使用を有効にすることはできます。 これにより、クライアントは デモ ワークスペースに対してクエリを実行できます。 このデモ ワークスペースの可用性とアクセスは変更される可能性があるため、独自の Log Analytics ワークスペースを使用することをお勧めします。

  4. Log Analytics ワークスペースで特定のクエリを実行し、結果を Pandas DataFrame として返す query_logs_workspace と呼ばれるヘルパー関数を定義します。

    import pandas as pd
    import plotly.express as px
    
    from azure.monitor.query import LogsQueryStatus
    from azure.core.exceptions import HttpResponseError
    
    
    def query_logs_workspace(query):
        try:
            response = logs_query_client.query_workspace(LOGS_WORKSPACE_ID, query, timespan=None)
            if response.status == LogsQueryStatus.PARTIAL:
                error = response.partial_error
                data = response.partial_data
                print(error.message)
            elif response.status == LogsQueryStatus.SUCCESS:
                data = response.tables
            for table in data:
                my_data = pd.DataFrame(data=table.rows, columns=table.columns)        
        except HttpResponseError as err:
            print("something fatal happened")
            print (err)
        return my_data
    

2. ノートブックで Log Analytics ワークスペースからデータを探索して視覚化する

ノートブックからクエリを実行して、ワークスペース内のデータを見てみましょう。

  1. このクエリでは、過去 1 週間に Log Analytics ワークスペースの各テーブル (データ型) に取り込んだデータの量 (メガバイト単位) を確認します。

    TABLE = "Usage"
    
    QUERY = f"""
    let starttime = 7d; // Start date for the time series, counting back from the current date
    let endtime = 0d; // today 
    {TABLE} | project TimeGenerated, DataType, Quantity 
    | where TimeGenerated between (ago(starttime)..ago(endtime))
    | summarize ActualUsage=sum(Quantity) by TimeGenerated=bin(TimeGenerated, 1h), DataType
    """
    
    df = query_logs_workspace(QUERY)
    display(df)
    

    結果の DataFrame には、Log Analytics ワークスペース内の各テーブルの 1 時間ごとのインジェストが表示されます。

    Screenshot of a DataFrame generated in a notebook with log ingestion data retrieved from a Log Analytics workspace.

  2. 次に、Pandas DataFrame に基づいて、時間の経過に伴うさまざまなデータ型の時間単位の使用状況を示すグラフとしてデータを表示してみましょう。

    df = df.sort_values(by="TimeGenerated")
    graph = px.line(df, x='TimeGenerated', y="ActualUsage", color='DataType', title="Usage in the last week - All data types")
    graph.show()
    

    結果の グラフ は次のようになります。

    A graph that shows the amount of data ingested into each of the tables in a Log Analytics workspace over seven days.

    ノートブック内の Log Analytics ワークスペースからログ データのクエリと視覚化が正常に完了しました。

3. データを分析する

簡単な例として、最初の 5 行を見てみましょう。

analyzed_df = df.head(5)

Azure Monitor ログのデータを分析する機械学習手法を実装する方法の例については、「サンプル ノートブック: 機械学習手法を使用して Azure Monitor ログの異常を検出する」を参照してください。

4. Log Analytics ワークスペース内のカスタム テーブルに分析されたデータを取り込む (省略可能)

Log Analytics ワークスペース内のカスタム テーブルに分析結果を送信して、アラートをトリガーしたり、さらに分析できるようにしたりします。

  1. Log Analytics ワークスペースにデータを送信するには、「チュートリアル: ログ インジェスト API を使って Azure Monitor ログにデータを送信する (Azure portal)」で説明されているように、カスタム テーブル、データ収集エンドポイント、データ収集ルール、データ収集ルールを使うアクセス許可を持つ登録済みの Microsoft Entra アプリケーションが必要です。

    カスタム テーブルを作成する場合:

    1. 次のサンプル ファイルをアップロードして、テーブル スキーマを定義します。

      [
        {
          "TimeGenerated": "2023-03-19T19:56:43.7447391Z",    
          "ActualUsage": 40.1,    
          "DataType": "AzureDiagnostics"     
        } 
      ]
      
  2. ログ インジェスト API に必要な定数を定義します。

    os.environ['AZURE_TENANT_ID'] = "<Tenant ID>"; #ID of the tenant where the data collection endpoint resides
    os.environ['AZURE_CLIENT_ID'] = "<Application ID>"; #Application ID to which you granted permissions to your data collection rule
    os.environ['AZURE_CLIENT_SECRET'] = "<Client secret>"; #Secret created for the application
    
    
    
    os.environ['LOGS_DCR_STREAM_NAME'] = "<Custom stream name>" ##Name of the custom stream from the data collection rule
    os.environ['LOGS_DCR_RULE_ID'] = "<Data collection rule immutableId>" # immutableId of your data collection rule
    os.environ['DATA_COLLECTION_ENDPOINT'] =  "<Logs ingestion URL of your endpoint>" # URL that looks like this: https://xxxx.ingest.monitor.azure.com
    
  3. Log Analytics ワークスペースのカスタム テーブルにデータを取り込みます。

    from azure.core.exceptions import HttpResponseError
    from azure.identity import ClientSecretCredential
    from azure.monitor.ingestion import LogsIngestionClient
    import json
    
    
    credential = ClientSecretCredential(
        tenant_id=AZURE_TENANT_ID,
        client_id=AZURE_CLIENT_ID,
        client_secret=AZURE_CLIENT_SECRET
    )
    
    client = LogsIngestionClient(endpoint=DATA_COLLECTION_ENDPOINT, credential=credential, logging_enable=True)
    
    body = json.loads(analyzed_df.to_json(orient='records', date_format='iso'))
    
    try:
       response =  client.upload(rule_id=LOGS_DCR_RULE_ID, stream_name=LOGS_DCR_STREAM_NAME, logs=body)
       print("Upload request accepted")
    except HttpResponseError as e:
        print(f"Upload failed: {e}")
    

    Note

    Log Analytics ワークスペースにテーブルを作成すると、取り込まれたデータがテーブルに表示されるまでに最大 15 分かかることがあります。

  4. カスタム テーブルにデータが表示されることを確認します。

    Screenshot that shows a query in Log Analytics on a custom table into which the analysis results from the notebook were ingested.

次のステップ

以下の方法についての詳細を確認します。