网易云信 Crash 异常治理实践 | 智企技术委员会技术专题系列

news2025/1/25 9:10:17

前言

Crash(造成用户无法使用客户端所承载的服务)作为客户端稳定治理的最主要问题之一。云信作为国内业界领先的 RTC/IM PaaS 服务商,对于客户端 SDK(PaaS 服务商对外服务的主要载体)的 Crash 治理再重视也不为过。关于客户端 Crash 稳定性治理,尽管业界已有多个成熟的监控平台,实现了从埋点、上报、展示到报警一站式服务,如 Bugly 平台、Fabric 平台等,也有 Crash 捕捉的工具 SDK,方便在此基础上按需定制监控平台,如 KSCrash、Breakpad 等。但对于云信这样的 RTC&IM PaaS 服务商来讲,无论是市面上现有 APP Crash 治理平台,还是 Crash 捕捉工具 SDK 都是无法解决针对 PaaS 服务商 Crash 异常治理痛点。

  • 平台类型支持有限

业内平台往往只覆盖主流的两个移动端平台 iOS/Android、对于 Mac OS/PC/Linux/Flutter 不支持。

  • APP 与 SDK 监控数据无法有效隔离

业内对外服务的 Crash 收集平台基本都是设计服务于 APP,后台分析与展示无法同时对 APP 和 SDK 进行区分。

  • 问题治理实现不了闭环处理

以业内著名 Bugly 为例,只提供了对外闭源 SDK,Bugly 后端目前也没有开放第三方接口,崩溃信息都要人工去主动搜索处理,无法与 PaaS 服务商内部 Bug 管理系统进行联动,异常感知也没法自动感知与推送,形成不了 Crash 问题从捕获到研发人员响应处理高效的闭环。

Crash 异常治理建设

为了解决以上 PaaS 服务商稳定性问题治理的痛点,构建一套从异常问题捕捉到研发人员高效问题处理的监控分析系统就显得格外迫在眉睫了,云信研发团队从以下三个维度思考:

  • 如何实现数字体验监控:采集的指标有哪些,以及这些指标的影响是什么?

  • 异常发现、跟踪及诊断:异常指标如何转化为具体可处理的方案,如何快速找到问题模块?

  • 面向技术人员的自动化运维:如何实现问题分析的精准性,如何降低研发分析耗时与成本?

经过大半年多的努力,终于落地了 Crash 稳定性治理平台(以下简称 Marvel)平台,实现了 Crash 问题的高效治理。该平台基于 PaaS 服务商的特点,设计了三级的账号体系,平台覆盖了 Android、iOS、Windows、MAC、Linux、Web 平台、Flutter 框架, 最终实现从问题捕获、分析处理问题、修复、复盘全链路的闭环,下文将针对该平台做较为详细的介绍。

平台架构设计

Marvel 平台架构设计图

如上图所示, 从数据流角度可知,当 CI 构建服务完成产品各个客户端平台 SDK 包的时候,系统会自动将 SDK 包对应平台的符号表文件上传到 NOS(网易对象存储)文件服务,同时将 SDK 版本号、各个 SO 库的 build_id/uuid、Github 仓库地址等元信息记录到平台数据库中,为后续异常解析服务查找奔溃库所属的符号表文件做准备。当 C 端发生 Crash 问题的时候,系统首先会将 Crash 信息(栈信息、用户操作轨迹、uuid/build_id 等信息)上传到 Marvel 后台服务,系统经过数据清洗以及异常解析之后,精准地分析出该 Crash 属于哪个模块,平台支持根据模块归属人查询表或者根据 git commit 记录查找出最后代码变更人, 最终自动生成 Jira 工单,然后通过公司内部协作工具(POPO)同步异常待处理消息给对应的研发同学。从而最终实现了线上异常处理的自动化闭环操作。

平台全景视图

Marvel 系统全景视图

