在 Flutter 中实现网络请求性能监控,关键在于拦截请求过程并记录关键指标。以下是完整的实现方案:

一、核心监控指标

  1. 请求耗时:从发起请求到收到完整响应的时间
    $$ \text{耗时} = T_{\text{响应结束}} - T_{\text{请求开始}} $$
  2. 成功率
    $$ \text{成功率} = \frac{\text{成功请求数}}{\text{总请求数}} \times 100% $$
  3. 补充指标:状态码分布、重试次数、数据包大小

二、实现方案(使用 Dio 拦截器)

在 Flutter 中实现网络请求性能监控,关键在于拦截请求过程并记录关键指标。以下是完整的实现方案:

一、核心监控指标

  1. 请求耗时:从发起请求到收到完整响应的时间
    $$ \text{耗时} = T_{\text{响应结束}} - T_{\text{请求开始}} $$
  2. 成功率
    $$ \text{成功率} = \frac{\text{成功请求数}}{\text{总请求数}} \times 100% $$
  3. 补充指标:状态码分布、重试次数、数据包大小

二、实现方案(使用 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');
}


四、高阶优化建议

  1. 数据持久化
    void _saveToStorage() async {
      final prefs = await SharedPreferences.getInstance();
      await prefs.setDouble('success_rate', _successCount / _totalCount);
    }
    

  2. 阈值告警(当成功率 < 95% 或平均耗时 > 1000ms 时触发)
  3. 区分API路径:使用 requestOptions.path 分类统计不同接口
  4. 可视化仪表盘:集成 Firebase AnalyticsPrometheus

五、监控结果示例

📊 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');
}


四、高阶优化建议

  1. 数据持久化
    void _saveToStorage() async {
      final prefs = await SharedPreferences.getInstance();
      await prefs.setDouble('success_rate', _successCount / _totalCount);
    }
    

  2. 阈值告警(当成功率 < 95% 或平均耗时 > 1000ms 时触发)
  3. 区分API路径:使用 requestOptions.path 分类统计不同接口
  4. 可视化仪表盘:集成 Firebase AnalyticsPrometheus

五、监控结果示例

📊 24小时网络监控报告:
---------------------------------
成功率       | 98.7% ⭐
平均耗时     | 346ms 
超时请求     | 12次 (耗时 > 3000ms)
最慢接口     | /user/profile (平均 890ms)
---------------------------------

关键提示:生产环境建议结合 Sentry 捕获堆栈信息,使用 flutter_ume 实现实时调试面板。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