Flutter监控与指标收集插件prometheus_client的使用

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

Flutter监控与指标收集插件prometheus_client的使用

prometheus_client 是一个简单的 Dart 实现的 Prometheus 客户端库,支持默认的指标类型如计数器(Counter)、仪表盘(Gauge)、摘要(Summary)或直方图(Histogram)。指标可以以文本格式导出,并且可以通过 prometheus_client_shelf 包与 shelf 处理程序集成。

使用示例

以下是一个简单的示例,展示如何在 Flutter 应用中使用 prometheus_client 插件来监控和收集指标。

示例代码

import 'dart:io';

import 'package:prometheus_client/format.dart' as format;
import 'package:prometheus_client/prometheus_client.dart';
import 'package:prometheus_client/runtime_metrics.dart' as runtime_metrics;

void main() async {
  // 注册运行时指标到默认的指标注册表
  runtime_metrics.register();

  // 创建一个没有标签的直方图指标。总是要注册你的指标,无论是在默认注册表还是自定义注册表。
  final durationHistogram = Histogram(
    name: 'http_request_duration_seconds',
    help: 'The duration of http requests in seconds.',
  )..register();

  // 创建一个带有请求路径标签的计数器指标:
  final metricRequestsCounter = Counter(
      name: 'metric_requests_total',
      help: 'The total amount of requests of the metrics.',
      labelNames: ['path'])
    ..register();

  // 创建一个 HTTP 服务器
  final server = await HttpServer.bind(
    InternetAddress.loopbackIPv4,
    8080,
  );
  print('Listening on localhost:${server.port}');

  await for (HttpRequest request in server) {
    // 测量请求持续时间
    await durationHistogram.observeDuration(Future(() async {
      // 根据请求路径统计调用次数
      metricRequestsCounter.labels([request.uri.path]).inc();

      // 输出文本格式的指标
      request.response.headers.add('content-type', format.contentType);
      final metrics =
          await CollectorRegistry.defaultRegistry.collectMetricFamilySamples();
      format.write004(request.response, metrics);

      await request.response.close();
    }));
  }
}

指标类型

Counter(计数器)

Counter 是一个单调递增的计数器。只能通过增加来改变值,每次增加可以是1或者指定的数量。

final requestsCounter = Counter(
  name: 'metric_requests_total',
  help: 'The total amount of requests of the metrics.',
);

requestsCounter.inc();
requestsCounter.inc(64.0);

Gauge(仪表盘)

Gauge 表示一个可以上升和下降的值。

final gauge = Gauge(
  name: 'my_metric',
  help: 'Help!',
);

gauge.value = 1337.0;
gauge.inc(2.0);
gauge.dec(4.0);

Histogram(直方图)

Histogram 允许事件的聚合分布,例如请求延迟。

final histogram = Histogram(
    name: 'my_metric',
    help: 'Help!',
);

histogram.observe(20.0);
await histogram.observeDuration(() async {
  // Some code
});
histogram.observeDurationSync(() {
  // Some code
});

Summary(摘要)

类似于直方图,Summary 对观察值进行采样,通常用于请求延迟和响应大小。

final summary = Summary(
  name: 'my_metric',
  help: 'Help!',
);

summary.observe(20.0);
await summary.observeDuration(() async {
  // Some code
});
summary.observeDurationSync(() {
  // Some code
});

标签

指标可以有可选的标签,在创建指标时传递标签名称,然后通过 labels() 函数访问子指标。

final requestsCounter = Counter(
  name: 'metric_requests_total',
  help: 'The total amount of requests of the metrics.',
  labelNames: ['path'],
);

requestsCounter.labels(['my/path/']).inc();

输出指标

使用 format.write004 方法将指标序列化为 Prometheus 的文本格式。

final buffer = StringBuffer();
final metrics = await CollectorRegistry.defaultRegistry.collectMetricFamilySamples();
format.write004(buffer, metrics);
print(buffer.toString());

启动示例应用程序并访问暴露的指标 http://localhost:8080/。对于完整的使用示例,请参阅 example/prometheus_client_example.dart

