Flutter数据监控与分析插件influxdb_client的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter数据监控与分析插件influxdb_client的使用

概述

influxdb_client 是一个用于与 InfluxDB 2.x 交互的 Dart 客户端库。它支持在 Web、服务器和 Flutter 应用程序中使用。本文将详细介绍如何安装和使用 influxdb_client 插件,包括创建客户端、写入数据、查询数据、删除数据以及管理 API 的使用。

安装

pubspec.yaml 文件中添加 influxdb_client 依赖:

dependencies:
  influxdb_client: ^2.2.0

然后在 Dart 文件中导入库:

import 'package:influxdb_client/api.dart';

使用

创建客户端

创建 InfluxDBClient 实例时,需要指定 InfluxDB 的 URL 和 Token。还可以设置默认的组织(org)和存储桶(bucket),以及其他选项如调试模式等。

var client = InfluxDBClient(
    url: 'http://localhost:8086',
    token: 'my-token',
    org: 'my-org',
    bucket: 'my-bucket',
    debug: true);

写入数据

WriteApi 支持异步写入数据到 InfluxDB 2.x。数据可以是字符串形式的 Line Protocol,也可以是 Point 结构体,或者两者的数组。

示例代码

import 'dart:async';
import 'dart:math';
import 'package:influxdb_client/api.dart';

void main() async {
  // 创建 InfluxDBClient
  var client = InfluxDBClient(
      url: 'http://localhost:8086',
      token: 'my-token',
      org: 'my-org',
      bucket: 'my-bucket',
      debug: true);

  // 创建写服务
  var writeApi = client.getWriteService(WriteOptions().merge(
      precision: WritePrecision.s,
      batchSize: 100,
      flushInterval: 5000,
      gzip: true));

  // 创建数据点列表
  var data = List<Point>.empty(growable: true);
  var random = Random();
  for (var i = 0; i < 10; i++) {
    var temperature = random.nextInt(30);
    data.add(Point('weather')
        .addTag('location', 'Prague')
        .addField('temperature', temperature)
        .time(DateTime.now().subtract(Duration(days: i)).toUtc()));
  }

  // 写入数据到 InfluxDB
  print(
      '\n\n-------------------------------- Write data -------------------------------\n');
  await writeApi.write(data).then((value) {
    print('Write completed 1');
  }).catchError((exception) {
    print('Handle write error here!');
    print(exception);
  });
}

查询数据

QueryService 可以用于从 InfluxDB 查询数据。查询结果可以格式化为 FluxRecord 或者原始字符串。

示例代码

// 创建查询服务并执行查询
var queryService = client.getQueryService();
var fluxQuery = '''
       from(bucket: "my-bucket")
            |> range(start: -20d)
            |> filter(fn: (r) => r["_measurement"] == "weather" 
                             and r["location"] == "Prague")''';

// 查询并迭代所有记录
print(
    '\n\n---------------------------------- Query ---------------------------------\n');
var recordStream = await queryService.query(fluxQuery);

print(
    '\n\n------------------------------ Query result ------------------------------\n');
await recordStream.forEach((record) {
  print(
      'Temperature in ${record['location']} at ${record['_time']} is ${record['_value']} °C');
});

删除数据

DeleteService 可以用于从 InfluxDB 删除数据。删除操作需要指定条件、开始时间、结束时间、存储桶和组织。

示例代码

// 删除数据
print(
    '\n\n------------------------------- Delete data -------------------------------\n');
await client
    .getDeleteService()
    .delete(
        predicate: '_measurement="weather"',
        start: DateTime.parse('1970-01-01T00:00:00Z'),
        stop: DateTime.now().toUtc(),
        bucket: 'my-bucket',
        org: 'my-org')
    .catchError((e) => print(e));

管理 API

influxdb_client 还提供了管理 API,可以用于创建、删除存储桶、授权等操作。

示例代码

import 'package:influxdb_client/api.dart';

