请求优化Defender狩猎KQL查询:用7天告警平均值替代固定阈值
修改后的KQL查询(适配动态周平均值阈值)
// 定义时间范围:过去7天到当前时间 let starttime = 7d; let endtime = 0d; // 第一步:获取关联后的告警数据,提取核心字段 let hourly_alerts = AlertEvidence | join AlertInfo on AlertId | project Timestamp, AlertId, Severity | where Timestamp between (ago(starttime)..ago(endtime)) // 按小时粒度和告警级别统计唯一告警数量 | summarize HourlyAlerts = dcount(AlertId) by HourBin = bin(Timestamp, 1h), Severity; // 第二步:计算每个告警级别对应的7天平均每小时告警数 let severity_avg = hourly_alerts | summarize TotalAlerts = sum(HourlyAlerts), TotalHours = dcount(HourBin) by Severity | extend AvgHourlyAlerts = round(TotalAlerts / TotalHours, 2); // 保留两位小数,提升可读性 // 第三步:关联数据并筛选出超过平均值的时段 hourly_alerts | join severity_avg on Severity | extend IsAboveAvg = iff(HourlyAlerts > AvgHourlyAlerts, "YES", "NO") | where IsAboveAvg == "YES" | project HourBin, Severity, HourlyAlerts, AvgHourlyAlerts, IsAboveAvg
关键修改说明:
- 移除固定阈值
Threshold,改用按告警级别动态计算的周平均每小时告警数,不同级别告警基线差异大,分组统计更贴合实际场景 - 拆分逻辑为三个独立步骤,便于理解和调试:
hourly_alerts:统计过去7天内,每个小时、每个告警级别的唯一告警数量severity_avg:基于小时统计结果,计算每个级别对应的平均每小时告警数(总告警数÷总小时数)- 关联两个数据集,判断每小时告警数是否超过对应级别的平均值,最终筛选出符合条件的记录
- 保留
dcount(AlertId)确保统计的是唯一告警,避免同一条告警关联多个证据导致重复计数 - 使用
bin(Timestamp, 1h)将时间规整为小时粒度,保证统计维度的一致性
内容的提问来源于stack exchange,提问作者Dantuzzo
相关产品推荐
相关产品推荐

