Amazon CloudWatch Logs Insights:如何让bin(1w)按周一开始聚合日志?
问题
我想要展示一个柱状图,其中每个柱子代表从周一开始的一周。以下查询代码实现了按周聚合数据的功能,但CloudWatch默认每周从周日开始统计。
我发现CloudWatch日志查询语法里只提到了以分钟(m)和小时(h)为单位的时间周期,但实际用天(d)和周(w)也能正常工作,只是没办法设置周的起始日期。请问怎么才能让周从周一开始而非周日?
原查询代码:
fields @timestamp, @message | fields strcontains(@message, 'the start') as start | fields strcontains(@message, 'the result') as result | stats sum(start) as startCalls, sum(result) as resultCalls by bin(1w) as t | sort t asc
解决方案
有两种可行的方法实现周从周一作为起始的聚合:
方法一:时间偏移后分箱
通过将时间提前1天,让周日的日志被归入上一周的周期,之后再将时间加回得到周一起始的时间戳:
fields @timestamp, @message | fields strcontains(@message, 'the start') as start | fields strcontains(@message, 'the result') as result // 把时间往前偏移1天(86400000毫秒=1天) | fields @timestamp - 86400000 as adjustedTimestamp // 基于调整后的时间按周分箱,再加回1天得到周一的起始时间 | stats sum(start) as startCalls, sum(result) as resultCalls by bin(adjustedTimestamp, 1w) + 86400000 as t | sort t asc
方法二:直接计算周一作为分组键
利用日期函数计算每条日志对应的周一0点时间,以此作为分组依据:
fields @timestamp, @message | fields strcontains(@message, 'the start') as start | fields strcontains(@message, 'the result') as result // dayOfWeek返回0=周日,1=周一,计算距离周一的偏移量后取整到天 | fields datefloor(@timestamp - (dayOfWeek(@timestamp) - 1)*86400000, 'd') as t | stats sum(start) as startCalls, sum(result) as resultCalls by t | sort t asc
原理说明
- 方法一:CloudWatch的
bin(1w)默认以周日为起始,偏移1天后,原本属于周日的日志会被分到上一个周日的周期,加回1天后,周期起始就变成了周一。 - 方法二:通过
dayOfWeek()获取当前日期的周几标识,计算出到最近周一的时间差,用datefloor()取到周一的0点时间,确保同一周(周一到周日)的日志都被归到同一个时间分组下。
内容的提问来源于stack exchange,提问作者Sven Emtell
相关产品推荐
相关产品推荐

