Flutter监控与指标收集插件prometheus_client_shelf的使用
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
更多关于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_shelf
和shelf
依赖:
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应用中,特别是当你需要监控后台任务或插件的性能时。