Func 自定义查询函数¶
本文将介绍如何通过 DataFlux Func 编写自定义查询函数、处理外部数据,并按图表要求组织返回结果。QueryHub 的原生查询和 DQL Like 由服务端处理结果,无需封装为 Func 图表数据结构。
配置连接器¶
在 Func 的开发 > 连接器中创建与目标数据源类型一致的连接器,填写连接地址和凭据,并测试连接。
以下示例假设已创建 ID 为 mysql 的 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 外部函数配置及图表数据源查询。