CloudWatch Insights查询-如何从计数中获取单个计数

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

我有一个包含playerId值的日志文件,有些球员在文件中有多个条目。我想对唯一播放器进行确切的计数,无论他们在日志文件中是否包含1个或多个条目。

使用下面的查询扫描497条记录,找到346个唯一的行(346是我想要的数字)查询:

fields @timestamp, @message
| sort @timestamp desc
| filter @message like /(playerId)/ 
| parse @message "\"playerId\": \"*\"" as playerId
| stats count(playerId) as CT by playerId

497 records 346 rows

如果我将查询更改为使用count_distinct,则完全可以得到所需的内容。下面的例子:

fields @timestamp, @message
| sort @timestamp desc
| filter @message like /(playerId)/ 
| parse @message "\"playerId\": \"*\"" as playerId
| stats count_distinct(playerId) as CT 

with count_distinct function

然而,count_distinct的问题是,随着查询扩展到更大的时间范围/更多记录,条目的数量将成千上万。由于洞察力count_distinct行为的性质,当数字变为近似值时,这就出现了一个问题。

“返回该字段的唯一值的数量。如果该字段具有很高的基数(包含许多唯一值),则count_distinct返回的值只是一个近似值。”

文档:https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html

这是不可接受的,因为我需要准确的数字。我相信可以解决这个问题,但是坚持使用count()而不是count_distinct(),但是我无法得出一个数字...无效的示例...任何想法?

例1:

fields @timestamp, @message
| sort @timestamp desc
| filter @message like /(playerId)/ 
| parse @message "\"playerId\": \"*\"" as playerId
| stats count(playerId) as CT by playerId
| stats count(*) 

我们难以理解查询。

要清楚,我正在寻找要在显示数字的一行中返回的确切计数。

我有一个包含playerId值的日志文件,有些球员在文件中有多个条目。我想获得唯一身份玩家的确切数量,无论他们是否有1个或多个...

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

如果我们引入一个硬编码为“ 1”的虚拟字段怎么办?这个想法是检索其最小值,以便即使相同的playerId出现多次也保持为“ 1”。然后我们对该字段求和。

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