Flutter异常监控 - 伍 | 关于异常监控框架设计的思考
前言
最近阅读 Catcher、BugSnag、Rollbar 三个 Flutter 异常监控开源框架,文章链接如下:
Flutter 异常监控 - 贰 | 框架 Catcher 原理分析
Flutter 异常监控 - 叁 | 从 bugsnag 源码学习如何追溯异常产生路径
Flutter 异常监控 - 肆 | Rollbar 源码赏析
这篇文章将从实现功能,优缺点,设计思想等方面做个总结,方便开发中技术选型。
需求列表
罗列下认为比较重点需求,并不表示框架所有需求只有这些。
功能对比
所有上述需求主要体现在异常产生到发送过程中,大致包括如下几个方面
| Catcher | Bugsnag | Rollbar | |
|---|---|---|---|
| 自定义 UI 显示异常 | 是(4 种报告模式) | 不支持 | 不支持 |
| 异常处理线程 | main isolate | 对端决定 | 子 isolate |
| 自定义包装过程 | 部分支持 | 不支持 | 支持 |
| 异常存储 | 不支持 | 对端存储 | Dart 侧存储 |
| 自定义上报处理程序 | 6 种 | 1 种(自研) | 1 种(自研) |
| 异常路径生成追溯 | 不支持 | 自动 + 手动 | 手动 |
| 是否纯 Dart 实现 | Dart | 对端+Dart | Dart |
| 对端异常处理 | 不支持 | 支持 | 部分支持 |
| 是否有自研后台 | 无 | 有 | 有 |
| 支持平台 | 全平台 | android,ios | android,ios |
框架的好与坏
如果问哪个最牛逼,我只能说:“没有不好的框架,只有乱用的人”。谁又不是个(某人心中的)宝宝呢?不同场景下谁都是自己的王者。
正确食用方式:
| 应用场景 | |
|---|---|
| Catcher | 如果对异常 UI 显示和自定义上报要求很高,且支持全平台,可以选 Catcher。 |
| Bugsnag | 如果对端各平台 SDK 有深耕和技术积累,可以参考 Bugsnag 来统一 Dart 端接口设计和自动埋点。 |
| Rollbar | 如果侧重功能可插拔,对 UI 性能要求高,重度 Dart 用户且未来需要支持全平台,可以选 Rollbar。 |
论变与不变
设计模式中最重要的原则是开闭原则,23 种设计模式都是以开闭原则为核心。
开闭原则:“对扩展开放,对修改关闭。” ,其中关键是识别需求中的变与不变,封装变化隔离不变。
用 Rollbar 框架举例:
拿复用代码来说,变化的是多平台及多平台中不同的网络和存储实现,不变的是各平台都需要实现这套异常网络上报和存储逻辑。隔离不变,就是将网络和存储放在 Dart 侧,封装变化,将不同平台捕获异常方式封装起来放到各自对应平台目录实现,这样就达到了复用代码目的。
这块可以看下Flutter 异常监控 - 肆 | Rollbar 源码赏析 中的代码复用分析,这里就不赘述了。
拿线程控制来说,变化的是在哪个线程,不变的是在线程中做的事情。Rollbar 中抽象 Notifier 来对线程控制,隔离不变,从 Config 中获取 Wrangler,Sender,Telemetry 来对异常事件进行操作,先存储再包装最后发送,这些是异常处理的标准流程,封装变化,将线程切换封装在 Notifier 中。
Flutter 异常谁来上报
这三个开源项目,总结下来分两个流派:
- 自力派纯 Dart 实现,啥都是自己干,比如 Catcher 和 Rollbar
- 借力派,Flutter 侧负责搜集 Flutter 异常,收集好解析好,给对端 SDK 负责上报,典型代表有 bugsnag 和 Sentry。
有人会说,管它白猫黑猫抓到老鼠就是好猫,只要能上报后台看到结果不就 OK 了,管那么多干嘛,领导又不在乎这个。回答 Flutter 异常谁上报的实质是回答下面三个问题:
Flutter 与宿主的关系
你认为 Flutter 是掌控全局(ios android ,window,web…)的大佬还是跟随其他平台的小弟?
从创建一个新的 Flutter 项目伊始 Flutter 官方就给出了答案,flutter create 命令结束,可看到 ios 和 android。。。 目录,这些目录理解成差异目录,表示同一个功能对应不同平台的实现是什么,然后将实现填充在其中。
没错 Flutter 是掌控全局的人,他定义了一套统一的 Dart 侧接口供各平台差异实现,各差异目录作用是为处理差异化功能而非因宿主已有现成功能方便桥接用。
显然,按 Flutter 是大佬的思路,站在多平台统一的上帝视角来看,Flutter 异常范围是包括其他平台异常的,比如其他平台的 OOM 等而非单纯考虑 Dart 侧异常。
代码复用问题
用一个场景来说明问题:如果按照不同平台维度建立项目,相同项目则对应不同平台,如果按照 Flutter 来建立项目就是一个。
那么问题来了,是在安卓端和 ios 端分别建立一套数据存储异常呢,还是将不同平台异常收拢到 Flutter 平台来统一管理和上报?
显然考虑到代码复用和人力成本,大可将其他平台异常抛都给 Flutter 侧来处理和上报,存储和上报都可复用,后台也一套代码。
迁移成本
很多开源库喜欢将 flutter 作为小弟角色,异常都给到对端,这样导致的问题也很明显,安卓和 ios 两个后台异常系统都会出现 flutter 异常数据,默认存储两份上报两次,比如 Bugsnag,这时肯定有人会说 Bugsnag 垃圾,强依赖对端,通用性不行,复用性不行。
但我们需要看到更深层次原因:迁移成本。
软件开发本来就是一个迭代过程,是先有安卓和 ios 再有 Flutter ,人家已经在各自平台有稳定的 crash-sdk 了,推翻不用重新弄一套的行为太过激进,势必存在原来上报系统的重构和迁移,稳定性先不论,平白就增加了很多开发和测试的人力成本,不划算,直接桥接到原来功能岂不更好。
如图,人家就是每个平台都已经有 SDK 了,而且 star 上 bugsnag-android 比 bugsnag-flutter 多得多,这叫先来后到,稳。


