DataWorks数据埋点的设计及未来发展的思考

2023-10-29

什么是前端埋点?

        马总曾经说过现在是DT时代(大数据的时代)。
        数据已经成为一家公司最宝贵的财富,越来越多的互联网公司开始重视数据的应用。数据应用的过程是:数据收集 -> 数据整理(数据同步)-> 数据分析 -> 数据可视化。
        前端埋点是用户行为数据采集领域非常重要的手段,指的是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。
        当然前端埋点上报也不仅仅有用户行为数据的采集,还有一个很重要的领域——前端健康度分析。包括采集页面加载性能,js报错收集,接口出错上报,自定义测速等等。

为什么要进行前端埋点

        埋点可以帮助分析人员获取真正需要的业务数据及其附带信息,对产品发展、业务决策和指导运营有非常重要的作用。
        在不同场景下,业务人员关注的信息和角度可能不同。典型的应用场景如淘宝活动运营,以及PD和UED。前者注重来源渠道和广告效果,而后两者更在意产品本身流程和体验的优化。这就需要通过埋点采集到对应的数据,以数据为依据来做决策和判断。
        打个比方,城市要提高一个路口的通过率,那必须要重新调整交通信号灯的逻辑。光看是不行的,我们需要同时拿到路口各个时间段和各个方向的车辆流动量,这就需要在相应的节点上安装摄像头和交通流量计数器。埋点同理。

DataWorks的产品和埋点需求

        DataWorks是阿里集团内最大最优秀的一站式大数据平台,整合了大数据设计和开发、运维监控、数据集成、数据管理,数据安全,数据质量等产品,并打通算法平台pai,形成了完整的大数据闭环。

需求背景

        目前整个DataWorks所有前端产品缺少一个统一化的埋点方案,导致产品和UED无法准确地拿到用户数据来辅助决策。
        鉴于此背景,我们在为DataWorks做埋点和数据上报的时候,遇到了不小的挑战。

需要上报的数据

  • UV/PV(支持单页应用)
  • 所有按钮链接的点击事件
  • 导航点击事件
  • 表格筛选表单的使用情况
  • 操作系统和浏览器信息
  • 前端性能数据
  • 前端报错记录
  • 接口返回时间
  • 接口报错信息,包含errorCode,requestId等

碰到的问题

  1. 首先,DataWorks是一个数据平台,包含产品15+,涉及到的页面将近50个,如果使用传统埋点方式,工作量巨大。
  2. 因为历史遗留问题,产品的前端技术栈不统一,有jquery、requirejs、react、angular1.x,还有一些自研的前端框架,导致无法使用统一的埋点规则进行数据采集上报。
  3. DataWorks的很多产品都是复杂的单页应用,而且需求交互迭代特别频繁,对用户行为数据埋点上报的拓展性和灵活性有非常高的要求。

其他业务需求

  1. 业务上对用户的角色、BU等信息进行分析有需求,所以在上报的数据中需要带上当前用户信息及一些产品自定义的信息。
  2. 能够有一个地方可以看到所有产品的PV/UV,及在线时长,流失率等指标。
  3. 针对定制化的需求,能够方便地对上报的数据进行抽取分析,并输出报表。
  4. 能够支持专有云的埋点上报。

埋点设计

设计原则

  1. 能够支持基础的PV/UV以及前端健康度的上报,也可以支持用户自定义上报。
  2. 尽量做到无痕,或者尽可能少的代码改动。降低接入埋点的工作量。
  3. 能够提供快速的数据抽取分析的方法。
  4. 可以让开发者针对不同的产品,在每次数据采集的时候,传入自定义数据。例如,用户信息,项目信息等。
  5. 默认全部记录,可设置抽样上报,并提供开关,关闭埋点功能。
  6. 统一入口,比如在公共头里统一接入埋点,再对外暴露方法,让各个产品设置自己的埋点配置。

技术选型

集团内比较成熟的两个方案:

  • aplus:可以进行采集用户的PV/UV,并统计页面的在线时长,流失率等指标,而且提供了页面可视化展示各项数据。
  • retcode:更专注于对前端健康度的监控和报警,并提供了灵活的自定义上报接口。另外retcode的源日志数据比较开放,更方便做后续的数据分析。

        针对DataWorks的数据上报需求,我们决定使用retcode进行主要的数据上报,aplus也会默认接入(阿里的Nginx会默认在页面中插入aplus的js)。

        但在埋点需求中有一项aplus和retcode都无法实现,就是“所有按钮链接的点击事件”。这个需求就需要使用到“无痕埋点”(在“无痕埋点”的场景下,数据监测工具一般倾向于在监测时捕获和发送尽可能多的事件和信息,而在数据处理后端进行触发条件匹配和统计计算等工作,以较好地支持关注点变更和历史数据回溯。)。

        但因为DataWorks的产品技术栈不统一,尤其当下业界在react和angular框架的无痕埋点方向上基本属于空白状态。所以我设计了一套埋点机制,来实现不同前端框架的下的无痕埋点,并将采集到的事件和数据通过retcode进行数据上报。

