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

m0rkklqb  于 2021-07-12  发布在  Java
关注(0)|答案(5)|浏览(517)

我在amazon sqs中处理死信队列。我希望每当队列接收到新消息时,它都会引发cloudwatch警报。问题是我在度量上配置了一个警报: number_of_messages_sent 但是在AmazonSQSDeadLetterQueues-AmazonSimpleQueueService文档中提到的死信队列的情况下,这个度量不能像预期的那样工作。
现在有人提出了一些建议 number_of_messages_visible 但我不知道如何在警报中配置它。所以如果我设置这个值 metric>0 这与在队列中获取新消息不同。如果存在旧消息,则度量值将始终为 >0 . 我可以做一些数学表达式来得到这个度量中某个特定时段(比如一分钟)的增量,但是我在寻找更好的解决方案。

x8goxv8g

x8goxv8g1#

我也遇到了同样的问题,答案是改用numberofmessagessent。然后我可以为在配置的时间段内传入的新消息设置条件。以下是我在云信息中的工作原理。
请注意,如果警报处于持续故障的警报状态,则不会发生单独的警报。你可以设置另一个闹钟来捕捉这些。ie:使用相同方法在1小时内发生100个错误时发出警报。
更新:因为numberofmessagesreceived和numberofmessagessent的度量取决于消息的排队方式,所以在向dlq设置添加延迟后,我使用度量approximateEnumberOfMessagesDelayed设计了一个新的解决方案来满足我们的需要。如果要手动将消息添加到队列中,则numberofmessagesreceived将起作用。否则,请在设置延迟后使用ApproximateEnumberOfMessagesDelayed。

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
xdnvmnnf

xdnvmnnf2#

很难达到问题中的要求。如果cloudwatch alarm的端点是发送电子邮件或通知用户dlq消息到达,您可以在sqs、sns和lambda的帮助下执行类似的操作。从cloudwatch中,您可以看到每当您收到任何电子邮件时,dlq消息是如何准时增长的。
为现有队列创建sqs dlq。
创建一个sns主题并订阅sns主题以发送电子邮件。
创建一个小lambda函数,用于侦听sqs队列中的传入消息,如果有任何新的传入消息,则将其发送到sns。由于sns订阅了电子邮件,所以每当任何新消息进入sqs队列时,您都会收到电子邮件。显然lambda函数的触发器是sqs,批大小是1。


# !/usr/bin/python3

import json
import boto3
import os

def lambda_handler(event, context):
    batch_processes=[]
    for record in event['Records']:
        send_request(record["body"])

def send_request(body):
    # Create SNS client
    sns = boto3.client('sns')

    # Publish messages to the specified SNS topic
    response = sns.publish(
        TopicArn=#YOUR_TOPIC_ARN
        Message=body,    
    )

    # Print out the response
    print(response)
bnl4lu3b

bnl4lu3b3#

您可以创建一个lambda,将事件源作为您的dlq。从lambda可以将定制的度量数据发布到cloudwatch。当您的数据满足条件时会触发报警。
使用此参考来配置lambda,以便在将消息发送到dlq时触发:using aws lambda with amazonsqs-aws lambda
下面是一个很好的代码解释,它建议我们如何将自定义度量从lambda发布到cloudwatch:使用代码示例从lambda发送cloudwatch自定义度量
一旦发布了度量,cloudwatch警报将触发,因为它将匹配度量。

nfs0ujit

nfs0ujit4#

我用了度量数学函数 RATE 每当消息到达死信队列时触发警报。
选择两个指标 ApproximateNumberOfMessagesVisible 以及 ApproximateNumberOfMessagesNotVisible 你的死信队列。
将度量表达式配置为 RATE(m1+m2) ,将阈值设置为 0 并选择比较运算符作为 GreaterThanThreshold . m1+m2 是给定时间队列中的消息总数。每当新消息到达队列时,此表达式的速率将高于零。这就是它的工作原理。

eimct9ow

eimct9ow5#

我们有同样的问题,并通过使用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

周期很重要,因此最小值和最大值要在较长的时间内进行评估。

相关问题