CloudWatch Logs Insights查询正确性及count相关函数差异咨询
1. 原查询是否正确?
不正确。
原查询stats count(*) as count, max(count) as max, avg(count) as avg by bin(10s)的问题在于:by bin(10s)已经将日志按10秒窗口分组,每个分组里的count(*)就是该窗口内的API调用次数。而max(count)和avg(count)在单个分组中没有意义——每个分组只有一个count值,所以max和avg结果都会等于该分组的count本身,完全达不到你想要的“多个10秒窗口中调用次数的最大值、平均值”的需求。
如果你想获取所有10秒窗口里API调用次数的最大值和平均值,正确的查询应该分两步:
- 先按10秒窗口统计每个窗口的调用次数
- 再基于这些窗口的统计值计算全局的max和avg
示例查询:
-- 第一步:统计每个10秒窗口的API调用次数 stats count(*) as call_count by bin(10s) -- 第二步:计算所有窗口的最大、平均调用次数 | stats max(call_count) as max_calls, avg(call_count) as avg_calls
2. count()、max(count())、avg(count(*))的差异
count(*):
当搭配by bin(10s)使用时,它统计的是单个10秒时间窗口内的API调用日志条目总数,也就是这个窗口的API调用次数。如果不搭配分组,它就是查询时间范围内所有API调用的总次数。max(count(*)):
它的作用是在一组count(*)结果中取最大值。比如先按10秒分组得到每个窗口的调用次数,再用max(count(*))就能找出所有窗口里调用次数最多的那个数值。但如果直接和by bin(10s)写在同一个stats语句里,每个分组只有一个count(*)值,此时max(count(*))就等于该分组的count(*),没有实际价值。avg(count(*)):
它是计算一组count(*)结果的平均值。比如先得到所有10秒窗口的调用次数,再用avg(count(*))就能算出这些窗口的平均调用次数。同样,如果直接和by bin(10s)同用,每个分组的avg(count(*))等于该分组的count(*),没有意义。
内容的提问来源于stack exchange,提问作者bittersour

