1.Rollbar能帮你解决什么问题,没有特别说明。本文中Rollbar指的是Rollbar-flutter1。代码重用。具有“代码重用”的光环。如图,当接入端(Third-APP)调用RollbarSDK时,说明包含的网络(数据上传异常等)和存储(存储管理异常)可以达到复用的效果。如果Flutter异常监控框架不是纯Dart实现的(第三篇Bugsnag),就会出现代码无法复用的问题。,…)必须适配peerSDK(android-crash-sdk,ios-crash-sdk,…),导致需要分别实现网络和存储逻辑peerSDK,严重重复逻辑。因此,在设计软件多端架构时,Dart端可以理解为多平台公共代码集合。如果有多端逻辑功能代码,完全可以提取到Dart端重复使用,减少测试和人力成本。2.自定义打包操作在前两篇文章中我们知道,在捕获原始异常后,Error和StackTrace的相当一部分工作就是将原始异常数据进行打包,然后将打包类数据发送给peer或者后端,不同的框架打包的过程是不同的。如下图,Catcher框架将类对象包装为Report,Bugsnag将异常包装了两次,第一次是BugsnagError,第二次是BugsnagEvent。这个很好理解,因为不同的框架对同一个东西的要求是不一样的,不同的要求就注定了不同的封装行为。原始异常数据如鱼得水。口味清淡的麦田选择清蒸,口味重的八爪鱼选择红烧。不同的框架是不同口味的鱼人。而Rollbar将包装行为抽象出来,以一定的方式为你提供原汁原味的鱼,让你享受自由烹饪的乐趣。3、线程切换异常发生后,有很多耗时的操作,如读取原始异常数据包中的附加字段、存储、查询、加密、上报异常等。所有耗时的操作都在mainisolate中完成,必然会影响mainisolate的UI构建。当异常数据量大时,UI会卡顿,就像图中的情况,Rollbar支持将耗时的异常处理操作转移给子isolate(崩溃isolate),让mainisolate专注于UI构建等,提高应用的流畅度。4.Tracingthegenerationpath这个需求和第三篇FlutterExceptionMonitoring-3|一样了解如何从bugsnag源代码中跟踪异常生成路径。该要求的目的是完整记录用户操作的整个行为路径,从而清晰地引导用户的操作过程。定位问题很有帮助。可以理解为一个小型的埋葬系统,但是埋葬系统只是针对异常的。差异是在代码级别实现的。在bugsnag中,有自动添加路径和手动添加路径两种情况。在Rollbar中,只有手动添加,但是手动添加分类更详细。例如图中,Breadcrumb构建过程分为Breadcrumb.error、Breadcrumb.navigation、Breadcrumb.widget和Breadcrumb.log分别对应不同的图标事件。也就是说,溯源异常生成路径需求是标准配置吗?目前,Bugsnag和Rollbar都已经实现了。2.如何将包添加到您的文件中:pubspec.yamldependencies:rollbar_flutter:^0.3.0-beta)async{constconfig=Config(//accessToken在https://rollbar.com/注册获取accessToken:'YOUR-ROLLBAR-ACCESSTOKEN',package:'rollbar_flutter_example');awaitRollbarFlutter.run(config,(){runApp(constMyApp());});}需要DartSDK>=2.7.0Flutter>=1.20.0一个Rollbar账号三、原理分析Rollbar是Flutter的异常框架。文章中的大体阅读路径,按照以下步骤:alt="无标题7.png"width="15%"/>1.Flutter异常监控点接入端通过RollerFlutter.run进入Rollbar的内部逻辑。重点关注Config中默认的四个变量:Notifier:控制发送事件是通过主线程还是其他线程发送。Transformer:对异常数据进行转换的转换器。Wrangler:为异常数据提供二次打包机会,返回最终发送的真实数据。Sender:发送Wrangler提供的真实数据。通过FlutterError.onError(第21行)和runZonedGuarded(第13行)两个监控点的逻辑处理,将异常收集到Rollbar.error方法中,将原始异常以形式发送给Notifier.notify(第15行)事件。通过步骤1中Config提供的默认实现,可知步骤3中的_notifier为IsolatedNotifier,这样下图中的事件(第14行)最终会发送给子线程(第45行)。这里主要涉及隔离双向通信的知识。如果您不确定,可以阅读这篇文章。Flutte指北->Isolate40~43:其实得到的是第一步传递的几个默认值,其中telemetry变量可以理解为一个数据库封装对象,用于缓存异常数据。46~49:在转换Event之前,需要处理数据库中缓存的异常。数据库中有两种缓存数据:1.面包屑2.事件。49会判断正常的Event是否过期,如果过期则删除。51~53:通过默认wrangler获取真实数据。54:发送端向服务器发送真实数据等。至此流程图如下:k3u1fbpfcp-watermark.image?"alt="Untitled13.png"width="30%"/>2.生成10行异常包装类:Event转化为Data对象,主要是添加一些Error和StackTrack以外的信息。如客户端信息(当前OS系统、OS版本、dart版本、平台CPU核数等)、包名、事件级别、环境等。第11行:将Data对象交给Transformer转换器,允许开发人员自定义他们自己的转换行为。第12行:返回最终的真实数据Payload。异常数据打包过程:3.操作打包类以上步骤中对事件进行了两次封装,生成最终的打包类为Payload,最后将该类转化为字符串发送给Rollbar后台。4.如何进行线程切换上面的分析表明,线程切换是通过Notifier来实现的。线程切换思路:通过Config配置自定义Notifier值,指定异常处理运行线程。AsyncNotifier是主要的UIisolate,IsolateNotifier会创建一个新的子线程来执行异常相关的操作。通知程序定义abstractclassNotifier{//通知程序版本随每个新版本更新:[todo]automatestaticconstversion='0.4.0-beta';staticconstname='rollbar-dart';发件人获取发件人;牧马人得到牧马人;遥测获取遥测;FutureOr