一种异常框架设计思路
依赖反转是不错的思路,子平台将异常收集传递给 Flutter 统一管理和上报。管理和上报本来就是各端通用能力,没必要浪费人力各端重复实现,异常的情况每个平台接口都不一样,这种差异化的 api 就应该由各个平台来实现,刚好契合 Flutter 中目录分治理念。
有点像代码设计的思路,如果是通用的代码需要提取处理作为公共使用,如果有差异部分就应该分到各个子类中取实现。lib 中负责是各个平台公共部分,存在差异的是各个平台捕获异常的 api 方式。
读源码在读什么
看需求,当前整个框架实现了哪些功能,跟自己想到的需求实现方式上有什么不同。
其次就是看不足,看不足可以对框架理解更深。如 Catcher 的局限性是它不支持异常的本地序列化断网了就发送不了,而且没自己后台,仅仅侧重于 Adapter 角色;Bugsnag 又太依赖对端,支持异常序列化断网仍可发送,但不是 Flutter 本身实现而是对端能力,Bugsnag 的扩展性相对于 Catcher 来说就差很多,包括多平台的适配上来说比不上 Catcher,但它有自己后台有盈利能力。
最后是看设计,如 Rollbar 中对类设计模块抽象精准且优美,单一原则和开闭原则做得很好。Catcher 中对 UI 显示和处理程序的开闭也做得很好,有时候看大佬们的设计思想只会觉得”编程即艺术”。
如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。
️ 欢迎关注公众号:码里特别有禅 原创技术文章第一时间推送! ️
如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。
️ 本文原创听蝉 公众号:码里特别有禅 欢迎关注原创技术文章第一时间推送 ️
Flutter异常监控 - 伍 | 关于异常监控框架设计的思考的更多相关文章
- 新书出版《.NET框架设计—模式、配置、工具》感恩回馈社区!
很高兴我的第一本书由图灵出版社出版.本书总结了我这些年来对框架学习.研究的总结,里面纯干货,无半句废话. 书的详情请看互动网的销售页面:http://product.china-pub.com/377 ...
- 限制UITextView的字数和字数监控,表情异常的情况和禁用表情
限制UITextView的字数和字数监控,表情异常的情况和禁用表情 3523FD80CC4350DE0AE7F89A8532B9A8.png 因为字数占一个字符,表情占两个字符.你要是限制15个字 ...
- 监控网站是否异常的shell脚本
本节内容:shell脚本监控网站是否异常,如有异常就自动发邮件通知管理员. 脚本检测流程,如下:1,检查网站返回的http_code是否等于200,如不是200视为异常.2,检查网站的访问时间,超过M ...
- 使用Prometheus监控Golang服务-基于YoyoGo框架
Prometheus Prometheus是一个非常棒的工具,结合grafana能够让我在不写代码,或者少写代码的情况下搭建一套有效的监控体系.这里介绍一下Prometheus监控golang程序的方 ...
- 快速接入业务监控体系,grafana监控的艺术
做一个系统,如果不做监控,是不完善的. 如果为做一个快速系统,花力气去做监控,是不值得的. 因为,我们有必要具备一个能够快速建立监控体系的能力.即使你只是一个普通开发人员! 个人觉得,做监控有三个核心 ...
- Yii自定义全局异常,接管系统异常
Yii自定义全局异常,接管系统异常 一般自己的框架都会使用一些自己封装的全局异常,那么在系统发生异常突发情况时候,即可自主的做一些异常机制处理,例如发送短信.发送邮件通知系统维护人员或者以更加友好的方 ...
- DB监控-Riak集群监控
公司的Riak版本是2.0.4,目前已根据CMDB三级业务部署了十几套集群,大部分是跨机房部署.监控采集分为两个大的维度,第一个维度是单机,也就是 「IP:端口」:第二个维度是集群,也就是所有节点指标 ...
- 分布式监控系统Zabbix3.2监控数据库的连接数
在 分布式监控系统Zabbix3.2跳坑指南 和 分布式监控系统Zabbix3.2给异常添加邮件报警 已经介绍了如何安装以及报警.此篇通过介绍监控数据库的3306端口连接数来了解如何监控其它端口和配置 ...
- 转 HystrixDashboard服务监控、Turbine聚合监控
SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置.服务降级.HystrixDashboard服务监控.Turbine聚合监控) 1.概念:Hystrix 熔断机制 2.具 ...
- SpringCloud (十) Hystrix Dashboard单体监控、集群监控、与消息代理结合
一.前言 Dashboard又称为仪表盘,是用来监控项目的执行情况的,本文旨在Dashboard的使用 分别为单体监控.集群监控.与消息代理结合. 代码请戳我的github 二.快速入门 新建一个Sp ...
随机推荐
- 2022-08-12-esp32把玩记-②_用Micropython点ssd1306_oled屏幕
layout: post cid: 8 title: esp32把玩记-② 用Micropython点ssd1306 oled屏幕 slug: 8 date: 2022/08/12 15:12:39 ...
- Linux中CentOS 7的安装及Linux常用命令
1. 前言 什么是Linux Linux是一套免费使用和自由传播的操作系统.说到操作系统,大家比较熟知的应该就是Windows和MacOS操作系统,我们今天所学习的Linux也是一款操作系统. 为什么 ...
- IDEA生成带参数和返回值注释
步骤说明 打开IDEA进入点击左上角 - 文件 - 设置 - 编辑器 - 活动模板 新建活动模板 填写模板文本 编辑变量 添加变量表达式 设置模板使用范围-设置全部范围应用-或者设置只在Java代码中 ...
- 一篇文章带你了解热门版本控制系统——Git
一篇文章带你了解热门版本控制系统--Git 这篇文章会介绍到关于版本控制的相关知识以及版本控制神器Git 我们可能在生活中经常会使用GitHub网页去查询一些开源的资源或者项目,GitHub就是基于G ...
- 『现学现忘』Git基础 — 35、Git中删除文件
目录 1.删除文件说明 2.删除文件操作 (1)仅删除暂存区的文件 (2)完全删除文件 3.本文用到的命令总结 1.删除文件说明 在Git工作目录中要删除某个文件,首先要清楚该文件所处的状态. 若要是 ...
- 动词时态=>4.将来时态和过去将来时态构成详解
将来时态构成详解 使用助动词will构成的将来时态 一般将来时态 与一般过去时态相反(时间上) 如果说 一般过去,我们将其当做一张照片 从这张照片当中,我们无法得知 动作什么时候开始 什么时候结束 只 ...
- LcdTools如何编写MIPI指令(初始化代码)
在LcdTools帮助文档中查看MIPI读写指令描述,如下图 编写LCM初始化代码就是配置LCM Driver IC寄存器值,一般只需用MipiWrite()指令写参数即可:下面介绍MipiWrite ...
- k8s之pod连接被拒排查
k8s之pod连接被拒排查 pod链接被拒 查看pod的时候发现pod的状态为crashloopbackoff 然后看看日志发现报错如下 kubectl -n kf10 logs easydata-r ...
- HAProxy反向代理实例
1.环境准备: 设备 IP地址 作用 系统版本 web1 10.0.0.18 Nginx-Web服务器 Rocky8.6 web2 10.0.0.28 Nginx-Web服务器 Rocky8.6 Ha ...
- 【lwip】12-一文解决TCP原理
目录 前言 12.1 TCP协议简介 12.2 TCP相关的一些概念词 12.2.1 MSL 12.2.2 MSS 12.3 TCP工作特性 12.3.1 面向连接 12.3.2 全双工通信 12.3 ...