#grafana #amazon-timestream
#графана #amazon-поток времени
Вопрос:
Я новичок в Grafana и Timestream и хочу продемонстрировать их пригодность для моих нужд.
Моя цель-визуализировать ряд определенных событий в журналах.
У меня есть поле, представляющее идентификатор сеанса (cmcd_sid ) и некоторый индикатор — cmcd_bs:
cmcd_sid cmcd_bs lt;other fieldsgt; "78b459fc-9fab-4286-8840-8f1420f528da" - "78b459fc-9fab-4286-8840-8f1420f528da" - "78b459fc-9fab-4286-8840-8f1420f528da" true
Итак, мне нужно получить и визуализировать количество сеансов (cmcd_sid), в которых более 1% cmcd_bs=true
WITH total_requests AS ( SELECT cast (count(*) as double) as CNT_TOTAL, cmcd_sid as SID_TOTAL FROM $__database.$__table WHERE cmcd_sid is not NULL AND time gt; ago(3h) GROUP BY cmcd_sid ), bs_requests AS ( SELECT cast (count(*) as double) as CNT_BS, cmcd_sid as SID_BS FROM $__database.$__table WHERE cmcd_bs is not NULL AND time gt; ago(3h) GROUP BY cmcd_sid ) SELECT count(DISTINCT SID_BS), SID_BS FROM total_requests, bs_requests WHERE SID_TOTAL = SID_BS AND CNT_BS / CNT_TOTAL * 100 gt; 1 GROUP BY SID_B
Я написал запрос, который дал мне эти сеансы, но когда я пытаюсь визуализировать его в Графане, он выдает «Данные не имеют поля времени».
В идеале я хочу иметь график, показывающий, сколько у меня таких сеансов за определенный период времени, но не уверен, как я могу включить поле времени в запрос?
Ответ №1:
1. Тип визуализации
График временных рядов в Графане ожидает поле времени, вы можете выбрать другие типы визуализации в правом верхнем углу панели редактирования. Общее количество сеансов с более чем 1% cmcd_bs = true
, по-видимому, составляет одно-единственное число. Если это так, вы можете выбрать, например, тип графика «Статистика» или «Показатель».
2. Запрос временного потока
Обратите внимание, что:
- Окончательная группировка по в вашем запросе не влияет, так как 2 CTE уже сгруппированы по этому столбцу.
- Вы можете объединить 2 CTE в один, так как они группируются по одному и тому же ключу.
cmcd_bs is not NULL
не эквивалентноcmcd_bs = true
Поэтому вы можете переписать свой запрос:
WITH session_stats AS ( SELECT cmcd_sid, SUM(CAST(cmcd_bs AS INT)) / CAST(COUNT(*) AS DOUBLE) AS true_bs_rate FROM $__database.$__table WHERE cmcd_sid IS NOT NULL AND time gt; ago(3h) GROUP BY cmcd_sid ) SELECT COUNT(*) AS high_true_bs_rate_session_count FROM session_stats WHERE true_bs_rate gt; 0.01
3. Фильтр времени
В вашем запросе есть фильтр с фиксированным временем time gt; ago(3h)
. Поэтому значение не изменится, если вы измените период в Графане (вы можете выбрать период времени в правом верхнем углу главной панели мониторинга). Чтобы считать записи только в течение периода времени, определенного в Grafana, вам необходимо перейти $__timeFilter
к вашему запросу:
WITH session_stats AS ( SELECT cmcd_sid, SUM(CAST(cmcd_bs AS INT)) / CAST(COUNT(*) AS DOUBLE) AS true_bs_rate FROM $__database.$__table WHERE cmcd_sid IS NOT NULL AND $__timeFilter GROUP BY cmcd_sid ) SELECT COUNT(*) AS high_true_bs_rate_session_count FROM session_stats WHERE true_bs_rate gt; 0.01
- Визуализации временных рядов
Если вам нужно не одно значение, а скорее эволюция этого ежедневного (или еженедельного, ежемесячного,…) подсчета с течением времени. Вы можете сгруппировать данные по нужному периоду вместо объединения по всему набору данных:
WITH session_stats AS ( SELECT cmcd_sid, MIN(time) AS session_start_time, SUM(CAST(cmcd_bs AS INT)) / CAST(COUNT(*) AS DOUBLE) AS true_bs_rate FROM $__database.$__table WHERE cmcd_sid IS NOT NULL GROUP BY cmcd_sid HAVING MIN(time) gt;= from_milliseconds(${__from}) AND MIN(time) lt; from_milliseconds(${__to}) ) SELECT DATE_TRUNC('day', session_start_time) AS day, COUNT(*) AS high_true_bs_rate_session_count FROM session_stats WHERE true_bs_rate gt; 0.01 GROUP BY DATE_TRUNC('day', session_start_time)
Примечание: сеансы могут быть усечены, $__timeFilter
и количество cmcd_bs = true
будет смещено для этих сеансов, поэтому фильтр времени выполняется после первой группы по. Это также должно относиться к другим запросам.