云信当前 Marvel 平台除了重点落地实现了 Crash 稳定性问题治理之外,同样也实现了部分平台其它稳定性问题的治理,如卡顿、内存泄漏、内存溢出、ANR、Watchdog 等客户端的稳定性问题,稳定性问题发生的上下文信息(用户的行为轨迹、应用的上下文等信息数据),通过 ES 搜索引擎和 HBASE 数据库实现海量数据的存储以及快速数据聚合查询,最终能够快速实现场景还原,实现问题的重现,最终实现快速分析定位问题。

账号体系设计

传统的异常捕获系统是基于 APP 维度来统计 Crash 等异常信息的,而作为 PaaS 服务商,希望看到的是从 PaaS 服务产品及对应的 SDK 维度来统计 Crash 信息,因此云信设计了三级的账号体系,以支持每个层级来做聚合统计监控。

账号体系设计图

三级账号体系说明如下:

  • 公司级别。如易盾、云信等 PaaS 服务厂商。

  • 公司产品SKU。如云信有 IM SDK、RTC SDK、播放器 SDK。

  • SKU 下的子产品。如 RTC SDK 下有美颜、背景替换、水印等插件化的子产品。

治理涵盖研发全周期

稳定性问题治理周期

稳定性问题治理需要贯穿整个软件研发的完整生命周期,包括需求研发、测试、集成、灰度、上线等,上述每个阶段,研发同学都应该格外重视稳定性问题的发现和治理。于是针对各个阶段的数据采集也就格外的重要,当前云信的稳定性问题治理平台已经完成了线下场景的全覆盖,以及线上场景的部分覆盖。当前上传到平台的数据主要分为 Monitor、Logging、Tracing 三类。Trace 数据主要指的是代码调用栈数据;Log 主要是用户行为轨迹数据、客户端系统日志等;Monitor 数据主要是与人们异常模型相匹配的异常数据。

端侧功能集

端侧 Marvel SDK 功能模块

端侧 SDK 层面功能以小的颗粒度接入。在设计开发上实现采集功能的模块化,各个应用可以根据自身需要选择性引用功能模块,从而保证稳定性监控 SDK 对于应用的包体积及性能达到最小影响。除了提供原子的监控采集能力外,为了实现监控 SDK 的容错与容灾能力,Marvel 平台除了会对线上应用实时采集功能开关控制之外,监控 SDK 当遇到本身运行异常的时候也会自动进行功能关闭,对于问题能够做到自动隔离。

堆栈解析服务

在每个异常上报中,除了基础元信息外,还包括异常类型、异常消息、异常堆栈等运行时内容,特别是堆栈信息,能够有效地协助研发去识别异常点。那么我们就可以依据堆栈和异常类型来做聚合。

简单来说,可以按照堆栈信息做 Hash 比对来去重,虽然该方案能够大幅减少重复异常,但还是会存在大量同类问题归结为不同类别的情况,例如在递归情况下的异常,递归深度不同就会导致 hash 结果不一致。考虑 ROI 比当前我们只截取非系统的用户函数堆栈,后期考虑引入些更高级的算法, 对相似的堆栈能够更加精准的归因(如对堆栈距离、TF-IDF 等手段对堆栈的内容进行解析,然后利用相应的公式来计算两个堆栈之间的相似性)。

从可观察性的指标来看堆栈信息对应就是 Tracing 数据,堆栈还原服务是决定后续是否能对问题进行精准分析归因的关键。通过还原后堆栈信息 Marvel 可以快速定位到代码行。然而线上运行时的程序为了安全和安装包体大小等因素,会对代码进行混淆或者压缩,所以获取到的堆栈文本是混淆压缩后的堆栈信息。为了使开发人员直观快速地理解堆栈含义,这就需要使用相关的符号文件来对混淆或者压缩的代码信息做还原处理。

客户端平台堆栈还原支持情况

早期 Marvel 符号化解析主要依赖原生平台工具,但存在以下问题:

  • 低性能

