Flutter性能监控插件site24x7_flutter_plugin的使用

Flutter性能监控插件site24x7_flutter_plugin的使用

Site24x7 Flutter插件允许用户跟踪其Flutter移动应用程序的HTTP调用、崩溃、屏幕加载时间以及自定义数据。通过添加事务并将其与组件、个别用户及其会话分组,可以优化应用性能。

开始使用

请遵循以下步骤完成在您的Flutter应用中安装site24x7_flutter_plugin。

快速设置

1. 安装插件
flutter pub add site24x7_flutter_plugin

打开位于应用文件夹内的pubspec.yaml文件,您会注意到dependencies:下已添加了一行site24x7_flutter_plugin:,如下所示:

dependencies:
  site24x7_flutter_plugin: ^1.0.0
2. iOS安装步骤
  1. 在项目目录下的ios/文件夹中添加pod。
    target 'Your_Project_Name' do
      
      pod 'Site24x7APM'
      
    end
    
  2. 在同一目录下运行以下命令:
    pod install
    

在Flutter应用中使用

导入site24x7_flutter_plugin包如下:

import 'package:site24x7_flutter_plugin/site24x7_flutter_plugin.dart';

1. 启动代理

import 'package:site24x7_flutter_plugin/site24x7_flutter_plugin.dart';

Future<void> main() async {
  
  WidgetsFlutterBinding.ensureInitialized();

  // 分配Site24x7错误回调
  // 非异步异常
  FlutterError.onError = ApmMobileapmFlutterPlugin.instance.captureFlutterError; // site24x7自定义回调

  // 异步异常
  PlatformDispatcher.instance.onError = (error, stack) {
    ApmMobileapmFlutterPlugin.instance.captureException(error, stack, false, type: "uncaughtexception"); // site24x7自定义API
    return true;
  };

  // 启动代理
  await ApmMobileapmFlutterPlugin.instance.startMonitoring("appKey", uploadInterval); // site24x7自定义API

  ...
  runApp(MyHomePage(title: 'Flutter Demo Home Page'));
  ...

}

注意:确保在main()方法中调用WidgetsFlutterBinding.ensureInitialized();之前分配错误回调。

2. 屏幕跟踪

您可以使用以下机制来计算屏幕加载所需的时间。这些数据将推送到Site24x7服务器,并可用于会话跟踪和崩溃报告。

无状态小部件

import 'package:site24x7_flutter_plugin/site24x7_flutter_plugin.dart';

class FirstScreen extends StatelessWidget {

  FirstScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('Sample Widget'),
        ),
        body: Center(
            child: ElevatedButton(
              child: const Text('Go To Stateless Widget'),
              onPressed: () {
                var initialTimeStamp = DateTime.now();
                Navigator.push(
                    context, 
                    MaterialPageRoute(
                        builder: (context) => SampleStatelessWidget()
                        ),
                    ).then((value) {
                    var loadTime = DateTime.now().difference(initialTimeStamp).inMilliseconds;
                    ApmMobileapmFlutterPlugin.instance.addScreen("SampleStatelessWidget", loadTime.toDouble(), initialTimeStamp.millisecondsSinceEpoch); // site24x7自定义API
                });
              },
            ),
          ),
      );
    }
  }
}

有状态小部件

import 'package:site24x7_flutter_plugin/site24x7_flutter_plugin.dart';

class SampleWidget extends StatefulWidget {
  const SampleWidget({super.key});
  @override
  State<SampleWidget> createState() => _SampleWidgetState();
}

class _SampleWidgetState extends State<SampleWidget> {
  
  late var _initialTimeStamp, _finalTimeStamp;

  @override
  void initState() {
    super.initState();
    _initialTimeStamp = DateTime.now();
  }

  void site24x7AfterBuildCallback(BuildContext context) {
    var finalTimeStamp = DateTime.now();
  }

  @override
  Widget build(BuildContext context) {

    WidgetsBinding.instance!.addPostFrameCallback((_) => site24x7AfterBuildCallback(context));
  
    return Scaffold(
        appBar: AppBar(
          title: const Text('Sample Widget'),
        ),
        body: Center(
          child: const Text('Hello Sample Widget');
        ),
      );
  }