这个 Markdown 文档详细介绍了如何在 Flutter 应用中使用 `prometheus_client` 插件进行监控和指标收集,并提供了完整的示例代码供参考。

更多关于Flutter监控与指标收集插件prometheus_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter监控与指标收集插件prometheus_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter应用中集成Prometheus客户端进行监控与指标收集,可以通过prometheus_client插件来实现。以下是一个基本的代码案例,展示了如何在Flutter项目中使用该插件来收集一些自定义指标。

步骤 1: 添加依赖

首先,在你的pubspec.yaml文件中添加prometheus_client依赖:

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

然后运行flutter pub get来安装依赖。

步骤 2: 初始化Prometheus客户端

在你的Flutter应用的入口文件(通常是main.dart)中,初始化Prometheus客户端:

import 'package:flutter/material.dart';
import 'package:prometheus_client/prometheus_client.dart';

void main() {
  // 初始化Prometheus客户端
  final collectorRegistry = CollectorRegistry();

  // 创建一个自定义计数器
  final counter = Counter('custom_counter', 'A custom counter for demonstration', const ['label1'], registry: collectorRegistry);

  // 增加计数器值
  counter.inc({'label1': 'value1'});

  runApp(MyApp(collectorRegistry: collectorRegistry));
}

class MyApp extends StatelessWidget {
  final CollectorRegistry collectorRegistry;

  MyApp({required this.collectorRegistry});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Prometheus Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(collectorRegistry: collectorRegistry),
    );
  }
}

步骤 3: 在应用中展示指标

MyHomePage类中,你可以添加一个按钮来增加计数器的值,并通过HTTP端点暴露Prometheus指标。为了简化示例,这里使用http包来创建一个简单的HTTP服务器。

首先,在pubspec.yaml中添加http依赖:

dependencies:
  http: ^x.y.z  # 请替换为最新版本号

然后,在MyHomePage类中实现如下逻辑:

import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:prometheus_client/prometheus_client.dart';

class MyHomePage extends StatefulWidget {
  final CollectorRegistry collectorRegistry;

  MyHomePage({required this.collectorRegistry});

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counterValue = 0;

  void _incrementCounter() {
    setState(() {
      // 增加自定义计数器的值
      widget.collectorRegistry.counterNamed('custom_counter', labels: {'label1': 'value1'}).inc();
      _counterValue++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Prometheus Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counterValue',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }

  // 启动HTTP服务器暴露Prometheus指标
  void _startHttpServer() async {
    HttpServer server = await HttpServer.bind(InternetAddress.loopbackIPv4, 8080);
    print('Serving at http://${server.address.address}:${server.port}');

    server.listen((HttpRequest request) {
      if (request.uri.path == '/metrics') {
        request.response
          ..headers.add('Content-Type', 'text/plain; charset=utf-8')
          ..write(widget.collectorRegistry.scrape())
          ..close();
      } else {
        request.response
          ..statusCode = HttpStatus.notFound
          ..close();
      }
    });
  }

  @override
  void initState() {
    super.initState();
    // 启动HTTP服务器
    _startHttpServer();
  }
}

运行应用

现在,你可以运行你的Flutter应用。在应用启动后,它会在本地启动一个HTTP服务器,监听http://localhost:8080/metrics端点。访问这个端点,你将能够看到Prometheus格式的指标数据。

注意事项

  1. 性能考虑:在实际应用中,直接在Flutter UI线程上运行HTTP服务器可能不是最佳实践。考虑使用后台服务或独立的Dart VM实例来处理HTTP请求。
  2. 跨平台兼容性:上述示例在桌面和Web平台上可能需要进行适当调整,因为Flutter在不同平台上的网络能力有所不同。
  3. 安全性:在生产环境中,确保你的HTTP服务器受到适当的保护,例如通过身份验证和授权机制。

通过上述步骤,你可以在Flutter应用中集成Prometheus客户端,并进行监控与指标收集。

回到顶部