研发效能 · 实时监控 · 5W2H分析Android实时监控体系

友情链接: BaguTree B站分享

微信公众号: 小木箱成长营

你好,我是小木箱,欢迎参与小木箱成长营的研发效能系列教程。今天我们将分享研发效能 · 实时监控 · 5W2H分析Android实时监控体系的内容,专注于移动端实时监控体系的建设。这一体系基于过去在端上已经上线并使用的监控能力,移动架构组对移动中台体系建设进行了深入思考和总结。

今天的主题将围绕四个核心维度展开。首先,我们会讨论为何需要建设端侧实时监控;其次,我们将深入了解如何进行端侧实时监控的建设;最后,我们将探讨端侧实时监控的规划。

通过学习小木箱的体验优化系列教程,你将能够在移动客户端提高工作效率,为自己创造更多机会展现才华。

1. 为什么要建端侧实时监控

1.1 业务痛点

出发点是解决三个当前项目存在的业务痛点。首先,项目的复杂性使得维护老代码和开发新功能变得困难,导致指标数据在大盘数据上不统一,可能产生混乱。

1.1.1 项目复杂

首先,我们说说第一个业务痛点特征项目复杂,随着功能需求的累加,既维护老代码,又开发新功能,项目越来复杂庞大,指标数据在大盘数据上没有完全统一,各自可能会有各自指标,甚至混乱。

1.1.2 迭代周期短

然后,我们说说第二个业务痛点特征迭代周期短,为支持业务需求,从开发、测试到上线,两周一迭代,迭代周期短,线上稳定性面临很大的挑战。

现阶段迭代周期追求敏捷开发,一般两周一个迭代,从开发到上线,迭代周期短造成App 线上的稳定性面临很大挑战。

应用既支持单发布单能力也支持多发布单能力,开发迭代当中,版本既有技术需求发布也有业务需求发布。因此,版本风险衡量点和版本稳定性需要借助线上大盘监控能力进行查看。

1.1.3 指标各自为战

最后,我们说说第三个业务痛点特征指标各自为战,业务、性能、技术以及网络等数据指标打到各自的系统,没有统一布局和管理。

现阶段各个指标各自为战的,有后端监控,有端上代码度量监控,有端上APM监控,有端上启动耗时,也有端上网络监控。指监控标在各自系统承接和展现方式百花齐放,缺乏统一布局和管理能力。

基于以上项目复杂痛点、迭代周期短和指标各自为战,三个痛点,因此要建设移动端的统一的实时监控的能力。

1.2 对比

说我业务痛点,我们对比企业现有能力。差异点主要体现在神策、实时日志和定制化服务三个方面。

1.2.1 神策

第一个方面是神策,神策有三个缺点,分别是实时性低,T+1才有数据、人工查看数据,无告警能力和因数据安全,需要申请权限

实时性低,T+1才有数据;

首先,我们来说说神策的第一个缺点: 实时性低,T+1才有数据, 神策是趋向于对业务或技术的埋点,对数据 UV 和 PV 打点统计。神策可以按照时间或系统进行展示。但是神策缺点是缺少实时性,需要 T + 1 才能看到数据。

人工查看数据,无告警能力;

然后,我们来说说神策的第二个缺点: 人工查看数据,无告警能力, 数据需要人为分析查看,神策缺少自动告警能力,变好变差,要手动到系统查看。如果数据变坏,神策没有告警告线上指标劣化信息。

因数据安全,需要申请权限;

最后,我们来说说神策的第三个缺点:因数据安全,需要申请权限。因为数据安全的原因,因此企业对神策权限把控严格,很多人没有权限查看神策,很难通过神策进行线上问题定位 。

1.2.2 实时日志

第二个是实时日志用来分析线上问题,实时日志分析线上问题有三个缺陷,分别是查看分析线上个例问题、缺失告警,线上问题后置和没有大盘数据。

当线上反馈过来 case 有问题,比如说无法下单。我们根据用户反馈账户信息,比如 user fid 或手机号,去实时日志系统查日志,查到关键信息定位问题。但同样缺失告警能力。

