InfluxDB 和 React 的超凡监控

导航至

经许可转载。© IDG Communications, Inc., 2021。 

在一次 InfluxData 内部黑客马拉松期间,我想做一项能帮助我加强我的 TelegrafFlux 技能的项目。我还想使用 InfluxData 的 Giraffe 在 React 应用程序中可视化我的项目。在阅读了 Sean Brickley 的博客文章 关于使用 InfluxDB 跟踪国际空间站后,我受到了启发,决定在此基础上构建。因此,我着手开发了一个 React 应用程序,可以实时跟踪 ISS 的位置并使用 InfluxDB、ExpressJS、Telegraf 和 Giraffe 记录其行程。

该项目有三个主要组件

  1. Telegraf配置
  2. ExpressJS API服务器
  3. React应用

让我们从Telegraf配置开始。

和Sean一样,我使用了一个公开API来获取国际空间站(ISS)的当前位置。我的计划是使用Telegraf轮询这个API,解析坐标数据,并将此位置信息发送到InfluxDB。我使用了Telegraf的HTTP插件来实现这一点。下一步是从JSON解析坐标信息,并将字符串转换为浮点数。这可以通过Telegraf的转换插件完成。最后,我需要将我的位置数据发送到我在AWS上运行的InfluxDB云实例。当然,这可以通过Telegraf的InfluxDB插件轻松完成。第一步完成!现在我们可以运行telegraf --config ./telegraf/iss.conf并开始收集ISS的位置。

现在我们已经开始收集一些数据,下一步是查询它。我决定使用ExpressJS构建一个API,并使用InfluxDB JS客户端查询我的InfluxDB实例。目标是构建一个React应用可以用来检索它需要用Giraffe可视化的ISS飞行路径的位置数据的API。

首先我们需要连接到InfluxDB,我们可以通过传递我们的URL和令牌到InfluxDB对象来实现。由于我们将使用客户端来运行查询,我们需要获取查询API对象。如果你想要获取桶信息,例如,你将需要获取桶API对象。

const influxDB = new InfluxDB({ url: baseURL, token: influxToken })
const queryApi = influxDB.getQueryApi(orgID)

接下来,我们可以使用InfluxDB JS客户端像这样查询我们的InfluxDB实例

app.get('/iss, (_, res) => {
 let csv = ''
 const issQuery = `todo`
 let clientQuery = flux``+issQuery
 queryApi.queryLines(clientQuery, {
   next(line) {
     csv = `${csv}${line}\n`;
   },
   error(error) {
     console.error(error)
     console.log('\nFinished /iss ERROR')
     res.end()
   },
   complete() {
     console.log('\nFinished /iss SUCCESS')
     res.end(JSON.stringify({ csv }))
   },
 })
})

此路由将使用InfluxDB客户端的查询API对象来执行我们的查询(我们尚未定义)。我们将使用queryLines函数逐行获取我们的响应。生成的字符串将是一个Giraffe可以理解的csv响应。

太棒了!现在我们只需要一个Flux查询。我尝试了几个查询,试图看看哪个我认为最能突出ISS的运动。如果我简单地抓取过去几个小时的所有数据,Giraffe图可能太忙。如果我专注于尝试抓取一个完整轨道的数据,则在平坦地图上绘制圆形、连续线时会遇到奇怪的问题。所以我最终决定绘制从西向东的ISS当前轨道,这意味着我抓取了从0度经度到其当前位置的所有数据点。ISS每93分钟绕轨道一周,所以我限制了我的查询在这个范围内。这是我得出的结论

import "experimental/geo"
 currentPos = from(bucket: "iss")
 |> range(start: -1m)
 |> filter(fn: (r) => r._field == "iss_position_longitude")
 |> tail(n: 1)
 |> findRecord(
   fn: (key) => true,
   idx: 0
 )
 
 from(bucket: "iss")
 |> range(start: -93m)
 |> aggregateWindow(every: 3m, fn: min, createEmpty: false)
 |> geo.shapeData(latField: "iss_position_latitude", lonField: "iss_position_longitude", level: 14)
 |> filter(fn: (r) => r.lon <= currentPos._value)
 |> geo.asTracks()

查询首先找到ISS的当前经度位置,这将是最近的记录。然后我们查询所有位置数据,将这些数据聚合到经度小于ISS当前位置的3分钟窗口中。我们使用Flux的实验性Geo包来塑造数据,并将位置数据作为轨迹返回。

现在我们进入有趣的部分——绘制图表!我只会介绍重点,所以请随意查看实现细节,可以在代码库中查看。基本上,我们有一个使用 InfluxData 的 Giraffe 可视化库的 React 应用程序。Giraffe 最近增加了地理绘图功能,可以绘制标记和轨迹(查看Storybook来尝试一下)。我们的 React 应用程序每隔大约 30 秒就会查询我们的 API,以获取最新的数据。我们将使用fromFlux函数将响应解析成 Giraffe 可以消费的表格。从 Storybook 中可以看出,有很多可调节的控件来调整地理绘图。一个重要的参数是tileServerConfiguration,它告诉 Giraffe 从哪里获取地图图像。我使用了OpenStreetMap,并为 Giraffe 提供了以下对象,以便它知道如何检索正确的地图瓦片。

const osmTileServerConfiguration = {
 tileServerUrl: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
}

到了这个阶段,所有部件都开始组合在一起了!我在 UI 中添加了一个复选框来添加标记作为可选层,并且还提供了查询自定义时间范围历史数据的选项。

Plotting the International Space Station's Orbit Live Using Telegraf, InfluxDB, and Giraffe

这就是我们所拥有的——国际空间站(ISS)的位置随着它在地球上空旅行而实时更新!请随意查看源代码并亲自尝试。如果您发现其他产生有趣数据可视化的 Flux 查询,请告诉我。

正如 Sean 在他的帖子中提到的,这里展示的地理功能仍然是实验性的,但我们正在努力使其为生产做好准备。敬请期待这个领域的更多令人兴奋的更新(当然是有意为之的)!如果您正在开发像 Sean 一样的有趣 InfluxDB 项目,并且需要帮助,请通过我们的社区论坛或 Slack 联系我们。我们很乐意回答您的问题,并了解您正在用 InfluxDB 做什么。