写点什么

数据采集方案设计与实践

2021 年 4 月 08 日

数据采集方案设计与实践

一. 数据采集是什么?

所谓“数据采集”,指的是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。比如用户某个 icon 点击次数、观看某个视频的时长等等。


数据采集的技术实质,是先监听软件应用运行过程中的事件,当需要关注的事件发生时进行判断和捕获。

在数据分析的整个体系中,通常是由数据采集、数据传输、数据建模、数据统计/分析、数据可视化反馈 5 个步骤组成,我们认为,第一个步骤,也即数据采集是最核心的问题。数据采集是否丰富,采集的数据是否准确,采集是否及时,都直接影响整个数据分析的效果。所以如何选择正确的数据采集方式,采集哪些数据对做好数据分析至关重要。

二、数据采集的现状

企业在数据采集的道路上经常会遇到各种各样的问题,如何采?采哪些?用什么手段?


目前现有企业的数据采集工作,通常会选择三种途径,分别是第三方统计工具、通过业务数据库做统计分析和、通过后端接口去做代码打点并结合业务数据库做精细化统计分析。

1、第三方统计工具

其中,友盟、百度统计等第三方统计工具,通过嵌入 APP SDK 或 JS SDK 来直接查看统计数据。这种方式简单、免费,基本满足宏观基础数据分析需求,如访问量、活跃用户量等。但使用这类统计工具的用户很快便会发现简单免费的同时存在一些问题。


  • a.由于数据采集不够完整,无法实现深度分析

这种方式的 SDK 只能采集到一些基本的用户行为数据,如设备的基本信息、用户执行的基本操作等数据,无法采集到一些精细化的维度。例如,在一些提交操作中,提交对应的个人信息、事项等信息无法采集,导致后续的分析成了“巧妇难为无米之炊”。


  • b. 安全顾虑,云模式的数据分析平台让不少企业不愿意将核心数据放在第三方平台上。


  • c. 基于第三方平台,缺乏灵活度,无法满足定制化的需求,比如数据采集的各种采集策略动态控制等等。

2、通过业务数据库做统计分析

通过业务数据库实现统计分析时,一些基于业务数据库中存储的事项、用户信息等数据,进行常规的统计分析需求,实时且准确,但也有不足之处。

  • 首先,性能较差,无法进行批量数据操作。业务数据表设计针对高并发、低延迟的小操作,而数据分析常常针对大数据进行批量操作,导致性能很差。


  • 其次,缺少必要的数据字段。业务数据库是为满足正常的业务运转服务的,而有些分析需求用到的信息并不会在业务数据库中出现。比如浏览器版本信息,设备信息等,我们在进行数据分析时就会用到,分析不同设备版本的用户转化情况,但是正常的业务流程并不使用,这时我们就无法进行对应的分析。

3、通过后端接口去做代码打点

在某个控件操作发生时通过预先写好的代码来发数据的代码埋点,能够做到精细化的获取用户行为数据,但包括用户的绑定、用户行为路径的分析,页面时长的统计、以及后续数据的流转并没有成体系,往往还是需要结合业务数据库去做最终的数据统计分析,所以与通过业务数据库做统计分析存在同样的性能问题。

三、数据采集系统总体方案设计

基于上述现状,结合政务项目自身特点(我们希望能保证采集数据的安全问题,又能携带用户属性和事件属性实现精细化的数据运营,还需要保证批量分析操作的性能,同时又能灵活方便的动态修改数据采集的采集策略,满足需求的多变性),我们搭建了一套自己的数据采集系统。


我们整个数据集采系统共包括 5 个模块:

前端 sdk、后端服务、etl 解析模块、可视化埋点 websocket 服务、后台管理端。

我们的数据采集系统支持多个前端渠道(包括 PC、移动端(iOS、android)、小程序)的 sdk 集成,同时支持多种数据采集方式,包括代码埋点、全埋点、可视化埋点三种。

  • a、代码埋点

是目前常用的数据采集方式,主要包括 web、h5 页面的 JS 埋点、移动端的 iOS、Android 埋点、微信小程序等.通过代码方式进行埋点,优点是数据采集比较全面、准确


  • b、全埋点

相对于传统的采集方式,全埋点的采集方式更加简单、快捷,并且可以看到页面元素点击的情况,更加了解自身的产品特点。缺点是采集的数据过于多,只要是可点击元素都会采集,上传数据多,消耗流量多。无法采集到更深维度的信息,如事件的属性,用户的属性等。


  • c、可视化埋点

可视化埋点是基于全埋点之上,需要业务同事对页面的元素进行圈选,被选择的元素才会采集。


