练习 - 列出最近停止发送日志的活动虚拟机
在这里,你将编写 KQL 查询来检索和转换 Heartbeat
表中的数据,以获取有关环境中计算机状态的见解。
1. 设定目标
第一个日志分析目标是确保获取网络中所有活动虚拟机的相关数据。 你想要确定停止发送数据的计算机,以确保你能够完全查看所有的活动虚拟机。
若要确定哪些计算机已停止发送数据,需要以下信息:
- 最近记录了数据但在过去几分钟内未按预期记录数据的所有计算机。
- 为了更深入地分析,了解每台计算机上运行的虚拟机代理非常有用。
2. 评估日志
Azure Monitor 使用 Azure Monitor 代理来收集在虚拟机内运行的活动和操作系统进程的相关数据。
注意
环境中一些较旧的计算机仍然使用旧版 Log Analytics Windows 和 Linux 代理,而 Azure Monitor 正在弃用这些代理。
Azure Monitor 代理和 Log Analytics 代理每分钟将计算机运行状况数据发送到 Heartbeat
表一次。
让我们对 Heartbeat
表运行一个简单的 take 10
查询,以查看每个列包含的数据类型:
Heartbeat
| take 10
TimeGenerated
、Computer
Category
和 OSType
列都具有与分析相关的数据。
现在让我们来评估如何使用此数据,以及哪些 KQL 操作可以帮助提取和转换数据:
列 | 说明 | 分析目标 | 相关的 KQL 操作 |
---|---|---|---|
TimeGenerated |
指示虚拟机何时生成每个日志。 |
|
|
Computer |
计算机的唯一标识符。 |
|
|
Category |
代理类型:
|
识别计算机上运行的代理。 | 若要简化结果并方便进一步分析(例如筛选):
|
OSType |
虚拟机上运行的操作系统的类型。 | 识别 Log Analytics 代理的代理类型,Windows 和 Linux 的代理类型不同。 | summarize by... OSType 有关详细信息,请参阅 summarize 运算符。 |
Version |
监视虚拟机的代理的版本号。 | 确定每台计算机上的代理版本。 | 将此列重命名为 AgentVersion (AgentVersion=Version )。 |
3. 编写查询
编写一个查询,它列出过去 48 小时内处于活动状态,但在过去 5 分钟内未将数据记录到 Heartbeat
表的计算机。
检索过去 48 小时内的所有日志:
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 小时内发送日志数据的所有计算机的日志。 这些结果可能包括每个活动计算机的大量日志。
若要了解最近未发送日志的计算机,只需要每台计算机发送的最后一个日志即可。
查找每台计算机生成的最后一个日志,并按计算机、代理类型和操作系统进行汇总:
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
,从而更好地描述作为此分析的一部分在列中查看的信息。若要查看过去 5 分钟内未发送日志的计算机,请筛选掉过去 5 分钟内生成的所有日志:
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 分钟内记录数据的计算机都不包含在结果集中。
现在,你拥有要查找的数据:过去 48 小时内记录数据,但在过去 5 分钟内未按预期记录数据的所有计算机的列表。 结果集中包括要进一步调查的一组计算机。
操作查询结果以更清楚地显示信息。
例如,可按生成时间(从最早到最新)来整理日志,以查看哪些计算机没有记录数据的时间最长。
AgentType 列中的
Direct Agent
值指示 Log Analytics 代理正在计算机上运行。 适用于 Windows 的 Log Analytics 代理也称为 OMS,而对于 Linux,该代理又称为 MMS,因此对于 Windows 计算机,将Direct Agent
值重命名为MMA
,对于 Linux 计算机则重命名为OMS
可简化结果并有利于进一步分析(例如筛选)。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
来关联计算机的最后一个检测信号,该计算机已停止报告大约同一时间发生的计算机日志或其他环境事件。 用这种方式关联日志有助于查找你正在调查的问题的根本原因。
挑战:通过监视代理和代理版本对计算机进行分组
了解计算机上运行的代理和代理版本有助于分析问题的根本原因,并确定需要将哪些计算机更新到新代理或新的代理版本。
你能想到一些可对上面开发的查询执行来获取此信息的一些快速调整吗?
考虑这一点:
- 你需要从日志中提取哪些额外的信息?
- 你可使用哪个 KQL 操作按计算机运行的代理版本对计算机进行分组?
解决方案:
从查询复制前 5 行,并将
Version
列添加到summarize
查询行来提取代理版本信息: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
为了清楚起见,将
Version
列重命名为AgentVersion
,另外添加一个summarize
行来查找代理类型、代理版本和操作系统类型的唯一组合,并使用 KQLmake_set()
聚合函数来列出运行代理类型和代理版本的每个组合的所有计算机: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
现在,你拥有了要查找的数据:代理类型和代理版本的唯一组合列表,以及运行每个代理的特定版本的所有最近处于活动状态的计算机集。