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

Grafana/Timestream: how to visualize number of certain events over time

我是 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。可视化类型

Grafana中的时间序列需要时间字段,可以在右上角选择其他可视化类型版本面板。超过 1% 的会话总数 cmcd_bs = true,似乎是一个数字。如果是这样,您可以选择图表类型“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 > ago(3h)。因此,如果您在 Grafana 中更改时间段,该值不会更改(您可以 select 主仪表板右上角的时间段)。要仅计算 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

4。时间序列可视化

如果您想要的不是单个值,而是每日(或每周、每月...)随时间推移的演变。您可以按所需时间段分组,而不是对整个数据集进行聚合:

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 的计数对于这些会话会有偏差,这就是为什么时间过滤器在第一个之后完成的原因通过...分组。这也适用于其他查询。