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

导航至

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

Grafana 自推出以来一直与 InfluxDB 一起用作标准可视化工具。随着 InfluxDB Cloud 带有 IOx 的发布,现在有了一种新的方式来集成 InfluxDB 和 Grafana:Flight SQL

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

General-Lunux System

注意:如果您正在寻找带有 Flux 或 InfluxQL 的 InfluxDB OSS 教程,请参阅以下 博客

安装插件

我们目前正在以实验包的形式发布 Grafana 的 Flight SQL 插件。要安装它,请参阅最新的说明 这里。由于该包目前处于实验阶段,它未签名,需要您明确批准插件的安装(说明将帮助您完成此操作)。

配置插件

要配置 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

快速启动运行后,您可以通过https://127.0.0.1:3000访问Grafana。您可以使用默认的用户名和密码:admin和admin。

仪表盘概述

现在我们已经安装并配置了插件,让我们通过Flight SQL数据源来浏览一个示例Grafana仪表盘。Linux系统是InfluxDB社区钟爱的仪表盘,因此我们将使用这个仪表盘作为如何将Flux转换为SQL的示例。

Flight SQL的全局变量

在我们继续查询转换之前,值得一提的是,有一系列全局Grafana变量可用于使您的查询动态化和高效。以下是一个非详尽的列表

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

示例转换
’2023-01 01T00:00:00Z’和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插件有足够的了解,以便开始试用。我对您的行动呼吁是开始测试这个插件,并在插件的存储库中留下您的反馈。这将帮助我们改进插件的整体可用性和功能集。我还要花点时间感谢Brett和Helen为制作Flight SQL的开源插件所做的努力。

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