Ela*_*hts 5 amazon-web-services amazon-cloudwatch amazon-cloudwatchlogs aws-cloudwatch-log-insights
我有一个包含 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
Run Code Online (Sandbox Code Playgroud)
如果我将查询更改为使用 count_distinct,我就会得到我想要的。下面的例子:
fields @timestamp, @message
| sort @timestamp desc
| filter @message like /(playerId)/
| parse @message "\"playerId\": \"*\"" as playerId
| stats count_distinct(playerId) as CT
Run Code Online (Sandbox Code Playgroud)
然而,count_distinct 的问题在于,随着查询扩展到更大的时间范围/更多的记录,条目的数量会达到数千甚至数万。由于 Insights 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(*)
Run Code Online (Sandbox Code Playgroud)
我们在理解查询时遇到问题。
需要明确的是,我正在寻找在显示数字的单行中返回的确切计数。
如果我们引入一个硬编码为“1”的虚拟字段怎么办?这个想法是检索其最小值,以便即使相同情况playerId发生多次,它仍保持为“1”。然后我们对这个字段求和。
日志条目可能如下所示:
[1]"playerId": "1b45b168-00ed-42fe-a977-a8553440fe1a"
Run Code Online (Sandbox Code Playgroud)
询问:
fields @timestamp, @message
| sort @timestamp desc
| filter @message like /(playerId)/
| parse @message "[*]\"playerId\": \"*\"" as dummyValue, playerId
| stats sum(min(dummyValue)) by playerId as CT
Run Code Online (Sandbox Code Playgroud)
使用的参考资料:
| 归档时间: |
|
| 查看次数: |
11899 次 |
| 最近记录: |