Documentation

开始查询数据

InfluxDB 支持多种不同的工具来查询数据,包括:

本教程将引导您了解在 InfluxDB 中查询数据的基本知识,并主要集中在您可以用来查询时间序列数据的两种语言上:

  • Flux:一种功能性脚本语言,旨在查询和处理来自InfluxDB和其他数据源的数据。
  • InfluxQL: 一种类似SQL的查询语言,旨在查询来自InfluxDB的时间序列数据。

本节教程中的示例查询了开始写数据部分中编写的数据。

在此页面上:

使用Flux查询数据

Flux是一种函数式脚本语言,让您能够查询和处理来自InfluxDB和其他数据源的数据。

这是写Flux查询的简要介绍。 若要获取更深入的介绍,请参见 Get started with Flux

Flux 查询基础

在使用Flux查询InfluxDB时,您会使用三个主要函数:

  • from(): 从InfluxDB存储桶查询数据。

  • range(): 根据时间范围过滤数据。Flux需要“有限制”的查询——限制在特定时间范围内的查询。

  • filter(): 根据列值过滤数据。每一行由 r 表示 而每一列由 r 的一个属性表示。 您可以应用多个后续筛选。

    要了解 from() 如何将数据结构化为行和表格,以便从 InfluxDB 返回, 查看在开始写入 InfluxDB 时写入的数据

    了解更多有关 filter() 的工作原理

管道转发运算符

Flux使用管道转发操作符 (|>) 将一个函数的输出作为下一个函数的输入。

查询示例数据

以下Flux查询返回存储在home测量中的cohumtemp字段,时间戳介于2022-01-01T08:00:00Z和2022-01-01T20:00:01Z之间。

from(bucket: "get-started")
    |> range(start: 2022-01-01T08:00:00Z, stop: 2022-01-01T20:00:01Z)
    |> filter(fn: (r) => r._measurement == "home")
    |> filter(fn: (r) => r._field== "co" or r._field == "hum" or r._field == "temp")

执行 Flux 查询

使用InfluxDB UIinflux CLIInfluxDB API来执行Flux查询。

  1. 访问 cloud2.influxdata.com 在浏览器中登录并访问 InfluxDB 用户界面。

  2. 在左侧导航栏中,点击 数据探测器

  1. InfluxDB 数据探测器提供了两种使用 Flux 查询数据的选项:

    • 查询构建器 (默认): 可视化查询构建器,允许您选择时间范围、 测量、标签和要查询的字段。
    • Script Editor: 浏览器内的代码编辑器,用于编写和运行Flux脚本。

    查询构建器

    使用查询构建器构建并执行Flux查询:

    1. FROM列中,选择要查询的桶。对于本教程,选择get-started桶。

    2. 在下一个 filter 列中,从列下拉菜单中选择 _measurement,然后选择 home 测量。

    3. (可选) 要查询特定字段或字段,在下一个 filter 列中,从列下拉菜单中选择 _field,然后选择要查询的字段。在本教程中,有三个字段: cohumtemp

    4. (可选) 要通过特定标签值进行查询,在下一个 过滤器 列中,从下拉菜单中选择标签列,然后选择要过滤的标签值。在本教程中,唯一的标签列是 房间

    5. (可选)聚合函数面板中,选择一个聚合或选择器函数来下采样数据。默认的聚合函数是mean

    6. 在时间范围下拉菜单中,选择 自定义时间范围,并从日期选择器中选择以下日期:

      • 开始: 2022-01-01 08:00:00

      • 停止: 2022-01-01 20:00:01

        请注意停止时间添加了一秒。在Flux中,停止时间是排他的,将排除具有该时间戳的点。通过添加一秒,查询将包括到2022-01-01 20:00:00的所有点。

    7. 点击 提交 以使用选定的过滤器和操作执行查询并显示结果。


    脚本编辑器

    使用查询构建器编写并执行Flux查询:

    1. 在数据探索器中,点击 脚本编辑器

    2. 在脚本编辑器文本字段中编写您的Flux查询。

      注意: 你可以手动编写函数,也可以使用脚本编辑器右侧的函数列表来搜索和插入函数。

      1. 使用 from() 并通过 bucket 参数指定要查询的桶。
        对于本教程,查询 get-started 桶。

      2. 使用 range() 指定要查询的时间范围。start 参数定义了结果中包括的最早时间。 stop 参数指定了结果中包括的最晚时间(不包括)。

        • 开始: 2022-01-01T08:00:00Z

        • 停止: 2022-01-01T20:00:01Z

          请注意停止时间添加了一秒。在Flux中,停止时间是排他的,将排除具有该时间戳的点。通过添加一秒,查询将包括到2022-01-01 20:00:00的所有点。

        如果您想使用在时间选择下拉菜单中选择的开始和结束时间,请使用 v.timeRangeStartv.timeRangeStop 作为 startstop 参数的值。

      3. 使用 filter() 按照 home 测量过滤结果。

      4. (可选) 使用 filter() 按特定字段过滤结果。 在本教程中,有三个字段: cohumtemp

      5. (可选) 使用 filter() 通过特定标签值过滤结果。在本教程中,有一个标签 room,其潜在值为: 客厅厨房

      from(bucket: "get-started")
          |> range(start: 2022-01-01T08:00:00Z, stop: 2022-01-01T20:00:01Z)
          |> filter(fn: (r) => r._measurement == "home")
          |> filter(fn: (r) => r._field== "co" or r._field == "hum" or r._field == "temp")
      
    3. 点击 提交 以使用选定的过滤器和操作执行查询并显示结果。

  1. 如果您还没有,请下载、安装并配置 influx CLI

  2. 使用influx query 命令通过 Flux 查询 InfluxDB。

    提供以下内容:

