使用新的 Flight SQL 插件为 Grafana 查询 InfluxDB IOx

导航至

安装、配置和使用的快速入门指南

Grafana 一直是与其配合使用的主要可视化工具。随着由 IOx 驱动的 InfluxDB Cloud 的发布,现在有了一种集成 InfluxDB 和 Grafana 的新方法:Flight SQL

我们的两位工程师 Brett 和 Helen 一直在努力创建一个名为 Flight SQL 的新 Grafana 插件。这款开源插件允许用户直接对 InfluxDB IOx 和其他与 Apache DataFusion 兼容的存储引擎执行 SQL 查询。这篇博文提供了安装、配置和使用此数据源插件的快速入门指南。

General-Lunux System

注意:如果您正在寻找包含 Flux 或 InfluxQL 的 InfluxDB OSS 教程,请查看以下 博客

安装插件

我们目前以实验性软件包的形式发布 Grafana 的 Flight SQL 插件。要安装它,请查看此处的最新说明 here。由于该软件包目前是实验性的,因此它是未签名的,需要您显式批准安装该插件(说明将帮助您完成此操作)。

配置插件

要配置 Flight SQL 插件,请查看以下 文档。我的首要提示是确保您以以下方式指定您的主机 URL

us-east-1-1.aws.cloud2.influxdata.com:443

您会发现,如果您在端口后包含任何协议或尾部路径,连接将会超时。

完成上述文档中的步骤后,您将收到以下连接成功消息。

Meta-data

快速入门示例

如果您想跳过一些手动设置并且熟悉 Docker,我还创建了一个名为 InfluxDB-IOx-Quick-Starts 的存储库。此存储库包含一系列使用 Docker-Compose 部署的 Telegraf 和 Grafana 示例。要使用此存储库,请运行以下说明

  1. 克隆存储库
    clone https://github.com/InfluxCommunity/InfluxDB-IOx-Quick-Starts.git
  2. 在存储库中创建一个环境文件
    cd InfluxDB-IOx-Quick-Starts && touch .env
  3. 将以下环境变量添加到文件中
    export INFLUX_HOST=<INSERT_HOST> 
    export INFLUX_TOKEN=<INSERT_TOKEN>
    export INFLUX_ORG=<INSERT_ORG>
    export INFLUX_BUCKET=<INSERT_BUCKET_NAME>
    注意:请务必记住仅包含 __host:port__,如下所示
    us-east-1-1.aws.cloud2.influxdata.com:443
    保存更改。
  4. 加载您新创建的环境文件
    source .env
  5. 现在您可以使用 docker-compose 部署 Telegraf 和 Grafana
    docker-compose -f system-monitoring/docker-compose.yml up -d

快速入门运行后,您可以在 http://localhost:3000 访问 Grafana。您可以使用默认用户名和密码 adminadmin 登录。

仪表板概览

现在我们已经安装并配置了插件,让我们参观一个使用 Flight SQL 数据源的 Grafana 仪表板示例。“Linux System”是 InfluxDB 社区喜爱的一个仪表板,因此我们将使用此仪表板作为如何将 Flux 转换为 SQL 的示例。

Flight SQL 的全局变量

在我们继续进行查询转换之前,值得一提的是,您可以使用一系列全局 Grafana 变量来使您的查询动态化和精简化。这是一个非详尽列表

变量 描述
$__timeRange(time) 此变量允许您动态设置查询时间范围。例如,如果您从下拉列表中选择查看最近 15 分钟的数据,您将看到与转换列等效的示例。

示例转换
’2023-01 01T00:00:00Z’ and time <= ’2023-01-01T01:00:00Z’
$__dateBin(time) 此变量是创建间隔窗口的动态简写形式,对于聚合很有用。间隔根据仪表板规范设置。

示例转换
date_bin(interval ’30 second’, time, interval ’1970-01-01T00:00:00Z’)
$__timeGroup(time, hour) 众所周知,dateBin 实际上是一个窗口期。这为我们提供了一种通过聚合或选择器来减少返回数据量的方法。timeGroup 的不同之处在于它生成可以分组的投影。