因为各个端提供的是命令行工具,所以需要在服务内部通过命令行调用,这种启动子进程的方式会带来大量的进程创建和销毁的性能损耗。此外,因为需要启动命令行子进程处理,处理跨进程通信也会带来较大的性能开销;通过命令行每次调用都要重复读取解析符号文件,带来了额外的性能开销。

  • 难维护

因为命令行是通过子进程处理,无法管理命令行子进程的状态,对命令行的异常的定位解决带来了复杂性;不同端的工具会依赖不同语言和运行环境,例如 iOS 的 atos 需要运行在 MacOS 环境下,这个对服务的统一部署非常不友好。

为了解决以上问题,当前 Marvel 采用 Rust 实现了各个端侧的符号解析,保证各个符号信息只做一次解析,并转为 KV 结构形式缓存处理。统一语言后也能降低程序运维复杂性,并服务 docker 容器化的需求。

当前堆栈还原相关的主要有两个服务:

  • 符号表管理服务

负责符号表的上传、下载、解析、缓存等流程的管理。符号表上传之后,该模块会实时解析文件,并将其解析为 KV 的形式写入 Redis 缓存之中。同时,还会负责符号表文件存储和缓存的管理。

  • 堆栈还原服务

负责堆栈还原,以 gRPC 的形式提供还原服务。当接收到还原请求时,会在 Redis 中查找相关的符号信息,并将这些信息拼接为完整的堆栈,返回给请求发送端。

异常问题自动化分发

上一章节介绍了 Marvel 平台系统的整体架构设计、账号体系设计、端侧功能集、堆栈解析服务等重点模块实现,本章节将重点讲解平台对于 Crash 异常问题的高效分发处理。

一个高效稳定性治理平台,自动精准分发异常的能力是必不可少的, 帮助 PaaS 服务方快速收到报警、快速响应用户遇到的问题。关于系统是如何根据堆栈信息来追踪与查询 Crash 处理研发人员了,上节第一 小节已详细说明,这里就不再重复了。

问题分发云信当前主要采取以下两个策略:

  • 包含业务堆栈的异常, 通过构建集成平台的组件维护人员信息,直接指派到开发负责人。

  • 对于没有业务栈帧的异常, 根据平台上项目创建人进行指派。

下文以 iOS 稳定性治理为例展示平台系统实现。

1. 聚类展示

Crash 异常问题聚类 UI 展示

2. 异常链接推送

SDK 系统异常链接推送通知

3. 工单创建通知

POPO- JIRA 建单链接推送

4. 平台异常与 Jira 关联

平台 Crash 异常与 Jira 关联

5. 异常项与 CI 产物符号表关联

Crash 异常与 SDK 版本符号表关联

6. 异常堆栈还原展示

Crash 异常堆栈还原图

总结与展望

以上就是云信研发团队对于客户端 Crash 稳定性问题治理与总结,文章针对 Marvel 平台的架构设计、账号体系设计、治理周期、端侧功能、堆栈解析服务等进行了详细阐述。该平台的落地使得云信的研发效能得到了大大提升。在 Marvel 平台上线前, Crash 等稳定性问题异常处理如下图所示,全流程人工作业,排查问题需要前后反复沟通,并且数据源完全依赖终端用户配合导出崩溃数据,响应链路长并且往往存在缺少数据源而没法定位的问题,产研侧也无法主动感知线下/线上的稳定性问题。

旧流程:

新流程:

后续云信研发团队将继续从以下几方面进一步建设与完善 Marvel 平台。

完善端侧疑难杂症的问题治理

  • 覆盖与完善更多端侧的稳定性问题治理;

  • 如 Android oom 治理 , 完善内存治理手段与分析 ,下一步完善问题判定规则。

一站式服务

端侧的问题并非孤立存在,它可能会受到后端的服务质量影响,双端的数据联通与关联能够为业务构建起完整的应用质量地图。后续 Marvel 将与更多内部平台联动如后台监控、后台日志团队在数据服务上做联动,为应用服务提供一站式监控、定位、容灾服务能力。

智能归因分析

