当前位置: 首页 > Web前端 > HTML

Flutter异常监控-四-Rollbar源码欣赏

时间:2023-03-28 18:29:17 HTML

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通知(事件事件);FutureOrdispose();}Notifier与子类关系图Subisolate处理好处默认初始化IsolatedNotifier.spwan会生成一个新线程。总结几个好处:Telemetry会在发送事件前做数据库相关的增、查、删,比较耗时。Wrangler对象会通过Transformer对Event进行二次保障操作,这个过程也可能比较耗时。Sender.send发送事件时,如果当前应用在某段时间异常频繁,主线程也可能影响UI。综上所述,将所有可能耗时的都放到异步线程中,可以提高主线程的流畅度。5.如何自定义封装类上面的分析说明了封装过程是通过Transformer实现的,自定义封装类的思路:通过Config配置自定义Transformer值实现自定义处理异常数据逻辑,可以加密等Transformer定义抽象类Transformer{FutureOrtransform(Datadata,{requiredEventevent});}Transformer子类Config的默认实现是这样的,如果要自定义数据打包过程,可以重写transform中它,以及其中的日期和事件。类NoopTransformer实现Transformer{constNoopTransformer(Config_);@overrideDatatransform(Datadata,{requiredEventevent})=>data;}6.设计模式相关1.单一职责原则类功能抽象和精确,分工明确:隔离switch模块,由Notifier子类实现。Transformation模块:Transformer对象提供自定义和默认的转换方法。传输模块:Wrangler会提供最终的真实数据并传输给发送方。发送模块:Sender子类实现,可扩展为httpSender等。存储模块:Telemetry对数据库、可插拔、查询异常、异常路径对象的封装。2.可插拔设计可插拔意味着更自由的功能和更开放和封闭的设计。Rollbar就像积木一样,统一配置打包、传输、发送、存储,更加灵活。通过非空命名构造函数提供默认实现,直接将模块配置为组合,可以外部设置和替换,满足开闭原则。constConfig({this.notifier=IsolatedNotifier.spawn,this.wrangler=DataWrangler.new,this.transformer=NoopTransformer.new,this.sender=PersistentHttpSender.new,});PS:一直没有想过Dart中的构造函数多非空可选参数和建造者模式有什么区别?感觉前者完全可以替代建造者模式的场景。谁能告诉我应用场景的区别?7.其他考虑到文章的篇幅,文章对主要流程进行了分析。其实还有很多值得学习和借鉴的地方。比如异常存储和序列化相关的逻辑。多个stacktrace处理,例如:Android平台中的PlatformException。Dart2.15中的构造函数拆分。八、问题及说明flutter官方目前还是测试版。在官网创建项目时,没有flutter项目图标的选项。发送过程中会报accesstoken错误。这是因为之前accesstoken配置错误,记录没有发送出去。卸载应用或删除应用数据库后,用最新的accesstoken测试。九。优缺点优点支持发送线程切换。支持dart层数据库保存数据。支持多stacktrace处理,例如:Android平台的PlatformException。整个过程看起来比较顺利,组件分工明确,支持config。支持跟踪异常路径。缺点异常追踪路径没有设计自动埋点导航和网络。手动埋点有点麻烦,可以参考Bugsnag完成。Rollbar虽然官方说是纯Dart实现,但是其存储相关的底层使用了sqlite3。这个东西是通过渠道实现的。非纯Dart实现有依赖于对等方的本机功能的风险。您可以考虑改用纯Dart配置单元吗?.10.参考链接Flutter异常监控-3|从bugsnag源码学习如何追踪异常生成路径-掘金发布rollbar/rollbar-flutterFlutter如果觉得文章对你有帮助,点赞、收藏、关注、评论、一键四连支持,你的支持就是我创作的最大动力。??本文原文在听蝉公众号:编程黑板报欢迎关注原创技术文章,第一时间推送??