跳转至

Func 自定义查询函数

本文将介绍如何通过 DataFlux Func 编写自定义查询函数、处理外部数据,并按图表要求组织返回结果。QueryHub 的原生查询和 DQL Like 由服务端处理结果,无需封装为 Func 图表数据结构。

配置连接器

在 Func 的开发 > 连接器中创建与目标数据源类型一致的连接器,填写连接地址和凭据,并测试连接。

以下示例假设已创建 ID 为 mysql 的 MySQL 连接器:

mysql = DFF.CONN('mysql')

如果脚本还需要调用观测云接口,可另外配置对应连接器和工作空间 API Key。数据库连接器与 API 连接器的凭据用途不同,配置入口见通过 Func 接入。

编写数据查询函数

使用 category='dataPlatform.dataQueryFunc' 注册可供数据查询使用的函数。

以下示例读取 my_table 表,假设:

  • createTime 保存 Unix 时间戳,单位为秒;
  • reqCost 是请求耗时;
  • 图表传入的 time_range 包含开始和结束时间,单位为毫秒。
@DFF.API('查询请求耗时', category='dataPlatform.dataQueryFunc')
def query_request_cost(time_range):
    mysql = DFF.CONN('mysql')

    sql = '''
        SELECT createTime, reqCost
        FROM my_table
        WHERE createTime >= ? AND createTime < ?
        ORDER BY createTime
        LIMIT 100
    '''
    parameters = [
        int(time_range[0] / 1000),
        int(time_range[1] / 1000),
    ]
    rows = mysql.query(sql, parameters)

    return {
        'series': [[{
            'columns': ['time', 'req_cost'],
            'tags': {},
            'values': [
                [row['createTime'] * 1000, row['reqCost']]
                for row in rows
            ],
        }]],
    }

请替换连接器 ID、表名和字段名,并根据实际数据的时间单位调整换算。示例的 SQL 参数按 ? 的出现顺序绑定,不通过字符串拼接时间值。

理解返回结构

字段 含义
series 供查询展示使用的数据序列,示例外层保留两层数组
columns 每行值的字段顺序,示例第一列是 time,第二列是 req_cost
tags 当前序列的标签;不同标签组合需要分别组织为不同序列
values 与 columns 对齐的二维数据;示例时间列统一输出为毫秒

这是一种 Func 图表返回结构,不表示脚本正在执行 QueryHub 的 DQL Like 表达式。

按图表类型组织结果

不同图表对序列、时间列和标签的要求不同,详细格式见:

函数配置和调用说明还可参考 Function 外部函数配置及图表数据源查询。

文档评价

文档内容是否对您有帮助?