【问题标题】:How to generate an alert when a SQS message is sent to the dead letter queue?当 SQS 消息发送到死信队列时如何生成警报?
【发布时间】:2020-07-01 09:21:39
【问题描述】:

目标

旨在当从 SQS 队列到 lambda 函数的消息超过最大重试次数时触发 CloudWatch 警报。

问题

我认为这很容易,并且 NumberOfMessagesReceived 指标会反映这一点。熟悉这一点的人都知道,事实并非如此。

解决方案

“Limbo”解决方案

我对这个问题的快速简单的解决方案是引入一个“Limbo”,它充当第一个 DLQ,并在几秒钟内将消息推送到最终/实际 DLQ。在指标中,这会导致“Limbo”队列的可见消息指标出现峰值。因此,警报阈值为“> 0”意味着每次该队列收到消息时都会发出警报。

但是,我上面的权力对于每次我们想要这个功能时都有一个“Limbo”队列并不满意。

据我所知,还有一些替代方法,但这些方法似乎比 Limbo 解决方案更糟糕

新的 Lambda 函数

第一个是有一个新的 lambda 函数,它使用 SQS DLQ 作为源并生成警报。

Lambda 运行时拦截

其次是让现有 lambda(处理 SQS 消息)中的逻辑读取消息已重试的次数,并在最后一次生成警报。这种首先消除了使用队列和重新驱动策略的优势,并且是一种过度设计的解决方案。

度量数学

我能想到的最后一个选择是使用一些度量数学来查看 DLQ 并计算最后 X 分钟是否有增加。

对于什么(我确信)必须有一个简单的实现,这些似乎都是奇怪且过于复杂的解决方案。如何在每次 DLQ 收到消息时创建警报?

【问题讨论】:

  • 有趣的问题。 +1。我认为 lambda 将是最简单和最明显的方法。但我很想看看是否有其他一些可能更复杂的解决方案,它们会以比使用 lambda 更便宜且更易于管理的方式实现相同的结果。
  • 为什么不使用 ApproximateNumberOfMessagesVisible 作为 DLQ 中的指标?
  • @GustavoTavares 问题是 CloudWatch 警报仅在状态更改时执行操作。使用 ApproximateNumberOfMessagesVisible。因此,如果设置为在阈值超过 1 时触发警报,则需要将其从队列中删除以使其再次回到阈值以下,以便警报可以回到 OK 状态。如果有一种方法可以进行度量数学,能够查看过去 5 分钟内 ApproximateNumberOfMessagesVisible 是否增加,那么这将是合适的解决方案。
  • 我不确定我是否理解您的问题...您不担心您的第一个案例吗?我的意思是:DLQ > 1 上的 ApproximateNumberOfMessagesVisible。如果它们随着时间的推移而增加,你会担心吗?
  • 我不明白的是,当您的 DLQ 的 ApproximateNumberOfMessagesVisible > 0 时,为什么您不能创建 CloudWatch 警报规则来更改?我知道对于 DLQ,NumberOfMessagesReceived 不起作用!但是,如果您使用可见消息的数量创建规则,它会发出警报,直到您删除它们...您想要不同的东西吗?

标签: amazon-web-services amazon-sqs amazon-cloudwatch amazon-cloudwatch-metrics cloudwatch-alarms


【解决方案1】:

我遇到了同样的问题,并使用 Metrics Math 成功实现了它。 Cloudwatch 有一个 RATE() 函数:

“返回指标每秒的变化率。这是通过最新数据点值与前一个数据点值之间的差值除以两个值之间的时间差(以秒为单位)计算得出的。”

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html

所以我创建了一个警报,它查看死信队列上 ApproximateNumberOfMessagesVisible 指标的变化率。当变化率大于 0 时会发出警报。以下是警报的 Cloudformation 模板示例:

DeadletterAlarm:
  Type: AWS::CloudWatch::Alarm
  Properties: 
    AlarmName: "DEADLETTER_ALARM"
    ComparisonOperator: GreaterThanThreshold
    EvaluationPeriods: 1
    TreatMissingData: missing
    Threshold: '0'      
    Metrics: 
      - Id: r1
        Expression: RATE(FILL(m1, 0))
        ReturnData: true
      - Id: m1          
        Label: VisibleAverage
        ReturnData: false
        MetricStat:
          Stat: Average
          Period: '300'
          Metric:
            MetricName: ApproximateNumberOfMessagesVisible
            Namespace: AWS/SQS
            Dimensions:
              - Name: QueueName
                Value: "Deadletter_queue_name"

【讨论】:

    【解决方案2】:

    实现此目的的另一种方法是在ApproximateNumberOfMessagesDelayed 上发出警报。然后你只需要在你的 DLQ 上设置一个延迟。所以它可能看起来像这样:

    MyDLQAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: MyDLQAlarm
      AlarmDescription: "Alarm when we have 1 or more failed messages in 10 minutes for MyQueue."
      Namespace: "AWS/SQS"
      MetricName: "ApproximateNumberOfMessagesDelayed"
      Dimensions:
        - Name: "QueueName"
          Value:
            Fn::GetAtt:
              - "MyQueue"
              - "QueueName"
      Statistic: "Sum"
      Period: 300
      DatapointsToAlarm: 1
      EvaluationPeriods: 2
      Threshold: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      AlarmActions:
        - Ref: "SNSTopic"
    

    那么您的 DLQ 可能如下所示:

      MyQueueDLQ:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: MyQueueDLQ
      MessageRetentionPeriod: 1209600
      DelaySeconds: 60
    

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 2022-07-28
      • 2020-05-29
      • 2019-06-21
      • 2023-03-17
      • 2016-08-24
      • 2020-10-22
      • 2021-03-16
      • 1970-01-01
      相关资源
      最近更新 更多