チュートリアル:Azure Data Explorer で監視データを取り込んでクエリを実行する

このチュートリアルでは、コードを書くことなく、診断ログとアクティビティ ログから Azure Data Explorer クラスターにデータを取り込む方法について説明します。 この簡単な取り込み方法を使用すると、データ分析のために Azure Data Explorer のクエリをすぐに開始できます。

このチュートリアルで学習する内容は次のとおりです。

  • Azure Data Explorer のデータベースに、テーブルと取り込みのマッピングを作成します。
  • 更新ポリシーを使用して、取り込まれたデータの形式を設定します。
  • イベント ハブを作成し、それを Azure Data Explorer に接続します。
  • Azure Monitor の診断メトリックとログアクティビティ ログからイベント ハブにデータをストリーム配信します。
  • Azure Data Explorer を使用して、取り込まれたデータのクエリを実行します。

注意

同じ Azure の場所またはリージョンに、すべてのリソースを作成します。

前提条件

Azure Monitor データ プロバイダー: 診断メトリックとログ、アクティビティ ログ

以下の Azure Monitor の診断メトリックとログ、アクティビティ ログによって提供されるデータを見て理解します。 これらのデータ スキーマに基づいて、インジェスト パイプラインを作成してみましょう。 ログの各イベントにはレコードの配列が含まれます。 このチュートリアルの後半では、このレコードの配列が分割されます。

診断メトリックとログおよびアクティビティ ログの例

Azure の診断メトリックとログ、アクティビティ ログは、Azure サービスによって生成され、そのサービスの動作に関するデータを提供します。

診断メトリックの例

診断メトリックは、1 分の時間グレインで集計されます。 クエリ期間に対する Azure Data Explorer メトリックイベント スキーマの例を次に示します。

{
    "records": [
    {
        "count": 14,
        "total": 0,
        "minimum": 0,
        "maximum": 0,
        "average": 0,
        "resourceId": "/SUBSCRIPTIONS/<subscriptionID>/RESOURCEGROUPS/<resource-group>/PROVIDERS/MICROSOFT.KUSTO/CLUSTERS/<cluster-name>",
        "time": "2018-12-20T17:00:00.0000000Z",
        "metricName": "QueryDuration",
        "timeGrain": "PT1M"
    },
    {
        "count": 12,
        "total": 0,
        "minimum": 0,
        "maximum": 0,
        "average": 0,
        "resourceId": "/SUBSCRIPTIONS/<subscriptionID>/RESOURCEGROUPS/<resource-group>/PROVIDERS/MICROSOFT.KUSTO/CLUSTERS/<cluster-name>",
        "time": "2018-12-21T17:00:00.0000000Z",
        "metricName": "QueryDuration",
        "timeGrain": "PT1M"
    }
    ]
}

Azure Data Explorer で取り込みパイプラインを設定する

Azure Data Explorer のパイプラインの設定には、テーブルの作成やデータの取り込みなど、いくつかの手順が含まれています。 データの操作、マップ、更新を行うこともできます。

Azure Data Explorer の Web UI に接続する

Azure Data Explorer の TestDatabase データベースで [クエリ] を選択して、Azure Data Explorer の Web UI を開きます。

[クエリ] ページ。

ターゲット テーブルを作成する

Azure Monitor ログの構造は表形式ではありません。 データを操作し、各イベントを 1 つまたは複数のレコードに展開します。 生データは、アクティビティ ログの場合は ActivityLogsRawRecords、診断メトリックとログの場合は DiagnosticRawRecords という中間テーブルに取り込まれます。 その時点で、データを操作および展開します。 更新ポリシーを使用すると、展開されたデータは、アクティビティ ログの場合は ActivityLogs テーブル、診断メトリックの場合は DiagnosticMetrics、診断ログの場合は DiagnosticLogs に取り込まれます。 つまり、アクティビティ ログを取り込むには 2 つの異なるテーブルを作成し、診断メトリックと診断ログを取り込むには 3 つの異なるテーブルを作成する必要があります。

Azure Data Explorer の Web UI を使用して、Azure Data Explorer データベースにターゲット テーブルを作成します。