可视化埋点基本和全埋点相同,具有同样的优缺点,虽然解决了全埋点数据杂乱的问题,但是每次页面的结构变化,都会使选择失效,需要重新圈选才可以,业务人员工作量较大。


可以根据不同的业务需求去选择不同的数据采集方式组合,从而真正实现精细化的数据采集。


同时我们还支持以云配置的方式,满足不同的数据采集策略实时变更的需求,省去了传统的变更采集策略需要发版本的问题。


四、核心技术实现

1、全埋点

  • a、代码拦截系统事件

    以 iOS 为例。动态地在函数调用前后插入相应的代码,在 Objective-C 中我们可以利用 Runtime 特性,用 Method Swizzling 来 hook 相应的函数,为了给所有类方便地 hook,我们可以给 NSObject 添加个 Category,名字叫做 NSObject+MethodSwizzling,


+(void)swizzleMethod:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector {Classclass=[selfclass];//原有方法Method originalMethod = class_getInstanceMethod(class, originalSelector);//替换原有方法的新方法Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);//先尝试給源SEL添加IMP,这里是为了避免源SEL没有实现IMP的情况    BOOL didAddMethod = class_addMethod(class,originalSelector,                                        method_getImplementation(swizzledMethod),                                        method_getTypeEncoding(swizzledMethod));if(didAddMethod){//添加成功:表明源SEL没有实现IMP,将源SEL的IMP替换到交换SEL的IMP        class_replaceMethod(class,swizzledSelector,                            method_getImplementation(originalMethod),                            method_getTypeEncoding(originalMethod));}else{//添加失败:表明源SEL已经有IMP,直接将两个SEL的IMP交换即可        method_exchangeImplementations(originalMethod, swizzledMethod);}}
复制代码


  • b、全量收集

全量收集采用 hook AppDelegate 代理、UIViewController 生命周期、按钮点击事件、手势事件、各种系统控件的点击回调方法、应用状态切换等实现。 

 

动作
事件
UIViewController 生命周期函数
给 UIViewController 添加分类,hook 生命周期
UIButton 等点击
UIButton 添加分类,hook 点击事件
手势事件 UITapGestureRecognizer、UIControl、UIResponder
相应系统事件

 

以统计 PV 事件为例,我们对 UIViewController 进行 hook,


// load 方法里面添加 dispatch_once 是为了防止手动调用 load 方法。+(void)load {staticdispatch_once_t onceToken;    dispatch_once(&onceToken,^{@autoreleasepool{[[selfclass] swizzleMethod:@selector(viewWillAppear:) swizzledSelector:@selector(zg_viewDidAppear:)];[[selfclass] swizzleMethod:@selector(viewWillDisappear:) swizzledSelector:@selector(zg_viewDidAppear:)];}});}
-(void)zg_viewDidAppear:(BOOL)animated {// do something CCBFT * CCBFT =[CCBFT sharedInstance];NSMutableDictionary*data =[NSMutableDictionary dictionary];[data setObject:@"pv" forKey:@"$eid"];[data setObject:isNil([selfCCBFTScreenName]) forKey:@"$url"];[data setObject:isNil([selfCCBFTScreenTitle]) forKey:@"$page_title"];[data setObject:isNil(CCBFT.ref) forKey:@"$ref"];[CCBFT autoTrack:data];[CCBFT startTrack:@"test"];[self zg_viewDidAppear:animated];}-(void)zg_viewDidDisappear:(BOOL)animated {// do something CCBFT * CCBFT =[CCBFT sharedInstance];[CCBFT endTrack:@"test" properties:@{@"":@""}];[self zg_viewDidDisappear:animated];}
复制代码

2、可视化埋点


可视化埋点方案图示


根据标识来识别每一个事件, 针对指定的事件进行取参埋点。而事件的标识与参数信息都写在配置表中,通过动态下发配置表来实现埋点统计。设置状态通过特定动作来与前端建立 socket 连接,并传递当前应用的界面信息。


工作状态从服务器后台获取当前的配置信息,依据路径表来查找想要监测的 view,并添加代理来统计行为,利用一份配置表来管理这个“事件唯一标识符“。


这里主要分为两个部分 :

  • a、事件的锁定

事件的锁定主要是靠 “事件唯一标识符”来锁定,而事件的唯一标识是由我们写入配置表中的。这里分为两种,本地配置表和线上下载的配置表。


  • b、埋点数据的上报。

埋点数据的数据又分为两种类型:固定数据与可变的业务数据, 而固定数据我们可以直接写到配置表中,通过唯一标识来获取。而对于业务数据,我是这么理解的:数据是有持有者的,例如我们 Controller 的一个属性值,又或者数据再 Model 的某一个层级。这么的话我们就可以通过 KVC 的的方式来递归获取该属性的值来取到业务数据。

五、总结

总而言之,要做好用户数据行为分析,数据源很重要,我们要更“全”、更“细”地采集数据。无论选取什么样的数据采集方式,这些都是手段,需要根据不同的应用场景,灵活设计数据采集方案。


以上,就是我们针对北京事业群政务项目需要选择的数据采集方式的介绍,希望能对你们了解数据采集与埋点有帮助!


本文转载自:金科优源汇(ID:jkyyh2020)

原文链接:数据采集方案设计与实践

2021 年 4 月 08 日 07:001139

评论

发布
暂无评论
发现更多内容

牛批!阿里P8大牛写了一份Spring Boot2教程已整理成文档免费分享。谁学谁真香系列!

Java成神之路

Java 程序员 架构 面试 编程语言

业务中台建设 - 自底向上演进

孝鹏

架构 中台 业务线 数字化转型 沟通

MindSpore手写数字识别初体验,深度学习也没那么神秘嘛

华为云开发者社区

人工智能 学习 手写识别

深入了解物理内存管理-伙伴(Buddy)算法

ShenDu_Linux

Linux 算法 内存管理 内核

怎么保护自己的音乐作品不被盗用,用FL制作防盗水印片段。

奈奈的杂社

【行业分享】叮咚课堂邱明丰:在线教育的最终形态的探索

ZEGO即构

Vim - 可能是投资回报率最高的 Editor

star_fx

vim

Arthas 实践——生产环境排查 CPU 飚高问题

阿里巴巴云原生

开源 云原生 中间件 Java 25 周年 Arthas

利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题

阿里巴巴云原生

阿里云 开源 云原生 中间件 Java 25 周年

Java基础+JVM+分布式+算法+锁+MQ+微服务+数据库等499道Java面试题整理(含答案)。

Java成神之路

Java 程序员 架构 面试 编程语言

从应用迁移到平台微认证:鲲鹏技术解读

华为云开发者社区

鲲鹏 代码迁移 arm

架构师训练营第十一周作业

邓昀垚

RocketMQ 很慢?引出了一个未解之谜

阿里巴巴云原生

开源 云原生 中间件 Java 25 周年 Arthas

最近我发现瑞幸在这样做私域运营

Linkflow

营销数字化 客户数据平台 CDP 私域运营

首家支持阿里云函数计算 APM技术为Serverless环境赋能

博睿数据

阿里云 Serverless 运维 APM 函数

区块链电子票据解决方案--区块链赋能纳税服务

13530558032

时空碰撞系列·终

誓约·追光者

数据分析 Sparksql

多线程源码明白了吗?不明白的话来看腾讯大牛给你画的面试重点

996小迁

Java 学习 编程 架构 面试

架构师训练营第十一周总结

邓昀垚

架构师训练营第二周框架设计学习总结

Geek_xq

二本毕业两年Javacrud经验,面试阿里侥幸通过定级P6,分享这波面经,希望能够激励到同样被学历所困扰的技术人,能够对职业生涯和技术规划有一个参考价值

Java成神之路

Java 架构 面试 编程语言 java程序员

还在头疼C艹中的智能指针吗?

北游学Java

指针 C/C++

阿里P8大牛总结整理的精选技术好文:Redis+Nginx+设计模式+Spring全家桶+SQL+Dubbo

Java成神之路

Java 程序员 架构 面试 编程语言

Spring+MySQL+数据结构+集合+注解+NIO+多线程进阶学习思维脑图总结!

Java成神之路

Java 程序员 架构 面试 编程语言

架构师训练营第 1 期 第 10 周作业

李循律

区块链商品溯源系统开发,区块链防伪追溯系统

13530558032

智慧警务大数据决策指挥平台,警务大数据可视化平台开发

13530558032

蘑菇街Java大牛熬夜半个月纯手打肛出的一份《多线程源码学习笔记》文档资料,赶紧收藏学习!

Java成神之路

Java 程序员 架构 面试 编程语言

打工人、打工魂、高效MES助力打工者都是人上人

Learun

敏捷开发

对于CRM之于现代化企业的影响以及作用的分析

Marilyn

敏捷开发 快速开发 企业开发 CRM 企业应用

LeetCode题解:121. 买卖股票的最佳时机,暴力法,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

4月17日 HarmonyOS 开发者日·上海站

4月17日 HarmonyOS 开发者日·上海站

数据采集方案设计与实践-InfoQ