线上问题反馈很后置,无法第一时间自动化告诉线上多少用户,哪个版本有问题,实时日志没有此功能。实时日志缺少大盘能力,实时日志体系大,每天有3TB存放到ES集群里,因此实时日志做大盘数据分析性能差。

1.2.3 定制化服务

第三个是定制化服务,定制化服务的原因有三个,分别是:

  • 开发维护成本高;
  • 新增指标需要后端额外开发;
  • 无统一通道,增加App负担;

比如: 启动耗时服务,走定制化。如果有需求去采集特定数据,需要定制化开发需求,从 SDK 到前端到后端服务一条龙进行收集、落库和渲染定制化开发。

如果新增指标需要前后端排期开发,维护成本高,无法具备通用性,而且无法统一通道,比如每个指标都来一套服务,流量、内存和线程方面都会给App性能造成负担。

1.3 全景

实时监控监控体系的建设,是从面到点,从急到缓过程,从实时监控用户反馈到事故现场还原崩溃。第三点,说一下实时监控的全景。实时监控、用户反馈、事故冒烟和Crash奔溃是由面到点分析过程。

首先如果有实时监控,那么实时监控第一时间通过告警方式协助我们发现通知到具体App下面。

某指标劣化,跟同期的比如: T - 7 或 T- 1 时间维度去做对比。因为用户反馈、事件事故、冒烟、 crash 崩溃是相对滞后的线上问题的反馈,所以可以直接通过实时日志和离线日志去进行查询数据恶化情况。

通过以上场景反馈过来问题,再借助实时、离线日志结合代码和数据对问题归因。

王阳明说过: 志不立,如无舵之舟,无衔之马,漂荡奔逸,终亦何所底乎?

如果志向不确定,像没有舵的船,没有衔的马。实时监控有异曲同工之妙。

如果没有实时监控,线上稳定性、线上指标是失控的。如果没有实时监控,我们线上故障现场难以还原。

如果没有实时监控,只能24h oncall、团队轮流值班,定时观测上线情况,人肉发现线上问题。

如果通过实时监控,相当有了上帝之眼对App 关键指标进行观测。因此,着重下面讲解怎样建设端侧实时监控。

怎样建设端侧实时监控

  1. 平台化设计:

    • 实现实时查看线上数据,提供可查能力的平台支持。
    • 确保系统具备可监控的能力,满足实时监测的需求。
    • 设计统一通道,以避免性能和流量的浪费。
  2. 可扩展性目标:

    • 通过抽象定义线上网络 APM 和业务指标,以及协议,实现系统的可扩展性。
    • 提供便捷的新增协议方式,只需在协议基础上更改名字和指标类型即可支持。
    • 后端和前端无需改动,通过 SDK 收集的指标数据,通过前端面板配置即可实现可扩展性。
  3. 零成本新增新指标监控:

    • 确保新增指标监控的零成本,降低维护成本。
    • 以易用性为目标,通过工具化的方式维护指标,保障两端指标在查看时的统一性。
  4. 高性能目标:

    • 针对端上 App 的上传承载通道和数据写入的 SDK,设定高性能的要求。
    • 着眼于高效的写入速度,点上传流量的最小化,以及存储和上传的高安全性。

通过以上目标的设计,系统实现了平台化、可扩展性、零成本新增监控和高性能的要求。这确保了系统的稳健性、可维护性和易用性,满足了实时监控的核心需求。