influx query '
from(bucket: "get-started")
    |> range(start: 2022-01-01T08:00:00Z, stop: 2022-01-01T20:00:01Z)
    |> filter(fn: (r) => r._measurement == "home")
    |> filter(fn: (r) => r._field== "co" or r._field == "hum" or r._field == "temp")
'

要使用Flux和InfluxDB HTTP API从InfluxDB查询数据,请向InfluxDB API /api/v2/query端点发送请求,使用POST请求方法。

POST http://localhost:8086/api/v2/query

请在您的请求中包含以下内容:

  • 头部:
    • 授权: 令牌 <INFLUX_TOKEN>
    • 内容类型: application/vnd.flux
    • 接受: application/csv
    • (可选) 接受编码: gzip
  • 查询参数:
    • org: InfluxDB 组织名称
  • 请求体: 以普通文本形式的Flux查询

以下示例使用 cURL 和 InfluxDB API 通过 Flux 查询数据:

curl --request POST \
"$INFLUX_HOST/api/v2/query?org=$INFLUX_ORG&bucket=get-started" \
  --header "Authorization: Token $INFLUX_TOKEN" \
  --header "Content-Type: application/vnd.flux" \
  --header "Accept: application/csv" \
  --data 'from(bucket: "get-started")
    |> range(start: 2022-01-01T08:00:00Z, stop: 2022-01-01T20:00:01Z)
    |> filter(fn: (r) => r._measurement == "home")
    |> filter(fn: (r) => r._field== "co" or r._field == "hum" or r._field == "temp")
  '

InfluxDB /api/v2/query 端点返回查询结果为 注释的 CSV

Flux 查询结果

查看 Flux 查询结果

使用InfluxQL查询数据

InfluxQL是一种类似于大多数SQL语言的SQL样式查询语言,但专门设计用于从InfluxDB 0.x和1.x查询时间序列数据。

将数据库和保留策略映射到存储桶

因为 InfluxQL 是为早期版本的 InfluxDB 开发的,它依赖于 数据库和保留策略 (DBRP),这些在 InfluxDB Cloud 中已被 取代。 要在 InfluxDB Cloud 中使用 InfluxQL,首先 将数据库和保留策略 (DBRP) 的组合映射到 InfluxDB 桶

InfluxQL 查询基础

当使用InfluxQL查询InfluxDB时,最基本的查询包括以下语句和子句:

  • SELECT: 指定要查询的字段和标签。
  • FROM: 指定要查询的测量。 使用测量名称或包括数据库和保留策略的完全限定测量名称。例如:db.rp.measurement
  • WHERE: (可选) 根据字段、标签和时间过滤数据。