  @override
  void didUpdateWidget(Fetch oldWidget) {
    super.didUpdateWidget(oldWidget);
    // 发送小部件加载时间,即初始和最终时间戳之间的差异应使用addScreen API发送到服务器
    var loadTime = _finalTimeStamp.difference(_initialTimeStamp).inMilliseconds;
    ApmMobileapmFlutterPlugin.instance.addScreen("Fetch", loadTime.toDouble(), _initialTimeStamp.millisecondsSinceEpoch); // site24x7自定义API
    // 将最终时间戳分配给初始时间戳
    _initialTimeStamp = DateTime.now();
  }

  @override
  void dispose() {
    super.dispose();
    // 发送小部件加载时间,即初始和最终时间戳之间的差异应使用addScreen API发送到服务器
    var loadTime = _finalTimeStamp.difference(_initialTimeStamp).inMilliseconds;
    ApmMobileapmFlutterPlugin.instance.addScreen("Fetch", loadTime.toDouble(), _initialTimeStamp.millisecondsSinceEpoch); // site24x7自定义API
  }
}

要自动捕获路由时的面包屑,可以使用Site24x7NavigatorObserver(),如下所示:

class MyHomePage extends StatefulWidget {
  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  
  @override
  Widget build(BuildContext context){
    return MaterialApp(
      routes: {
        '/first': (context) => FirstScreen(),
        '/second': (context) => SecondScreen(),
        '/fetch': (context) => FetchScreen()
      },
      navigatorObservers: [
        Site24x7NavigatorObserver() // site24x7自定义导航观察器
      ]
    );
  }

}

3. 网络监控

支持HTTP和Dio包。捕获使用上述包进行的API调用。

HTTP包

import 'package:http/http.dart' as http;
import 'package:site24x7_flutter_plugin/site24x7_flutter.dart';

...

// site24x7自定义组件
var client = Site24x7HttpClient();
                  (或)
var client = Site24x7HttpClient(client: http.Client());

var dataURL = Uri.parse('https://jsonplaceholder.typicode.com/posts?userId=1&_limit=5');
http.Response response = await client.get(dataURL);

...

Dio包

import 'package:dio/dio.dart';
import 'package:site24x7_flutter_plugin/site24x7_flutter_plugin.dart';

...

var dio = Dio();

dio.enableSite24x7(); // site24x7 dio扩展

var dataURL = 'https://jsonplaceholder.typicode.com/posts?userId=1_limit=5';
final response = await dio.get(dataURL);

...

// 注意:在进行API调用前,请确保已安装http和Dio包。并且在所有自定义配置完成后,在dio对象上调用.enableSite24x7()。

4. 错误监控

您可以在catch块中手动捕获发生的异常,使用以下API。

捕获非异步异常

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  FlutterError.onError = ApmMobileapmFlutterPlugin.instance.captureFlutterError; // site24x7自定义回调
  runApp(MyHomePage());
}

捕获异步异常

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  PlatformDispatcher.instance.onError = (error, stack){
    ApmMobileapmFlutterPlugin.instance.platformDispatcherErrorCallback(error, stack); // site24x7自定义API
  };
  runApp(MyHomePage());
}

捕获捕获的异常

try {

  // 可能生成异常的代码

} catch (exception, stack){
  ApmMobileapmFlutterPlugin.instance.captureException(exception, stack);
}

注意:在调用runApp()之前使用错误监控自定义API。

5. 事务和组件

您可以在一个事务内开始和停止一个唯一的组件。在一个事务中,您可以开始多个组件。

ApmMobileapmFlutterPlugin.instance.startTransaction("listing_blogs");

// 使用组件分组各种操作。
ApmMobileapmFlutterPlugin.instance.startComponent("listing_blogs", "http_request");
// 您的代码/逻辑
ApmMobileapmFlutterPlugin.instance.stopComponent("listing_blogs", "http_request");