示例转换
datepart(’minute’, time),datepart(’hour’, time),datepart(’day’, time),datepart(’month’, time),datepart(’year’, time);

您可以通过在构建查询时单击“显示查询帮助”来找到完整的变量列表

Show Query Help

获取主机列表

InfluxDB 仪表板引入了一个仪表板变量,允许您根据主机名标签进行过滤。让我们看一下转换。

Flux Flight SQL
import "influxdata/influxdb/v1"

v1.measurementTagValues(bucket: v.bucket,
measurement: "cpu", tag: "host")
SELECT distinct (host) FROM cpu 
WHERE $__timeRange(time)

聚合窗口(平均值)

Flux 中最常用的函数之一是聚合窗口。这允许我们按特定间隔(例如 30 秒、2 分钟、1 年)对时间序列数据进行窗口化,然后在窗口化数据点上执行聚合器(平均值、众数、中位数等)或选择器(最大值、最小值、第一个、最后一个等)函数。

Flux Flight SQL
from(bucket: v.bucket)
  |> range(start: v.timeRangeStart, stop:
  v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "cpu")
  |> filter(fn: (r) => r._field == "usage_user"
  or r._field == "usage_system" or r._field == 
  "usage_idle")
  |> filter(fn: (r) => r.cpu == "cpu-total")
  |> filter(fn: (r) => r.host == v.linux_host)
  |> aggregateWindow(every: 
  v.windowPeriod, fn: mean, createEmpty: false)
SELECT
  $__dateBin(time) ,
  avg(usage_user) AS 'usage_user',
  avg(usage_system) AS 'usage_system',
  avg(usage_idle) AS 'usage_idle'
FROM cpu
WHERE host='${linux_host}' AND
cpu='cpu-total' AND  $__timeRange(time)
GROUP BY time

计算导数

现在我们打开天窗说亮话:并非所有基于时间的查询在 SQL 中都很简单。值相对于时间的导数(也称为值的变化率)是通过使用微分规则计算的。函数的导数给出了函数在给定点的变化率。这要求我们知道前一个值以及当前值。让我们看一个例子

Flux Flight SQL
from(bucket: v.bucket)
  |> range(start: v.timeRangeStart, stop:
  v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == 
  "diskio")
  |> filter(fn: (r) => r._field == "read_bytes"
  or r._field == "write_bytes")
  |> filter(fn: (r) => r.host == v.linux_host)
  |> derivative(unit: v.windowPeriod,
  nonNegative: false)
SELECT time, (read_bytes_delta_v /
delta_t_ns) * 1000000000 as read_bytes,
(write_bytes_delta_v / delta_t_ns) * 
1000000000 as write_bytes
FROM
(
SELECT
  (lag(read_bytes, 1) OVER (ORDER BY 
  time))  - read_bytes  as read_bytes_delta_v,
   (lag(write_bytes, 1) OVER (ORDER BY 
   time))  - write_bytes  as write_bytes_delta_v,
  (lag(cast(time as bigint), 1) OVER (ORDER BY
  time)) - cast (time as bigint) as delta_t_ns,
  time
FROM
diskio
WHERE host='${linux_host}' AND
$__timeRange(time)
) as sq

对于这些类型的示例,我们计划尽可能提供这样的解决方法,并逐步开发一系列自定义 SQL 函数来处理这些复杂的时间序列计算。

结论

我希望这篇博文能够为您提供足够的关于 Grafana 新 Flight SQL 插件的见解,以便您开始试用它。我给您的行动号召是开始测试该插件,并在插件 repository 中留下您的反馈。这将帮助我们改进插件的整体可用性和功能集。我还要借此机会感谢 Brett 和 Helen 为制作 Flight SQL 开源插件所做的努力。

欢迎加入我们的 Slack论坛。分享您的想法——我期待在那里见到您!