Flutter监控与指标收集插件prometheus_client的使用
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
更多关于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格式的指标数据。
注意事项
- 性能考虑:在实际应用中,直接在Flutter UI线程上运行HTTP服务器可能不是最佳实践。考虑使用后台服务或独立的Dart VM实例来处理HTTP请求。
- 跨平台兼容性:上述示例在桌面和Web平台上可能需要进行适当调整,因为Flutter在不同平台上的网络能力有所不同。
- 安全性:在生产环境中,确保你的HTTP服务器受到适当的保护,例如通过身份验证和授权机制。
通过上述步骤,你可以在Flutter应用中集成Prometheus客户端,并进行监控与指标收集。