Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >有赞移动Crash平台建设

有赞移动Crash平台建设

作者头像
有赞coder
发布于 2020-09-01 02:51:31
发布于 2020-09-01 02:51:31
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

获取更多技术干货哦~

作者:王剑标

部门:电商移动

背景 & 痛点 & 价值

稳定性始终会是一家成功公司的重要指标,在移动端亦是如此。跟大部分创业公司一样,有赞在创业初期选择以核心业务为主, 在一些基础设施的搭建上主要以使用三方平台为主(腾讯bugly)。随着业务的发展和bugly的长期不维护,慢慢出现一些三方平台的弊端。例如:

  • 某次版本上线之后,没有及时发现其隐藏的Crash, 导致故障产生
  • Crash发生之后,无法根据特定规则分给某位处理人。
  • 某个版本上线灰度时,该版本在特定角色下存在Crash。这个时候没法中断灰度版本的下发

crash平台建设的线路规划

为了解决这些问题,我们就开始着手搭建自有的Crash反馈平台。平台建设的规划大致的路线是:

  1. 基础架构搭建。Crash的收集、上报、分类、查看、处理
  2. 增加三方平台没有的功能。实时监控、告警、日报
  3. 补齐三方平台的功能,Crash趋势统计、Crash符号化

crash平台的功能集

总结下来,Crash平台大概需要有以下功能:

  • Crash收集:某次Crash从发生,保存本地到上报的过程
  • Crash查看:查看Crash的发生堆栈,版本分布,发生页面,操作页面路径,帮助处理人快速定位问题。
  • Crash处理人以及状态:将某个Crash分配给指定人,发送通知。处理人修复完成之后,修改Crash的状态。
  • Crash分类:根据上报的Crash将Crash进行分组,不同机型、不同版本可能发生同一个Crash,某个Crash标识某段代码错误。
  • Crash告警检测:针对新版本引入的Crash以及因为服务端变更引起的老版本Crash,增加告警功能,第一时间发现影响面广的Crash问题。
  • Crash报告:每日报告,本日Crash情况,让团队的小伙伴能够清晰的了解到当天整体的crash情况,及时解决crash次数较多的问题。

Crash平台整体设计

得益于有赞在数据埋点方面的建设,Crash数据收集可以通过埋点通道的进行上报,然后通过Flink实时计算任务将上报上来的Crash实时进行捞取、分组、实时监控,最后落到我们自己的业务数据库中。Crash平台上可以对Crash进行浏览,分配,标记解决等等。整个Crash上报过程、后续处理流程如下图:

为了避免crash堆栈的数据量过大,crash堆栈等长字段存储至HBase. Mysql中只要存储前128预览字符与Hbase中的row_key即可

一、实现方案

1.1 Crash发生时的拦截+上报

Crash的拦截主要依靠各端系统的拦截机制。以Android为例,首先需要实现Thread.UncaughtExceptionHandler接口,在初始化的时候将线程默认的Handler替换为我们拦截的Handler(当然别忘了调用下原先默认的handler)。

1.2 Crash收集、数据整理--分组归类及自动分配处理人

1.2.1 Crash收集

Crash收集主要由埋点平台提供的实时计算任务来运行。

为什么要用埋点平台, 而不是用自己上报?

一个原因是避免重复造轮子,再者埋点平台需要设计之初就是为了超大数据量而设计,支持分布式存储,实时响应数据分析等等优点。而这些都是我们Crash收集所需要的,因此选择了通过埋点平台。

埋点平台在收到来自客户端的数据后为我们做了哪些工作

首先我们先来看下平台工作时的整体流程图:

日志流转主要环节:

  1. 前端监控用户行为,收集并通过http请求上报
  2. NIO高并发日志接收服务将日志转发到rsyslog服务器
  3. rsyslog服务器再通过logstash转发到kafka原始日志中
  4. flink实时ETl任务将原始日志加工成标准中间层格式,并继续落地到kafka
  5. 最后消息会到我们的Crash收集flink任务程序crash-clollection-task