診断メトリックのためのテーブルを作成する

  1. TestDatabase データベースで、診断メトリック レコードを格納する DiagnosticMetrics という名前のテーブルを作成します。 次 .create table の管理コマンドを使用します。

    .create table DiagnosticMetrics (Timestamp:datetime, ResourceId:string, MetricName:string, Count:int, Total:double, Minimum:double, Maximum:double, Average:double, TimeGrain:string)
    
  2. [実行] を選択してテーブルを作成します。

    クエリを実行します。

  3. 次のクエリを使用して、データ操作用の DiagnosticRawRecords という名前の中間データ テーブルを TestDatabase データベース内に作成します。 [実行] を選択してテーブルを作成します。

    .create table DiagnosticRawRecords (Records:dynamic)
    
  4. 中間テーブルのアイテム保持ポリシーをゼロに設定します。

    .alter-merge table DiagnosticRawRecords policy retention softdelete = 0d
    

テーブル マッピングを作成する

データ形式が json であるため、データのマッピングが必須です。 json のマッピングでは、json の各パスがテーブルの列名にマップされます。 特殊文字を含む JSON パスは、['プロパティ名'] の形式でエスケープする必要があります。 詳しくは、「JSONPath 構文」を参照してください。

診断メトリックとログをテーブルにマップする

診断メトリックとログのデータをテーブルにマップするには、次のクエリを使用します。

.create table DiagnosticRawRecords ingestion json mapping 'DiagnosticRawRecordsMapping' '[{"column":"Records","Properties":{"path":"$.records"}}]'

メトリックおよびログのデータの更新ポリシーを作成する

診断メトリックのデータ更新ポリシーを作成する

  1. コレクション内の各値が個別の行を受け取るように診断メトリック レコードのコレクションを展開する関数を作成します。 mv-expand 演算子を使用します。

    .create function DiagnosticMetricsExpand() {
       DiagnosticRawRecords
       | mv-expand events = Records
       | where isnotempty(events.metricName)
       | project
           Timestamp = todatetime(events['time']),
           ResourceId = tostring(events.resourceId),
           MetricName = tostring(events.metricName),
           Count = toint(events['count']),
           Total = todouble(events.total),
           Minimum = todouble(events.minimum),
           Maximum = todouble(events.maximum),
           Average = todouble(events.average),
           TimeGrain = tostring(events.timeGrain)
    }
    
  2. 更新ポリシーをターゲット テーブルに追加します。 このポリシーでは、DiagnosticRawRecords 中間データ テーブルに新しく取り込まれたデータに対してクエリが自動的に実行され、その結果が DiagnosticMetrics テーブルに取り込まれます。

    .alter table DiagnosticMetrics policy update @'[{"Source": "DiagnosticRawRecords", "Query": "DiagnosticMetricsExpand()", "IsEnabled": "True", "IsTransactional": true}]'
    

Azure Event Hubs 名前空間を作成する

Azure 診断設定により、ストレージ アカウントまたはイベント ハブへのメトリックとログのエクスポートが可能になります。 このチュートリアルでは、イベント ハブ経由でメトリックとログをルーティングします。 診断メトリックとログ用のイベント ハブと Event Hubs 名前空間を次の手順で作成します。 Azure Monitor では、アクティビティ ログ用にイベント ハブ insights-operational-logs が作成されます。

  1. Azure portal で Azure Resource Manager テンプレートを使用して、イベント ハブを作成します。 この記事の残りの手順を実行するには、 [Azure へのデプロイ] ボタンを右クリックして、 [新しいウィンドウで開く] を選択します。 [Azure へのデプロイ] ボタンをクリックすると、Azure portal に移動します。

    [Azure へのデプロイ] ボタン。

  2. Event Hubs 名前空間と、診断ログ用のイベント ハブを作成します。 Event Hubs 名前空間を作成する方法に関するページをご覧ください。

  3. フォームに次の情報を入力します。 次の表に記載されていない設定については、既定値を使用してください。

    設定 推奨値 説明
    サブスクリプション 該当するサブスクリプション イベント ハブに使用する Azure サブスクリプションを選択します。
    リソース グループ test-resource-group 新しいリソース グループを作成します。
    場所 ニーズに最も適したリージョンを選択します。 他のリソースと同じ場所に、Event Hubs 名前空間を作成します。
    名前空間名 AzureMonitoringData 名前空間を識別する一意の名前を選択します。
    イベント ハブ名 DiagnosticData イベント ハブは、固有のスコープ コンテナーを提供する名前空間以下にあります。
    コンシューマー グループ名 adxpipeline コンシューマー グループ名を作成します。 コンシューマー グループを使用すると、複数の使用アプリケーションがそれぞれイベント ストリーム ビューを持つことができるようになります。

Azure Monitor のメトリックとログをイベント ハブに接続する

ここで、診断メトリックとログ、アクティビティ ログをイベント ハブに接続する必要があります。

