【发布时间】:2017-03-08 23:49:44
【问题描述】:
如果我的 json 日志消息属于错误日志级别,我会尝试创建警报。我的过滤器工作正常,但是当我创建警报时,它总是因数据不足而失败。貌似是因为没有错误。
有什么想法吗?
【问题讨论】:
标签: amazon-web-services amazon-cloudwatch
如果我的 json 日志消息属于错误日志级别,我会尝试创建警报。我的过滤器工作正常,但是当我创建警报时,它总是因数据不足而失败。貌似是因为没有错误。
有什么想法吗?
【问题讨论】:
标签: amazon-web-services amazon-cloudwatch
解决此问题的方法是定义 两个指标,名称相同,但使用反向过滤器。匹配错误级别日志消息的过滤器必须返回一个度量值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'
)
【讨论】: