不允许使用多个统计命令(Cloudwatch Logs Insights)

问题描述 投票:0回答:1

使用 AWS Cloudwatch Log Insights,我得到的客户端检查数量少于 50,执行以下查询有效,并得到以下输出

fields @timestamp, @message
| sort @timestamp desc
| parse @message /clientId=(?<clientid>\w+)/
| stats count() as Checks by clientid | filter Checks<50

clientid 检查
客户A 13
客户B 45

现在我想获得与过滤器匹配的检查的总和,这是预期的输出

总和(检查)
58

我尝试了以下查询,但收到错误。

fields @timestamp, @message
| sort @timestamp desc
| parse @message /clientId=(?<clientid>\w+)/
| stats count() as Checks by clientid | filter Checks<50 | sum(Checks)

编译错误 - 不允许使用多个统计命令

amazon-web-services grafana amazon-cloudwatchlogs aws-cloudwatch-log-insights
1个回答
0
投票

在 AWS CloudWatch Logs Insights 中,由于平台的限制,无法在单个查询中执行多个聚合函数。因此,为了获得所需的输出,您需要使用两个单独的查询。

首先,您使用此查询正确识别了检查次数少于 50 的客户:

fields @timestamp, @message
| sort @timestamp desc
| parse @message /clientId=(?<clientid>\w+)/
| stats count() as Checks by clientid
| filter Checks<50

鉴于此查询的结果,要获取检查总和,您将使用单独的查询:

fields @timestamp, @message
| parse @message /clientId=(?<clientid>\w+)/
| stats sum(Checks) as totalChecks by clientid
| filter totalChecks<50

但是,以上仅给出了每个客户单独的总金额。遗憾的是,由于使用多个

stats
命令的限制,CloudWatch Logs Insights 不支持直接在平台内将这些结果聚合为单个总和。

典型的解决方案是从初始查询中获取结果并手动或借助外部工具计算总和。如果您以编程方式获取结果(使用 AWS SDK 或 CLI),那么您可以使用您选择的语言/工具进一步处理结果以获得所需的总和。

例如下面是AWS SDK BOTO3方式:

当然!让我们使用 Python 和 Boto3 SDK 来获取结果,然后计算总和。

先决条件:

  1. 如果尚未安装 boto3:
pip install boto3
  1. 确保您已在您的环境中设置 AWS 凭证(使用
    aws configure
    、IAM 角色、环境变量等)

使用 Boto3 获取 CloudWatch Logs Insights 结果并计算总和的 Python 脚本:

import boto3
import time

# Initialize CloudWatch Logs client
client = boto3.client('logs')

# Define the CloudWatch Logs Insights query
query = """
fields @timestamp, @message
| sort @timestamp desc
| parse @message /clientId=(?<clientid>\w+)/
| stats count() as Checks by clientid
| filter Checks<50
"""

# Replace with your log group name and time range
log_group = 'YOUR_LOG_GROUP_NAME'
start_query_response = client.start_query(
    logGroupName=log_group,
    startTime=int((time.time() - 60) * 1000),  # adjust time as needed; this example is 60 seconds back
    endTime=int(time.time() * 1000),
    queryString=query,
)

query_id = start_query_response['queryId']

response = None
while response == None or response['status'] == 'Running':
    print('Waiting for query to complete...')
    time.sleep(1)
    response = client.get_query_results(
        queryId=query_id
    )

checks_sum = 0
for result in response['results']:
    for field in result:
        if field['field'] == 'Checks':
            checks_sum += int(field['value'])

print(f"Total Checks Sum: {checks_sum}")

YOUR_LOG_GROUP_NAME
替换为您的 CloudWatch Logs 组名称。根据您所需的时间范围调整
startTime
endTime
参数。

此脚本将执行 CloudWatch Logs Insights 查询,检索结果,然后计算并打印“Checks”字段的总和。

© www.soinside.com 2019 - 2024. All rights reserved.