我们要求在启动和停止Windows服务时获取Windows服务的状态,因为我已经返回了一个查询,但是在连接2个表以获取输出时遇到了问题。
我尝试使用内部和左侧外部联接,但仍然得到重复
Event
| where EventLog == "System" and EventID == 7036 and Source == "Service Control Manager"
| parse kind=relaxed EventData with * '<Data Name="param1">' Windows_Service_Name '</Data><Data Name="param2">' Windows_Service_State '</Data>' *
| where Windows_Service_State == "running" and Windows_Service_Name == "Microsoft Monitoring Agent Azure VM Extension Heartbeat Service"
| extend startedtime = TimeGenerated
| join (
Event
| where EventLog == "System" and EventID == 7036 and Source == "Service Control Manager"
| parse kind=relaxed EventData with * '<Data Name="param1">' Windows_Service_Name '</Data><Data Name="param2">' Windows_Service_State '</Data>' *
| where Windows_Service_State == "stopped" and Windows_Service_Name == "Microsoft Monitoring Agent Azure VM Extension Heartbeat Service"
| extend stoppedtime = TimeGenerated
) on Computer
| extend downtime = startedtime - stoppedtime
| project Computer, Windows_Service_Name,stoppedtime , startedtime ,downtime
| top 10 by Windows_Service_Name desc
如果一天中多次重启该服务,我们将不希望该服务启动和停止的次数,加入时在启动时出现重复的计时,请查看链接(https://ibb.co/JzqxjC0)
答案 0 :(得分:1)
由于无法访问数据,我不确定我是否完全了解发生了什么。但。我可以看到您正在使用default join flavor。
默认值为内部唯一:
内部联接函数就像来自SQL世界的标准内部联接。只要左侧的记录具有与右侧的记录相同的联接键,就会生成输出记录。
这意味着在左侧和右侧之间的每个匹配项上都会在结果中创建新行。因此。假设您有一台计算机重新启动了两次,因此它有2行stopped
和2行running
。这将在Kusto答案中产生4行。
看看您的照片,这对我来说很有意义,因为您的生产线停机时间很短。我想那是不可能的。
我要做的是寻找一个在每次Computer
运行中唯一的标识符。然后,您可以加入其中,并确保不生成不需要的数据。