埋点为什么要靠近领域事件而不是 UI 事件

一句话先讲清楚

我更倾向于让埋点靠近领域事件,而不是只停留在 UI 事件,因为 UI 会变,但业务语义相对稳定。


30 秒版本

如果埋点只记录 button_clicked 这类 UI 事件,短期接入会很快,但长期会越来越脆。因为一旦交互改了,数据语义就断了。相反,如果埋点尽量往“订单已提交”“任务已完成”这种业务事件靠,哪怕 UI 从按钮变成快捷键、拖拽或者自动流程,数据语义还是稳定的。所以我通常会把 UI 事件当作底层输入,把领域事件当作分析层主语。


1 分钟版本

我会把这个问题理解成“埋点到底是在记录动作,还是在记录业务事实”。如果只是记录 UI 动作,比如某个按钮点了、某个弹窗开了,那它更像是技术日志。短期能看,但长期很难支撑业务分析。

因为 UI 本身是非常容易变的。同一个业务动作,今天可能是点按钮,明天可能是拖拽,后天可能是自动触发。如果埋点语义完全绑在 UI 上,那每次交互调整,埋点就得重做,历史数据也很难连续。

所以我更倾向于把埋点往领域事件上靠。比如不是埋 submit_button_clicked,而是埋“订单已提交”“任务进入评审”“用户完成注册”。UI 事件当然还可以保留,但它更适合做调试和交互分析,而不是做最核心的业务指标主语。


2 到 3 分钟版本

我觉得这个问题本质上是在区分两种不同层次的事件。第一种是 UI 事件,它描述的是页面上发生了什么技术动作,比如 click、input、modal-open。第二种是领域事件,它描述的是业务上真正发生了什么,比如订单提交、任务完成、用户注册成功。

如果一个团队长期只埋 UI 事件,最大的问题不是埋点数量不够,而是语义越来越碎。因为 UI 本来就是会不断调整的,同一个业务结果,可能经过不同交互路径达成。今天是按钮,明天是快捷键,后天可能直接是系统自动流转。你如果只看 button_clicked,其实根本不知道业务上到底发生了什么。

所以我更认同一种分层思路。底层可以采 UI 事件,因为它对前端调试、曝光分析、交互路径分析还是有价值的;但业务分析层最好尽量对齐领域事件。也就是说,最终真正进报表、漏斗、转化、告警的,应该是那些稳定的业务事件,而不是随 UI 变化的技术动作。

这样做有几个好处。第一,语义稳定,UI 改版不会轻易打断数据连续性。第二,跨端更一致,不同端就算交互不同,也可以落到同一类业务事件上。第三,它更接近真实业务问题,产品和运营看数据时也更容易理解。

当然,这不意味着 UI 事件没价值。我的做法通常是两层都保留。UI 事件负责补充交互细节,比如按钮曝光、按钮点击、面板打开;领域事件负责承接业务事实,比如任务已创建、任务已流转、订单已支付。这样既能看行为细节,也能保证核心指标不漂。

所以如果让我总结,我会说埋点越靠近领域事件,越容易长期稳定;越停留在 UI 事件,越容易随着页面变化不断重做。


一个很好用的例子

submit_button_clicked 只说明一个按钮被点了,但它没有说明业务到底成功了没有。相反,“订单已提交”或者“任务已进入评审”这种事件,直接对应的是业务事实。前者更像技术动作,后者才更像真正有价值的数据主语。


如果面试官追问“那 UI 事件是不是就不要了”

不是不要,而是分层使用。UI 事件适合做交互分析、曝光分析、路径还原;领域事件适合做核心业务指标、漏斗分析和长期报表。我的重点不是取消 UI 事件,而是不让它成为唯一视角。


如果面试官追问“怎么从 UI 事件映射到领域事件”

我的做法通常是由业务动作的成功边界来定义领域事件。也就是说,不是用户点了按钮就算一个业务事件,而是系统真的完成了某个业务动作,比如创建成功、提交成功、流转成功,这时候再发领域事件。这样语义更稳,也更容易对齐后端或业务系统状态。


最后一句收尾

所以我会保留 UI 事件,但不会只停留在 UI 事件。真正能长期沉淀业务价值的,还是那些接近领域事实的埋点。

关联逐字稿