CloudWatch Insights Query - Как получить единый счет из подсчетов - PullRequest
2 голосов
/ 20 января 2020

У меня есть файл журнала, который содержит значения 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 заключается в том, что при расширении запроса на больший таймфрейм или большее количество записей количество записей получается на тысячи и десятки тысяч. Это создает проблему, поскольку числа становятся аппроксимациями из-за характера поведения 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 Ответ

0 голосов
/ 23 февраля 2020

Что если мы введем фиктивное поле, которое жестко закодировано в «1»? Идея состоит в том, чтобы извлечь его минимальное значение, чтобы оно оставалось как «1», даже если один и тот же playerId встречается более одного раза. И затем мы суммируем это поле.

Запись в журнале может выглядеть следующим образом:

[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 

Использованные ссылки:

...