如何在CloudWatch查询stats段中为百分比计算显示0值
修复CloudWatch Logs Insights上传完成率无数据区间显示NaN的问题
你的核心问题是两个:一是无日志的时间区间不会出现在查询结果中,二是当FileStarts为0时,除法运算会产生NaN。可以通过生成连续时间序列+左关联统计结果+条件处理除法来解决,具体查询如下:
WITH time_bins AS ( -- 生成目标时间范围内的连续1分钟时间区间,替换start/end为你的需求,也可用相对时间如ago(1h)/now() SELECT bin AS @timestamp FROM generate_sequence( start=timestamp'2024-05-01T00:00:00Z', end=timestamp'2024-05-01T01:00:00Z', step=60 ) ), upload_stats AS ( -- 统计每个时间区间的上传开始/完成次数 SELECT bin(1min) AS @timestamp, sum(strcontains(@message, "$=File.Upload=$ [Starting]")) AS FileStarts, sum(strcontains(@message, "$=File.Upload=$ [Finished]")) AS FileFinish FROM YOUR_LOG_GROUP_NAME -- 替换为你的日志组名称 WHERE @timestamp BETWEEN timestamp'2024-05-01T00:00:00Z' AND timestamp'2024-05-01T01:00:00Z' GROUP BY bin(1min) ) -- 关联时间序列与统计结果,填充缺失值并计算完成率 SELECT tb.@timestamp, COALESCE(us.FileStarts, 0) AS FileStarts, COALESCE(us.FileFinish, 0) AS FileFinish, CASE WHEN COALESCE(us.FileStarts, 0) = 0 THEN 0 ELSE COALESCE(us.FileFinish, 0) / COALESCE(us.FileStarts, 0) END AS HitPercentage FROM time_bins tb LEFT JOIN upload_stats us ON tb.@timestamp = us.@timestamp ORDER BY tb.@timestamp
关键逻辑说明:
- 生成连续时间区间:用
generate_sequence创建覆盖目标范围的所有1分钟bin,确保无日志的时间段也会出现在结果中。 - 左关联填充缺失值:通过
LEFT JOIN将统计结果与连续时间区间关联,用COALESCE把无数据的FileStarts和FileFinish设为0。 - 处理除以0的情况:用
CASE语句判断,当FileStarts为0时直接返回0%,避免NaN的产生。
如果需要适配相对时间范围,把generate_sequence的start和end改成ago(24h)和now()这类相对时间表达式即可,无需手动指定固定时间。
内容的提问来源于stack exchange,提问作者Joshua Little
相关产品推荐
相关产品推荐

