【问题标题】:How do I get a sum of megabytes sent to a set of Cloudwatch log groups?如何获得发送到一组 Cloudwatch 日志组的兆字节总和?
【发布时间】:2019-12-18 19:21:51
【问题描述】:

我需要将 MB 的总和作为数据发送到一组 Cloudwatch 日志组,而不是在控制台中。但首先我需要得到两个工作的总和。

我从 AWS support article. 开始,然后从 Cloudwatch 控制台获取我需要的指标名称。然后查看docsget-metric-data CLI。

在这三个之间,这是我得到的最接近的:

aws cloudwatch get-metric-data --profile default --metric-data-queries file://./.temp/metric-data-queries.json  \
--start-time 2019-12-04T00:00:00Z --end-time 2019-12-18T00:00:00Z

查询文件如下所示:

[
    {
        "Id": "mbSum",
        "MetricStat": {
            "Metric": {
                "Namespace": "AWS/Logs",
                "MetricName": "IncomingBytes",
                "Dimensions": [
                    {
                        "Name": "LogGroupName",
                        "Value": "/aws/lambda/prd-***-lambda"
                    },
                    {
                        "Name": "LogGroupName",
                        "Value": "/aws/lambda/prd-****-lambda"
                    }
                    ... 98 more, down the road, but just two for now
                ]
            },
            "Period": 1209600,
            "Stat": "Sum",
            "Unit": "Megabytes"
        }
    }
]

我得到的结果是:

{
    "MetricDataResults": [
        {
            "Id": "mbSum",
            "Label": "IncomingBytes",
            "Timestamps": [],
            "Values": [],
            "StatusCode": "Complete"
        }
    ],
    "Messages": []
}

如果没有结果,我希望那里为零。尝试了 300 周期(如 get-metric-data 文档建议的那样),没有变化。我所掌握的关于经期的信息是矛盾的/不清楚的。我在这里想念什么?

【问题讨论】:

    标签: amazon-web-services aws-cli amazon-cloudwatch


    【解决方案1】:

    使用 AWS CLI 进行这项工作非常麻烦。最后抓取了一个 Python 脚本from this answer 并稍作修改:

    #!/usr/bin/env python3
    
    # Outputs all loggroups with > 1GB of incomingBytes in the past x days
    
    import boto3
    from datetime import datetime as dt
    from datetime import timedelta
    
    days_to_check=30
    
    logs_client = boto3.client('logs')
    boto3.setup_default_session(profile_name="default")
    cloudwatch_client = boto3.client('cloudwatch')
    
    end_date = dt.today().isoformat(timespec='seconds')
    start_date = (dt.today() - timedelta(days=days_to_check)).isoformat(timespec='seconds')
    print("looking from %s to %s" % (start_date, end_date))
    
    paginator = logs_client.get_paginator('describe_log_groups')
    pages = paginator.paginate()
    page_c = 0
    total_checked = 0
    
    for page in pages:
      page_c += 1
      for json_data in page['logGroups']:
        total_checked += 1
        log_group_name = json_data.get("logGroupName")
    
        print(f"Page {page_c}: checking {log_group_name}                                    ", end="\r", flush=True)
    
        cw_response = cloudwatch_client.get_metric_statistics(
           Namespace='AWS/Logs',
           MetricName='IncomingBytes',
           Dimensions=[
            {
                'Name': 'LogGroupName',
                'Value': log_group_name
            },
            ],
            StartTime= start_date,
            EndTime=end_date,
            Period=3600 * 24 * days_to_check,
            Statistics=[
                'Sum'
            ],
            Unit='Bytes'
        )
        if len(cw_response.get("Datapoints")):
            stats_data = cw_response.get("Datapoints")[0]
            stats_sum = stats_data.get("Sum")
            sum_GB = stats_sum /  (1000 * 1000 * 1000)
            if sum_GB > 1.0:
                print("   **** %s exceeded 1GB log sent, total %.2f GB **** " % (log_group_name , sum_GB))
    
    print(f"Done. Checked {total_checked} logs.                                         ")
    

    值得注意的是,我们有 1000 个日志组,因此 CLI 将是一个困难的解决方案。如果有人想改进它,那就去吧。我的蟒蛇是咩。

    【讨论】:

    • 脚本很有用,谢谢分享。
    【解决方案2】:

    这些指标使用单位 Bytes 发出,CloudWatch 不会自动对单位进行任何转换。将单位更改为Bytes(或根本不指定单位)并使用度量数学将字节转换为兆字节。

    这是一个简化的请求,它汇总了所有日志组的所有传入字节:

    [
        {
            "Id": "mbSum",
            "Expression": "SUM(SEARCH('{AWS/Logs,LogGroupName} MetricName=\"IncomingBytes\"', 'Sum', 1209600))/1000000",
            "ReturnData": true
        }
    ]
    

    我在测试帐户上收到的回复:

    {
        "MetricDataResults": [
            {
                "Timestamps": [
                    "2019-12-04T00:00:00Z"
                ],
                "StatusCode": "Complete",
                "Values": [
                    4.844451
                ],
                "Id": "mbSum",
                "Label": "mbSum"
            }
        ] }
    

    将payload保存在query.json中并执行以下命令:

    aws cloudwatch get-metric-data --metric-data-queries file://query.json  \
    --start-time 2019-12-04T00:00:00Z --end-time 2019-12-18T00:00:00Z
    

    【讨论】:

    • 你确定? docs.aws.amazon.com/cli/latest/reference/cloudwatch/… 不同意这一点。改成字节,没区别。
    • 是的,从您链接的文档中:'如果您指定一个单位,则该操作仅返回使用指定单位收集的数据数据。如果指定的单位与收集的数据不匹配,则运算结果为空。 CloudWatch 不执行单位转换。
    • 接下来要检查的是地区和信用。确保默认配置文件中的区域与指标所在的区域匹配,并且信用与帐户匹配。
    • 好的,但我将其更改为字节,仍然得到一个空的结果集。未指定单位的结果相同。
    • 尝试在 CLI 调用中添加 --region us-west-2(以及其他 3 个美国地区)——结果没有变化。
    猜你喜欢
    • 2018-03-10
    • 2020-02-27
    • 1970-01-01
    • 2020-01-25
    • 2018-10-20
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多