Amazon web services 如何获取发送到一组Cloudwatch日志组的兆字节总数?
我需要将MB的总和作为数据发送到一组Cloudwatch日志组,而不是在控制台中。但首先我需要得到两个工作日的总和 我从一个开始,然后从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
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调用--结果无变化。