平台化设计的三层架构

  1. 客户端层:

    • 在第一层客户端中,Web 前端负责管理指标,而安卓和 iOS SDK负责集成和自定义指标的上传。
    • Web 层作为数据查看的后期能力,通过网关层的负载均衡,将前端、安卓和 iOS 的数据请求传递到最小的 handler S SVC 服务。这相当于 mount 服务的 gateway 层,同时参与额外服务相关能力。
  2. 攻击防御和过滤策略:

    • 针对攻击防御,实施对 IP 抓包、恶意攻击、数据重复上传和设备重复上传的防护,并对 IP 和设备进行降级处理。
    • 设定过滤策略,对线上指标数据进行过滤处理,防止不合法或时间节点错传的数据。例如,防止上传昨天的数据,以避免对实时监控造成脏数据干扰,导致误导。
  3. 合法性校验和黑名单管理:

    • 实施合法性校验,由于采用注册制,确保只有注册过的指标才能传达到后端服务。这考虑到指标数据存在容量限制,需要进行合法性校验以降低后端成本。
    • 管理黑名单,用于配置处理端上接入时无法预知的域名,拉黑名单管理不关心的指标数据。
  4. Label 检查:

    • 在安卓和 iOS 接入文档中强调 Label 检查,以避免同一指标名在不同平台上的数据展示污染。例如,安卓和 iOS 同指标名时,通过 iOS key 取A1,而安卓则取相同的A1,以确保数据展示的准确性。

通过这样的架构和策略,平台化设计能够实现高效的数据管理和可靠的数据展示,同时保障系统的安全性和稳定性。

2. 怎样建设端侧实时监控

2.1 目标

2.1.1 平台化

• 实时查看线上数据;

•提供监控告警能力;

•统一上传通道能力;

2.1.2 可拓展性

•抽象监控指标需求;

•支持多种指标类型;

•0成本新增指标;

2.1.3 易用性

•指标管理工具化;

•两端指标统一;

•数据面板简单好用;

2.1.4 高性能

•写入快速高效;

•上传流量小;

•存储上传安全性高;

2.2 平台化设计

2.2.1 Prometheus架构

2.2.2 可拓展设计

2.2.2.1 Protobuf 设计

✔️ 统一指标抽象设计

✔️ 支持多种指标类型

✔️ 支持自定义扩展

✔️ 数据安全性高

2.2.2.2 指标类型

✔️ Counter

✔️ Summary

✔️ Histogram

2.2.2.3 易用性设计

✔️ 工具化管理监控指标和控制采样率;

✔️ 统一规范Android和iOS指标设计;

✔️ Monitor拖拽面板,配置方便;

✔️ 通过Monitor统一配置管理告警规则;

✔️ 数据展示形式丰富:线图、饼图、柱状图等;

2.2.3 可降级设计

2.2.3.1 攻击防御

加入IP和设备ID黑名单机制,避免被线上恶意用户破解攻击,做到攻击可降级。

2.2.3.2 采样管理

可按照appId、指标、时效等多维度控制采样率,避免数据量大引起服务宕机。

2.2.3.3 上传控制

可以通过后端Apollo配置控制App的上传周期,避免QPS过大引起服务宕机。

2.2.3.4 时序数据库降级

数据量大占用Promethues时序数据库内存,在monitor消费服务增加降级开关。

3. 端侧实时监控规划

3.1 Monitor体验

第一个优化点规划点是Monitor体验,需要手动写 pql, 不是自动配置规则,目标跟monitor告警规则一样,做简单配置。

  • Monitor前端选择时间范围大就会卡死;
  • Monitor面板配置成本高,需要简化易用;
  • Monitor告警能力还没有发挥作用;

3.2 通道统一

第二个优化点规划点是通道统一。通道统一有两个特征。第一个特征是实时日志和实时监控两个短链的上传通道;第二个特征是接入Mqtt长链能力,提高上传实时性;降低对短链耗请求的问题,给App 造困扰。

3.3 全链路分析

第三个规划是全链路分析,健全从面到点分析能力,划点全链路分析,实时监控跟踪并打通实时日志数据。

收到实时监控告警,指标问题需要通过实时日志查看线上用户的业务问题。需要支持从面到点分析能力,提供模糊搜索日志查询能力,打通后端trace ID 查询跟进。

3.4 自动化发布

第四项规划旨在实现自动化发布,分为两个关键方面。首先,通过建设版本APM灰度监控能力,系统在发现告警或问题时可自动停止发布。其次,在CD基础上升级发布能力,支持版本的自动发布和自动回滚。

