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是给定时间队列中的消息总数。每当有新消息到达队列时,该表达式的速率就会高于零。这就是它的工作原理。
我们遇到了同样的问题,并通过使用 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)
我遇到了同样的问题,我的答案是改用 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)
小智 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 警报将触发,因为它将与指标匹配。
| 归档时间: |
|
| 查看次数: |
5832 次 |
| 最近记录: |