crash-clollection-task实时任务只要订阅相关的Topic,就能实时接收到订阅相关的Topic消息:

消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 隐去敏感数据,更改为测试数据
{
  topic: "topic.log",
    servers: "****",
  type: "kafka010",
  consumerGroup: "crash_collection_task"
}

因为我们订阅的Crash涉及到的有赞全部移动端的Crash,所以订阅了全量的数据。在代码中对数据进行过滤,只过滤Crash相关的数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public boolean filter(String line) {
    try {
    JSONObject data = JSON.parseObject(line);
      String type = data.getString("event_type");
    return Objects.equal(type, "crash");
  } catch (Exception e) {
    System.out.println(String.format("line:[%s]: \n解析发生错误:%s", line, e.toString()));
  }
  return false;
}

这样就只剩下我们关心的Crash相关的数据了。

1.2.2 分组归类、自动分配处理人

分组归类

分组归类是必不可少的一个工作,理想情况下。针对同一处代码错误的Crash上报上来,可以精确的将其分组归类。

但是因为代码混淆、同一处代码错误,错误堆栈缺不能完全匹配等等原因。做到这一点其实不容易。

那目前采取的做法是以App标识系统crash类型crash错误原因crash发生页面这五个维度来将crash分配到指定组。

其中App标识系统是用来区分具体哪个App上报的crash的。

crash类型crash错误原因是来根据crash发生的错误堆栈来区分出不同错误的类型。

以Android堆栈为例:

crashType为“java.lang.OutOfMemoryError”,crashReson为“Failed to allocate a 8306416 byte allocation with 502326 free bytes and 490KB until OOM”

crash发生页面是用来区分不同页面发生的同一个错误类型的。

最后将这些字段通过MD5算法计算出一个 groupId

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private String generateGroupId() {
    String groupKey = MD5Utils.crypt(bundleId + crashType + crashReason + pageType);
    return "Android-v4-" + groupKey;
}
自动分配处理人

自动分配处理人主要目的是为了让对应业务的人快速处理属于自己业务的Crash。为此做了两种方式的自动分配。

  1. 配置清单分配
  2. 历史页面自动分配
配置清单分配

我们先来看下配置清单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "modules": [
    {
      "name": "xxxxSDK",
    "key_stacks": [
        "com.youzan.mobile.xxxx"
    ],
    "cas_id": 10086
    }
}

清单中配置着模块列表,模块中主要有两个字段keystacks(关键堆栈)、casid(模块负责人)。有crash上报时,会根据模块列表一一匹配其crash堆栈,看是否能匹配上若匹配上,则将该crash分配给该模块负责人。

自动分配处理人的初步匹配就是读取配置清单中的key_stacks, 然后从上报crash的堆栈中找是否包含目标堆栈。

如果包含就匹配成功,会将该crash发送至配置好的messenger群中去,并且@casid字段指定的处理人。

历史页面自动分配

如果清单匹配匹配失败,还会落入历史页面自动匹配。与清单匹配不同的是历史页面自动分配给该页面上次的处理人。

当手动分配crash给指定人时,这张表中会记录着这个crash发生页面分配给某个人。例如 工作台页面有一个crash发生,是分配给张三。那么当下次工作台页面有crash发生时,都会以此分配给张三。

2.2 Crash实时监控、每日报告

得益于实时计算平台,我们能很容易做到实时监控。我们可以做到只要有Crash上报,就会向企业微信对应的处理人发送消息通知。这样做的在某种程度上来说是无意义的,尤其是疑难杂症问题多的时候,最多的时候一天能产生1000条通知,对于这样的通知无异于没有通知。

后来发现我们报上来大部分问题都是针对最新版本解决就OK,因为老版本要么是趋于稳定。要么如果因为后端某个接口变动,那么新老版本同样会受到影响。所以就只要监控最新版本。因此问题就变成如何版本过滤

