You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:18:05