前言

最近阅读 Catcher、BugSnag、Rollbar 三个 Flutter 异常监控开源框架,文章链接如下:

Flutter 异常监控 - 壹 | 从 Zone 说起

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 异常谁来上报

这三个开源项目,总结下来分两个流派:

  1. 自力派纯 Dart 实现,啥都是自己干,比如 Catcher 和 Rollbar
  2. 借力派,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异常监控 - 伍 | 关于异常监控框架设计的思考的更多相关文章

  1. 新书出版《.NET框架设计—模式、配置、工具》感恩回馈社区!

    很高兴我的第一本书由图灵出版社出版.本书总结了我这些年来对框架学习.研究的总结,里面纯干货,无半句废话. 书的详情请看互动网的销售页面:http://product.china-pub.com/377 ...

  2. 限制UITextView的字数和字数监控,表情异常的情况和禁用表情

    限制UITextView的字数和字数监控,表情异常的情况和禁用表情   3523FD80CC4350DE0AE7F89A8532B9A8.png 因为字数占一个字符,表情占两个字符.你要是限制15个字 ...

  3. 监控网站是否异常的shell脚本

    本节内容:shell脚本监控网站是否异常,如有异常就自动发邮件通知管理员. 脚本检测流程,如下:1,检查网站返回的http_code是否等于200,如不是200视为异常.2,检查网站的访问时间,超过M ...

  4. 使用Prometheus监控Golang服务-基于YoyoGo框架

    Prometheus Prometheus是一个非常棒的工具,结合grafana能够让我在不写代码,或者少写代码的情况下搭建一套有效的监控体系.这里介绍一下Prometheus监控golang程序的方 ...

  5. 快速接入业务监控体系,grafana监控的艺术

    做一个系统,如果不做监控,是不完善的. 如果为做一个快速系统,花力气去做监控,是不值得的. 因为,我们有必要具备一个能够快速建立监控体系的能力.即使你只是一个普通开发人员! 个人觉得,做监控有三个核心 ...

  6. Yii自定义全局异常,接管系统异常

    Yii自定义全局异常,接管系统异常 一般自己的框架都会使用一些自己封装的全局异常,那么在系统发生异常突发情况时候,即可自主的做一些异常机制处理,例如发送短信.发送邮件通知系统维护人员或者以更加友好的方 ...

  7. DB监控-Riak集群监控

    公司的Riak版本是2.0.4,目前已根据CMDB三级业务部署了十几套集群,大部分是跨机房部署.监控采集分为两个大的维度,第一个维度是单机,也就是 「IP:端口」:第二个维度是集群,也就是所有节点指标 ...

  8. 分布式监控系统Zabbix3.2监控数据库的连接数

    在 分布式监控系统Zabbix3.2跳坑指南 和 分布式监控系统Zabbix3.2给异常添加邮件报警 已经介绍了如何安装以及报警.此篇通过介绍监控数据库的3306端口连接数来了解如何监控其它端口和配置 ...

  9. 转 HystrixDashboard服务监控、Turbine聚合监控

    SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置.服务降级.HystrixDashboard服务监控.Turbine聚合监控) 1.概念:Hystrix 熔断机制 2.具 ...

  10. SpringCloud (十) Hystrix Dashboard单体监控、集群监控、与消息代理结合

    一.前言 Dashboard又称为仪表盘,是用来监控项目的执行情况的,本文旨在Dashboard的使用 分别为单体监控.集群监控.与消息代理结合. 代码请戳我的github 二.快速入门 新建一个Sp ...

随机推荐

  1. 数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储

    哈希表 解释 哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方 内存结构分析图 1.定义一个类为结点,存储的信息 2.定义链表的相关操作 3.定义一个数组存 ...

  2. IP分类与子网划分

    1.IP地址的格式  每一类地址都由两个固定长度的字段组成: (1)网络号 net-id:它标志主机(或路由器)所连接到的网络 (2)主机号 host-id:它标志该主机(或路由器).   最大可指派 ...

  3. Redis可视化管理工具-RedisDesktopManager

    Windows客户端,访问Redis数据库并执行一些基本操作. 链接:https://pan.baidu.com/s/1OuGqIfbpGwglC-642rECbQ 提取码:m6uo

  4. Ajax(下)

    跨域 跨域的概念:非同源请求,均为跨域.如果两个页面拥有相同的协议(protocol),端口(port)和主机(host),那么这两个页面就属于同一个源(origin). 例如:主机:http://w ...

  5. C++实现真值表

    这一片文章主要是关于真值表,在完成之前我也遇到了许多问题.比如怎么去求解表达式的值,怎么去将每个变量进行赋值,也就是如何 将n个字符进行01全排列. 01全排列真的神奇,01全排列其实就是2^n.他可 ...

  6. CodeQL(1)

    前言 开始学习使用CodeQL,做一些笔记,可供参考的资料还是比较少的,一个是官方文档,但是Google翻译过来,总觉得怪怪的,另一个就是别人的一个资源整合,其中可供参考的也不是很多,大多也是官方文档 ...

  7. JavaWeb实战:基础CRUD+批量删除+分页+条件

    技术栈及相关参考资料: MyBatis基础 Servlet基础 ServletRequest和ServletResponse MVC模式和三层架构 AJAX基础+Axios基础 Vue前端框架 Ele ...

  8. 基于python的数学建模---时间序列

    JetRail高铁乘客量预测--7种时间序列方法 数据获取:获得2012-2014两年每小时乘客数量 import pandas as pd import numpy as np import mat ...

  9. CSP 记

    csp 开考建好文件夹编译器不能用搞了半天换了台电脑 四道题看完一个小时过去了 第一题不会正解写了部分分还有点悬 第二题写暴力因为一个小错误调了半天 看时间不多了已经有点慌了 也没想正解直接开了下一题 ...

  10. linux系统移植

    1 linux环境搭建 1.1 添加交叉开发工具链 新建如下工程目录: gcc-4.6.4.tar.xz #拷贝 tar -Jxvf gcc-4.6.4.tar.xz #解压 cd ./gcc-4.6 ...