演習 - ログの送信を停止した最近アクティブになっていた仮想マシンを一覧表示する

完了

ここでは、Heartbeat テーブルからデータを取得して変換する KQL クエリを記述し、環境内のマシンの状態に関する分析情報を取得します。

1. 目標を設定する

ログ分析の最初の目標は、ネットワーク内のすべてのアクティブな仮想マシンに関するデータを確実に取得することです。 すべてのアクティブな仮想マシンを完全に可視化できるように、データの送信を停止したマシンを特定する必要があります。

データの送信を停止したマシンを特定するには、次に関する情報が必要です。

  • 最近データをログに記録しているが、過去数分間は想定どおりにデータをログに記録していないすべてのマシン。
  • より詳細な分析を行うために、各マシン上で実行されている仮想マシン エージェントを把握すると便利です。

2. ログを評価する

Azure Monitor では、Azure Monitor エージェントを使って、仮想マシン内で実行されているアクティビティとオペレーティング システム プロセスに関するデータを収集します。

Note

環境内の古いマシンの中には、Azure Monitor で非推奨となっている、Windows と Linux のレガシ Log Analytics エージェントを引き続き使用しているものもあります。

Azure Monitor エージェントと Log Analytics エージェントは、1 分間に 1 回、仮想マシンの正常性データを Heartbeat テーブルに送信します。

Heartbeat テーブルに対してシンプルな take 10 クエリを実行して、その各列に保持されているデータの種類を確認してみましょう。

ここをクリックして Log Analytics のデモ環境でクエリを実行する

Heartbeat
| take 10

TimeGeneratedComputerCategoryOSType 列には、すべてここでの分析に関連するデータが含まれています。

Screenshot that shows the results of a take 10 query on the Heartbeat table with the TimeGenerated, Computer, Category, and OSType columns highlighted.

次に、このデータをどのように使用できるか、またどの KQL 演算がデータの抽出と変換に役立つかを評価してみましょう。

説明 分析の目標 関連する KQL 演算
TimeGenerated 仮想マシンによって各ログが生成された時期を示します。
  • 最近アクティブであるマシンを特定する。
  • 各マシンについて最後に生成されたログを検索し、それが過去数分間に生成されたかどうかを確認する。
  • where TimeGenerated >ago(48h)
  • summarize max(TimeGenerated)
  • max_TimeGenerated < ago(5m)
詳細については、「where 演算子」、「summarize 演算子」、「ago()」、「max() (集計関数)」を参照してください。
Computer マシンの一意識別子です。
  • マシン別に結果を集計する。
  • 個別のエージェント バージョン別にマシンをグループ化する。
  • summarize by Computer
  • summarize ComputersList=make_set(Computer)
詳細については、「summarize 演算子」と「make_set() (集計関数)」を参照してください。
Category エージェントの種類:
  • Azure Monitor Agent または
  • Direct Agent。これは Log Analytics エージェントを表します。 Windows 用 Log Analytics エージェントは MMA とも呼ばれます。 Linux 用 Log Analytics エージェントは OMS とも呼ばれます。
