5

有赞移动天网平台搭建

 2 years ago
source link: https://tech.youzan.com/mobileskynet/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

作者:王前、浅浅

在快速迭代的业务需求下,难免会出现一些线上 bug ,特别是在 SaaS 业务领域,线上 bug 对于商家来说大概率会影响经营,严重的话很可能引发故障。所以,我们对线上质量要求很高。针对线上 bug ,除了商家主动上报问题,后端还有自己的天网监控体系,进行主动发现问题,那移动端如何进行主动防控呢?所以我们也需要自己的主动防控平台。

为什么不可以直接使用后端的天网系统?

  • 需求功能对比

    天网更能对比

从功能来看,后端的天网更像一个线上接口日志存储,结合监控配置能力进行预警处理。经过分析,后端天网无法满足移动端的使用场景。

  • 提高客户端线上质量,减少线上问题,主动发现与预防线上问题,及时报警与处理,降低线上问题的影响面。做到防患于未然。

二、整体设计

根据以上背景,可以得知,移动端天网平台相对于后端天网平台更复杂,涉及的技术点也比较多,主要有客户端、 PC 后台管理(下面内容简称 mpaas )、后端服务、数据存储等。

  • 系统架构图

    系统架构图

整体流程是可以区分两部分,一部分为日志上报流程,数据来源是业务方客户端,另一部分为日志操作流程,操作方是 mpaas 后台。这两者的区别,主要是一个是数据的来源方,另一个是数据的使用方。

  • 日志上报流程

客户端上处理流程相对来说没有那么复杂,主要就是数据的采集与上报。其中核心逻辑都在业务服务中进行,比如日志内容整合,触发通知逻辑等。

客户端整体流程

  • 日志操作流程

mpaas 平台,是整个处理和报警的核心。提供问题查看、分配人员、状态变更、问题备注、通知策略等功能。

mpaas流程

  • 后端天网系统( skyLog )

为什么我们自己做了数据存储以及移动天网平台,为什么还会依赖 skyLog 呢?

主要原因是,我们天网上报数据是区分等级,存在 info 、warning 、error 三个等级,对应上报问题等级不同,通知策略与处理流程也会有区别,但都是需要记录到 skyLog 日志平台上,类似打 log 日志。目前 info 级别的数据是不会存储到移动天网服务中,因为打日志内容不在报警范围内,所以查询打的日志内容就需要到 skyLog 平台上查询。具体两者区别参考前面第一部分背景介绍。

  • 企业微信服务

公司内部使用企业微信,针对企业微信可以自定义消息通知以及群机器人功能,可以使用企微提供的公开接口进行调用,很方便的实现通知报警能力,可针对不同业务场景,定制不同消息通知。 针对本平台,当触发报警,比如 error 级别问题上报(后面会有具体通知策略分析),则会通过消息给负责人推送系统消息,以及群机器人触发报警。

例:零售移动天网报警群机器人

--------1.jpg

具体使用参考企业微信官网 api:https://work.weixin.qq.com/api/doc/90000/90135/90235

三、日志采集和上报

目前该平台对接的业务方,主要是针对的是公司各业务团队的移动端业务,日志的上报基础能力集中 Zanlogger 日志二方库。同时基于目前混合开发的现状,开发了 ZanlogWeex 和 ZanlogFlutterPlugin 来实现 Flutter 和 Weex 页面的日志需求。

1、日志信息采集

首先看下日志内容的组成:

日志内容元素组成

其中,基础信息由 Zanlogger 自主收集,业务方使用的时候,只需关注相关业务信息。

//天网日志上报
Log.sky("info", "sale", "startPay", "goods is xxxxx")  
Log.sky("warn", "sale", "changePriceFailed", "goods is xxxxx")  
Log.sky("error", "sale", "db can not open", "error:xxxx")  

设备型号,系统 os 版本,应用版本,用户 id ,店铺 id 等基础信息,在同个设备的大部分时间段内,都是相同的。考虑到流量和效率问题,没必要每条日志都上传。

Zanlogger 的实现方式是,应用启动时,获取设备唯一标识,上传一次基础信息。业务日志上报时,只需上传设备唯一标识。后端服务收到消息时,通过唯一标识获取基础信息,组合成完整的日志。

基础信息上报逻辑

2、按级别策略上报

移动天网平台支持 error,warning,info 三种级别的日志上报,针对不同级别的上报信息,触发接口上报的时机也不同。

  • error : 最高等级问题,如果发生,则会引发线上 bug ,客户端会立即上报。
  • warning : 该级别我们定义为警告,针对一些业务场景,可能是异常或其他系统错误,发生并不一定是线上 bug ,然而当短时间内发生次数过多,则可能演变成线上 bug,所以该问题不会立即上报,而是存在一定 buffer ,当发生次数到达 buffer 量级后客户端进行上报。
  • info : 低等级问题。该级别我们认为是基础日志信息,并不认为是问题,基本是业务人员进行埋点数据进行线上逻辑排查与跟踪使用,客户端上报策略和 warning 类似,也存在 buffer ,达到量级后进行上报。该级不会进行通知,相关人员自行去天网日志平台中查询信息。

为了担心数据量太小,buffer 一直未达到上报的条件,或者网络原因,但是一直上传失败,同时会设置指定时间(例如 30s )的轮询机制,一旦发现有未上传的日志,立即上报。

按等级策略上传

四、日志存储和报警设计

1、日志存储

实际场景中,日志的上报频率,和日志的内容大小是不确定的,基于性能考虑,后端的数据存储流程如下:

日志存储流程

