如何用KQL查询Azure日志分析事件数与过去1小时均值的差异
KQL实现分钟级事件数与历史1小时均值对比方案
实现思路
核心有两种常用实现路径,优先推荐时间序列滑动窗口方案,查询效率更高,无需二次扫描数据表:
- 先拉取覆盖「目标查询时间范围+1小时历史缓冲区」的全量事件数据,保证目标时间范围的第一条数据也能拿到完整的前1小时样本
- 按渠道、1分钟时间桶聚合得到每分钟事件计数后,按渠道分组构造时间序列,补齐缺失的时间桶(避免流量中断时均值计算错误)
- 用FIR滑动窗口函数计算每个时间点前60个桶(对应1小时)的均值,排除当前桶本身的数值避免干扰
- 最后计算当前分钟计数和历史均值的绝对值差异、相对差异率,可自行添加阈值过滤异常波动
完整示例代码
// 定义查询参数,可自行调整 let queryRange = 24h; // 要查看的目标时间范围 let histWindow = 1h; // 历史对比窗口 let bucketSize = 1m; // 聚合时间桶大小 customEvents | where timestamp >= ago(queryRange + histWindow) // 多取1小时的历史数据做缓冲区 | where name == "EventICareAbout" | extend channel = tostring(customDimensions["ChannelName"]) // 先聚合得到每分钟各渠道的事件数 | summarize events=count() by bin(timestamp, bucketSize), channel // 按渠道分组构造时间序列,自动补齐没有数据的时间桶(值补0) | make-series eventsPerMin = sum(events) default=0 on timestamp in range(ago(queryRange), now(), bucketSize) by channel // 计算滑动窗口均值:过去60个桶的平均,排除当前桶,所以系数为前60个1,最后一个0,除以60取平均 | extend histHourlyAvg = series_fir(eventsPerMin, repeat(1, toint(histWindow / bucketSize)), true, false) / (histWindow / bucketSize) // 把时间序列展开成多行表格方便查看 | expand timestamp, eventsPerMin, histHourlyAvg // 过滤掉开头的1小时缓冲区数据,只保留目标查询范围的结果 | where timestamp >= ago(queryRange) // 计算差异指标 | extend diff = eventsPerMin - histHourlyAvg | extend diffRate = round(diff / histHourlyAvg * 100, 2) // 可选:只筛选波动超过30%的异常记录 // | where abs(diffRate) >= 30 | project timestamp, channel, eventsPerMin, histHourlyAvg, diff, diffRate
可选方案:Join关联历史聚合结果
如果需要自定义历史窗口的计算逻辑(比如排除最近5分钟的数据、仅用工作日同时段数据对比),可以用join方式实现:
let bucketSize = 1m; // 第一步:计算每分钟的事件数 let minutelyData = customEvents | where timestamp >= ago(24h) | where name == "EventICareAbout" | extend channel = tostring(customDimensions["ChannelName"]) | summarize eventsPerMin = count() by bin(timestamp, bucketSize), channel; // 第二步:计算每个时间点前1小时的均值 minutelyData | join kind=inner ( minutelyData | extend histTime = timestamp | extend windowEnd = histTime + 1h ) on channel | where timestamp between (histTime .. windowEnd) | summarize histHourlyAvg = avg(eventsPerMin) by timestamp, channel | join kind=inner minutelyData on timestamp, channel | project timestamp, channel, eventsPerMin, histHourlyAvg, diff = eventsPerMin - histHourlyAvg
注意事项
- 如果渠道数量非常多,建议先过滤你需要关注的渠道再做序列计算,可大幅提升查询效率
- 没有事件的时间桶会默认补0计算均值,符合大多数业务场景的统计需求,若要排除空桶可修改
make-series的default参数和后续计算逻辑 - 若要对比的是过去7天同时间段的1小时均值,可以配合
datetime_part取小时/分钟维度聚合后再关联
内容的提问来源于stack exchange,提问作者mattb
相关产品推荐
相关产品推荐

