配置 SQS 死信队列以在收到消息时发出云监视警报

May*_*jaj 9 java message-queue amazon-sqs amazon-web-services

我正在使用 Amazon SQS 中的死信队列。我希望每当队列收到新消息时,它都应该引发 CloudWatch 警报。问题是我number_of_messages_sent在队列的指标上配置了一个警报:但是在Amazon SQS 死信队列 - Amazon Simple Queue Service文档中提到的死信队列的情况下,该指标无法按预期工作。

现在使用了一些关于此的建议,number_of_messages_visible但我不确定如何在警报中配置它。因此,如果我设置了 this 的值,metric>0那么这与在队列中获取新消息不同。如果存在旧消息,则度量值将始终为>0。我可以做某种数学表达式来在某个定义的时间段(假设一分钟)内获得此指标中的增量,但我正在寻找一些更好的解决方案。

Lok*_*esh 15

RATE每当消息到达死信队列时,我就使用度量数学函数触发警报。

为您的死信队列选择两个指标ApproximateNumberOfMessagesVisible和。ApproximateNumberOfMessagesNotVisible

将度量表达式配置为RATE(m1+m2),将阈值设置为0,并选择比较运算符为GreaterThanThreshold

m1+m2是给定时间队列中的消息总数。每当有新消息到达队列时,该表达式的速率就会高于零。这就是它的工作原理。

  • 这对我来说是最简单也是最好的解决方案。但是,我也不需要“ApproximateNumberOfMessagesNotVisible”指标。只需 m1='ApproximateNumberOfMessagesVisible' 和 RATE(m1) 就可以发挥作用 (4认同)

Luc*_*asz 6

我们遇到了同样的问题,并通过使用 2 个指标并创建一个数学表达式来解决它。

    ConsentQueue:
        Type: AWS::SQS::Queue
        Properties:
            QueueName: "queue"
            RedrivePolicy:
                deadLetterTargetArn:
                    Fn::GetAtt:
                        - "DLQ"
                        - "Arn"
                maxReceiveCount: 3 # after 3 tries the event will go to DLQ
             VisibilityTimeout: 65
    DLQ:
        Type: AWS::SQS::Queue
        Properties:
            QueueName: "DLQ"

    DLQAlarm:
        Type: AWS::CloudWatch::Alarm
        Properties:
            AlarmDescription: "SQS failed"
            AlarmName: "SQSAlarm"
            Metrics:
            - Expression: "m2-m1"
              Id: "e1"
              Label: "ChangeInAmountVisible"
              ReturnData: true
            - Id: "m1"
              Label: "MessagesVisibleMin"
              MetricStat:
                  Metric:
                      Dimensions:
                      - Name: QueueName
                        Value: !GetAtt DLQ.QueueName
                      MetricName: ApproximateNumberOfMessagesVisible
                      Namespace: "AWS/SQS"
                  Period: 300 # evaluate maximum over period of 5 min
                  Stat: Minimum
                  Unit: Count
              ReturnData: false
            - Id: "m2"
              Label: "MessagesVisibleMax"
              MetricStat:
                  Metric:
                      Dimensions:
                      - Name: QueueName
                        Value: !GetAtt DLQ.QueueName
                      MetricName: ApproximateNumberOfMessagesVisible
                      Namespace: "AWS/SQS"
                  Period: 300 # evaluate maximum over period of 5 min
                  Stat: Maximum
                  Unit: Count
              ReturnData: false
            ComparisonOperator: GreaterThanOrEqualToThreshold
            Threshold: 1
            DatapointsToAlarm: 1
            EvaluationPeriods: 1
Run Code Online (Sandbox Code Playgroud)

该时期很重要,因此最小值和最大值是在较长时期内评估的。 AWS 数学表达式图


ale*_*017 5

我遇到了同样的问题,我的答案是改用 NumberOfMessagesSent。然后我可以为在我配置的时间段内收到的新消息设置我的标准。这是在 CloudFormation 中对我有用的方法。

请注意,如果警报因持续故障而保持警报状态,则不会发生个别警报。您可以设置另一个警报来捕捉这些警报。即:使用相同的方法在 1 小时内发生 100 个错误时发出警报。

更新:由于NumberOfMessagesReceived和NumberOfMessagesSent指标取决于如何邮件在排队,我设计了使用的度量ApproximateNumberOfMessagesDelayed将延迟到DLQ设置后,我们需要一个新的解决方案。如果您手动将消息添加到队列,则 NumberOfMessagesReceived 将起作用。否则在设置延迟后使用 ApproximateNumberOfMessagesDelayed。

MyDeadLetterQueue:
    Type: AWS::SQS::Queue
    Properties:
      MessageRetentionPeriod: 1209600  # 14 days
      DelaySeconds: 60 #for alarms

DLQthresholdAlarm:
 Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: "Alarm dlq messages when we have 1 or more failed messages in 10 minutes"
      Namespace: "AWS/SQS"
      MetricName: "ApproximateNumberOfMessagesDelayed"
      Dimensions:
        - Name: "QueueName"
          Value:
            Fn::GetAtt:
              - "MyDeadLetterQueue"
              - "QueueName"
      Statistic: "Sum"
      Period: 300  
      DatapointsToAlarm: 1 
      EvaluationPeriods: 2       
      Threshold: 1
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      AlarmActions:
        - !Ref MyAlarmTopic
Run Code Online (Sandbox Code Playgroud)

  • 有很多变量,包括消息如何排队。在我们的例子中,我们的排队是由状态机中的错误处理以及 lambda 引起的。我坚持对答案的更新,因为它处理更多会导致您的方法失败的情况。必须在队列上正确配置延迟才能使用 ApproximateNumberOfMessagesDelayed。 (2认同)

小智 5

上述 RATE(M1+M2) 的 Terraform 工作示例

resource "aws_cloudwatch_metric_alarm" "dlq_alarm" {
  alarm_name                = "alarm_name"
  comparison_operator       = "GreaterThanThreshold"
  evaluation_periods        = "1"
  threshold                 = "0"
  alarm_description         = "desc"
  insufficient_data_actions = []
  alarm_actions = [aws_sns_topic.sns.arn]

  metric_query {
    id          = "e1"
    expression  = "RATE(m2+m1)"
    label       = "Error Rate"
    return_data = "true"
  }

  metric_query {
    id = "m1"

    metric {
      metric_name = "ApproximateNumberOfMessagesVisible"
      namespace                 = "AWS/SQS"
      period      = "60"
      stat        = "Sum"
      unit        = "Count"

      dimensions = {
        QueueName    = "${aws_sqs_queue.sqs-dlq.name}"
      }
    }
  }

  metric_query {
    id = "m2"

    metric {
      metric_name = "ApproximateNumberOfMessagesNotVisible"
      namespace                 = "AWS/SQS"
      period      = "60"
      stat        = "Sum"
      unit        = "Count"

      dimensions = {
        QueueName    = "${aws_sqs_queue.sqs-dlq.name}"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 0

您可以做的是创建一个带有事件源的 lambda 作为您的 DLQ。您可以从 Lambda 将自定义指标数据发布到 CloudWatch。当您的数据满足条件时,将触发警报。

使用此参考配置您的 lambda,以便在消息发送到您的 DLQ 时触发它:将 AWS Lambda 与 Amazon SQS 结合使用 - AWS Lambda

下面是一个很好的代码解释,建议我们如何将自定义指标从 Lambda 发布到 CloudWatch:使用代码示例从 Lambda 发送 CloudWatch 自定义指标

发布指标后,CloudWatch 警报将触发,因为它将与指标匹配。