cover_image

达达快送APP埋点日志框架升级实战

朱鸿飞 高军 达达集团技术
2022年09月23日 10:23

目录

一、背景与目标
二、新埋点框架架构
三、新埋点框架核心设计介绍

四、成果与规划

一、背景与目标

随着公司业务的快速发展,埋点数据在业务分析中越来越重要,历史上达达快送的埋点数据一直存在问题,所以需要去对现行埋点框架进行重构。

埋点框架现状为:由业务方触发埋点,开启异步线程,经过数据组装处理后入库同时进行上报,上报结束后捞取数据库中剩余所有埋点的一半再次上报,不对埋点数量进行检查,也不管被捞取的埋点是不是正在上报的埋点,如此循环,且埋点文件分散在多个模块中,相互调用。

图片

在对各个节点进行分析后发现存在以下问题:

  • 埋点数据不准确:埋点丢失、重复上报、无限上报等问题;

  • 上报成功率低:一次捞取数据库一半埋点上报,并发过高,容易导致网络接口堵塞或者OOM;

  • 低可移植性:内部子模块耦合严重,甚至与业务高度耦合,不适合其他app使用;

通过对现有埋点框架的问题进行归纳和总结后,得出埋点框架重构的目标为:

  • 解决埋点丢失等问题:在解决重复上报和无限上报等问题的前提下,保证埋点可以被全部上报;

  • 提升埋点成功率:旧框架成功率只有70%,新埋点框架的成功率要达到99%以上;

  • 高可移植性:新的框架可以被其他app高效接入并且方便扩展;

二、新埋点框架架构

为了解决内部子模块耦合严重问题,在设计新框架时,必须要考虑到对整体功能职责的划分。结合埋点的特性,我们将埋点整个过程划分成三个功能模块:采集、存储和上报,模块之间相互独立互不影响。这样划分可以降低耦合,便于后期的拓展和维护。而且,为了防止出现线程过多影响业务处理的问题,模块内采用单线程池的存储和上报,单线程并不会影响埋点的上报,对提升性能也有帮助,从设计的层面解决了老框架出现的线程阻塞导致的埋点丢失问题

图片

框架整体分为三层

接口层

表示SDK提供了什么样的能力,是SDK与外部业务方进行交互的桥梁,提供SDK初始化入口、代码埋点接口以及SDK配置等。

业务核心库

其中包括管理模块和三个子系统,分别是数据采集、数据存储、数据上报系统。每个子系统各自独立,只负责处理自己应该处理的逻辑,而管理模块则是统筹各子系统之间协作的管理者,同时也负责各子系统构建和初始化等。

底层库

底层是整个SDK所依赖的基础库以及使用到的通用的工具类等。

三、新埋点框架核心设计介绍

埋点的时效性一般存在不同情况。有些点上报的时效性不高,可以配合数据库使用。有些点时效性比较高,不能延迟统一上报,防止集中上报造成接口瞬时异常报警。所以新框架设计了两个对外接口,非及时性点会入库,及时性点不会入库。

图片

为了解决埋点的丢失问题,新框架在上报模块的设计中,采用了实时上报和定时上报结合的形式,实时上报失败的数据,可以通过定时任务及时上报,这样就避免用户不操作也能上报。

图片

1、实时上报

  • 当APP主动调用代码埋点或者监听触发时,会携带业务数据进入新框架,首先进入采集系统,在此系统内会进行数据长度和格式的校验,校验通过后会与App通用数据(设备信息、用户信息等)组合;

  • 采集系统组装数据完成后,通过管理模块调度进入存储系统,先是转换存储需要的数据格式,随后创建存储任务交给线程池排队执行,在数据存储的同时,此数据也同步进入上报流程;

  • 存储系统传来的数据会转换成上报任务,交给单线程的线程池排队上报,为了防止任务过多导致OOM,线程池的队列限制在128以内,超过后会丢弃最早的任务,上报结束后,通过管理模块去更新上报次数(上报失败)或者删除(上报成功)数据;

  • 新框架在初始化时会注册监听,主要用于自动上报埋点;

2、定时上报

  • 新框架初始化后会同时启动定时任务;

  • 定时时间到,首先会检查数据库中待上报的数据量,如果有待上报的数据,会进行分批上报,每批读取固定条数,前一批上报结束才会进行下一批的读取和上报,这样是为了防止内存中读取的数据过多引起OOM;

  • 上报成功删除数据,失败更新上报次数,如果上报次数达到上限,也会删除数据;

新框架设计采用实时上报和定时任务结合的形式保证埋点不丢失,那么如何避免定时任务取的数据是正在上报或者待上报的数据呢?

在设计时可以维护一个时间戳,记录的是最近一次实时上报结束埋点数据的产生时间,这个时间戳之前的所有点位都是已经经历过上报的,所以按照此时间取到的数据都是已经失败的,不会跟正在排队上报的数据重合。

图片

在老的框架下,存在埋点数据完全相同的情况,如何区分是重复埋点还是用户连续点击产生的呢?

在新框架设计中,我们为每条日志打上一个唯一性标签,这样我们很容易就能区分出来此日志是重复上报的还是用户瞬间操作的,这个标签的生成使用了设备信息和时间戳,可以用来对生成埋点的信息进行反推。

图片

那么如何避免老框架存在的无限上报问题呢?我们给每条日志加上上报次数(uploadCount)限制,如果超出预设的次数我们就可以删除此条日志。

在验证新框架的稳定性和健壮性方面,我们使用uploadCount这个参数统计所有日志的上报次数,计算平均每条日志经历多少次才能上报成功,统计重传率。

图片

最后,新框架中存在一张表,以天为维度记录当前设备每天发送和成功的点数,落库后我们就能根据设备的发送数值和成功数值比,统计成功率。

图片

四、成果与规划

1、埋点丢失等问题被解决

新框架上报的埋点pv和uv数量级比老框架多出20%。

2、高成功率

新框架的成功率达到99.912%,重传率1.2%。

3、高可移植性和可扩展性

目前达达商家和骑士端app都已接入新框架,接入联调用时2天/人,配置代码控制在50行左右,并且经历了两次无侵入扩展。

4、规划

虽然新框架已经在多个app上稳定运行,并且产生了很好的结果,但是还有一些可以优化的地方:

  • 增加埋点数据列表和搜索功能,提升埋点验证阶段效率和准确率;

  • 可以将埋点集成进部分通用组件,绑定数据,提升埋点研发效率;

  • 对一些pv和曝光埋点,借鉴SPM思想,提升埋点设计和研发效率;

未来新埋点框架将被越来越多app接入,达达快送团队将继续优化新埋点框架,从各个方面提升效率。

继续滑动看下一个
达达集团技术
向上滑动看下一个