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

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

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

prometheus_client_shelf 是一个用于在 Shelf 应用中暴露 Prometheus 指标的 Dart 包。它利用了 prometheus_client 包来实现这一功能,并提供了一个 Shelf 处理器和一些现成的中间件来简化集成过程。

使用方法

下面是一个简单的使用示例,展示了如何注册默认运行时指标、创建自定义计数器以及设置处理请求的路由:

import 'package:prometheus_client/prometheus_client.dart';
import 'package:prometheus_client/runtime_metrics.dart' as runtime_metrics;
import 'package:prometheus_client_shelf/shelf_metrics.dart' as shelf_metrics;
import 'package:prometheus_client_shelf/shelf_handler.dart';
import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf/shelf_io.dart' as io;
import 'package:shelf_router/shelf_router.dart';

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

  // 创建一个名为 'greetings_total' 的计数器
  final greetingCounter = Counter(
    name: 'greetings_total',
    help: 'The total amount of greetings',
  )..register();

  final app = Router();

  // 定义 '/hello' 路由,每次访问时增加计数器
  app.get('/hello', (shelf.Request request) {
    greetingCounter.inc();
    return shelf.Response.ok('hello-world');
  });

  // 设置 '/metrics' 路由以暴露指标
  app.get('/metrics', prometheusHandler());

  var handler = const shelf.Pipeline()
      // 注册一个中间件来追踪请求时间
      .addMiddleware(shelf_metrics.register())
      .addHandler(app.handler);

  var server = await io.serve(handler, 'localhost', 8080);
  
  print('Serving at http://${server.address.host}:${server.port}');
}

更完整的示例

这里有一个更复杂的例子,包括了更多类型的度量(如 Gauge)以及错误处理:

import 'dart:math';
import 'package:prometheus_client/prometheus_client.dart';
import 'package:prometheus_client/runtime_metrics.dart' as runtime_metrics;
import 'package:prometheus_client_shelf/shelf_handler.dart';
import 'package:prometheus_client_shelf/shelf_metrics.dart' as shelf_metrics;
import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf/shelf_io.dart' as io;
import 'package:shelf_router/shelf_router.dart';

void main() async {
  runtime_metrics.register();

  // 创建带有标签的 Gauge 来记录最后访问的时间
  final timeGauge = Gauge(
    name: 'last_accessed_time',
    help: 'The last time the hello endpoint was accessed',
    labelNames: ['endpoint'],
  )..register();

  // 创建不带标签的 Gauge 来存储最后一次掷骰子的结果
  final rollGauge = Gauge(
    name: 'roll_value',
    help: 'The last roll value',
  )..register();

  // 创建一个计数器
  final greetingCounter = Counter(
    name: 'greetings_total',
    help: 'The total amount of greetings',
  )..register();

  final app = Router();

  app.get('/hello', (shelf.Request request) {
    timeGauge.labels(['hello']).setToCurrentTime();
    greetingCounter.inc();
    return shelf.Response.ok('hello-world');
  });

  app.get('/roll', (shelf.Request request) {
    timeGauge.labels(['roll']).setToCurrentTime();
    final value = Random().nextDouble();
    rollGauge.value = value;
    return shelf.Response.ok('rolled $value');
  });

  // 提供 /metrics 路径来获取所有度量数据
  app.get('/metrics', prometheusHandler());

  // 默认处理未匹配到的路径
  app.all('/<ignored|.*>', (shelf.Request request) {
    return shelf.Response.notFound('Not Found');
  });

  var handler = const shelf.Pipeline()
      .addMiddleware(shelf_metrics.register()) // 添加追踪请求时间和状态码的中间件
      .addMiddleware(shelf.logRequests())      // 添加日志中间件
      .addHandler(app);

  var server = await io.serve(handler, 'localhost', 8080);

  print('Serving at http://${server.address.host}:${server.port}');
}

通过上述代码,你可以启动一个服务器并访问 http://localhost:8080/metrics 来查看当前应用的所有 Prometheus 指标。这个包非常适合需要对 Dart/Flutter 后端服务进行性能监控的应用场景。


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

1 回复

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


在Flutter应用中,使用prometheus_client_shelf插件可以帮助你进行监控和指标收集,这对于维护应用的性能和稳定性至关重要。prometheus_client_shelf通常与Dart的HTTP服务器(如Shelf)一起使用,以便公开Prometheus格式的指标端点。

以下是一个简单的示例,展示了如何在Flutter应用中使用prometheus_client_shelf来设置和暴露Prometheus指标。请注意,虽然Flutter主要用于构建UI,但此示例将重点放在后端服务部分,通常你会在Flutter应用的后台任务或插件中使用这样的代码。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  prometheus_client_shelf: ^x.y.z  # 请替换为最新版本号
  shelf: ^x.y.z  # 请替换为最新版本号
  shelf_router: ^x.y.z  # 可选,用于路由处理

步骤 2: 编写后端服务代码

接下来,在你的Flutter项目中创建一个Dart文件(例如server.dart),用于设置HTTP服务器和Prometheus指标。

import 'dart:io';
import 'package:prometheus_client_shelf/prometheus_client_shelf.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';

void main() async {
  // 创建一个Prometheus收集器
  final collectorRegistry = CollectorRegistry();
  final counter = Counter.newCounter(
    'requests_total',
    'Total number of requests',
    const <String, String>{},
    registry: collectorRegistry,
  );

  // 创建一个HTTP路由处理器
  final router = Router()
    ..get('/metrics', (Request request) async {
      final metricsHandler = PrometheusHandler(collectorRegistry);
      return Response.ok(await metricsHandler.handleRequest(request));
    })
    ..all('*', (Request request) async {
      counter.inc();  // 每次请求都增加计数器
      return Response.ok('Hello, Prometheus!');
    });

  // 创建一个HTTP服务器
  final handler = Pipeline.pipe(router.handler);
  final server = await HttpServer.bind(InternetAddress.anyIPv4, 8080);

  print('Serving at http://${server.address.host}:${server.port}');
  await server.listen(handler);
}

步骤 3: 运行你的服务

你可以通过命令行运行这个Dart文件,启动HTTP服务器。确保你的Flutter环境已经配置好Dart SDK。

dart run server.dart

步骤 4: 访问Prometheus指标

启动服务器后,你可以通过访问http://localhost:8080/metrics来查看Prometheus格式的指标数据。

示例输出

访问http://localhost:8080/metrics后,你可能会看到类似以下的输出:

# HELP requests_total Total number of requests
# TYPE requests_total counter
requests_total_total 5

这表示requests_total计数器当前的值是5,每当你访问除/metrics之外的任何路径时,这个值都会增加。

结论

以上代码展示了如何在Flutter项目中使用prometheus_client_shelf插件来设置和暴露Prometheus指标。尽管Flutter主要用于前端UI开发,但这样的后端服务代码可以嵌入到Flutter应用中,特别是当你需要监控后台任务或插件的性能时。

回到顶部