练习 - 列出最近停止发送日志的活动虚拟机

已完成

在这里,你将编写 KQL 查询来检索和转换 Heartbeat 表中的数据,以获取有关环境中计算机状态的见解。

1. 设定目标

第一个日志分析目标是确保获取网络中所有活动虚拟机的相关数据。 你想要确定停止发送数据的计算机,以确保你能够完全查看所有的活动虚拟机。

若要确定哪些计算机已停止发送数据,需要以下信息:

  • 最近记录了数据但在过去几分钟内未按预期记录数据的所有计算机。
  • 为了更深入地分析,了解每台计算机上运行的虚拟机代理非常有用。

2. 评估日志

Azure Monitor 使用 Azure Monitor 代理来收集在虚拟机内运行的活动和操作系统进程的相关数据。

注意

环境中一些较旧的计算机仍然使用旧版 Log Analytics Windows 和 Linux 代理,而 Azure Monitor 正在弃用这些代理。

Azure Monitor 代理和 Log Analytics 代理每分钟将计算机运行状况数据发送到 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()== (equals) 运算符
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 小时内记录数据的每台计算机中的一个日志 - 每台计算机发送的最后一个日志。

    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,因此对于 Windows 计算机,将 Direct Agent 值重命名为 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 行,并将 Version 列添加到 summarize 查询行来提取代理版本信息:

    单击以在 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.