2.2.1 版本过滤

想要过滤版本就需要知道目前某个App的最新版本多少。目前有赞移动端的打包发版控制已经都使用自研的构建发布平台。

crash上报之后,只要它的版本号大于等于最新全量的版本号,就实时上报到秒级响应群,以便及时发现最新版本、灰度版本、项目测试包的crash问题。

2.2.2 每日报告

每日报告功能有两个目的,一是为了让各个App负责人对每天的Crash大致状况有个大致上的了解。二是为了让没时间及时处理的小伙伴,当有属于自己的模块,发生次数、影响面比较大的Crash出现时要引起重视。

基于这样的目的我们在每日报告中加了每日Crash变化趋势(与前一日相比)、每日Crash Top N两大块。这里主要讲下设计思路。

每日Crash变化趋势

日报中会取昨日的crash与今日的crash对比。如涨幅过大,则说明很可能新版本是存在问题的,需要引起注意。

碰到的坑

起初昨日与今日的Crash次数是按照自然日取的。这样有个问题,就是昨日的次数是一整天的,今天的次数不是一整天。所以这里对比,应该以报告时间往前24小时内、48~24小时,这样来对比。才能正常反馈Crash的变化趋势。

每日Crash Top N
排序规则

排序的背后是Crash的影响面大小,影响面大的排在前。这样让处理人与管理者能每天及时知晓影响大的Crash有哪些,是否需要及时处理等等目的。

我们为什么选择了Top3?

其实开始不是Top3 ,而是Top10。但是运转一段时间后发现,crash问题并不多,每天汇报时都报Top10,会有大部分次数少的crash,会让人失焦。无论是管理者还是处理人,都搞不清楚,某个问题是该及时处理还是可以延后处理。再集合运转的这一段时间的平均数据,最终选择了Top3。

技术实现

每日报告背后的技术实现有定时任务。起初使用的是SpringBoot自带的定时任务。

功能都能实现,有一个麻烦的点就是调试起来不方便。比如配置10点报告的,难道要等到10点么。或者改成1分钟一次,那调式完成之后是不是又得改回来?后来使用了TSP,具体可参考 有赞调度系统 TSP 调试起来非常方便,定时任务也像普通接口的形式书写即可。

日报的业务就是在不断的聚合查询当天的最新版本的数据,细节不再赘述,直接上日报最终效果图:

2.3 Crash反馈平台--管理后台

Crash管理后台的作用是提供Crash问题分析定位Crash处理流程管理

如何快速定位问题

为了方便快速定位在列表接口添加了最近上报信息发生过的系统版本发生过的应用版本来帮处理人第一时间发现问题。

有这样一个场景:

4.47.0改了某块代码之后,发布至线上,因为用户老数据的问题,Crash一直隐藏着带到了线上。此时根据发生过的应用版本就能很快定位到Crash就是出现在4.47.0这个版本上。

类似的发生过的系统版本能帮助快速识别某个系统版本特定的问题。

Crash列表页信息:

更详细的排查维度

为了降低排查难度,增加了Crash页面路径Crash出错堆栈、符号化等功能来增加排查的线索。

Crash详情信息:

详情中展示全量的Crash堆栈信息,以及最新上报的一次设备相关信息。目的是为了帮助排查Crash。

Crash离线日志

值得一提的是某些时候需要再结合Crash时App端的日志来综合排查,这个点已经在着手设计排查,开始将Crash时跟日志绑定。后续在此页面会直接显示Crash时手机上的日志

总结

Crash反馈平台目前还没有实现Crash处理流程的闭环,存在大家在使用时不会去修改Crash的状态等问题,接下来会对这个流程做整体优化,提升整体协作效率。随着接入的业务方越来越多,为了保证业务方能更加容易、快速的排查与定位问题,修复问题,需要做的工作还不少,比如Crash的分组更加准确,Android堆栈符号化,顽固Crash定时提醒等等。

