Dart 和 InfluxDB 入门指南
作者:社区 / 产品, 用例, 开发者, 入门
2022年2月2日
导航至
本文由 Habdul Hazeez 编写。滚动到下方查看作者的图片和简介。
您刚刚发布了应用程序,吸引了比预期更多的用户。您的 web 服务器被数据淹没。现在您需要了解更多关于用户的信息:他们主要使用什么设备,他们在应用上停留了多长时间?
时间序列数据库可以帮助您回答这些问题。它允许您在指定的时间内保存给定点的数据,这使您能够了解您正在获得的哪种类型的使用情况以及何时。
这样一个时间序列数据库就是 InfluxDB。本教程将向您展示如何将 InfluxDB 与 Dart 应用程序设置在一起。
什么是时间序列数据库?
时间序列数据库旨在存储和检索在一定时间内收集的测量或事件的 带时间戳的数据。这些信息可以帮助您跟踪和分析该数据的变化。
时间序列数据的一些常见用例
以下是时间序列数据库的一些显著用例,具体取决于您的带时间戳数据的性质和来源
- 理解股票市场交易
- 根据房屋销售量的上升或下降来规划房地产投资
- 跟踪和优化电力消耗率
- 通过传感器监控 物联网 (IoT) 设备的性能
- 为什么使用 InfluxDB
InfluxDB 是市场上知名的时间序列数据库之一。它速度快,易于使用,无依赖项。它提供多种数据压缩算法,并支持开源 Telegraf 插件,提供更好的开发者体验 (DX)。
安装 InfluxDB
访问 下载页面 进行安装。如果您选择,可以注册您的下载。如果您更喜欢不需要本地安装的管理云实例,也可以使用 InfluxDB Cloud。
选择您的平台并按照说明进行操作。本教程使用 Windows;如果您也选择 Windows,则需要 wget
。有关如何在 MacOS 或 Linux 上安装 InfluxDB 的完整说明,请参阅 文档。
使用管理员权限启动PowerShell,并粘贴以下命令进行下载。InfluxDB文件将出现在您的C:\
目录中。
将InfluxDB解压到一个文件夹中。在这个例子中,它是在Program Files
目录下的一个名为InfluxData
的文件夹
# Extract InfluxDB download archive
Expand-Archive .\influxdb2-2.0.9-windows-amd64.zip -DestinationPath 'C:\Program Files\InfluxData\influxdb\'
完成这些后,InfluxDB和相关文件将位于与安装文件同名的文件夹中。选择该文件夹中的所有文件,并将它们移动到上级目录。您的文件夹结构应类似于以下结构
切换回PowerShell,并导航到InfluxDB目录。使用命令./influxd
启动InfluxDB守护进程
将您的浏览器指向localhost:8086
。您将看到入门页面
点击开始使用以设置您的账户
点击继续,然后选择快速入门。您将需要输入之前创建的登录详情
输入您的登录详情以进入您的仪表板
当您从应用程序与InfluxDB交互时,您需要一个令牌。您可以在数据 > 令牌下找到它
接下来,您将安装InfluxDB客户端库,但首先您需要一些先决条件。
客户端库的先决条件
以下是安装客户端库需要执行的操作
- 安装包管理器
- 安装Dart SDK
- 创建项目文件夹
安装包管理器
在Linux上,使用您发行版的包管理器。对于macOS,请安装Homebrew。
在这个教程中,您将在Windows上使用Chocolatey(这还需要PowerShell)。
安装Dart SDK
以管理员权限启动您的命令提示符并安装Dart SDK
choco install dart-sdk
创建项目文件夹
切换回您的命令行并导航到您首选的文件夹。键入并执行以下命令
dart create test-app
下面的图片显示了代码的运行情况
设置客户端库
该库与InfluxDB版本2及以上版本兼容。它可以在pub.dev 包仓库中下载。
在您的项目目录中打开PowerShell。键入以下命令
# InfluxDB client installation
dart pub add influxdb_client
为了确认已安装,检查您的pubspec.yaml
文件,并确保它被列为依赖项
将客户端库连接到InfluxDB
在这个阶段,您将开始编写一些代码。如果您还没有安装VS Code,请先安装它;它提供了大量的扩展,包括Dart扩展。
通过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();
}
点击主函数上方的运行来执行代码
您可以通过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
。
切换回VS Code。当InfluxDB通过HTTPS
运行时,客户端库尝试通过HTTP连接的任何尝试都不会通过。相反,您将看到错误消息Client sent an HTTP request to an HTTPS server
。
仅仅更改协议https://
无法解决这个问题。您将得到另一个错误
修复方法是导入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();
}
重新建立连接,一切应该都正常。
将数据插入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
的数据
将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}
因此,它反映在数据库中。
您可以在本GitHub仓库中找到完整的代码。
库最佳实践
以下是遵循客户端库的某些最佳实践
- 在连接到数据库时使用SSL/TLS
- 从其pub.dev 仓库安装库
- 尽可能更新它
结论
现在您应该更好地了解如何通过Dart应用程序使用InfluxDB。InfluxDB提供的数据可以帮助您深入了解您的应用程序用户和流量类型,帮助您为业务做出明智的决策。
有关InfluxDB的更多信息,请查看其文档这里。
关于作者
Habdul Hazeez用代码和文字表达自己。他是Dev.to、Educative edpresso和CSS-Tricks上的技术作家。他之前曾在LogRocket博客工作。