You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Grafana与Amazon Athena实现多设备动态并行SQL查询可视化

Grafana对接Athena多设备查询的实现方案

场景与问题

我用Grafana对接Amazon Athena数据源,后端是基于AWS S3的Parquet数据湖,文件结构如下:

[DeviceID]/[MessageName]/YYYY/MM/DD/filename.parquet

每个表对应特定设备的一条消息,Parquet文件列包含该消息组的子信号。单设备可视化的SQL示例如下:

SELECT
    $__timeGroup(t, $__interval) as time,
    AVG(mysignal) as AVG_mysignal
FROM
    tbl_${device:csv}_mymessage
WHERE
    date_created BETWEEN $__rawTimeFrom('yyyy/MM/dd') AND $__rawTimeTo('yyyy/MM/dd')
    AND
    $__timeFilter(t)
GROUP BY
    $__timeGroup(t, $__interval)

这个结构在单设备场景下运行正常,但要展示多设备(比如全部或100个设备)的数据时,比如统计所有设备MessageSpeed表中Speed信号的日均平均值,跨表关联查询耗时极长,单SQL无法实现。

我尝试通过参数化逻辑让Grafana提交多个并行SQL查询(每个设备表执行一次),再在单个面板可视化结果,但没找到可行方法。需要实现传入DeviceID列表后,动态执行对应次数的查询并返回结果。

可行解决方案

1. 利用Grafana变量+重复查询(最直接的面板级实现)

  • 创建DeviceID变量:
    新建一个Query类型的变量,用Athena查询获取所有设备ID,SQL示例:

    SELECT DISTINCT regexp_extract(table_name, 'tbl_(.*)_MessageSpeed', 1) as device_id
    FROM information_schema.tables
    WHERE table_name LIKE 'tbl_%_MessageSpeed'
    

    变量设置为允许多选,勾选「Include All option」,方便一次性选择所有设备。

  • 配置重复查询:
    在目标面板中添加查询,修改SQL为:

    SELECT
        $__timeGroup(t, $__interval) as time,
        AVG(Speed) as AVG_Speed,
        '${device}' as device_id  -- 新增设备ID字段,区分不同设备的结果
    FROM
        tbl_${device}_MessageSpeed
    WHERE
        date_created BETWEEN $__rawTimeFrom('yyyy/MM/dd') AND $__rawTimeTo('yyyy/MM/dd')
        AND
        $__timeFilter(t)
    GROUP BY
        $__timeGroup(t, $__interval)
    

    在查询编辑器的「Query options」中,开启「Repeat for each value」,选择刚创建的DeviceID变量。Grafana会自动为每个选中的DeviceID并行执行查询,结果会带上设备ID标识,直接在面板中就能区分展示多设备的数据。

2. 数据层预聚合(解决大规模设备性能瓶颈)

如果设备数量极大(比如上千台),并行查询可能出现资源耗尽或超时问题,建议在数据湖层面做预聚合:

  • 用AWS Glue定时任务,按天/小时将所有设备的MessageSpeed数据聚合到一张统一的预聚合表,表结构示例:
    date_partition (YYYY/MM/DD) | device_id | time | avg_speed
    
  • 后续Grafana直接查询这张预聚合表,单SQL就能快速获取多设备的统计结果,无需依赖并行查询。

3. Grafana API批量生成查询(进阶自动化方案)

如果需要更灵活的动态查询管理,可以通过Grafana API批量创建面板查询:

  • 编写脚本遍历DeviceID列表,调用Grafana的/api/dashboards/uid/{uid}接口,动态为目标面板添加多个查询条目。
  • 这种方式适合需要自动化维护大量设备查询的场景,但需要额外开发脚本。

内容的提问来源于stack exchange,提问作者mfcss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:03:39