[译]JavaScript 和 InfluxDB 2.0 初体验

2,154 阅读4分钟

查看原文:Getting Started with JavaScript and InfluxDB 2.0

Telegraf 有 200 多个插件,可以对 InfluxDB 中的数据执行各种各样的删除、写入、查询的方法。然而,Telegraf 并不能满足一切数据收集需求。用户可能需要收集自定义数据用于应用程序的性能监控;也有可能需要利用外部工具和类库构建漂亮的、基于 Web 平台的可视化效果。InfluxDB 的客户端类库可以用于实现这些需求。今天,我们聚焦如何在 InfluxDB 2.0 中使用最新版本的 InfluxDB Javascript 客户端类库。

重点提示:InfluxDB v1.8 包含了用于查询的 Flux 数据查询引擎和支持数据更新功能的 InfluxDB v2 HTTP API。这意味着如果你没有准备好使用 InfluxDB v2,但有使用新版客户端类库的打算,那也是可行的。设置一些读写兼容选项,可以使代码跟随时代发展的步伐,避免落后。

指导要求和设置

本指南适用于通过 Homebrew 安装了 Node 的 MacOS 系统,关于安装配置的详情,可参考 Node.js 文档

#update brew before installing
brew update 
brew install node 
#check to make sure you have successfully installed Node and NPM
node -v
npm -v

入门使用 InfluxDB v2 JavaScript 客户端的最方便的方法是克隆 GitHub 上的实例仓库,它是 influxdb-client-js 仓库中的子项目。

当你成功克隆项目后,打开所在目录并运行:

npm install

index.htmlenv.js 文件中定义你的认证参数。你需要填写公司名称、bucket 和 token。现在我们开始在浏览器中使用客户端:

npm run browser

Npm 会打开 http://localhost:3001/examples/index.html 这个页面,你需要在这个页面上把一个 datapoint 写入行协议,并通过页面进行查询。你也可以搭载一个用户并执行 API 健壮性检查。

认证参数

InfluxDB v2

为了使用客户端,你需要收集以下参数:

InfluxDB v1.8 或以上版本

如果你打算在 InfluxDB 1.8 或更高版本中使用新的客户端库,以下是关于收集授权参数的几条重要建议:

  • Bucket Name: 在 InfluxDB v1.x 中已经没有 Bucket 这一概念。Bucket 只是数据库名和备份保留策略的组合。所以,你可以以"数据库名/保留策略"形式定义它。如果你不使用保留策略,系统将使用默认的保留策略。

例如:Bucket 名称为 "telegraf/1week",它表示允许写入名称为 "telegraf" 的数据库,保留策略为 "1week"。简而言之,telegraf/ 或 telegraf 是指允许写入名称为 "telegraf" 的 InfluxDB 1.x 数据库,保留策略为默认值(通常是 autogen)。

  • Token: 在 InfluxDB v2 中,API Tokens 用于访问平台和使用它的所有功能。如果使用的是 InfluxDB v1.x,在访问 HTTP API 时需要使用用户名和密码的组合。你需要提供“用户名:密码”格式的字符串,它就等同于 Toekn。例如:username:password

  • Org: 在 InfluxDB v1.x 的兼容模式下,Org 参数可以为空。

使用 JavaScript 客户端库对 InfluxDB v2 执行写操作

在示例中写入的数据是硬编码形式的,包括度量、标记键和标记值。下面的函数创建了行协议 temperature,example=index.html value=28.7:

function writeExample(value) {
       const writeApi = influxDB.getWriteApi(org, bucket)
       // setup default tags for all writes through this API
       writeApi.useDefaultTags({location: 'browser'})


       log('\n*** WRITE ***')
       const point1 = new Point('temperature')
         .tag('example', 'index.html')
         .floatField('value', value)
       writeApi.writePoint(point1)
       log(` ${point1}`)
// flush pending writes and close writeApi
       writeApi
         .close()
         .then(() => {
           log('WRITE FINISHED')
         })
         .catch(e => {
           log('WRITE FAILED', e)
         })
     }

你向 getWriteApi 方法提供了 org 和 bucket 这两个参数,这样就创建了一个 WriteApi。这个方法允许包含一个精度参数,支持多个时间戳精度,时间戳精度默认为纳秒精度。

向 InfluxDB 写入行协议可以使用多种数据格式化方法。

  • useDefaultTags 方法命令 API 使用用户在写入数据时定义的默认标签。
  • writeRecord 方法写入单个行协议字符串。
  • writeRecords 方法写入一组行协议字符串。

向 InfluxDB 写入行协议数据有两种方法。

使用 JavaScript 客户端库对 InfluxDB v2 进行查询操作

