如何使用KQL合并相同CorrelationId的AzureActivity日志行?
解决方案
针对你的场景,推荐使用**行号排名(row_number())**结合分区(partition by)的方式,精准筛选出每个CorrelationId对应的有效数据行。具体KQL查询如下:
AzureActivity | project TimeGenerated, CorrelationId, Caller, Action, RoleId, ObjectId, Status // 加入Status列用于判断行类型 | partition by CorrelationId ( order by Status asc // 让"Success"排在"Start"前面(字符串排序中Success优先级更高) | take 1 // 取每个CorrelationId下的第一行,即有效数据行 )
更直观的优先级指定写法:
如果担心字符串排序的不确定性,可以用case函数明确标记优先级:
AzureActivity | project TimeGenerated, CorrelationId, Caller, Action, RoleId, ObjectId, Status | extend Priority = case(Status == "Success", 1, Status == "Start", 2, 3) // 给Success最高优先级 | partition by CorrelationId ( order by Priority asc | take 1 ) | project-away Priority // 移除临时优先级列
简化场景的快捷写法:
如果确认所有CorrelationId都同时存在Success和Start行,可以直接过滤Status为Success的行,写法更简洁:
AzureActivity | where Status == "Success" | project TimeGenerated, CorrelationId, Caller, Action, RoleId, ObjectId
注:这种方法会丢失仅存在Start行的CorrelationId数据,适合已确认数据完整性的场景。
内容的提问来源于stack exchange,提问作者Luca Dessauvagie
相关产品推荐
相关产品推荐

