我用埋点让老板安静 (埋点篇)

 
 

大厂技术  高级前端  Node进阶

点击上方 程序员成长指北,关注公众号
回复1,加入高级Node交流群

前言 (PREFACE)

某日在电梯间遇到老板,打完招呼后陷入沉默,1s,2s,3s, 也许老板想体现对下属的关心,突然开始提问

👴老板:

最近平台的PV,UV是多少啊

👦 我(最怕老板突然关心):

大概是XXX

👴 老板:

怎么突然增加了这么多啊

👦 我(擦一下冷汗,这题我会,幸好前两天听产品说过):

因为最近上了一个分享有礼活动,流量一下子就起来了

👴 老板:

不错,那活动页面的停留时长是多少啊,转化率怎么样啊,新用户占了多少啊,其中的留存率是多少啊....

👦 我(沉默,沉默是我最后倔强, 我们都没相关的埋点,哪里来的数据这些数据分析啊):

老板,我们没有相关的埋点统计

👴 老板:

什么! 埋点都没有 ? ##$%#

以上情节纯属虚构,但是在实际的工作中,数据埋点与我们的产品息息相关,大部分业务的迭代以及收益衡量都离不开埋点数据的分析。

在小编所在的团队,负责的主要是中后台业务,没有拉新和转化的压力,按上述例子看埋点就显得无关紧要了。实际的情况也是如此,在小编加入团队的初期,业务还处于高速发展期,团队业务基本都没有埋点数据,一切以完成业务功能诉求为主。

但小编本人认为不管什么类型的业务,埋点一定是不可欠缺的。

事实也是如此,举个例子,遇到一个业务诉求,某个模块的列表有太多的筛选项,我们想知道各个筛选项使用的频率,看是否可以做一些位置调整和取舍优化,但没有人能直接拍板如何进行调整和取舍。这时小编就推荐了前端埋点能力,辅助进行分析决策,最终顺利帮助产品完成了业务需求。埋点,很多时候是能对决策做有利支持,也是能辅助发现隐藏问题的,甚至,完美应对老板关心的问题,让老板安静下来。那么,下面随小编一起来学习下基础的埋点知识吧。

什么是埋点(WHAT)

如果要用一个成语来形容埋点,就是“守株待兔”,在特定的地方设定好特定的触发机制,等待用户来触发

b777c2707a379838d104946148895c51.png

埋点,它的学名是事件追踪(Event Tracking),主要是针对特定用户行为或业务过程进行捕获、处理和发送的相关技术及实施过程。埋点是数据领域的一个专业术语,也是互联网领域的一个俗称。

埋点是产品数据分析的基础,一般用于推荐系统的反馈、用户行为的监控和分析、新功能或者运营活动效果的统计分析

“前端埋点”作为埋点的一种主要方式,本质是记录和收集终端(App/H5/PC等)用户的操作行为,基本的实现原理是在通过采集代码,当用户的行为满足某种条件的时候,比如进入某个页面、点击某个按钮等,会触发采集记录和存储并上传,然后这些数据会被整合加以分析,在数据平台形成报表等被消费。

7c7a484faa27e6fb8015c352bb56f3e6.png

埋点采集上报流程示意图

PS:本文的埋点仅指行为埋点,对于性能埋点不在这里讨论

👤 性能埋点:

16bd1ca23108da78b838b7295c0c5d39.jpeg

👤 行为埋点: 
f64888945b3e5100643e7e1deada787d.jpeg

为什么要埋点(WHY)

  • 流量监测(按时间空间维度分析,留存分析,转化分析)

  • 构建行为路径, 获取用户的整条行为链路,实现用户分群、人群洞察、行为细查等,构建用户画像

  • 通过对埋点数据的处理、分析、建模,判断产品的效果和未来走向

  • 为营销策略提供数据支持,分析营销效果,提高渠道转化

  • 热力分析,帮助判断访客热衷的区域,评估网页设计是否合理等

  • 实施 AB Test, 持续优化产品,使产品在市场上更具有竞争力

