Grafana/Timestream:如何随着时间的推移可视化某些事件的数量

Posted

技术标签:

【中文标题】Grafana/Timestream:如何随着时间的推移可视化某些事件的数量【英文标题】:Grafana/Timestream: how to visualize number of certain events over time 【发布时间】:2022-01-09 00:16:06 【问题描述】:

我是 Grafana 和 Timestream 的新手,想了解它们是否适合我的需求。

我的目标是在日志中可视化一些特定事件。

我有一个表示会话 ID (cmcd_sid) 和一些指示符的字段 - cmcd_bs

cmcd_sid                                   cmcd_bs         <other fields>

"78b459fc-9fab-4286-8840-8f1420f528da"     -

"78b459fc-9fab-4286-8840-8f1420f528da"     -

"78b459fc-9fab-4286-8840-8f1420f528da"     true

所以我需要获取并可视化拥有超过 1% cmcd_bs=true 的会话 (cmcd_sid) 的数量

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 > 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 > 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 > 1
GROUP BY SID_B

我编写了一个查询,提供了这些会话,但是当我尝试在 Grafana 中对其进行可视化时,它会抛出“数据没有时间字段”

理想情况下,我想要一个图表来描述我在一段时间内有多少次会话,但不确定如何将时间字段合并到查询中?

【问题讨论】:

【参考方案1】:

1.可视化类型

Grafana 中的时间序列图表需要一个时间字段,您可以在编辑面板的右上角选择其他类型的可视化。超过cmcd_bs = true 1% 的会话总数似乎是一个单一的数字。如果是这样,您可以选择图形类型“Stat”或“Gauge”。

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 > ago(3h)
        GROUP BY cmcd_sid
    )
SELECT
    COUNT(*) AS high_true_bs_rate_session_count
FROM session_stats
WHERE true_bs_rate > 0.01

3.时间过滤器

您的查询time &gt; ago(3h) 中有一个固定时间过滤器。因此,如果您在 Grafana 中更改时间段,则该值不会更改(您可以在主仪表板的右上角选择时间段)。要仅计算 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 > 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) >= from_milliseconds($__from) 
          AND MIN(time) < 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 > 0.01
GROUP BY DATE_TRUNC('day', session_start_time)

注意:会话可能会被$__timeFilter 截断,cmcd_bs = true 的计数会因这些会话而有所偏差,这就是为什么时间过滤器在第一个分组之后完成的原因。这也应该适用于其他查询。

【讨论】:

以上是关于Grafana/Timestream:如何随着时间的推移可视化某些事件的数量的主要内容,如果未能解决你的问题,请参考以下文章

如何调试并查看随着时间的推移存储到线程间通信插件的 FIFO 队列中的内容?

随着数据框变大,如何防止 rbind() 变得非常慢?

Excel中如何让进度中的时间随着开始时间和结束时间的变化而发生颜色变化呢?

如何随着媒体屏幕尺寸的变化关闭材料抽屉?

swift spritekit 随着游戏时间的推移增加重力?

Android - 如何让手机随着音乐播放而振动