Amazon web services 如何获取发送到一组Cloudwatch日志组的兆字节总数?

Amazon web services 如何获取发送到一组Cloudwatch日志组的兆字节总数?,amazon-web-services,aws-cli,amazon-cloudwatch,Amazon Web Services,Aws Cli,Amazon Cloudwatch,我需要将MB的总和作为数据发送到一组Cloudwatch日志组,而不是在控制台中。但首先我需要得到两个工作日的总和 我从一个开始,然后从Cloudwatch控制台抓取了我需要的度量名称。然后查看get metric dataCLI的 在这三者之间,这是我得到的最接近的结果: aws cloudwatch get-metric-data --profile default --metric-data-queries file://./.temp/metric-data-queries.json

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

我从一个开始,然后从Cloudwatch控制台抓取了我需要的度量名称。然后查看
get 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
doc建议),没有变化。我所掌握的有关这段时间的信息相互矛盾/不清楚。我错过了什么

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

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

[
    {
        "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"
        }
    ] }
将有效负载保存在
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

使用AWS CLI实现这一点是一个巨大的难题。最后抓取了一个Python脚本并对其进行了一些修改:

#!/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对于这一点来说将是一个困难的解决方案。如果有人想改进这一点,那就去做吧。我的蟒蛇是meh

你确定?我不同意这一点。将其更改为字节,没有区别。是的,与您链接的文档相比:“如果您指定一个单位,该操作将只返回使用指定单位收集的数据。如果指定的单位与收集的数据不匹配,则操作结果为空。CloudWatch不执行单位转换。接下来要检查的是区域和信誉。确保默认配置文件中的区域与度量值所在的区域匹配,并且cred与帐户匹配。确定,但我将其更改为Bytes,仍然得到一个空结果集。未指定单位的结果相同。已尝试将
--地区us-west-2
(以及其他3个美国地区)添加到CLI调用--结果无变化。