ApmMobileapmFlutterPlugin.instance.startComponent("listing_blogs", "view_data_onto_screen");
// 您的代码/逻辑
ApmMobileapmFlutterPlugin.instance.stopComponent("listing_blogs", "view_data_onto_screen");

ApmMobileapmFlutterPlugin.instance.stopTransaction("listing_blogs");

6. 用户跟踪

您可以通过设置唯一用户标识符来跟踪特定用户。如果未指定唯一ID,Site24x7将生成随机GUID并将其作为用户ID分配。

ApmMobileapmFlutterPlugin.instance.setUserId("user@example.com");

7. 面包屑

您可以使用以下函数手动添加面包屑。

ApmMobileapmFlutterPlugin.instance.addBreadcrumb(event, message);
ex : ApmMobileapmFlutterPlugin.instance.addBreadcrumb("Info", "download completed");

8. 刷新

您可以使用以下API立即刷新数据到Site24x7服务器,而不是等待下一个上传间隔。

ApmMobileapmFlutterPlugin.instance.flush();

9. 应用程序崩溃

您可以强制应用程序崩溃并显示一条错误消息,说"这是Site24x7崩溃"

ApmMobileapmFlutterPlugin.instance.crashApplication();

更多关于Flutter性能监控插件site24x7_flutter_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter性能监控插件site24x7_flutter_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用site24x7_flutter_plugin进行性能监控的示例代码。这个插件允许你监控应用的性能数据,并将这些数据发送到Site24x7进行分析。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加site24x7_flutter_plugin依赖:

dependencies:
  flutter:
    sdk: flutter
  site24x7_flutter_plugin: ^最新版本号 # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 初始化插件

在你的main.dart文件中,你需要初始化Site24x7插件。通常,你会在应用的入口点进行初始化。

import 'package:flutter/material.dart';
import 'package:site24x7_flutter_plugin/site24x7_flutter_plugin.dart';

void main() {
  // 初始化Site24x7插件
  Site24x7FlutterPlugin.initialize(
    appKey: '你的Site24x7应用密钥', // 请替换为你的Site24x7应用密钥
    logEnable: true, // 是否启用日志记录
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('Hello, World!'),
      ),
    );
  }
}

3. 自定义监控(可选)

你可以根据需求自定义监控逻辑,例如记录自定义事件或性能标记。以下是一些示例代码:

// 记录自定义事件
Site24x7FlutterPlugin.logCustomEvent(eventName: 'custom_event_name', eventData: {'key': 'value'});

// 记录自定义性能标记
void someFunction() async {
  final startTime = DateTime.now().millisecondsSinceEpoch;
  
  // 模拟一些工作
  await Future.delayed(Duration(seconds: 2));
  
  final endTime = DateTime.now().millisecondsSinceEpoch;
  Site24x7FlutterPlugin.logCustomMetric(metricName: 'custom_metric_name', metricValue: endTime - startTime);
}

4. 处理生命周期事件(可选)

在某些情况下,你可能希望在应用生命周期事件发生时记录额外的监控信息。例如,你可以在AppLifecycleState变化时记录应用状态:

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.inactive:
        Site24x7FlutterPlugin.logAppLifecycleState('inactive');
        break;
      case AppLifecycleState.paused:
        Site24x7FlutterPlugin.logAppLifecycleState('paused');
        break;
      case AppLifecycleState.resumed:
        Site24x7FlutterPlugin.logAppLifecycleState('resumed');
        break;
      case AppLifecycleState.detached:
        Site24x7FlutterPlugin.logAppLifecycleState('detached');
        break;
    }
  }

  @override
  Widget build(BuildContext context) {
    // ... 你的构建代码 ...
  }
}

请注意,这里的logAppLifecycleState方法是一个假设的方法,site24x7_flutter_plugin可能提供了特定的方法来记录应用生命周期状态,或者你可能需要自定义实现这一逻辑。

结论

以上代码展示了如何在Flutter项目中集成和使用site24x7_flutter_plugin进行性能监控。请确保你查阅了最新的Site24x7 Flutter插件文档(假设有一个官方文档链接),以获取最准确的集成指南和API参考。

回到顶部