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

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

关键逻辑说明:

  1. 生成连续时间区间:用generate_sequence创建覆盖目标范围的所有1分钟bin,确保无日志的时间段也会出现在结果中。
  2. 左关联填充缺失值:通过LEFT JOIN将统计结果与连续时间区间关联,用COALESCE把无数据的FileStarts和FileFinish设为0。
  3. 处理除以0的情况:用CASE语句判断,当FileStarts为0时直接返回0%,避免NaN的产生。

如果需要适配相对时间范围,把generate_sequence的start和end改成ago(24h)和now()这类相对时间表达式即可,无需手动指定固定时间。

内容的提问来源于stack exchange,提问作者Joshua Little

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:55:12