对指标内部值进行校验,确保一致性。通过清洗旧数据并替换为最新数据,避免数据两端的不一致。在安卓和iOS实时监控采集数据时,强调规范使用方法。

第六点关注服务限流,对SDK上传的数据进行采样项目的限流,根据App ID进行区分和定义采样率,可灵活调整。在数据量异常多时,可以降级为0。服务限流策略对SDK进行监控,上传周期可进行调整以减轻后端的压力。

基础服务能力包括MySQL、Redis、Apollo配置和集群。经过handle gateway的数据处理后,通过合法性过滤限流,如内部检查,数据会统一发送到Kafka集群。

采用Protobuf对数据进行编码,并发送到Kafka。选择Protobuf的原因是其相比JSON更轻量化,数据量更小,提高了50%的编解码效率。面对大量数据压力,线上QPS高达4000/秒。

数据通过Protobuf再发送到Kafka,Kafka有bound Consumer服务,真正对线上指标进行消费。通过订阅Kafka集群,批量取数据后对Protobuf数据进行解析。解析后,进行数据的组装、过期策略处理,包括降级容错。处理后的数据打到Prometheus client used,相当于数据mount到Consumer服务内存,其中包含Prometheus client服务能力。

之后,Prometheus搜索的集群可通过注册方式配置化,发现一些Consumer IP节点服务,通过定时30m/s的短链拉取数据,然后数据存储到Prometheus server端。

Prometheus的作用是时序数据库,按照时间戳统计和组织数据。在链路存储之后,通过mount web M,mount前端服务,打开后通过拉取Prometheus server端数据进行数据渲染和展示。

Prometheus的架构包括jobs、exporters等,将Consumer通过注册方式对外暴露,将IP和服务暴露给Prometheus server端,并通过定时方式拉取。通过Consumer服务,Prometheus主动将指标push到server端。

Prometheus与MySQL、realreal DB、squlite不同,是时序数据库,按照时间戳存储数据。在拉数据时,当前1000秒去拉取对应的数据,减少数据运算和查询,实现秒查询效率。

Prometheus server端通过短链拉取数据,集群比较简单,不使用tsdb,而是外置存储,直接存在Prometheus server端。tsdb有内存管理功能,可以持久化到HDD和SSD。

通过PQL方式查询,类似MySQL搜索语句,查询后进行展示。支持告警能力,配置规则后,在采集数据时进行运送,触发告警规则后通过root manager触发邮件。

企业一般采用混天仪相关的告警能力。稳定性大盘借助企业办公软件,飞书或钉钉的告警方式来通知服务问题。

仅采集在端上的指标,包括CI/CD前端注册时的指标。例如,与用户相关的指标,如"user App user user Modeo report error code",旨在收集用户侧上报的错误信息,实现用户模块的相关错误监控。端上SDK采集后,数据存储方式如截图所示。

首先,"platform App washing"以及"app user"的"module"和"error code"实际上是标签(label)。标签的键和值分别是"platform"和"安卓"。在接入时,不能随意添加键值对,因为随着键值对的增加,维度数量会增加,对后端Prometheus的存储压力也会增加。

例如,版本号如果不是真实版本而是随机时间戳,会导致后端数据呈爆炸式增长,对存储和查询效率产生限制。因此,在接入时要求各端进行评审,架构组会审查埋点方式是否正确,人为控制键值对存储方式是否规范。对于键值对,如error code有限个数时允许,但超过百万级会对后端存储造成巨大压力。

关于可扩展设计,满足实时监控的要求。每种指标(例如message Matrix)定义了字段,包括App ID、platform、App wash、device ID、ctenm和Matrix item。前面的字段用于采集端上的基本数据,包括版本应用、App ID等。Matrix item是指标的扩展,时间戳由SDK采集。

