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

如何用CloudWatch指标数学实现SQS死信队列每小时消息接收量统计

解决SQS死信队列小时级消息接收量统计问题

我有一个接收Lambda处理失败消息的死信队列(DLQ),但该队列的NumberOfMessagesSent指标不可用。于是通过CloudWatch指标数学,基于ApproximateNumberOfMessagesVisible指标,用表达式IF(DIFF(mDLQApproxNumberOfMessagesVisible) > 0, DIFF(mDLQApproxNumberOfMessagesVisible), 0)实现了分钟级的消息发送量统计(指标eDLQNumberOfMessagesSent)。现在想创建eDLQNumberOfMessagesSentPerHour指标统计每小时接收的消息总量,但使用SUM([eDLQNumberOfMessagesSent])并设置period:3600的方式无法生效,我的完整配置如下:

{
    "metrics": [
        ["AWS/SQS", "ApproximateNumberOfMessagesVisible", "QueueName", "dlq.fifo", {
            "id": "mDLQApproxNumberOfMessagesVisible",
            "visible": false
        }],
        [{
            "expression": "IF(DIFF(mDLQApproxNumberOfMessagesVisible) > 0, DIFF(mDLQApproxNumberOfMessagesVisible), 0)",
            "label": "eDLQNumberOfMessagesSent",
            "id": "eDLQNumberOfMessagesSent",
            "period": 60,
            "stat": "Maximum"
        }],
        [{
            "expression": "SUM([eDLQNumberOfMessagesSent])",
            "label": "eDLQNumberOfMessagesSentPerHour",
            "id": "eDLQNumberOfMessagesSentPerHour",
            "period": 3600,
            "stat": "Sum"
        }]
    ],
    "view": "timeSeries",
    "stacked": false,
    "region": "eu-west-1",
    "stat": "Maximum",
    "period": 60
}

问题原因

CloudWatch指标数学的执行逻辑是:当你对一个分钟级周期(60秒)的指标表达式使用SUM并设置3600秒周期时,它会先把原分钟级指标按Maximum聚合为小时级统计值,再对这个聚合值求和,而不是直接累加60个分钟级的原始数据,这就导致统计结果和预期不符。

解决方案

直接基于原始的ApproximateNumberOfMessagesVisible指标计算小时级差值,跳过中间的分钟级指标,这样就能准确得到每小时新增的消息总量。调整后的配置如下:

{
    "metrics": [
        ["AWS/SQS", "ApproximateNumberOfMessagesVisible", "QueueName", "dlq.fifo", {
            "id": "mDLQApproxNumberOfMessagesVisible",
            "visible": false
        }],
        [{
            "expression": "IF(DIFF(mDLQApproxNumberOfMessagesVisible) > 0, DIFF(mDLQApproxNumberOfMessagesVisible), 0)",
            "label": "eDLQNumberOfMessagesSent",
            "id": "eDLQNumberOfMessagesSent",
            "period": 60,
            "stat": "Maximum"
        }],
        [{
            "expression": "IF(DIFF(mDLQApproxNumberOfMessagesVisible) > 0, DIFF(mDLQApproxNumberOfMessagesVisible), 0)",
            "label": "eDLQNumberOfMessagesSentPerHour",
            "id": "eDLQNumberOfMessagesSentPerHour",
            "period": 3600,
            "stat": "Maximum"
        }]
    ],
    "view": "timeSeries",
    "stacked": false,
    "region": "eu-west-1",
    "stat": "Maximum",
    "period": 60
}

说明

  • 小时级指标直接复用了和分钟级相同的表达式,但将period设置为3600秒,DIFF会自动计算该周期内队列可见消息数的增量,也就是这一小时内进入DLQ的消息总量
  • 保留了分钟级指标,同时实现了小时级统计,两者逻辑独立,不会互相干扰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:50:37