【问题标题】:AWS Cloudwatch Alarm on Error fails on Insufficient DataAWS Cloudwatch 错误警报因数据不足而失败
【发布时间】:2017-03-08 23:49:44
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: amazon-web-services amazon-cloudwatch


    【解决方案1】:

    解决此问题的方法是定义 两个指标,名称相同,但使用反向过滤器。匹配错误级别日志消息的过滤器必须返回一个度量值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'
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 2014-01-06
      • 2021-10-24
      • 2021-05-25
      • 2019-07-14
      • 1970-01-01
      • 2017-04-05
      相关资源
      最近更新 更多