AWS Cloudwatch 错误警报因数据不足而失败

AWS Cloudwatch Alarm on Error fails on Insufficient Data

如果我的 json 日志消息是错误日志级别,我会尝试创建警报。我的过滤器工作正常,但当我创建警报时,它总是因数据不足而失败。貌似,因为没有错误。

有什么想法吗?

解决这个问题的方法是定义两个具有相同名称但具有反向过滤器的指标。匹配错误级别日志消息的过滤器必须 return 一个 1 度量值,而第二个过滤器应该匹配所有消息,或者至少匹配其中的一条消息时间段和 return 度量值 00 值的存在避免了数据不足的错误。

根据指标创建警报时,两个筛选器会合并。如果应用总和统计并应用报警规则>0,则只有在错误消息到达时才会触发报警,而不会在运行数据不足时触发。

这是一个使用 boto3 客户端的例子:

import boto3
client = boto3.client('logs')
logGroupName = 'myLogGroup'
# create this SNS topic with your email subscription...
env['aws_sns_arn_error_email'] = 'arn:aws:sns:eu-west-1:1234567:log_error'

env['sys_type'] = 'production'

metricsNamespace = 'LogMetrics'
metricName = 'ErrorCount' + "_%(sys_type)s" % env

print colors.cyan('Put metric $(metricName)s' % env)

cloudwatch_client = boto3.client('cloudwatch')
response = cloudwatch_client.put_metric_data(
    Namespace=metricsNamespace,
    MetricData=[
        {
            'MetricName': metricName,
            'Unit': 'Count',
            'Value': 1
        },
    ]
)

logs_client = boto3.client('logs')
print colors.cyan('Put metric filter $.levelname-ERROR')
logs_client.put_metric_filter(
    logGroupName=env.log_group_name_ea,
    filterName='levelname-ERROR',
    filterPattern='{ $.levelname = "ERROR" }',
    metricTransformations=[
        {
            'metricNamespace': metricsNamespace,
            'metricValue': '0',
            'metricName': metricName,
        }]

)
print colors.cyan('Put metric filter catchAll')
logs_client.put_metric_filter(
    logGroupName=env.log_group_name_ea,
    filterName="catchAll",
    filterPattern='',
    metricTransformations=[
        {
            'metricNamespace': metricsNamespace,
            'metricValue': '1',
            'metricName': metricName,
        }]
)

print colors.cyan('Put metric alarm, email on error')

response = cloudwatch_client.put_metric_alarm(
    AlarmName='email on error',
    AlarmDescription='email on error',
    ActionsEnabled=True,

    AlarmActions=[
        env.aws_sns_arn_error_email,
    ],

    MetricName=metricName,
    Namespace=metricsNamespace,
    Statistic='Sum',
    Period=300,
    Unit='Count',
    EvaluationPeriods=1,
    Threshold=0,
    ComparisonOperator='GreaterThanThreshold'
)