InfluxDB v2

既然我们已经向 InfluxDB 实例写入了一些随机的温度数据,现在我们进行查询操作

function queryExample(fluxQuery) {
       log('\n*** QUERY ***')
       const queryApi = influxDB.getQueryApi(org)
       queryApi.queryRows(fluxQuery, {
         next(row, tableMeta) {
           const o = tableMeta.toObject(row)
           if (o.example){
             // custom output for example query
             log(
               `${o._time} ${o._measurement} in '${o.location}' (${o.example}): ${o._field}=${o._value}`
             )
           } else {
             // default output
             log(JSON.stringify(o, null, 2))
           }
         },
         error(error) {
           log('QUERY FAILED', error)
         },
         complete() {
           log('QUERY FINISHED')
         },
       })
     }

getQueryApi 方法创建了一个查询公司名的接口。queryRows 方法用于查询数据,并返回[带注解的 csv] 中的行,执行 console.log(o) 输出:

{result: "_result", table: "0", _start: "1970-01-01T00:00:00Z", _stop: "2020-04-03T20:39:23.761184Z", _time: "2020-04-03T18:31:33.95Z", …}
result: "_result"
table: "0"
_start: "1970-01-01T00:00:00Z"
_stop: "2020-04-03T20:39:23.761184Z"
_time: "2020-04-03T18:31:33.95Z"
_value: 29.9
_field: "value"
_measurement: "temperature"
example: "index.html"
location: "browser"
__proto__: Object

InfluxDB v1.8 或以上版本

在 1.8 及以上版本中,上述例子的运行结果也一样,但连接 URL 不同。欲获取查询端点,应使用 http://<hostname>:8086/api/v2/query

健壮性检查

使用 API 对你的数据库实例进行健壮性检查时很重要的一步,它有利于构建一个可信的管道。此例子还包含一个健壮性检查:

const {InfluxDB} = require('@influxdata/influxdb-client')
const {HealthAPI} = require('@influxdata/influxdb-client-apis')
const {url, token} = require('./env')

console.log('*** HEALTH CHECK ***')
const influxDB = new InfluxDB({url, token})
const healthAPI = new HealthAPI(influxDB)

healthAPI
  .getHealth()
  .then((result /* : HealthCheck */) => {
    console.log(JSON.stringify(result, null, 2))
    console.log('\nFinished SUCCESS')
  })
  .catch(error => {
    console.error(error)
    console.log('\nFinished ERROR')
  })

为了获取实例的健壮性相关信息,你需要:

  • 新建一个 InfluxDB 对象
  • 基于 InfluxDB 对象创建 HealthAPI
  • 使用 getHealth 方法获取 API 状态(更多详情请查阅 API 文档

入门培训

最后需要说明,本实例还包含一个用户入门指南。简单且快速的用户入门指南使应用开发者为用户减少访问时间序列数据时面临的障碍。欲使用入门工具,你需要向 ./env 提供用户名和密码。

const setupApi = new SetupAPI(new InfluxDB({url}))

setupApi
  .getSetup()
  .then(async ({allowed}) => {
    if (allowed) {
      await setupApi.postSetup({
        body: {
          org,
          bucket,
          username,
          password,
          token,
        },
      })
      console.log(`InfluxDB '${url}' is now onboarded.`)
    } else {
      console.log(`InfluxDB '${url}' has been already onboarded.`)
    }
    console.log('\nFinished SUCCESS')
  })
  .catch(error => {
    console.error(error)
    console.log('\nFinished ERROR')
  })

跟健壮性检查类似,欲对一位新用户进行入门培训,你需要

  • 新建一个 InfluxDB 对象
  • 基于 InfluxDB 对象创建 SetupAPI
  • getSetup 方法建立一个初始的用户、公司和 bucket。

关于infxdb v2 JavaScript客户端的总结

需要注意,除了浏览器环境外,Node 环境也是受支持的。我也会分享一些对 JavaScript 开发者有用的其他资源。如果你对 InfluxDB UI 感兴趣,并需要使用 复杂的时间序列数据可视化算法,我建议你参考 Giraffe 和 Clockface 这两个项目。其中,Giraffe是一个基于 react 的开源可视化库,用于实现inflxdb Cloud 2.0用户界面(UI)。 Clockface是一个开源的 React 和 Typescript UI 工具包,用于构建 inflxdb v2 UI 和其他时间序列可视化应用程序。

我希望本教程能帮助你开启 JavaScript 和 InfluxDB 之旅。 一如既往,我很乐意倾听你们的想法并为你们解答任何问题。请将你们的问题发布到我们的社区网站Slack 频道。