Matrix step支持三种:count、summary和histogram。name可扩展,对于某一指标可能有特定的name,需要技术人员定义。例如,内存统计可以通过这两个组合方式实现可扩展能力。value在summary或histogram时记录传输的具体值,如内存的95分位、50分位、某版本的平均内存值等。

指标类型的键值如下:key是map,network指标用于统计App的网络监控,包括success标记、host域名、pass code等,通过protobuffer进行扩展。通过二进制方式实现压缩效率,体积小,decode和encode效率比JSON更高,提高安全性。

为了提高易用性,提供了mdouble web前端,通过注册指标,如采样率、指标描述,统一管理安卓和iOS。通过采样率控制指标线上数据上报情况,前端能力包括mount web编辑页面,用于统计网络成功率。

通过配置指标类型,如App ID等过滤条件,支持自定义pql字段,同时支持折线、柱状图和饼状图等能力。

为了提供攻击防御、采样管理、上传控制和实时数据库降级能力,特别考虑了Prometheus端的容量问题。如果指标太多,通过gateway层进行降级,对于mount Consumer服务的数据量过大情况,进行数据pull时进行降级,指标和采样率会相应降级。

高性能设计的主要目标是SDK,服务于应用层,提升用户体验,包括产品线A、产品线B和产品线C。这一层有三个核心能力,分别是实时日志制作、离线日志制作和实时监控,构成了上层服务层。Logan具备文件服务、上传服务和采集服务的功能。文件管理器支持Logan的读写,实现文件过期、权限管理、日志归档、压缩解压等自定义管理功能在Logan层面得以实现。

通过借助Linux mmap方式,采用内存映射解决了文件读写IO性能瓶颈。通过PB规范,实现了安卓和iOS数据的上传和存储协议,并通过message query管理上层Java和Swift OC的日志读写任务。

底层实现了message query和线程轮询,包括排队写入和读写,利用激励部门的能力实现了压缩和解压功能。通过mutext实现线程写控制,增加了安全加密能力,并将数据统一存储到第值班空间。

上传服务与后端协同控制上传周期,对上传数据进行格式化以控制上传包大小、日志大小和日志条数,同时由上传周期管理服务和端口轮询能力实现。

在线上,通过短链每分钟进行定时轮询上传,也可以通过MQTT方式实现实时上传的能力。采集服务与后端服务对接,通过后端下发的配置和过滤策略,实现对Vue控制、iOS控制等方面的日志采集。对于安卓,通过Activity、Fragment或Dialog的AOP方式进行日志采集,包括生命周期日志的采集,网络能力则通过hook方式实现。整体上,通过移动中台三驾马车,实现了对日志的拉取和写入的一体化服务,使得上传服务得到统一,服务端内核也实现了跨端能力,避免了重复开发,提高了效率。

与的腾讯数据相比,进行了10万次读写对比,在不同手机上性能提升了10倍;

相关推荐
雾散声声慢3 分钟前
前端开发中怎么把链接转为二维码并展示?
前端
熊的猫4 分钟前
DOM 规范 — MutationObserver 接口
前端·javascript·chrome·webpack·前端框架·node.js·ecmascript
天农学子4 分钟前
Easyui ComboBox 数据加载完成之后过滤数据
前端·javascript·easyui
mez_Blog5 分钟前
Vue之插槽(slot)
前端·javascript·vue.js·前端框架·插槽
爱睡D小猪8 分钟前
vue文本高亮处理
前端·javascript·vue.js
开心工作室_kaic11 分钟前
ssm102“魅力”繁峙宣传网站的设计与实现+vue(论文+源码)_kaic
前端·javascript·vue.js
放逐者-保持本心,方可放逐11 分钟前
vue3 中那些常用 靠copy 的内置函数
前端·javascript·vue.js·前端框架
IT古董12 分钟前
【前端】vue 如何完全销毁一个组件
前端·javascript·vue.js
Henry_Wu00114 分钟前
从swagger直接转 vue的api
前端·javascript·vue.js
SameX23 分钟前
初识 HarmonyOS Next 的分布式管理:设备发现与认证
前端·harmonyos