可调用 Flux API 脚本和参数化查询
目录
InfluxDB Cloud 支持 Flux 中的可调用 API 脚本。InfluxDB Cloud 服务器托管和调用带有参数化查询的可调用 API 脚本,以便应用程序开发人员可以向其时间序列应用程序添加自定义功能,而无需在其客户端服务和代码中引入查询资源。参数化查询使您能够提供参数,然后将其插入到 Flux 查询中以供执行。通过支持运行时参数,可以泛化这些函数,以便可以为每个用户返回自定义结果。
参数化查询
对于最基本的示例,我们将传递一个桶名称作为参数传递给我们的参数化 Flux 查询。Flux 脚本如下所示
from(bucket:params.mybucket)
|> range(start: -7d)
|> limit(n:2)","params":{"mybucket":"telegraf"}
Flux 引擎将使用我们要查询的桶名称替换 params.mybucket。我们在 Flux 查询请求有效负载的末尾使用 “params”:{“mybucket”:”telegraf”} 指定 mybucket 参数的值以查询 “telegraf” 桶。由于必须使用 API 执行此查询,因此我们将查询转换为 JSON 以执行以下 cURL 请求
curl -X POST \
'https://us-west-2-1.aws.cloud2.influxdata.com/api/v2/query?orgID=<myOrgID>' \
-H 'authorization: Token <myToken>' \
-H 'content-type: application/json' \
-d '{"query":"from(bucket:params.mybucket) |> range(start: -7d) |> limit(n:2)","params":{"mybucket":"telegraf"}}'
就是这样!现在您可以开始构建参数化查询以保护您的 IoT 应用程序并帮助防止注入攻击。参数化查询还可以轻松更新查询以反映新的桶、过滤器或时间戳,并鼓励代码重用。
参数化查询的类型
使用参数化 Flux 查询非常简单。参数化 Flux 查询支持 int、float 和 string 类型的参数。但是,Flux 本身支持更多类型,例如 duration 等。因此,您必须确保正确键入日期参数。例如,如果要将参数设为时间戳,则必须使用 duration() 函数将该值转换为 duration。您的请求正文应如下所示
{"query":"from(bucket:\"telegraf\") |> range(start: duration(v : params.mystart)) |> limit(n:2)","params":{"mystart":"-7d"}}
可调用 Flux API 脚本
您可以使用 InfluxDB v2 API 创建可调用 API 脚本和关联的函数资源。关联的函数资源包含以下内容:名称、ID、描述、组织 ID、脚本、语言、URL、创建时间和更新时间。这些功能可帮助开发人员识别其可调用 API 脚本及其关联的元数据。函数 ID 用于根据请求手动调用函数。
要使用关联的函数资源创建函数,请使用 api/v2/functions 端点。在此示例中,我们的参数化查询返回我们选择的桶中的最后两个数据点。
curl -X 'POST' \
'https://us-west-2-1.aws.cloud2.influxdata.com/api/v2/functions' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"name": "myFirstAPIInvokableScripts",
"description": "a API Invokable Script that gathers the last point from a bucket",
"orgID": "<myOrgID>",
"script": "from(bucket:params.mybucket) \
|> range(start: -7d) \
|> limit(n:2)",
"language": "flux"
}'
创建可调用 API 脚本时,函数 ID 将在响应正文中返回。或者,您也可以通过列出函数来检索函数 ID 和所有其他关联的函数资源。然后,您可以使用以下命令列出函数
curl -X 'GET' \
'https://us-west-2-1.aws.cloud2.influxdata.com/api/v2/functions?orgID=<myOrgID>' \
-H 'accept: application/json'
使用参数化查询调用脚本
获得函数 ID 后,您可以手动调用可调用 API 脚本并提供参数。在这种情况下,我们将向 mybucket 参数提供桶名称。我们的请求如下所示
curl -X 'POST' \
'https://us-west-2-1.aws.cloud2.influxdata.com/api/v2/functions/<functionID>/invoke' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"params": {"mybucket":"telegraf"}
}'