在数据不足时,AWS Cloudwatch报警错误失败

时间:2016-02-09 12:12:49

标签: amazon-web-services amazon-cloudwatch

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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

解决这个问题的方法是定义具有相同名称但使用反向过滤器的两个指标。与错误级别日志消息匹配的过滤器必须返回指标值1 ,而第二个过滤器应匹配所有消息,或者在该时间段内至少返回一条消息并返回指标值0 0值的存在可以避免数据错误。

根据指标创建警报时,两个过滤器将合并。如果应用了总和统计信息并且应用了>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'
)