以下的 InfluxQL 查询返回cohumtemp 字段以及 在home 测量中存储的room 标签,时间戳介于 2022-01-01T08:00:00Z 和 2022-01-01T20:00:00Z之间。

SELECT co,hum,temp,room FROM "get-started".autogen.home WHERE time >= '2022-01-01T08:00:00Z' AND time <= '2022-01-01T20:00:00Z'

这些只是InfluxQL语法的基础知识。有关更深入的信息,请参阅InfluxQL文档

执行一个 InfluxQL 查询

使用 influx CLIInfluxDB API 来执行 InfluxQL 查询。

influxdb 用户界面不支持 InfluxQL

InfluxDB Cloud 用户界面不提供使用 InfluxQL 查询数据的方式。对于构建和执行 InfluxQL 查询的用户界面,请考虑使用 ChronografGrafana 与 InfluxDB Cloud。

身份验证凭据

下面的示例假设您的 InfluxDB 主机组织令牌 是通过 活动 influx CLI 配置 或环境变量 (INFLUX_HOSTINFLUX_ORGINFLUX_TOKEN) 提供的。如果您没有设置 CLI 配置或环境变量,请在每个命令中使用以下标志包含这些必需的凭据:

  • --host: InfluxDB 主机
  • -o, --org--org-id: InfluxDB 组织名称或 ID
  • -t, --token: InfluxDB API 令牌
  1. 如果您还没有,请下载、安装并配置 influx CLI

  2. 使用influx v1 shell命令启动InfluxQL shell,并使用InfluxQL查询InfluxDB。提供以下内容:

    influx v1 shell
    
  3. 输入一个 InfluxQL 查询并按 Enter ↵

    SELECT co,hum,temp,room FROM "get-started".autogen.home WHERE time >= '2022-01-01T08:00:00Z' AND time <= '2022-01-01T20:00:00Z'
    

要使用 InfluxQL 和 InfluxDB HTTP API 从 InfluxDB 查询数据,请发送请求 到 InfluxDB API /query 1.X 兼容终端 使用 POST 请求方法。

POST http://localhost:8086/query

请在您的请求中包含以下内容:

  • 标题:

    • Authorization: Token <INFLUX_TOKEN>
    • Accept: application/json
    • (Optional) Accept-Encoding: gzip
  • 查询参数:

    • db: 要查询的数据库。

    • rp: 查询数据的保留策略。

    • q: 要执行的InfluxQL查询。

    • epoch: (可选) 返回具有指定精度的 Unix 时间戳,而不是RFC3339 时间戳。以下精度可用:

      • ns - nanoseconds
      • u or µ - microseconds
      • ms - milliseconds
      • s - seconds
      • m - minutes
      • h - hours
  • 请求体: 作为纯文本的Flux查询

以下示例使用cURL和InfluxDB API通过InfluxQL查询数据:

curl --get "$INFLUX_HOST/query?org=$INFLUX_ORG&bucket=get-started" \
  --header "Authorization: Token $INFLUX_TOKEN" \
  --data-urlencode "db=get-started" \
  --data-urlencode "rp=autogen" \
  --data-urlencode "q=SELECT co,hum,temp,room FROM home WHERE time >= '2022-01-01T08:00:00Z' AND time <= '2022-01-01T20:00:00Z'"

InfluxDB /write 1.x 兼容性端点以 JSON 格式返回查询结果。

InfluxQL 查询结果

查看InfluxQL查询结果

恭喜! 您已经学习了在InfluxDB中查询数据的基础知识。要深入了解您可以查询InfluxDB的所有方法,请参阅文档中的在InfluxDB中查询数据部分。

让我们继续更高级的数据处理查询以及使用InfluxDB任务自动化查询。



Flux的未来

Flux 正在进入维护模式。您可以像现在一样继续使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源版本现已公开Alpha测试

InfluxDB 3 Open Source is now available for alpha testing, licensed under MIT or Apache 2 licensing.

我们将发布两个产品作为测试版的一部分。

InfluxDB 3 核心,是我们新的开源产品。 它是一个用于时间序列和事件数据的实时数据引擎。 InfluxDB 3 企业版是建立在核心基础之上的商业版本,增加了历史查询能力、读取副本、高可用性、可扩展性和细粒度安全性。

有关如何开始的更多信息,请查看:

由TSM驱动的InfluxDB Cloud