診断メトリックとログをイベント ハブに接続する

メトリックをエクスポートするリソースを選択します。 診断データのエクスポートは、Event Hubs 名前空間、Azure Key Vault、Azure IoT Hub、Azure Data Explorer クラスターなど、複数のリソースの種類でサポートされます。 このチュートリアルでは、Azure Data Explorer クラスターをリソースとして使用し、クエリ パフォーマンスのメトリックとインジェスト結果のログを確認します。

  1. Azure portal でお使いの Kusto クラスターを選択します。

  2. [診断設定] を選択してから、 [診断をオンにする] リンクを選択します。

    診断設定。

  3. [診断設定] ウィンドウが開きます。 次の手順を実行します。

    1. 診断ログ データに ADXExportedData という名前を付けます。

    2. [ログ] で、 [SucceededIngestion][FailedIngestion] の両方のチェック ボックスをオンにします。

    3. [メトリック][クエリ パフォーマンス] チェック ボックスをオンにします。

    4. [イベント ハブへのストリーム] チェック ボックスをオンにします。

    5. [構成] をクリックします。

      [診断設定] ペイン。

  4. [イベント ハブの選択] ウィンドウで、自分が作成したイベント ハブに診断ログからデータをエクスポートする方法を構成します。

    1. [イベント ハブの名前空間の選択] リストで、AzureMonitoringData を選択します。
    2. [イベント ハブ名を選択する] リストで、DiagnosticData を選択します。
    3. [イベント ハブ ポリシー名の選択] リストで、RootManagerSharedAccessKey を選択します。
    4. [OK] を選択します。
  5. [保存] を選択します。

イベント ハブに送られてくるデータを確認する

  1. 接続が定義され、イベント ハブへのアクティビティログのエクスポートが完了するまで、数分待ちます。 ご自分の Event Hubs 名前空間に移動して、自分が作成したイベント ハブを確認します。

    作成されたイベント ハブ。

  2. イベント ハブに送られてくるデータを確認します。

    イベント ハブのデータ。

イベント ハブを Azure Data Explorer に接続する

次に、診断メトリックとログ、アクティビティ ログのデータ接続を作成する必要があります。

診断メトリックとログ、アクティビティ ログのデータ接続を作成する

  1. kustodocs という名前の Azure Data Explorer クラスターで、左側のメニューの [データベース] を選択します。

  2. [データベース] ウィンドウで、ご自分の TestDatabase データベースを選択します。

  3. 左側のメニューで、[データ インジェスト] を選択します。

  4. [データ インジェスト] ウィンドウで、[+ データ接続の追加] を選びます。

  5. [データ接続] ウィンドウで、次の情報を入力します。

    イベント ハブのデータ接続。

  1. [データ接続] ウィンドウで、次の設定を使用します。

    データ ソース:

    設定 推奨値 フィールドの説明
    データ接続名 DiagnosticsLogsConnection Azure データ エクスプローラーで作成する接続の名前。
    イベント ハブの名前空間 AzureMonitoringData 以前に選択した、名前空間を識別する名前。
    イベント ハブ DiagnosticData 作成したイベント ハブ。
    コンシューマー グループ adxpipeline 作成したイベント ハブに定義されているコンシューマー グループ。

    ターゲット テーブル:

    ルーティングには、"静的" と "動的" という 2 つのオプションがあります。 このチュートリアルでは、静的ルーティング (既定) を使用し、テーブル名、データ形式、およびマッピングを指定します。 [My data includes routing info](データにルーティング情報が含まれている) をオフのままにしておきます。

    設定 推奨値 フィールドの説明
    Table DiagnosticRawRecords 自分が TestDatabase データベースに作成したテーブル。
    データ形式 JSON テーブルで使用される形式。
    列マッピング DiagnosticRawRecordsMapping 自分が TestDatabase データベースに作成したマッピング。これにより、受信 JSON データが DiagnosticRawRecords テーブルの列名とデータ型にマッピングされます。
  2. [作成] を選択します

新しいテーブルのクエリを実行する

パイプラインをデータが流れるようになりました。 クラスター経由での取り込みには既定で 5 分かかるので、データが流れるのを数分待ってから、クエリを始めます。

診断メトリック テーブルに対してクエリを実行する

次のクエリでは、Azure Data Explorer の診断メトリック レコードからクエリ期間のデータを分析します。

DiagnosticMetrics
| where Timestamp > ago(15m) and MetricName == 'QueryDuration'
| summarize avg(Average)

クエリの結果:

avg_Average
00:06.156