架构设计

从结构上划分,分为底座和插件两大块。

  • 底座:负责插件的装载、数据的封装处理和上报。
  • 插件:不同前端框架的埋点方案都基于规定好的数据格式开发插件,并按需插入到底座来实现埋点数据采集。

从功能上划分,底座总共分为三层,既数据采集层、数据处理层及数据传输层。

image.png

底座设计

上面讲到底座分为三层:

  1. 数据采集层,提供了一整套的插件接入机制。底座自身并不提供数据采集的功能,它本身只是一个容器,允许各种插件按照一定的规则插入到底座中,提供数据采集的功能。
  2. 数据处理层:提供了数据的规范,各个插件需要依照该数据规范把采集到的数据进行包装(例如加入各个产品配置的业务数据),然后传给数据传输层。
  3. 数据传输层:封装retcode进行埋点上报。

        这样设计的好处是底座不负责采集,采集的工作由插件实现。而插件机制又保证了整个埋点机制的拓展性,甚至未来其他的开发者也可以基于这套底座和规范,去开发各种前端框架的埋点上报。

插件设计

        我们目前开发了jQuery、react及fetch的埋点采集插件。它们前端事件和请求数据的采集方案,主要是通过Hack通用的前端框架,在事件处理函数上做文章。具体Hack的方式下面会描述。

  • 优点:能够较为精确地定位到具体的选择元素以及其功能,并且可以结合框架的优势传递业务数据,更能满足我们在复杂业务场景下处理数据的需求。
  • 缺点:必须要在执行用户代码之前执行我们的埋点代码。
jQuery的埋点方式:
  • 第一步: 改写jQuery的事件绑定方法(如on,click,delegate等)
  • 第二部: 判断如果是click,则记录selector,并对回调函数做一层封装。
  • 第三部:执行回调封装的时候,会把selector传入函数内,上报上去。

注: 这里selector需要注意区分,因为有可能是通过parent或者find找到的,我们需要根据selector以及prevObject来精确查找具体的元素。

React的埋点方式:

        通过改写React.createElement,其中可以拿到组件传递的Property,通过Property可以进行判断,如果含有onClick事件的话,则在此事件中进行数据的上报操作。整个过程中可以上报Component名称以及Component的父子关系。

请求采集方案:

        目前对于jQuery的Ajax。主要做法是修改ajax的beforeSend函数和complete函数,来对ajax进行统一的处理及上报。
        如果是fetch,则hack浏览器原生的fetch方法,来对请求进行包装,上报请求信息。

其他框架Angular、vue、backbone....

        如果想使用我们的这套埋点机制,任何前端框架只需要遵循传输的数据格式,然后实现各自的点击事件采集即可。

解决的问题和优化

优化:

  1. 优化pv/uv数据的采集,由于用户在使用DataWorks时,页面不会关闭,导致PV/UV数据不准确。所以增加用户每日首次激活页面的时候也会进行PV/UV采集。
  2. jQuery插件中,减少不必要的全局事件,例如绑在body上,用来隐藏右键下拉菜单的事件。

解决掉的问题:

  1. retcode必须在页面文档流加载的时候引入,否则不会上报PV/UV和页面加载性能数据。这个问题很严重,因为我们的基础库是通过公共头统一引入的,这个时候文档流已经执行完毕,所以我们通过手动调用retcode提供的spm上报接口来实现PV/UV的上报。另外页面加载性能数据,也通过浏览器的PerformanceTiming API进行手动采集上报。
  2. jQuery的on事件绑定方法,在hack的时候需要提取guid,并赋给hack的函数,否则off的时候会找不到对应的函数。
  3. 推动七星阵支持retcode数据上报。

后期计划

本期主要目标在于产出数据,即实现对买点数据的采集、上报、汇总工作。后续工作可以从前端及后端数据处理两个方向进行发展。

前端方向:

  1. 制作浏览器插件: 基于埋点数据,开发类似Udata的浏览器插件,能够帮助PD、UED、运营对页面上用户的行为数据有个直观的认识,从而支撑他们的产品设计和决策。这个插件的数据来源可以是实时数据,也可以是离线数据。
  2. 数据可视化: 与集团内部的一些自定义报表工具打通,能够快速方便得进行数据可视化展现。