原因是,相较于 RDS ,HBase 更适合适合大数量的存储,于是日志完整内容存放在 HBase,两者通过每条日志存储时,生成的 uuid 关联。日志的频繁上报,使用 kafka ,保证峰值处理能力。

存储位置的问题解决后,接下来思考的是日志该以什么维度进行分组?

移动日志的解决方案是聚合 biz + sign + type + level + os ,取其 hashcode 。

这里为什么会将系统 os 作为分组因子呢?这里的原因是,基于现有场景分析,存在 pad 和 phone 同一个 sign 的报警,大概率是不同的代码流程导致的,应该视为不同问题去排查和分析。

2、报警策略设计

当 error 日志上报后,后端会通过企业微信服务,向指定的群发送消息,并且 @指定的人,影响范围大的问题甚至需要 @所有人。信息论中有个定律:“信息量越大,信息熵越小”,所以为了保证群消息的关注度,在保证关键信息触达的前提下,对群内成员减少不必要的打扰。

因此不是所有信息都需要发送到群消息,比较建议群通知的场景如下:

  1. 新问题出现。

  2. 已解决问题新版本再次出现。

  3. 阈值范围报警。

以上是我们提供的默认配置,也支持让业务方自定义。下一章节中会讲到相关自定义配置功能。

报警策略流程中需要用到以下概念:

  • 问题状态:上报问题处理的状态,分为待处理、处理中、待发版、已上线。
  • 问题解决版本:当问题状态变更到待发版或已上线时,需要填写解决版本号,比如 6.5.0 ,代表该问题在该版本已解决。

完整的报警策略流程如下:

整体通知策略流程图

五、移动天网平台可视化介绍

该平台的核心功能就是对于上报问题的报警通知能力与处理能力,以及相关报警配置策略。这里对于客户端的上报相关没有什么可讲的,相关的数据上报策略前面也有讲。这里主要针对 mpaas 平台进行功能与策略介绍。

1、问题查看

问题列表页面:

问题列表

问题列表主要展示上报的所有问题,上报时相同的问题会进行聚合,列表中每一条数据,代表相同一类问题。同时支持多种筛选条件进行快速查找。

  • 业务:针对不同客户端的业务方
  • 平台:iOS、Android、PC 等
  • 版本:上报问题的 app 版本信息
  • 类型:各业务方定义自己的问题分类 type ,比如零售定义为业务模块
  • sign:上报问题的 key ,用来标识问题名称
  • 等级:前面也有讲到,分为三个等级,error、warning、info
  • 时间:进行时间段筛选
  • 处理状态:用于筛选具体问题状态,多选
  • 处理人:问题相关处理人
  • 关联问题文档:用来快速筛选出带有关联问题链接的问题

问题详情页面:

问题详情

针对每一类问题,点击详情进行查看上报的具体信息。详情中,会包含该类问题的所有上报信息,每次上报问题都可以查看具体上报内容信息,然后进行问题分析。

  • 拉取设备离线日志:可以快速拉取上报问题设备的本地离线日志
  • 操作记录:记录该问题的操作情况,以及该问题解决过程中的备注

2、问题处理

当问题上报上来时,会默认进行分配给上一次处理该问题的人员,如果是新问题则会分配给对应业务 owner 进行处理。当问题在解决时,需要对问题人员及状态等进行变更。

处理操作

针对问题处理的操作,主要有状态、人员、备注信息。如果状态为待发版或者已上线,则需要填写修复版本,用来保证该问题在低版本的误报情况,如果问题存在问题链接,则需要填写关联问题文档,方便后续查看与统计使用。

  • 状态:分为四个状态,待处理、处理中、待发版、已上线
  • 处理人:根据公司内部员工信息,对应到内部人员信息
  • 备注:操作该问题时,需要填写备注信息,以便后者人员进行查看
  • 修复版本:该问题的解决版本,当状态为待发版或已上线时需要填写
  • 问题文档:该问题关联的问题链接,非必填
  • 2h 内免打扰:当有人在处理时,为了专心解决问题,可以设置 2h 免打扰

3、报警策略相关配置

前面有讲到,报警能力主要依赖企业微信进行通知到相关的人和群。实现自定义报警策略,那就需要相关策略配置功能页面。

3.1 配置后台页面

报警策略列表页面:

通知策略配置页面1

报警策略配置页面:

通知策略配置页面2

配置页面可以根据业务方需求,自行添加应用配置策略,可根据 error 和 warning 级别分别设置配置策略信息。在问题上报后,会根据不用业务方应用( biz )进行识别,采用对应的配置信息进行报警。

3.2 通知模板

通知模板主要分为三类,个人及群消息通知,日报和周报。

  • 问题消息通知

    群消息通知

  • 日报和周报

    日报和周报

个人及群消息通知,主要是针对新问题及操作变更时进行通知。日报和周报更多的是关注统计相关的数据,针对上报问题日报情况,可以看出当日问题的处理情况,周报数量统计,可以看出本周的概要情况。

对于移动端来说,线上问题的发生是比较严重的问题,特别是在零售这种线下场景,很可能一个问题会给商家带来资损的问题,所以对于移动端的质量问题要有高标准。除了开发阶段的 code review 和自测,测试阶段的自动化测试和人工测试,我们如何主动监控线上问题的发生就成了关键,移动天网平台的搭建就是解决线上主动监控的空缺。

目前移动天网平台在线上已经跑了近半年时间,其中有效帮助移动端主动发现线上问题数量占比已经达到 20% 。对于主动发现的问题,我们快速响应进行解决,目前主动发现的问题商家没有再进行上报。这对于商家和服务同学,以及开发都是一种效率和质量的提升。

欢迎关注我们的公众号
coder_qrcode.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK