如何用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
相关产品推荐
相关产品推荐

