Dart 和 InfluxDB 入门指南

导航至

本文由 Habdul Hazeez 编写。滚动到下方查看作者的图片和简介。

您刚刚发布了应用程序,吸引了比预期更多的用户。您的 web 服务器被数据淹没。现在您需要了解更多关于用户的信息:他们主要使用什么设备,他们在应用上停留了多长时间?

时间序列数据库可以帮助您回答这些问题。它允许您在指定的时间内保存给定点的数据,这使您能够了解您正在获得的哪种类型的使用情况以及何时。

这样一个时间序列数据库就是 InfluxDB。本教程将向您展示如何将 InfluxDB 与 Dart 应用程序设置在一起。

什么是时间序列数据库?

时间序列数据库旨在存储和检索在一定时间内收集的测量或事件的 带时间戳的数据。这些信息可以帮助您跟踪和分析该数据的变化。

时间序列数据的一些常见用例

以下是时间序列数据库的一些显著用例,具体取决于您的带时间戳数据的性质和来源

  • 理解股票市场交易
  • 根据房屋销售量的上升或下降来规划房地产投资
  • 跟踪和优化电力消耗率
  • 通过传感器监控 物联网 (IoT) 设备的性能
  • 为什么使用 InfluxDB

InfluxDB 是市场上知名的时间序列数据库之一。它速度快,易于使用,无依赖项。它提供多种数据压缩算法,并支持开源 Telegraf 插件,提供更好的开发者体验 (DX)。

安装 InfluxDB

访问 下载页面 进行安装。如果您选择,可以注册您的下载。如果您更喜欢不需要本地安装的管理云实例,也可以使用 InfluxDB Cloud

选择您的平台并按照说明进行操作。本教程使用 Windows;如果您也选择 Windows,则需要 wget。有关如何在 MacOS 或 Linux 上安装 InfluxDB 的完整说明,请参阅 文档

Download command for Windows

使用管理员权限启动PowerShell,并粘贴以下命令进行下载。InfluxDB文件将出现在您的C:\ 目录中。

InfluxDB downloaded archive

将InfluxDB解压到一个文件夹中。在这个例子中,它是在Program Files 目录下的一个名为InfluxData 的文件夹

# Extract InfluxDB download archive
Expand-Archive .\influxdb2-2.0.9-windows-amd64.zip -DestinationPath 'C:\Program Files\InfluxData\influxdb\'

完成这些后,InfluxDB和相关文件将位于与安装文件同名的文件夹中。选择该文件夹中的所有文件,并将它们移动到上级目录。您的文件夹结构应类似于以下结构

Folder-structure

切换回PowerShell,并导航到InfluxDB目录。使用命令./influxd启动InfluxDB守护进程

InfluxDB launch

将您的浏览器指向localhost:8086。您将看到入门页面

Onboarding page in Firefox 93

点击开始使用以设置您的账户

Account-setup-page

点击继续,然后选择快速入门。您将需要输入之前创建的登录详情

Login page

输入您的登录详情以进入您的仪表板

InfluxDB dashboard

当您从应用程序与InfluxDB交互时,您需要一个令牌。您可以在数据 > 令牌下找到它

Authentication token

接下来,您将安装InfluxDB客户端库,但首先您需要一些先决条件。

客户端库的先决条件

以下是安装客户端库需要执行的操作

  • 安装包管理器
  • 安装Dart SDK
  • 创建项目文件夹

安装包管理器

在Linux上,使用您发行版的包管理器。对于macOS,请安装Homebrew

在这个教程中,您将在Windows上使用Chocolatey(这还需要PowerShell)。

Chocolatey installation

安装Dart SDK

以管理员权限启动您的命令提示符并安装Dart SDK

choco install dart-sdk

Dart SDK installation

创建项目文件夹

切换回您的命令行并导航到您首选的文件夹。键入并执行以下命令

dart create test-app

