首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cloudwatch未使用boto3创建自定义日志度量标准

Cloudwatch未使用boto3创建自定义日志度量标准
EN

Stack Overflow用户
提问于 2016-06-01 01:00:55
回答 1查看 1.1K关注 0票数 0

我试图编写一个AWS,它将遍历所有Cloudwatch日志组,为每个日志组上的搜索项创建一个度量过滤器。

不幸的是,虽然我对put_metric_filter的所有调用都收到HTTP200个响应,但大多数调用都没有被创建(4/15调用导致创建过滤器)。

我有一个AWS Lambda,它的处理程序文件是'handler.py':

代码语言:javascript
复制
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)

它从‘ManageMetricsAndAlarms’类调用'basicExample.py‘类,该类映射到一个日志组名称数组上,为每个类创建一个对术语“错误”进行筛选的度量:

代码语言:javascript
复制
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非常陌生,所以我想我错过了一些基本的东西,但是任何帮助都会很感激!

EN

回答 1

Stack Overflow用户

发布于 2020-01-14 08:03:50

很少有事情需要考虑:

  1. 你为什么要把这个放在灯笼上?你打算每分钟/每小时在同一块羊羔上放同样的过滤器吗?通常,您应该只执行一次脚本(或者在部署新lambdas之后)。
  2. map是一个懒惰的评估器,所以您需要类似于 如果要执行函数,则为list(map(function x: print(x), iterable))

下面是一个例子

代码语言:javascript
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37557879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档