我上个月从亚马逊获得了一张1200美元的Cloudwatch服务发票(特别是在“AmazonCloudWatch PutLogEvents”中提取了2 TB的日志数据),当时我预计会有几十美元。我已登录AWS控制台的Cloudwatch部分,可以看到我的一个日志组使用了大约2TB的数据,但该日志组中有数千个不同的日志流,如何判断哪个使用了该数量数据的?
在CloudWatch控制台上,使用IncomingBytes指标使用Metrics页面查找特定时间段内每个日志组在未压缩字节中摄取的数据量。按照以下步骤 -
这样,您将看到每个日志组摄取的数据量,并了解哪个日志组正在摄取多少日志组。
您还可以使用AWS CLI获得相同的结果。您只想知道日志组摄取的数据总量(例如30天)的示例场景,您可以使用get-metric-statistics CLI命令 -
示例CLI命令 -
aws cloudwatch get-metric-statistics --metric-name IncomingBytes --start-time 2018-05-01T00:00:00Z --end-time 2018-05-30T23:59:59Z --period 2592000 --namespace AWS/Logs --statistics Sum --region us-east-1
样本输出 -
{
"Datapoints": [
{
"Timestamp": "2018-05-01T00:00:00Z",
"Sum": 1686361672.0,
"Unit": "Bytes"
}
],
"Label": "IncomingBytes"
}
要为特定日志组查找相同内容,可以更改命令以适应以下维度:
aws cloudwatch get-metric-statistics --metric-name IncomingBytes --start-time 2018-05-01T00:00:00Z --end-time 2018-05-30T23:59:59Z --period 2592000 --namespace AWS/Logs --statistics Sum --region us-east-1 --dimensions Name=LogGroupName,Value=test1
您可以逐个在所有日志组上运行此命令,并检查哪个日志组负责提取数据的大部分帐单并采取纠正措施。
注意:更改特定于您的环境和要求的参数。
OP提供的解决方案提供了存储的日志数量的数据,这与记录的日志不同。
有什么不同?
每月摄取的数据与数据存储字节不同。将数据提取到CloudWatch后,它将由CloudWatch归档,每个日志事件包含26个字节的元数据,并使用gzip level 6压缩进行压缩。因此,存储字节是指Cloudwatch在摄取日志后用于存储日志的存储空间。
参考:https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html
好的,我在这里是answering my own question,但我们在这里(欢迎所有其他答案):
您可以结合使用AWS CLI工具,csvfix CSV软件包和电子表格来完成此任务。
$ aws logs describe-log-streams --log-group-name test01-ecs
output = json
中的~/.aws/config
),它将如下所示:
{
"logStreams": [
{
"creationTime": 1479218045690,
"arn": "arn:aws:logs:eu-west-1:902720333704:log-group:test01-ecs:log-stream:test-spec/test-spec/0307d251-7764-459e-a68c-da47c3d9ecd9",
"logStreamName": "test-spec/test-spec/0308d251-7764-4d9f-b68d-da47c3e9ebd8",
"storedBytes": 7032
}
]
}
$ aws logs describe-log-streams --log-group-name test01-ecs >> ./cloudwatch-output.json
$ in2csv cloudwatch-output.json --key logStreams >> ./cloudwatch-output.csv
在我的情况下,这工作 - 结果我的一个日志流(来自redis实例中破坏的TCP管道的日志)是所有其他流组合的大小的4000倍!
由于意外登记,我们有一个lambda记录GB的数据。这是一个基于boto3的python脚本,它基于上面答案中的信息扫描所有日志组,并打印出过去7天内日志大于1GB的任何组。这对我的帮助不仅仅是尝试使用速度缓慢的AWS仪表板。
#!/usr/bin/env python3
# Outputs all loggroups with > 1GB of incomingBytes in the past 7 days
import boto3
from datetime import datetime as dt
from datetime import timedelta
logs_client = boto3.client('logs')
cloudwatch_client = boto3.client('cloudwatch')
end_date = dt.today().isoformat(timespec='seconds')
start_date = (dt.today() - timedelta(days=7)).isoformat(timespec='seconds')
print("looking from %s to %s" % (start_date, end_date))
paginator = logs_client.get_paginator('describe_log_groups')
pages = paginator.paginate()
for page in pages:
for json_data in page['logGroups']:
log_group_name = json_data.get("logGroupName")
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 * 7,
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 = %.2f GB" % (log_group_name , sum_GB))