簡體   English   中英

CloudWatch Insights 查詢 - 如何從計數中獲取單個計數

[英]CloudWatch Insights Query - How to get a single count from counts

我有一個包含 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 條記錄 346 行

如果我將查詢更改為使用 count_distinct,我就會得到我想要的。 下面的例子:

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

使用 count_distinct 函數

然而,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(*) 

我們在理解查詢時遇到問題。

需要明確的是,我正在尋找在顯示數字的單行中返回的確切計數。

如果我們引入一個硬編碼為“1”的虛擬字段會怎樣? 這個想法是檢索它的最小值,以便即使相同的playerId出現多次,它也保持為“1”。 然后我們總結這個領域。

日志條目可能如下所示:

[1]"playerId": "1b45b168-00ed-42fe-a977-a8553440fe1a"

詢問:

fields @timestamp, @message
| sort @timestamp desc
| filter @message like /(playerId)/ 
| parse @message "[*]\"playerId\": \"*\"" as dummyValue, playerId
| stats sum(min(dummyValue)) by playerId as CT 

使用的參考資料:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM