《Flutter 网络请求性能监控:如何统计请求耗时与成功率?》
在 Flutter 中实现网络请求性能监控,关键在于并记录关键指标。
·
在 Flutter 中实现网络请求性能监控,关键在于拦截请求过程并记录关键指标。以下是完整的实现方案:
一、核心监控指标
- 请求耗时:从发起请求到收到完整响应的时间
$$ \text{耗时} = T_{\text{响应结束}} - T_{\text{请求开始}} $$ - 成功率:
$$ \text{成功率} = \frac{\text{成功请求数}}{\text{总请求数}} \times 100% $$ - 补充指标:状态码分布、重试次数、数据包大小
二、实现方案(使用 Dio 拦截器)
在 Flutter 中实现网络请求性能监控,关键在于拦截请求过程并记录关键指标。以下是完整的实现方案:
一、核心监控指标
- 请求耗时:从发起请求到收到完整响应的时间
$$ \text{耗时} = T_{\text{响应结束}} - T_{\text{请求开始}} $$ - 成功率:
$$ \text{成功率} = \frac{\text{成功请求数}}{\text{总请求数}} \times 100% $$ - 补充指标:状态码分布、重试次数、数据包大小
二、实现方案(使用 Dio 拦截器)
import 'package:dio/dio.dart';
class NetworkMonitor extends Interceptor {
final _successCount = 0;
final _totalCount = 0;
final _durations = <Duration>[];
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
// 记录请求开始时间
options.extra['start_time'] = DateTime.now().millisecondsSinceEpoch;
super.onRequest(options, handler);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
_recordRequest(
startTime: response.requestOptions.extra['start_time'],
isSuccess: response.statusCode! >= 200 && response.statusCode! < 300
);
super.onResponse(response, handler);
}
@override
void onError(DioException err, ErrorInterceptorHandler handler) {
_recordRequest(
startTime: err.requestOptions.extra['start_time'],
isSuccess: false
);
super.onError(err, handler);
}
void _recordRequest({required int startTime, required bool isSuccess}) {
final endTime = DateTime.now().millisecondsSinceEpoch;
final duration = Duration(milliseconds: endTime - startTime);
_durations.add(duration);
_totalCount++;
if (isSuccess) _successCount++;
// 实时打印指标(实际项目可上报到监控系统)
print('''
📊 请求统计:
- 耗时: ${duration.inMilliseconds}ms
- 成功率: ${(_successCount/_totalCount*100).toStringAsFixed(1)}%
- 平均耗时: ${_avgDuration().inMilliseconds}ms
''');
}
Duration _avgDuration() => Duration(
milliseconds: _durations.fold(0, (sum, d) => sum + d.inMilliseconds) ~/
_durations.length
);
}
三、接入应用
void main() {
final dio = Dio();
// 添加监控拦截器
dio.interceptors.add(NetworkMonitor());
// 示例请求
dio.get('https://api.example.com/data');
dio.post('https://api.example.com/submit');
}
四、高阶优化建议
- 数据持久化
void _saveToStorage() async { final prefs = await SharedPreferences.getInstance(); await prefs.setDouble('success_rate', _successCount / _totalCount); } - 阈值告警(当成功率 < 95% 或平均耗时 > 1000ms 时触发)
- 区分API路径:使用
requestOptions.path分类统计不同接口 - 可视化仪表盘:集成 Firebase Analytics 或 Prometheus
五、监控结果示例
📊 24小时网络监控报告:
---------------------------------
成功率 | 98.7% ⭐
平均耗时 | 346ms
超时请求 | 12次 (耗时 > 3000ms)
最慢接口 | /user/profile (平均 890ms)
---------------------------------
关键提示:生产环境建议结合 Sentry 捕获堆栈信息,使用 flutter_ume 实现实时调试面板。
三、接入应用
void main() {
final dio = Dio();
// 添加监控拦截器
dio.interceptors.add(NetworkMonitor());
// 示例请求
dio.get('https://api.example.com/data');
dio.post('https://api.example.com/submit');
}
四、高阶优化建议
- 数据持久化
void _saveToStorage() async { final prefs = await SharedPreferences.getInstance(); await prefs.setDouble('success_rate', _successCount / _totalCount); } - 阈值告警(当成功率 < 95% 或平均耗时 > 1000ms 时触发)
- 区分API路径:使用
requestOptions.path分类统计不同接口 - 可视化仪表盘:集成 Firebase Analytics 或 Prometheus
五、监控结果示例
📊 24小时网络监控报告:
---------------------------------
成功率 | 98.7% ⭐
平均耗时 | 346ms
超时请求 | 12次 (耗时 > 3000ms)
最慢接口 | /user/profile (平均 890ms)
---------------------------------
关键提示:生产环境建议结合 Sentry 捕获堆栈信息,使用 flutter_ume 实现实时调试面板。
更多推荐



所有评论(0)