[英]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
如果我將查詢更改為使用 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 的問題在於,隨着查詢擴展到更大的時間范圍/更多記錄,條目數量會達到數千甚至數萬。 由於 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.