研发效能 · 实时监控 · 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倍;

相关推荐
小高007几秒前
🔥「从零到一」我用 Node BFF 手撸一个 Vue3 SSR 项目(附源码)
前端·javascript·vue.js
SailingCoder3 分钟前
AI 流式对话该怎么做?SSE、fetch、axios 一次讲清楚
前端·javascript·人工智能·ai·node.js
hxjhnct7 分钟前
Vue 实现多行文本“展开收起”
前端·javascript·vue.js
橙子的AI笔记9 分钟前
2025年全球最受欢迎的JS鉴权框架Better Auth,3分钟带你学会
前端·ai编程
百锦再9 分钟前
Vue大屏开发全流程及技术细节详解
前端·javascript·vue.js·微信小程序·小程序·架构·ecmascript
独自破碎E13 分钟前
你知道Spring Boot配置文件的加载优先级吗?
前端·spring boot·后端
cute_ming13 分钟前
浅谈提示词工程:企业级系统化实践与自动化架构(三)
人工智能·ubuntu·机器学习·架构·自动化
一树山茶15 分钟前
Vue变化响应
前端
黑土豆18 分钟前
一次真实的流式踩坑:fetchEventSource vs fetch流读取的本质区别
前端·javascript·ai编程