下面的图片显示了代码的运行情况

Creation of project folder

设置客户端库

该库与InfluxDB版本2及以上版本兼容。它可以在pub.dev 包仓库中下载。

InfluxDB client library download page

在您的项目目录中打开PowerShell。键入以下命令

# InfluxDB client installation
dart pub add influxdb_client

InfluxDB client installation

为了确认已安装,检查您的pubspec.yaml 文件,并确保它被列为依赖项

InfluxDB client library installation in pubspec.yaml file

将客户端库连接到InfluxDB

在这个阶段,您将开始编写一些代码。如果您还没有安装VS Code,请先安装它;它提供了大量的扩展,包括Dart扩展。

通过VS Code扩展市场安装扩展

Dart tool installed in VS Code

创建并保存一个新的Dart文件。将其命名为main.dart 并插入以下代码

// @dart=2.9

import 'package:influxdb_client/api.dart';

void main() async {
  var client = InfluxDBClient(
  	url: 'https://127.0.0.1:8086',
  	token:
      	'Your token here',
  	org: 'Your org name',
  	bucket: 'Your bucket name',
  	debug: true);

  var healthCheck = await client.getHealthApi().getHealth();
  print(
  	'Health check: ${healthCheck.name}/${healthCheck.version} - ${healthCheck.message}');
    
  client.close();
}

点击主函数上方的运行来执行代码

Successful connection

您可以通过HTTPS来改善连接

通过HTTPS连接客户端库

在连接库之前,您需要InfluxDB通过HTTPS运行。在继续之前,请先关闭InfluxDB。

现在启动带有证书和密钥对的InfluxDB。由于您在本机上,您将创建一个自签名证书和密钥。

您有几种方法可以做到这一点

  • 使用在线服务
  • 使用OpenSSL库

本教程采用后一种选项。您可以在GitHub gist中找到全部细节:这里

使用自签名证书和密钥重启InfluxDB

./influxd --tls-cert="C:\Program Files\OpenSSL-Win64\bin\SSL\influxdb-selfsigned.crt" --tls-key="C:\Program Files\OpenSSL-Win64\bin\SSL\influxdb-selfsigned.key"

检查您的命令提示符(或终端)中的连接字符串。它应该为https

HTTPS connection

切换回VS Code。当InfluxDB通过HTTPS运行时,客户端库尝试通过HTTP连接的任何尝试都不会通过。相反,您将看到错误消息Client sent an HTTP request to an HTTPS server

InfluxDB application error 400

仅仅更改协议https://无法解决这个问题。您将得到另一个错误

Self-signed certificate error

修复方法是导入dart:io并在您的main()函数之前创建一个类。这授予您使用自签名证书的权限。在main() 函数中使用该类。有关更多详细信息,请查看这里

// @dart=2.9

import 'dart:io';

import 'package:influxdb_client/api.dart';

class DevHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext context) {
	return super.createHttpClient(context)
  	..badCertificateCallback =
      	(X509Certificate cert, String host, int port) => true;
  }
}

void main() async {
  HttpOverrides.global = DevHttpOverrides();

  var client = InfluxDBClient(
  	url: 'https://127.0.0.1:8086',
  	token:
      	'Your token here',
  	org: 'Your org name',
  	bucket: 'Your bucket name',
  	debug: true);

  var healthCheck = await client.getHealthApi().getHealth();
  print(
  	'Health check: ${healthCheck.name}/${healthCheck.version} - ${healthCheck.message}');
 
  client.close();
}

重新建立连接,一切应该都正常。

Successful HTTPS connection

将数据插入InfluxDB

您可以在influx_data_NOT_annotated中找到要使用的数据。如下所示

{
  "measurement": "watt-hour",
  "tags": [
    "house_name": "The Johnsons"
  ],
  "fields": [
    "electricity_consumption": 78
  ]
}

write_data.dart 代码执行插入操作