后端数据处理方向:

  1. 自动生成离线任务:DataWorks本身就是一整套的大数据平台,能够实现数据的抽取、分析和运维。后续将考虑搭建一套机制,能够自动的生成调度任务去帮用户进行数据分析。

即形成了 数据收集 -> 数据整理(数据同步)-> 数据分析 -> 数据可视化的闭环。
​​
image.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DataWorks数据埋点的设计及未来发展的思考 的相关文章

  • 禁用内容安全策略

    当我开发网站时 我经常想看看特定功能在网站上的外观如何 所以我会使用 chrome 开发者工具并经常运行一些 javascript 脚本 我经常发现一些脚本由于内容安全策略 CSP 而无法运行的问题 我完全理解该策略是为了防止跨站点脚本攻击
  • Angular 2 链式 Promise 并传递拒绝

    应该是一个简单的问题 但是我找不到有关如何做到这一点的文档 像这样链接一个承诺 Making a promise no problem let promise new Promise resolve reject gt let data d
  • VBA / HTML / jQuery 选择自动完成 - 在列表中选择

    我正在尝试使用 Excel 中的 VBA 在网站的列表中选择一个值 这不是一个 正常列表 该网站使用 jQuery 选择自动完成 如下所示 example http davidwalsh name demo jquery chosen ph
  • 使用 CryptoJS 更改密钥 [重复]

    这个问题在这里已经有答案了 我正在使用 CryptoJS 来加密和解密文本 在这里 我只是获取消息并显示加密和解密消息 我使用DES算法进行加密和解密 这是我的 HTML 文件
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 如何流式传输 OpenAI 的完成 API?

    我想流式传输结果通过 OpenAI 的 API 完成 https beta openai com docs api reference completions 该文档提到使用服务器发送的事件 https developer mozilla
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • 如何在 Angular 中从父组件访问子组件?

    I have mat paginator在子组件a中 如下所示 子组件 html
  • IE11不监听MSFullscreenChange事件

    我正在尝试使用 Bigscreen js 在 IE11 中使用全屏 但 IE11 不监听 MS FullscreenChange 事件 document addEventListener MSFullscreenChange functio
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是
  • 如何在jquery中获取保存时间和当前时间的差异?

    我想在 javascript 或 jquery 中获取保存时间和当前时间之间的时差 我节省的时间看起来像Sun Oct 24 15 55 56 GMT 05 30 2010 java中的日期格式代码如下 String newDate 201
  • 如何将函数内的捕获错误传递给父级

    我有这几行代码示例 想知道下面的逻辑到底如何 try var response child console log why here catch err console log should show this err function c
  • JavaScript onresize 事件多次触发

    我在尝试仅在触发 onresize 事件时运行一次函数时遇到一些麻烦 我已经看过这个问题DOM onresize 事件 https stackoverflow com questions 1500312 javascript onresiz
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas
  • 使用异步调用时如何从 javascript 更新元刷新?

    我有一个系统 它使用元刷新来注销页面 该系统会在空闲用户后进行清理 不用担心 服务器也会导致会话超时 我开始通过 ajax 进行一些操作 不是真正的 xml 但这不是重点 我可以运行从异步请求返回的javascript 所以我想知道是否可以
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse

随机推荐

  • 我看鸿蒙操作系统

    华为宣布推出鸿蒙操作系统 其实我觉得能理解 但也蛮无奈的 所谓不得已而为之 google不提供后续版本授权 不提供新的支持 怎么办 硬着头皮也要上 有些自媒体说什么安卓慌了 google吓坏了 我真的想骂人 一群王八蛋为了点击率什么都敢写
  • 日志分析 入侵检测--实战

    收到客户服务器被入侵消息 希望我给他做一次入侵排查 刚做完顺手记录一下 入侵排查思路 0x01 日志分析 1 爆破ip统计 grep i Failed var log secure awk print NF 3 sort uniq c so
  • fgets()

    fgets 函数简介 读字符串函数fgets 的功能是从指定的文件中读一个字符串到字符数组中 函数调用的形式为 fgets 字符数组名 n 文件指针 要从键盘输入时文件指针的参数为 stdin 其中的n是一个正整数 表示从文件中读出的字符串
  • Springboot中创建拦截器

    目录 目的 实现过程 1 创建拦截器 2 注册拦截器 完整代码 目的 在Springboot项目中创建拦截器 在进入Controller层之前拦截请求 可对拦截到的请求内容做响应处理 如 校验请求参数 验证证书等操作 实现过程 1 创建拦截
  • PTS测试

    PTS性能测试 一 什么是性能测试 性能测试PTS Performance Testing Service 是一款简单易用 具备强大的分布式压测能力的SaaS压测平台 PTS可以模拟复杂的业务场景 并快速精准地调度不同规模的流量 同时提供压
  • JAVA中String及String常用的方法

    String string是表示字符串的字符串类 public class StringDemo public static void main String args 常见面试题 String s new String hello 问 如
  • Assuming drive cache: write through

    我也遇到过 关机重启就可以了
  • linux内存管理(十四)-内存OOM触发分析

    在内存分配路径上 当内存不足的时候会触发kswapd 或者内存规整 极端情况会触发OOM 来获取更多内存 在内存回收失败之后 会进行OOM OOM的入口是 alloc pages may oom 文件位于mm page alloc c中 s
  • 线代——基础解系 vs 特征向量

    基础解系 基础解系的概念是针对方程而言的 齐次线性方程组的解集的最大无关组称为齐次线性方程的基础解系 要求齐次线性方程组的通解 只需求出它的基础解系 例 特征向量 特征向量和特征值满足关系式 A A
  • 物理学家的Python

    特点 从基本的交互式 Python 开始 熟悉该语言 详细讨论了所有程序清单 介绍了 Matplotlib 图形 用于生成表示数据和函数图的图形 例如场线 考虑了动画函数图 有一章专门讨论代数方程和超越方程的数值解 讨论了基本的数学原理 并
  • 之前的一些笔记 py

    cmd清空 cls win e 打开我的电脑 好习惯 文件夹后面写数字表明软件的版本 怎么将2个分开的网页窗口合并成一个 鼠标按住一个窗口中的标签页不放 并向其它窗口的标题栏中拖动 即可把当前标签页合并到其它窗口中 注意 一定要按住标签页拖
  • 学习OpenCV——Surf(特征点篇)&flann

    Surf Speed Up Robust Feature Surf算法的原理 1 构建Hessian矩阵构造高斯金字塔尺度空间 其实surf构造的金字塔图像与sift有很大不同 就是因为这些不同才加快了其检测的速度 Sift采用的是DOG图
  • 我的博客即将同步至腾讯云+社区

    我的博客即将同步至腾讯云 社区 邀请大家一同入驻
  • OpenGL笔记之矩阵变换(Matrix Transformation)

    OpenGL笔记之矩阵变换 Matrix Transformation 分类 OpenGL 2012 08 06 21 21 3968人阅读 评论 1 收藏 举报 transformation matrix math 图形 影视 本文是学习
  • nftqin网站登录参数s算法逆向

    原文转载自http www itfvck com 7488 html 抓包数据 method POST authority api nftqin com scheme https path api app passwordLogin con
  • java 代码静态检查_[原创]Java静态代码检查工具介绍

    原创 Java静态代码检查工具介绍 一 什么是静态代码检查 静态代码分析是指无需运行被测代码 仅通过分析或检查源程序的语法 结构 过程 接口等来检查程序的正确性 找出代码隐藏的错误和缺陷 如参数不匹配 有歧义的嵌套语句 错误的递归 非法计算
  • 把win10系统迁移至ssd后,开机时电脑默认不会启动ssd里面系统的问题解决方法

    把win10系统迁移至ssd后 开机时电脑默认不会启动ssd里面系统的问题解决方法 电脑用了两三年了卡到不行 开机要两三分钟 刚开机后两三分钟内卡到都无法操作 于是乎 买了一块三星的860 evo的ssd 固态硬盘 打算对旧机升级一下 简单
  • elasticsearch之嵌套对象、父子文档

    一 嵌套对象 es并非关系型数据库 它并不擅长关系型数据库的join操作 在存储数据时 用冗余数据替代查询时的关联 如blog和comments 如果用关系型数据库 会将blog存一个表 comments存另一个表 然后将这两个表关联起来
  • 华兴数控g71外圆循环编程_数控车床加工时的复合循环指令G70,G71,G72,G73

    复合循环指令应用在切除非一次加工即能加工到规定尺寸的场合 主要在粗车和多次切螺纹的情况下使用 它主要有以下几种 外径 内径粗车循环指令G71 该指令将工件切削到精加工之前的尺寸 精加工前工件形状及粗加工的刀具路径由系统根据精加工尺寸自动设定
  • DataWorks数据埋点的设计及未来发展的思考

    什么是前端埋点 马总曾经说过现在是DT时代 大数据的时代 数据已经成为一家公司最宝贵的财富 越来越多的互联网公司开始重视数据的应用 数据应用的过程是 数据收集 gt 数据整理 数据同步 gt 数据分析 gt 数据可视化 前端埋点是用户行为数