本着数据驱动的理念,以及高效挖掘并利用已有数据的思路。Marvel 后续将通过结合研发期间的数据,通过发布信息、代码变更信息、测试案例等,构建研发流程画像,同时结合线上观测数据与问题详情构建的线上质量画像,实现快速聚合分析归因,做到研发内问题提前预警,以及线上问题的在代码和责任人层面的根因分析,降低研发排查问题的时间消耗以及人员沟通成本,助力效能提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【编程基础之Python】12、Python中的语句

【编程基础之Python】12、Python中的语句Python中的语句赋值语句条件语句循环语句for循环while循环continue语句break语句continue与break的区别函数语句pass语句异常处理语句结论Python中的语句 Python是一种高级编程语言,具有简单易学的语法,适用于各…

JAVA架构与开发(JAVA架构是需要考虑的几个问题)

在企业中JAVA架构师主要负责企业项目技术架构,企业技术战略制定,技术框架搭建,技术培训和技术攻坚的工作。 在JAVA领域,比较多的都是web项目。用于解决企业的数字化转型。对于JAVA架构师而言,平时对项目的架构主要考虑…

yolov7改进系列

1. YOLOv7改进结构系列: 最新结合用于小目标的新CNN卷积构建 (71条消息) YOLOv7改进结构系列: 最新结合用于小目标的新CNN卷积构建块_芒果汁没有芒果的博客-CSDN博客 一、SPD论文理论部分 卷积神经网络 (CNN) 在许多计算机视觉任务(例如图像…

CMU15-445 Project.3总结

在线测试 Project #3 - Query Execution 以下是Project #3的网址,2022FALL的Project #3是实现一个查询执行,实现一系列算子,用于实现数据库内的SQL计算。项目中的 Query Execution 主要分为三个任务: Access Method Executors…

九龙证券|整合大年 钢企迎来盈亏平衡新周期

经历上一年的“至暗时间”后,2023年的钢铁工业正从盈亏平衡的新窗口探出面来。证券时报记者从多家钢企和钢贸商处确认,本年以来钢材价格试探性上涨频现,量价、开工率、库存等指标都呈现向好趋向。 如果说供应侧结构性变革是推动上一轮钢铁工业…

HTML 简介

文章目录HTML 简介实例解析什么是HTML?HTML 标签HTML 元素Web 浏览器HTML 网页结构HTML版本<!DOCTYPE> 声明通用声明HTML5HTML 4.01XHTML 1.0中文编码HTML 简介 HTML 实例 <!DOCTYPE html> <html><head><meta charset"utf-8"><ti…

Spring——数据源对象管理和Spring加载properties文件

前面一直都是在管理自己内部创建的对象&#xff0c;这个是管理外部的对象。 这里先使用阿里巴巴的druid来演示。需要在pom.xml中添加如下的依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1…

Leetcode.2416 字符串的前缀分数和

题目链接 Leetcode.2416 字符串的前缀分数和 Rating &#xff1a; 1725 题目描述 给你一个长度为 n的数组 words&#xff0c;该数组由 非空 字符串组成。 定义字符串 word的 分数 等于以 word作为 前缀 的 words[i]的数目。 例如&#xff0c;如果 words ["a", &q…

C++STL详解(五)——list的介绍与使用

文章目录list的介绍list的使用list的定义方法list迭代器失效问题list插入和删除inserteraselist迭代器的使用begin&#xff0c;end 和 rbegin&#xff0c;rendlist元素访问front 和 backlist容量控制与数据清理resizeclearlist操作函数spliceremove 和 remove_ifuniquemergerev…

安卓开发之动态设置网络访问地址

之前开发程序联测测接口的时候&#xff0c;因为要和不同的后台人员调接口&#xff0c;所以经常要先把程序里的ip地址改成后台人员给我的。每次都要先修改ip地址&#xff0c;之后编译运行一下&#xff0c;才能测试。但要是换了个后台人员&#xff0c;或者同时和2个后台人员测接口…

Android提词器实现富文本样式

前提前一段时间做了一个程序&#xff0c;提词器APP&#xff0c;结合greendao保存数据。最近新增了一个需求&#xff0c;实现部分文字富文本的展现。师傅找了一个网上的SDK&#xff0c;但是在集成的时候总是出问题&#xff0c;我又不想把项目挪进来&#xff0c;感觉很麻烦&#…

Oracle P6 Professional相比与Microsoft Project的8个优势

目录 引言 1. 自上而下的调度 2. 努力程度 (LOE) 活动 3. 最长路径 4. 多浮动路径分析功能 6.预算材料成本 7. 开始和完成里程碑 8. 工作公式类型 概括 引言 哪种日程安排工具更适合您的情况&#xff0c;Oracle Primavera P6 还是 Microsoft Project(MSP) 经常有一些…

MySQL8.0Linux安装及主从的搭建

MySQL8.0Linux安装教程 下载并安装 需要说明的一点是我使用的是SSH secure shell Client连接linux系统的&#xff0c;它的用法和命令窗口差不多。界面如图&#xff1a;一样的使用Linux命令操作。 话不多说 第一步&#xff1a; 1&#xff09;、切换到 /usr/local下 cd /usr/…

已解决hint : See above for output from the failure.

已解决&#xff08;pip install wxPython安装失败&#xff09;error: legacy-instal1-failure Encountered error while trying to install package.wxPython note: This is an issue with the package mentioned above&#xff0c;not pip. hint : See above for output from …

关于世界坐标系,相机坐标系,图像坐标系,像素坐标系的一些理解

关于世界坐标系&#xff0c;相机坐标系&#xff0c;图像坐标系&#xff0c;像素坐标系的一些理解前言一、各坐标系的含义二、坐标系转换1.世界坐标系与相机坐标系&#xff08;旋转与平移&#xff09;2.相机坐标系与图像坐标系&#xff08;透视&#xff09;3.图像坐标系与像素坐…

【UE4 RTS游戏】02-摄像机运动_完成摄像机在X轴上运动的相关步骤

效果通过控制键盘WS键使得“CameraPawn”进行前后移动步骤将landscape的Z轴位置更改为0删除“PostProcessVolume”将“LightmassImportanceVolume”移入Lighting文件夹内新建一个蓝图类&#xff0c;父类是Pawn&#xff0c;命名为“CameraPawn”将“MyController”重命名为“Cam…

详解JVM

详解JVM 最近学习了&#xff1a;周志明《深入理解高并发编程》&#xff1b;&#xff1b; 特此简要对学习做了部分总结&#xff0c;方便后续对JVM相关知识的完善和巩固&#xff1b; 若想深入了解学习&#xff0c;可阅读上述参考原著&#xff1b; Java内存区域与OOM 运行时数据…

大数据 | (三)centos7图形界面无法执行yum命令

大家好&#xff0c;今天是三八女神节了&#xff01; 你知道吗&#xff1f;世界上第一位电脑程序设计师是名女性&#xff0c;Ada Lovelace (1815-1852)。 她是一位英国数学家兼作家&#xff0c;第一位主张计算机不只可以用来算数的人&#xff0c;也发表了第一段分析机用的演算…

vector中迭代器失效的问题及解决办法

目录 vector常用接口 vector 迭代器失效问题 vector中深浅拷贝问题 vector的数据安排以及操作方式&#xff0c;与array非常相似。两者的唯一差别在于空间的运用的灵活性。array 是静态空间&#xff0c;一旦配置了就不能改变&#xff1b;要换个大(或小) 一点的房子&#x…

CorelDRAW Graphics Suite2023更新内容介绍

懂设计的职场人都知道这款软件&#xff0c;CorelDRAW是一款非常高效的矢量图形设计软件。CorelDRAW操作界面简洁易懂&#xff0c;能够为用户提供精确地创建物体的尺寸和位置的功能&#xff0c;减少点击步骤&#xff0c;提高设计效率&#xff0c;节省设计时间。功能比普通的美图…