// @dart=2.9
import 'dart:io';
import 'package:influxdb_client/api.dart';

class DevHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext context) {
    return super.createHttpClient(context)
    ..badCertificateCallback = (X509Certificate cert, String host, int port) => true;
  }
}

void main() async {
    HttpOverrides.global = DevHttpOverrides(); 
    var client = InfluxDBClient(
        url: 'https://127.0.0.1:8086',
        token: 'Your token here',
        org: 'Your org name',
        bucket: 'Your bucket name', 
debug: true);
var writeApi = client.getWriteService(WriteOptions().merge(
        precision: WritePrecision.s, 
        batchSize: 100,
        flushInterval: 5000,
        gzip: true));

var point = Point('watt-hour')
    .addTag('house_name', 'The Johnsons') 
    .addField('electricity_consumption', 78) 
    .time(DateTime.now().toUtc());

await writeApi.write(point).then((value) {
    print('Write completed 1'); 
}).catchError((exception) {
    print(exception);  });

client.close();

}

您将在调试控制台中看到Write completed 1 。

从InfluxDB读取数据

读取数据涉及以下步骤

  • 初始化连接
  • 启动库提供的getQuery 服务
  • 使用Flux 查询来筛选数据
  • 遍历记录
  • 打印记录
// @dart=2.9
import 'dart:async';
import 'dart:io';
import 'package:influxdb_client/api.dart';
class DevHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext context) {
    return super.createHttpClient(context)
    ..badCertificateCallback = (X509Certificate cert, String host, int port) => true;
  }
}

void main() async {
    HttpOverrides.global = DevHttpOverrides();
    var client = InfluxDBClient(
         url: 'https://127.0.0.1:8086',
         token: 'Your token here', 
        org: 'Your org name', 
        bucket: 'Your bucket name', 
        debug: true);

 // Reading the data
var queryService = client.getQueryService();

var fluxQuery = '''
from(bucket: "test_bck")
|> range(start: -1d) 
|> filter(fn: (r) => r["_measurement"] == "watt-hour") 
|> aggregateWindow(every: 1m, fn: mean, createEmpty: false)
|> yield(name: "mean")  ''';

// query to stream and iterate all records  var count = 0;  var recordStream = await queryService.query(fluxQuery);

await recordStream.forEach((record) {
    print( 'record: ${count++} ${record['_time']}: ${record['_field']} ${record['house_name']} ${record['_value']}');  });

client.close();}

有关读取数据的其他选项,请查看query_data.dart。这些选项是 Raw CSV 和 StreamSubscription。

更新InfluxDB数据

您还可以更新存储在InfluxDB中的数据,尽管应该注意的是,在处理时间序列数据库时,更新数据通常被认为是一种不良做法。

要更新数据,您需要一个与点关联的 标签 名称。

本教程使用Mavericks 的数据

Data for Mavericks

Mavericks的电力消耗更新为178

// code truncated to save space

void main() async {

// code truncated to save space

var point = Point('watt-hour')
.addTag('house_name', 'Mavericks')
.addField('electricity_consumption', 178)
.time(DateTime.now().toUtc());

 // code truncated to save space}

因此,它反映在数据库中。

Updated data for Mavericks

您可以在本GitHub仓库中找到完整的代码。

库最佳实践

以下是遵循客户端库的某些最佳实践

  • 在连接到数据库时使用SSL/TLS
  • 从其pub.dev 仓库安装库
  • 尽可能更新它

结论

现在您应该更好地了解如何通过Dart应用程序使用InfluxDB。InfluxDB提供的数据可以帮助您深入了解您的应用程序用户和流量类型,帮助您为业务做出明智的决策。

有关InfluxDB的更多信息,请查看其文档这里

关于作者

Habdul Hazeez用代码和文字表达自己。他是Dev.to、Educative edpresso和CSS-Tricks上的技术作家。他之前曾在LogRocket博客工作。