Crash反馈平台技术上来说他的综合性比较高,涉及的技术栈有大数据技术、后端技术、前端技术、移动端技术等4端技术栈。开发一个综合性的平台,不能单从技术层面去思考怎么解决技术上的问题,更多的需要从整个平台的目的出发。就crash平台而言,需要以去搭建一套能快速发现Crash、及时修复Crash为目标去思考。而技术更多的是“锄头”,它只是帮助实现“大丰收”的其中一个工具。

扩展阅读:

  1. 有赞移动消息卡片动态化方案实践
  2. 有赞移动端商品模块的架构演变之路
  3. 有赞移动热修复平台建设
  4. 有赞移动 App 一键切换网关实践
  5. 有赞零售小票打印图片二值化方案
  6. 有赞 Android 崩溃保护的探索及实践
  7. 有赞移动 iOS 组件化(模块化)架构设计实践
  8. 有赞Flutter插件开发与发布
  9. 有赞移动如何做到并行灰度的复杂场景?
  10. 微商城订单模块重构实践

Vol.330

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有赞coder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一行代码,一个系统!您的 Crash 实时分析已上线
文章主要讲述了移动应用崩溃问题的分析、定位与解决过程。首先分析了移动应用崩溃的原因和类型,然后介绍了基于腾讯移动分析(MTA)的Crash分析方案。MTA通过采集和分析用户行为数据,对应用进行全方位的健康度评估,从而帮助开发者快速定位和解决Crash问题。此外,文章还分享了在处理海量数据时的一些优化措施和技术挑战。
腾讯大数据
2017/09/07
2.3K0
一行代码,一个系统!您的 Crash 实时分析已上线
大型IM稳定性监测实践:手Q客户端性能防劣化系统的建设之路
防劣化是比较经典的技术话题,手 Q 的防劣化系统从 2021 年 10 月开始投入研发,从 0 到 1 迭代了将近三年的时间,已经达到了业界先进水平。为了守护好手 Q 性能稳定性的门禁,我们将其命名为 Hodor 系统,即 Hold the door!
JackJiang
2024/08/02
2140
大型IM稳定性监测实践:手Q客户端性能防劣化系统的建设之路
算法AB实验平台进化历程和挑战
AB 实验平台这几年在互联网公司得到了越来越广泛的应用,采用 AB 实验来评估产品和技术迭代效果也成为主流的业务新功能效果评估方式,数据驱动的文化在这几年得到了不少公司的广泛的认同,通过数据和指标来说明产品效果也得到了越来越多的公司的认可和应用。
得物技术
2023/09/11
1.1K0
UITabbarController 偶现启动crash问题分析
最近新版本发布后,出现了一个偶现的crash并且迅速增加为Top1,这里对该问题做一个分析。 报错内容如下: NSException -[UITabBarController setSelectedViewController:] only a view controller in the tab bar controller's list of view controllers can be selected. crash堆栈如下:
落影
2022/10/28
9330
有赞crash平台符号化实践
有赞在基础保障平台的实践中完成了 Crash平台 的建设,但是iOS的崩溃日志未经符号化,排查问题比较困难。为了降低iOS App的crash率,快速排查线上crash,疑难crash的跟踪处理,符号化崩溃日志显得尤为重要!
有赞coder
2020/09/21
1.6K0
有赞crash平台符号化实践
QQ 客户端性能稳定性防劣化系统 Hodor 技术方案
盘点了下手 Q 研发流程的困局,现有的手段更着重于线上监控问题并在下个版本修复(甚至是下下个版本),如果能在开发阶段发布前甚至合入 master 之前就把问题扼杀在摇篮之中,就可以达到防劣化的目标。
腾讯云开发者
2024/06/13
1K0
QQ 客户端性能稳定性防劣化系统 Hodor 技术方案
干货 | 携程无线APM升级实践
辛贵,携程无线研发总监。主要负责App基础框架研发相关工作,关注App开发框架、性能、质量、效率和新技术。
携程技术
2020/02/19
1.9K0
干货 | 携程无线APM升级实践
移动端性能监控方案Hertz
性能问题是造成App用户流失的罪魁祸首之一。App的性能问题包括崩溃、网络请求错误或超时、响应速度慢、列表滚动卡顿、流量大、耗电等等。而导致App性能低下的原因有很多,除去设备硬件和软件的外部因素,其中大部分是开发者错误地使用线程、锁、系统函数、编程范式、数据结构等导致的。即便是最有经验的程序员,也很难在开发时就能避免所有导致性能低下的“坑”,因此解决性能问题的关键是在于能不能尽早地发现和定位这些“坑”。 美团外卖在实践中通过总结常见性能问题,并在学习了业内微信、360等性能监控技术原理后,开发了一套移动端
美团技术团队
2018/03/12
2.9K0
移动端性能监控方案Hertz
教你 Debug 的正确姿势——记一次 CoreMotion 的 Crash
最近的一个手机 QQ 版本发出去后收到比较多关于 CoreMotion 的 crash 上报,案发现场如下: 但是看看这个堆栈发现它完全不按照套路出牌啊! 乍一看是挂在 CoreMotion 里面的CLStartStopAdvertisingBeacon函数,看似是 iBeacon 相关的问题,但实际上是具体函数的符号解不出来,注意 CLStartStopAdvertisingBeacon + 175940 这个巨大的偏移量,一般的函数不可能这么大,所以这个地址对应的肯定是另外的一个函数! 抛开错误
腾讯Bugly
2018/03/23
2.9K0
【穿山甲系列】像修复Crash一样修复卡顿
本文介绍了穿山甲在技术社区中的一种技术方案,通过将线上用户反馈进行上报,以帮助开发人员快速定位和修复用户反馈的问题,并验证问题是否被修复,从而提升产品的质量,提高用户的满意度。
腾讯移动品质中心TMQ
2017/12/22
9120
全民K歌内存篇1——线上监控与综合治理
一、背景 2020年K歌安卓的白屏反馈和top crash在逐渐恶化,深入分析后,这两个问题的原因都指向了内存不足,我们通过脚本压测直播、歌房等核心场景复现了问题,也实锤了我们的猜想,确定是内存、线程、fd等资源耗尽,app开始出现各种异常。当前需求的性能测试主要依赖我们测试同学的人工覆盖,在K歌需求飞速迭代的情况下,人工性能测试的发现问题能力出现了瓶颈: 测试人力有限,只能覆盖小部分的需求,大量的需求未经过严格的性能测试,可能会带着内存问题发布到外网; 测试场景不足,无法反映外网海量用户的复杂情况,很难
QQ音乐技术团队
2021/02/19
2.7K0
有赞前端质量保障体系
最近一年多一直在做前端的一些测试,从小程序到店铺装修,基本都是纯前端的工作,刚开始从后端测试转为前端测试的时候,对前端东西茫然无感,而且团队内没有人做过纯前端的测试工作,只能一边踩坑一边总结经验,然后将容易出现问题的点形成体系、不断总结摸索,最终形成了目前的一套前端测试解决方案。在此,将有赞的前端质量保障体系进行总结,希望和大家一起交流。
测试开发社区
2019/09/20
1.4K0
有赞前端质量保障体系
有赞移动性能监控平台(一)
随着移动端业务复杂度的提升,开发同学在编写业务的时候往往容易忽略性能问题,虽然有赞移动端自研了 APM ,但是 APM 采集的都是线上的数据,无法在 QA 与开发阶段提前发现问题,为了保障软件的稳定性,需要补齐线下监控能力,避免性能问题上线对商家经营过程造成影响。
有赞coder
2021/03/04
1.6K0
有赞移动性能监控平台(一)
京东科技埋点数据治理和平台建设实践
Tech      导读 本文核心内容聚焦为什么要埋点治理、埋点治理的方法论和实践、奇点一站式埋点管理平台的建设和创新功能。读者可以从全局角度深入了解埋点、埋点治理的整体思路和实践方法,落地的埋点工具和创新功能都有较高的实用参考价值。遵循埋点治理的方法论,本文作者团队已在实践中取得优异成效,在同行业内有突出的创新功能,未来也将继续建设数智化经营能力,持续打造更好的服务。 01  埋点治理背景 在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪
京东技术
2022/08/25
2.2K0
京东科技埋点数据治理和平台建设实践
有赞移动基础设施建设的实践和思考
移动基础设施的建设已经不用再过多解释,每个涉及移动开发的企业都在一步一步地建设移动基础设施,目标是为了服务移动团队,提供移动开发全流程的技术支撑,减少研发成本、提升开发效率、保障稳定质量。
有赞coder
2020/08/24
8340
有赞移动基础设施建设的实践和思考
新功能 | Crash日报,玩的就是酷炫风!
在你的邮箱中,是否收到下图这样一封邮件?是的,腾讯Bugly的Crash日报已经悄悄上线了。 点击“查看详细日报”,你会看到非常酷炫的一个日报!谁说屌丝没有春天?谁说程序员不能玩酷?Crash日报玩的就是酷炫风! 1、产品Crash汇总 开发哥运营哥测试妹,想知道当天产品的质量情况么?看下日报吧,日报汇总了产品总体的Crash情况,再与前一天和七天前对比一下,马上可以知道当天产品的数据波动情况。 2、Top3版本Crash汇总 产品的整体情况太笼统,我只关注用户量最多的版本,肿么办? 木有关系,日
腾讯Bugly
2018/03/22
1.2K0
新功能  |  Crash日报,玩的就是酷炫风!
有赞埋点实践
大数据应用一般会有采集、加工、存储、计算及可视化这几个环节。其中采集作为源头,在确保全面、准确、及时的前提下,最终加工出来的指标结果才是有价值的。
有赞coder
2020/08/25
2.9K0
有赞埋点实践
有赞移动日志实践
日志系统,是移动端定位排查线上问题非常有效的一个工具。以往商家使用App出现问题,向客服咨询时,客服需要详细收集商家的问题信息、店铺信息(操作步骤、操作视频等),然后提交工单反馈给开发,开发再根据这些信息进行问题定位。这个过程中反复沟通的时间成本无法避免,商家与客服在沟通时也存在信息遗漏与缺失。随着业务的不断扩张,业务的复杂度不断加深,当用户达到一定的量级时,仅靠客服在商家和开发之间反复沟通,显然不能满足各个业务开发同学的需要,也无法快速定位问题。
有赞coder
2020/08/24
1.3K0
有赞移动日志实践
有赞全链路追踪实践
在企业级业务系统日趋复杂的背景下,微服务架构逐渐成为了许多中大型企业的标配,它将庞大的单体应用拆分成多个子系统和公共的组件单元。这一理念带来了许多好处:复杂系统的拆分简化与隔离、公共模块的重用性提升与更合理的资源分配、大大提升了系统变更迭代的速度、更灵活的可扩展性以及在云计算中的适用性,等等。
有赞coder
2020/08/24
1.2K0
有赞全链路追踪实践
Logan:美团点评的开源移动端基础日志库
Logan是美团点评集团移动端基础日志组件,这个名称是Log和An的组合,代表个体日志服务。同时Logan也是“金刚狼”大叔的名号,当然我们更希望这个产品能像金刚狼大叔一样“犀利”。此前我们公众号发布过一篇文章《Logan:美团点评移动端基础日志库揭秘》,主要讲述了Logan的很多技术细节。本文将重点阐述Logan的整体框架。
美团技术团队
2019/03/22
1.9K0
Logan:美团点评的开源移动端基础日志库
推荐阅读
相关推荐
一行代码,一个系统!您的 Crash 实时分析已上线
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验