マシン上で実行されているエージェントを特定する。 結果を簡素化し、さらなる分析 (フィルター処理など) を容易にするために:
  • 列の名前を AgentType に変更する (AgentType=Category)
  • Windows マシンに対して Direct Agent の値を MMA に変更する (AgentType= iif(AgentType == "Direct Agent" and OSType =="Windows", "MMA", AgentType)
  • Linux マシンに対して Direct Agent の値を OMS に変更する (AgentType= iif(AgentType == "Direct Agent" and OSType =="Linux", "OMS", AgentType)。
詳細については、「iff()」と「== (等号) 演算子」を参照してください。
OSType 仮想マシン上で実行されているオペレーティング システムの種類です。 Log Analytics エージェントのエージェントの種類を特定する (Windows と Linux で異なります)。 summarize by... OSType
詳細については、「summarize 演算子」を参照してください。
Version 仮想マシンを監視しているエージェントのバージョン番号です。 各マシンに対するエージェントのバージョンを特定する。 列の名前を AgentVersion に変更する (AgentVersion=Version)。

3. クエリを作成する

過去 48 時間以内にアクティブであったが、過去 5 分間には Heartbeat テーブルにデータを記録していないマシンを一覧表示するクエリを作成します。

  1. 過去 48 時間のすべてのログを取得します。

    ここをクリックして Log Analytics のデモ環境でクエリを実行する

    Heartbeat // The table you’re querying
    | where TimeGenerated >ago(48h) // Time range for the query - in this case, logs generated in the past 48 hours
    

    このクエリの結果セットには、過去 48 時間以内にログ データを送信したすべてのマシンからのログが含まれます。 これらの結果には、おそらくアクティブな各マシンの大量のログが含まれています。

    Screenshot that shows the results of a query on the Heartbeat table for all records generated in the past 48 hours.

    最近ログを送信していないマシンを把握するために必要なのは、各マシンが最後に送信したログのみです。

  2. 各マシンが最後に生成したログを検索し、コンピューター、エージェントの種類、オペレーティング システム別に集計します。

    ここをクリックして Log Analytics のデモ環境でクエリを実行する

    Heartbeat // The table you’re querying
    | where TimeGenerated >ago(48h) // Time range for the query - in this case, logs generated in the past 48 hours
    | summarize max(TimeGenerated) by Computer, AgentType=Category, OSType // Retrieves the last record generated by each computer and provides information about computer, agent type, and operating system
    

    これで、過去 48 時間以内にデータをログに記録した各マシンごとに 1 つのログを得られます。つまり、各マシンが最後に送信したログです。

    summarize 行では、Category 列の名前を AgentType に変更しています。この方が、この分析の一環としてこの列で参照している情報に適しています。

    Screenshot that shows the results of a query for the last log generated by each machine.

  3. 過去 5 分間にログを送信していないマシンを表示するには、過去 5 分間に生成されたすべてのログをフィルターで除外します。

    ここをクリックして Log Analytics のデモ環境でクエリを実行する

    Heartbeat // The table you’re querying
    | where TimeGenerated >ago(48h) // Time range for the query - in this case, logs generated in the past 48 hours
    | summarize max(TimeGenerated) by Computer, AgentType=Category, OSType // Retrieves the last record generated by each computer and provides information about computer, agent type, and operating system
    | where max_TimeGenerated < ago(5m) // Filters away all records generated in the last five minutes
    

    このクエリの結果セットには、過去 48 時間以内にデータをログに記録したすべてのマシンが最後に生成したログが含まれますが、過去 5 分間以内に生成されたログは含まれません。 言い換えると、過去 5 分間以内にデータをログに記録したマシンは、この結果セットに含まれません。

    Screenshot that shows the results of a query that filters away all records generated in the last five minutes.

    これで求めているデータが得られました。つまり、過去 48 時間以内にデータをログに記録したが、過去 5 分間には想定どおりにデータをログに記録していないすべてのマシンの一覧です。 この結果セットは、さらに調査する必要があるコンピューターのセットで構成されています。

  4. クエリ結果を操作して、情報をより明確に表示します。

    たとえば、ログを生成された時間別に (最も古いログから最新のログへ) 整理して、どのコンピューターが最も長くデータをログに記録していないかを確認できます。

    AgentType 列の Direct Agent 値は、そのマシン上で Log Analytics エージェントが実行されていることを示します。 Windows 用 Log Analytics エージェントは OMS とも呼ばれ、また Linux 用のエージェントは MMS とも呼ばれるため、Direct Agent 値の名前を Windows マシンに対しては MMA に、Linux マシンに対しては OMS に変更することで、結果を簡素化し、フィルター処理などのさらなる分析を容易にすることができます。

    ここをクリックして Log Analytics のデモ環境でクエリを実行する

    Heartbeat // The table you’re querying
    | where TimeGenerated >ago(48h) // Time range for the query - in this case, logs generated in the past 48 hours 
    | summarize max(TimeGenerated) by Computer,AgentType=Category, OSType // Retrieves the last record generated by each computer and provides information about computer, agent type, and operating system
    | where max_TimeGenerated < ago(5m) // Filters away all records generated in the last five minutes
    | extend AgentType= iif(AgentType == "Direct Agent" and OSType =="Windows", "MMA", AgentType) // Changes the AgentType value from "Direct Agent" to "MMA" for Windows machines
    | extend AgentType= iif(AgentType == "Direct Agent" and OSType =="Linux", "OMS", AgentType) // Changes the AgentType value from "Direct Agent" to "OMS" for Linux machines
    | order by max_TimeGenerated asc // Sorts results by max_TimeGenerated from oldest to newest
    | project-reorder max_TimeGenerated,Computer,AgentType,OSType  // Reorganizes the order of columns in the result set
    

    ヒント

    max_TimeGenerated を使って、レポートを停止したマシンの最後のハートビートと、ほぼ同じ時期に発生したマシン ログやその他の環境のイベントを関連付けます。 この方法でログを関連付けると、調査している問題の根本原因を見つけるのに役立ちます。

    Screenshot that shows the results of a query that changes the AgentType values to MMA for Windows machines and to OMS for Linux machines.

課題: 監視しているエージェントとエージェント バージョン別にマシンをグループ化する

マシン上で実行されているエージェントとエージェント バージョンを把握することは、問題の根本原因を分析し、新しいエージェントや新しいエージェント バージョンに更新する必要があるマシンを特定するのに役立ちます。

この情報を得るために、上記で作成したクエリに対していくつかの微調整を加えることはできますか?

次の点を考慮してください。

  • ログからどのような追加情報を抽出する必要がありますか?
  • 実行しているエージェント バージョン別にマシンをグループ化するために、どの KQL 演算を使えますか?

解決方法:

  1. クエリの最初の 5 行をコピーし、クエリの summarize 行に Version 列を追加して、エージェント バージョンの情報を抽出します。

    ここをクリックして Log Analytics のデモ環境でクエリを実行する

    Heartbeat // The table you’re querying
    | where TimeGenerated >ago(48h) // Time range for the query - in this case, logs generated in the past 48 hours 
    | summarize max(TimeGenerated) by Computer,AgentType=Category, OSType, Version // Retrieves the last record generated by each computer and provides information about computer, agent type, operating system, and agent version 
    | extend AgentType= iif(AgentType == "Direct Agent" and OSType =="Windows", "MMA", AgentType) // Changes the AgentType value from "Direct Agent" to "MMA" for Windows machines
    | extend AgentType= iif(AgentType == "Direct Agent" and OSType =="Linux", "OMS", AgentType) // Changes the AgentType value from "Direct Agent" to "OMS" for Linux machines
    

    Screenshot that shows the results of the first five lines of the query we've built up in this exercise, with the Version column added to the Summarize line to add agent version information to the results.

  2. わかりやすくするために Version 列の名前を AgentVersion に変更します。また、別の summarize 行を追加して、エージェントの種類、エージェント バージョン、オペレーティング システムの種類からなる一意の組み合わせを検索し、KQL の make_set() 集計関数を使ってエージェントの種類とエージェント バージョンの各組み合わせを実行しているすべてのコンピューターを一覧表示します。

    ここをクリックして Log Analytics のデモ環境でクエリを実行する

    Heartbeat // The table you’re querying
    | where TimeGenerated >ago(48h) // Time range for the query - in this case, logs generated in the past 48 hours 
    | summarize max(TimeGenerated) by Computer,AgentType=Category, OSType, Version // Retrieves the last record generated by each computer and provides information about computer, agent type, operating system, and agent version 
    | extend AgentType= iif(AgentType == "Direct Agent" and OSType =="Windows", "MMA", AgentType) // Changes the AgentType value from "Direct Agent" to "MMA" for Windows machines
    | extend AgentType= iif(AgentType == "Direct Agent" and OSType =="Linux", "OMS", AgentType) // Changes the AgentType value from "Direct Agent" to "OMS" for Linux machines
    | summarize ComputersList=make_set(Computer) by AgentVersion=Version, AgentType, OSType // Summarizes the result set by unique combination of agent type, agent version, and operating system, and lists the set of all machines running the specific agent version
    

    これで求めているデータが得られました。つまり、エージェントの種類とエージェント バージョンの一意の組み合わせの一覧と、各エージェントの特定のバージョンを実行している最近アクティブなすべてのマシンのセットです。

    Screenshot that shows the results of a query that creates a list of all machines running each unique combination of agent type, agent version, and operating system.