void main() async {
  // 初始化客户端和 API
  var client = InfluxDBClient(
      url: 'http://localhost:8086', token: 'my-token', org: 'my-org');

  // 检查服务器可用性
  await client.getPingApi().getPing();

  var orgs = await client.getOrganizationsApi().getOrgs();
  var myOrgId = orgs.orgs.first.id;

  var bucketsApi = client.getBucketsApi();
  var bucketName = 'bucket-my-org';

  // 查找并删除名为 'bucket-my-org' 的存储桶
  var buckets = await bucketsApi.getBuckets(name: bucketName);
  if (buckets.buckets.isNotEmpty) {
    var bucketID = buckets.buckets.first.id;
    await bucketsApi.deleteBucketsID(bucketID);
    print('Bucket $bucketID was deleted.');
  }

  // 存储桶配置
  var request = PostBucketRequest(
      orgID: myOrgId,
      name: bucketName,
      retentionRules: [
        RetentionRule(type: RetentionRuleTypeEnum.expire, everySeconds: 3600)
      ]);

  var bucket = await bucketsApi.postBuckets(request);

  // 创建授权,允许读写新创建的存储桶
  var bucketResource =
      Resource(type: ResourceTypeEnum.buckets, id: bucket.id, orgID: myOrgId);

  // 授权配置
  var auth = AuthorizationPostRequest(
      description: 'Authorization to read/write bucket:${bucket.name}',
      orgID: myOrgId,
      permissions: [
        Permission(action: PermissionActionEnum.read, resource: bucketResource),
        Permission(action: PermissionActionEnum.write, resource: bucketResource)
      ]);

  // 创建授权
  var authorizationsApi = client.getAuthorizationsApi();
  var authorization = await authorizationsApi.postAuthorizations(auth);

  // 打印 Token
  var token = authorization.token;
  print('The bucket: \'${bucket.name}\' is successfully created.');
  print('The following token can be used to read/write: ${token}');

  client.close();
}

总结

influxdb_client 是一个功能强大的 Dart 客户端库,适用于与 InfluxDB 2.x 进行数据交互。通过本文的介绍,您应该能够轻松地在 Flutter 应用程序中集成 influxdb_client,实现数据的写入、查询和删除等操作。希望这些示例代码对您有所帮助!


更多关于Flutter数据监控与分析插件influxdb_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据监控与分析插件influxdb_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成并使用influxdb_client插件进行数据监控与分析,可以通过以下步骤实现。这里将展示如何配置插件、写入数据到InfluxDB以及查询数据的基本代码示例。

1. 添加依赖

首先,在pubspec.yaml文件中添加influxdb_client依赖:

dependencies:
  flutter:
    sdk: flutter
  influxdb_client: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来获取依赖。

2. 配置InfluxDB客户端

在Flutter应用中配置InfluxDB客户端,包括设置连接参数和认证信息。

import 'package:influxdb_client/api.dart';

void configureInfluxDBClient() {
  // 替换为你的InfluxDB URL、token和org
  final String influxDBUrl = 'http://localhost:8086'; // 或者你的InfluxDB云服务URL
  final String token = 'your-influxdb-token';
  final String org = 'your-org';

  // 创建InfluxDB客户端
  final InfluxDBClient client = InfluxDBClient(url: influxDBUrl, token: token, org: org);

  // 可以在这里保存client实例以便后续使用
  // 例如,可以将其存储在全局变量或依赖注入容器中
}

3. 写入数据到InfluxDB

使用WriteApi将数据点写入InfluxDB。

import 'package:influxdb_client/api.dart';
import 'dart:convert';

void writeDataToInfluxDB(InfluxDBClient client) async {
  // 创建WriteApi实例
  final WriteApi writeApi = client.getWriteApi();

  // 准备数据点
  final Point point = Point('measurement_name')
    ..addField('field_key', 'field_value')
    ..addTag('tag_key', 'tag_value')
    ..time(DateTime.now().toMillis(), WritePrecision.NS);

  // 写入数据点
  await writeApi.writePoint(bucket: 'your-bucket', record: point);

  // 关闭客户端连接
  await client.close();
}

4. 查询数据从InfluxDB

使用QueryApi从InfluxDB查询数据。

import 'package:influxdb_client/api.dart';

void queryDataFromInfluxDB(InfluxDBClient client) async {
  // 创建QueryApi实例
  final QueryApi queryApi = client.getQueryApi();

  // 准备Flux查询语句
  final String fluxQuery = 'from(bucket: "your-bucket") |> range(start: -1h)';

  // 执行查询
  final FluxTableResult result = await queryApi.query(query: fluxQuery, org: 'your-org');

  // 处理查询结果
  result.tables.forEach((table) {
    print('Table: ${table.label}');
    table.records.forEach((record) {
      print('Record: ${jsonEncode(record.values)}');
    });
  });

  // 关闭客户端连接
  await client.close();
}

5. 整合到Flutter应用中

将上述功能整合到你的Flutter应用中,可以在初始化阶段配置InfluxDB客户端,并在需要的时候调用写入和查询功能。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 配置InfluxDB客户端
  final InfluxDBClient client = configureInfluxDBClient();

  // 写入数据
  await writeDataToInfluxDB(client);

  // 查询数据
  await queryDataFromInfluxDB(client);

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('InfluxDB Client Demo'),
        ),
        body: Center(
          child: Text('Check console for InfluxDB interactions.'),
        ),
      ),
    );
  }
}

注意:上述代码示例为了简洁,将所有操作放在了main函数中。在实际应用中,你可能需要根据业务需求将这些操作分散到不同的组件或服务中,并处理异步操作和错误情况。

此外,确保你的InfluxDB服务正在运行,并且URL、token、org和bucket等参数配置正确。

回到顶部