什么情况下需要埋点(WHO/WHEN//WHERE)

情景剧场

以下剧情纯属虚构,如有雷同纯属巧合

小情景A:

👧PM同学(激动万分):

同学们,我昨晚灵感突发,设计了一个巨🐂的功能,预计能提升产品XX的转化率,听我细说,它是......(two hours later)

👦RD同学(OS):

好复杂,听的头晕了

👦QA同学(OS):

手里好多需求在排期,这个工作量一看就很大,排不过来了😭

👴资深大佬(沉思片刻):

这个功能比较新颖,用户是否买账也没有具体的调研支撑,它的效果还有待论证,同时这个功能做下来要耗费我们XX+人力啊,个人觉得它的ROI不是那么高,咱们能不能先做下市场调研下,根据结果简化下,先做个MVP版本,加上埋点采集分析,根据数据来看下实际效果,判断后续的投入

小情景B:

👧UED同学:

我们针对这个产品要进行改版优化,这次改版设计参考了%%¥#&#!.........,整体能更好的吸引用户,综上这是一件很重要的事,希望各位研发同学大力支持

👦FE同学:

怎么又要进行改版,上次改版才没过几个月,仅仅改个交互样式的能有大差别,还不如多做两个新功能实在,这个吸引用户怎么判断啊,有什么数据支撑嘛,怎么能看到实际效果呢?

👴资深大佬:

AB实验走起,埋点大法好,行不行咱们数据说话!

小情景C:

👧运营同学(抱着一叠策划书):

老板,我们想做一个营销活动,预计能吸引XX新客,这些新客后续的留存率预估为XX,为产品整体提升XX转换率。所以,老板打钱💰!

🙎老板(战术后仰):

真的嘛,你不要骗我读书少啊🤔,那个谁,你觉得呢?

👴资深大佬:

老板,咱们可以对活动的进行全链路埋点,跟踪分析用户的数据,对本次活动的效果进行评估。如果效果好咱们可以考虑加大投入,多招点人做大做强

埋点场景

mindmap
      埋点场景
          产品
            用户日活/留存/转化
            核心转化流程分析
            新功能效果验证
            产品问题洞察
            用户路径追踪
          运营
            用户日活/留存/转化
            营销活动ROI评估
            用户行为分析、用户画像
          设计   
            交互效果评估
          研发
            人力等资源ROI评估
            智能推荐
            场景化提示
          老板
            市场分析
            资源投入

怎么埋点(HOW)

埋点类型

埋点方式多种多样,按照埋点位置不同,主要可以分为前端(客户端)埋点与后端(服务器端)埋点,本文主要讨论前端埋点

👤 后端埋点:

559718a366c20a5a45f16f938d493a45.png

👤 前端埋点:

bfad1e597be8fc2738767911af87e797.png

代码埋点全埋点

可视化埋点

定义针对想要的数据单独定义,并可以通过变量丰富埋点的信息,手动进行代码埋点,以支持上下游分析数据采集sdk无区别的对待所有事件,将所有事件(页面的加载成功事件、模块的浏览和点击事件)全部获取后先存下来,到使用的时候,再根据具体的页面路径和控件名称,去捞取相应的数据以可视化的方式,在页面中操作,选择埋点位置/模块,实现埋点采集上报。想埋哪里点哪里
原理按需埋点,跟迭代运行,定义好埋点事件后添加相应埋点代码通过SDK将程序中的数据尽可能多的采集、存储下来,以备后续消费使用将核心代码与埋点配置分开,在可视化界面中编辑埋点信息生成埋点配置,从服务端拉取配置,根据配置监听相关交互操作并采集上报
工作量引入SDK,根据需求添加埋点代码引入SDK即可引入SDK,可视化圈定并选择埋点模块
优势按需采集,数据信息更聚焦和全面,可定制化 数据传输、存储消耗小开发工作量小,仅前期引入SDK即可 数据链路完善,可通过行为数据钻取等,发现一些僵尸功能开发工作量小,节省研发人力, 与研发流程解耦,产品、运营人员也单独进行埋点操作, 配置化,无需发版即可生效
劣势需要人力定义、开发、验证 跟随版本迭代,需要发版 埋点代码和业务代码可能存在耦合对比代码埋点单条数据信息内容少, 数据传输、存储消耗大,不能自定义事件与代码耦合的问题,一旦对页面路径,模块名称位置等进行改动,埋点就会失效, 新增自定义事件比较困难, 可覆盖的范围有限,支持的埋点都是可视化元素触发
适用场景埋点诉求复杂,需要为业务定制化的行为埋点业务多变,但分析诉求比较轻量,不需要自定义事件的场景业务页面多,且变动相对不是很频繁,有一定的分析场景但都能枚举, 用户行为可直接与页面可视元素挂钩

从工作量上来看 代码埋点 > 可视化埋点 > 全埋点

从准确性上来看:代码埋点 > 可视化埋点 > 全埋点

投入和产出成正比,但这里的对比有个前提,可视化埋点的基建工作不算在里面

埋点模型

埋点模型包含两个主要概念:事件(event)属性(params)

事件:通过埋点定义的用户行为或业务操作,比如页面打开,页面离开,模块曝光,模块点击

属性:事件附带的各种维度信息,比如用户信息,网络信息,设备信息,事件具体维度信息等

一个设计的相对完善的模型,一般包含用户行为五元素

通过这个可以详细的分析是谁在什么地方什么时间,怎么样进行了什么操作

da57537759129228e9459add3d4ded9f.png

举个🌰子:

93566a6798f31b8dcc12c42ceb199046.png

埋点模型举例图

模型事件

仅供参考

  • APP启动 (AL)

APP应用专属,APP冷启动

  • APP隐藏 (AH)

APP应用专属,APP隐藏到后台运行

  • APP展现 (AS)

APP应用专属,APP从后台运行切打开

  • APP退出(AQ)

APP应用专属,APP程序销毁

  • 页面打开(PV)

网页程序专属,页面打开

  • 页面离开(PQ)

网页程序专属,页面离开

  • 模块曝光(MV)

通用,模块的曝光事件

  • 模块点击(MC)

通用,模块的点击事件

模型属性

仅供参考

  • 用户属性

    user_id // 用户ID
      user_name // 用户名称
      uid // 应用唯一id
  • 时间属性

    event_time // 上报的时间戳
     time_zone // 时区
  • 网络属性

    ip // ip地址
      network_type // 网络类型
      carrier // 运营商类型
  • 设备属性

    device_type // 设备类型
     device_id // 设备ID
     os_type // 操作系统类型
     os_version // 操作系统版本
     user_agent // 用户代理
  • 地域属性

    contry // 国家
      city // 城市
  • 应用基础属性

    app_version // 应用版本
     app_id // 应用id
     app_name // 应用名称
     env // 环境
     source // 来源
     
    -

埋点上报方式

当用户触发一个埋点被监听到时,埋点的上报通常分为三步

第一步:对数据进行处理加工,比如添加上who,when,where等信息

第二步:对数据进行队列化, 判断是批量上报还是单条上报,实时上报还是延迟上报等

第三步:对数据进行上报,发送请求进行上报

数据队列处理

从数量维度,分为批量和单条

从时间维度,分为实时和延迟

一般不做任何处理的情况下都是单条实时上报,在真实的项目场景下,当需要上报的数据量逐渐变多时,就需要考虑进行批量上报和延迟上报,本质上都是为了不阻塞业务程序的执行,上报本来就是用户无感知的事情,用户不能为此耗时买单(流量必须买单🐶)

a7f7b74f91741cff23fe003afa9fdfe1.png

无优化处理示意图

1f9165d3d8099b59456ce0662ae2e9f9.png

优化处理示意图

从数量维度上,将单条上报聚合成多条上报,大大减少了数量的请求(比如列表页每条数据的曝光事件)

从时间维度上,先本地化存储数据,将上报请求延后,优先处理业务逻辑请求,在程序空闲时进行上报

数据请求处理

传统XHR请求Image 对象Beacon****API
原理直接将数据通过 ajax 发送到后端用图片的src属性发送请求进行数据上报,一般采用1*1像素的透明 gif 进行上报,因为gif图片格式体积小使用Beacon api 发送请求上报,Beacon api 是w3c新引入的补充性api,就是用来解决web页面在触发卸载销毁事件unload期间会中断所有异步xhr请求的问题
优势灵活地设置请求头属性  针对POST, 能发送的数据量大没有跨域问题,image 天然支持跨域。不会阻塞页面加载,影响用户的体验。src请求体量小,速度快-   页面销毁时的埋点请求不会中断
劣势针对GET请求,存在安全问题,请求参数被暴露在IURL 中,同时GET请求在URL中传送的参数是有长度限制的,太大的数据量不适用,  页面销毁时还未上报成功的埋点大概率上报失败,   天然不支持跨域,需要进行设置图片src 中的URL内容是有大小限制的,太大的数据量不适用,同样的安全性问题只支持post请求,并且发送的数据量不会像正常xhr的post数据量那么大,最大数据量大小是由客户端(用户浏览器)版本决定的,chrome@70版本测试大概15MB左右(一般都够用),  浏览器兼容性问题

对于数据请求处理,主要考虑的有三个因素

  • 跨域的问题

  • 页面销毁时,如何保障还未成功上传的数据完成数据上传请求

  • 大数据量的上传

这样看的话数据请求方式上没有银弹,每种方式都有一定的缺陷

所以,一般采用组合方式,根据数据量,选择Image或者Beacon的方式,若检测不支持Beacon, 在大数据量时回退到传统的XHR请求

埋点迭代(代码埋点)

埋点迭代流程
c48bcf5791d00cea6e57f6098ce3b464.png

迭代流程示意图

流程中各阶段各岗位职责
阶段事项岗位人员职责重要产出
需求阶段埋点需求产出PM/运营明确看数需求,明确埋点目标,产出埋点需求文档埋点需求文档

埋点评审ALL参与评审并给出结论评审结论
设计阶段埋点设计DA根据业务需求明确需要采集的内容和采集逻辑,设计具体埋点,产出埋点设计文档埋点设计文档
开发阶段埋点开发FE/RD根据具体埋点设计进行埋点逻辑开发开发后进行埋点自测代码
测试验收阶段埋点测试QA根据具体埋点设计进行埋点测试,检查漏埋,不规范属性、少报等信息,方式不限可人工对比,自动化脚本,或使用埋点验证工具等,最终产出埋点测试报告埋点测试报告

埋点验收DA更进一步检查,验收埋点测试报告是否符合埋点设计的规则,产出埋点验收结论埋点验收结论
上线阶段上线ALL包含代码在内的相关内容等上线,并线上验收线上验收
分析总结阶段数据分析 分析结论PM/运营/DA一般在项目运行一段时间后,拉取数据进行分析,根据需求阶段的目标,产出数据分类结论分析结论

埋点注意事项(TIPS)

埋点好用,但不可乱用!

数据安全问题

  • 埋点的数据里可能存在一些敏感信息,需要考虑脱敏或者在传输时进行加密,甚至在消费时也需要处理

    • 针对国际化的业务,可能还要考虑数据存储相关的问题   ad1edf677575c14f7dd33b2421192942.png

  • 埋点数据的消费需要有较完善的授权体系,不管是谁,最好不要给永久权限,对数据的下载等做强监控

    b190d41b8abce8d43e26949b3901a452.jpeg

埋点的准确性

模块曝光的时机

较为标准的针对模块曝光的定义:窗口可视区域内 && 组件矩形与视窗区域发生交集 && 交集垂线距离 >= 1px && 停留时间 >= XXms

针对列表或者瀑布流等模块,这种曝光定义的监听是相对比较麻烦且容易不准确的。那么就有比较偷懒的做法是直接拿到数据就全量上报,不考虑是否真的出现在窗口可视区域中。这样会导致上报数据不准,影响数据分析的结果。比如曝光到点击的转化率很低等

bf54085801edca0f4045cae926707eaf.jpegPV事件上报的时机

PV是一个页面打开时第一个事件,埋点上报的时间应该早于该页面其他任何事件,但如果埋点不当,可能会有其他事件先于PV事件上报。

产生这种情况的原因,主要有两个

一是PV埋点代码的位置不对,触发时机晚于其他事件了

二是PV埋点上报里存在异步逻辑,导致执行晚了 mv事件(吃瓜.jpg):

bfafff75f11093471fd175de40e838ec.png

pv事件(痛哭.jpg):

d7adee10239247cd81620528d199b8f7.png

重复曝光和刷新机制

  • 重复曝光

    同一个模块多次出现是否需要去重

  • 刷新机制

页面内模块的刷新,是否需要上报,若是,且有曝光去重机制,是否需要清空去重数据

对业务逻辑的阻塞

  • JS是单线程的,程序的运行必然会有消耗,如果阻塞了正常业务逻辑的运行,影响了用户体验,那就有点得不偿失了

  • 请求的阻塞,埋点的上报数据请求过多,也可能会造成对正常业务数据的请求,同样也会对用户的交互响应有一定的影响

    46d53740249eaa263606e0252bc06067.png

基于上述原因,一般埋点代码都在业务逻辑代码之后,同时也会包在单独的try catch里,尽量把埋点代码的影响降到最低

另外上文埋点上报方式讲述到的数据队列中批量和延时的处理,也是为此服务

总结(SUMMARY)

理论篇从什么是埋点,为什么要埋点,什么情况下需要埋点,怎么埋点逐步带大家初步认识了埋点,另外根据个人遇到的一些问题提出注意事项。主要让大家了解到埋点的流程,关注埋点的重要性。

大部分情况下,想了解一个产品的运营情况,数据分析是最直观有效的方法,但是想要拿到具体的数据,就离不开科学合理的埋点,通过具体的分析,我们甚至能从中发现产品存在的问题或者值得优化的空间,为业务的发展带来一定的启发。

随着业务的发展和埋点知识的科普,埋点在团队的业务中也逐渐受到了重视,大家都学会用埋点去解决一些有争议的问题,针对团队具体的埋点流程,此处留个坑后续分享。

Node 社群

 
 

我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加 考拉 好友回复「Node」即可。

75dffbe3fa22bda63d28f68ba3b15fbc.png

“分享、点赞、在看” 支持一下
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值