[英]How to use boto3 to send custom EC2 metrics to a CloudWatch Dashboard?
[英]Cloudwatch custom log metrics not being created with boto3
我正在尝试编写一个 AWS Lambda,它将遍历所有 Cloudwatch 日志组,为每个日志组上的搜索词创建一个指标过滤器。
不幸的是,我发现尽管我对 put_metric_filter 的所有调用都收到 HTTP 200 响应,但大多数调用都没有创建任何内容(4/15 调用导致创建过滤器)。
我有一个带有此处理程序文件“handler.py”的 AWS Lambda:
from __future__ import print_function
from basicExample import ManageMetricsAndAlarms
import json, logging
log = logging.getLogger()
log.setLevel(logging.INFO)
def handler(event, context):
log.info("Received event {}".format(json.dumps(event)))
mc = ManageMetricsAndAlarms(event, context)
response = mc.main()
return json.dumps(response)
它调用来自“basicExample.py”的 ManageMetricsAndAlarms 类,该类映射到日志组名称的数组,为每个过滤器创建一个度量标准“错误”:
from __future__ import print_function
import boto3, os, sys, json, botocore, logging
log = logging.getLogger()
log.setLevel(logging.INFO)
class ManageMetricsAndAlarms:
# -------------------------------------------------
def __init__(self,event,context):
self.event = event
# -------------------------------------------------
def main(self):
cloudwatch = boto3.resource('cloudwatch')
metricsNamespace = 'ExampleMetrics'
errorFilter = '{ $.levelname = "ERROR" }'
# Supposing that I have log groups for 10 imaginatively named lambdas
logGroupNames = [
'/aws/lambda/Lambda-1', '/aws/lambda/Lambda-2',
'/aws/lambda/Lambda-3', '/aws/lambda/Lambda-4',
'/aws/lambda/Lambda-5', '/aws/lambda/Lambda-6',
'/aws/lambda/Lambda-7', '/aws/lambda/Lambda-8',
'/aws/lambda/Lambda-9', '/aws/lambda/Lambda-10'
]
# map over the log groups adding a metric filter for 'ERROR' to each
responses = map(lambda lg: self.createErrorFilter(metricsNamespace, errorFilter, lg), logGroupNames)
return responses
# -------------------------------------------------
def createErrorFilter(self, metricsNamespace, filterPattern, logGroup):
metricName = logGroup + '_ErrorCount'
logs_client = boto3.client('logs')
log.info('Put metric filter ' + metricName + ' with filter $.levelname-ERROR on logGroup: ' + logGroup)
errorFilter = logs_client.put_metric_filter(
logGroupName = logGroup,
filterName ='ERROR-filter',
filterPattern = filterPattern,
metricTransformations = [
{
'metricNamespace': metricsNamespace,
'metricValue': '1',
'metricName': metricName,
}
]
)
log.info('errorFilter response: ' + json.dumps(errorFilter))
return errorFilter
# -------------------------------------------------
我对 python 很陌生,所以我希望我错过了一些基本的东西,但任何帮助都将不胜感激!
需要考虑的几点:
你为什么要把它放在一个 lambda 上? 你打算每分钟/小时在相同的 lambda 表达式上放置相同的过滤器吗? 通常,您应该只执行一次脚本(或在部署新的 lambda 之后。
map
是一个惰性求值器,因此您需要类似的东西
list(map(function x: print(x), iterable))
如果要执行函数
这是一个例子
import boto3
def createErrorFilter(metricsNamespace, filterPattern, logGroup):
metricName = logGroup + '_example'
logs_client = boto3.client('logs')
errorFilter = logs_client.put_metric_filter(
logGroupName = logGroup,
filterName ='ERROR-filter',
filterPattern = filterPattern,
metricTransformations = [
{
'metricNamespace': metricsNamespace,
'metricValue': '1',
'metricName': metricName,
}
]
)
print('ok')
return
cloudwatch = boto3.resource('cloudwatch')
metricsNamespace = 'ExampleMetrics-2'
errorFilter = 'ERROR'
logGroupNames = [
'/aws/lambda/lambda1', '/aws/lambda/lambda2'
]
# map over the log groups adding a metric filter for 'ERROR' to each
responses = list(map(lambda lg: createErrorFilter(metricsNamespace, errorFilter, lg), logGroupNames))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.