外观
埋点与口径变更怎么落地
难度与前置
难度:进阶
前置:知道埋点事件与指标字典;理解「同名异义」的危害。
读完能做什么:走完一次埋点或口径变更:登记 → 兼容 → 验证 → 下游门禁发布 → 决定是否回刷。
适用场景
- 客户端改版要改事件名 / 参数,或新增必填字段
- 业务重定义指标(如消耗是否含赠款),报表与 API 要切新口径
- 历史有多套同义事件,要合并并灰度切换
不适用:
- 日常「同名指标对不齐」的稳态治理(见 指标口径一致性)
- 仅 Kafka 消息 schema 兼容细节(见 Schema 演进;本文管变更流程)
- 从 1000 事件精简到 100 的盘点专项(可作前置项目,本文聚焦单次变更怎么上线)
真实场景(一条)
投放 App 改版:buy_click 改为 purchase_click,并新增必填 campaign_id。客户端先发版,数仓未改映射,ADS「消耗」一周内少计约 12%(旧事件仍进、新事件落未知桶)。业务先发现,数据侧被动补数。
改造流程:
- 变更单进埋点字典:旧事件废弃日、新事件生效日、双写窗口
- ODS 映射表双读,DWD 统一成标准事件名
- 验证:新包抽样触发 + 字段缺失率告警
- ADS 走 出数验收 门禁后切
current - 窗口期内旧事件占比 < 阈值再下线旧映射
结果:切流当周无「静默少计」;缺失率从双位数降到约定阈值内。
怎么做(步骤清单)
1. 先判变更类型,再选策略
| 类型 | 例子 | 策略要点 |
|---|---|---|
| A. 埋点事件/参数变更 | 改名、增必填、枚举扩展 | 字典 + 双写/兼容窗口 + 客户端验证 |
| B. 指标口径变更 | 含税/赠款、归因窗口 | 新指标名或新 version;禁止静默改旧 SQL |
| C. 两者同时 | 改版带动口径 | 拆成两张变更单,埋点就绪后再切口径 |
口诀:能加新名就不要偷改旧名的含义(尤其是已被报表引用的指标)。
2. 变更单最小字段(埋点字典 / 指标字典)
text
change_id / owner / 生效版本(App 或仓版本)
对象:event_name 或 metric_id
变更前定义 / 变更后定义(含 SQL 或字段列表)
兼容策略:双写至 YYYY-MM-DD / 只增字段可空→必填日期
影响下游:表、ADS、API、看板(血缘列表)
是否回刷历史:是/否 + 分区范围
验收标准:缺失率、diff 阈值、抽检清单无变更单禁止合入生产映射与 ADS 发布。
3. 埋点侧:兼容窗口 + 上线前验证
- 命名:
对象_动作(或团队已有规范),禁止click1 - 公共参数:user / device / app_version / event_ts 由 SDK 统一带
- 双写或双读:
- 客户端短期双发旧+新;或
- 仓侧映射
COALESCE(new, old),窗口结束后只认新
- 上线前验证(不可省):触发时机、必填参数、枚举值;用验证平台或抓包
- 改版回归:发版检查单含埋点项,防止「界面改了事件没了」
字段新增建议:先可选 → 观察缺失率 → 再改必填并告警。
消息层兼容与淘汰策略与 Schema 演进 对齐,避免仓与 Topic 各改各的。
4. 口径侧:新版本,不静默改历史含义
text
metric_spend_v1 含赠款
metric_spend_v2 不含赠款 ← 新名或 version
ads_xxx_current → 灰度切到 v2 计算的物理表- 原子指标唯一 SQL;派生/复合在字典里写清限定条件
- 看板文案同步改显示名(如「消耗(不含赠款)」)
- 与财务/运营对齐会议纪要挂在变更单上
稳态「多报表对不齐」仍用 口径一致性 的对账手段。
5. 下游联动(算 → 验 → 发)
text
映射/DWD 切换
→ DWS/ADS 重跑变更影响的 dt(若需要)
→ 对账 + 新鲜度门禁
→ ADS/API 按 [出数验收](/warehouse/ads-publish) 灰度切 current需要历史对齐时,回刷范围与并发走 补数与重跑,本篇不展开操作手册。不回刷则文档写明:历史分区仍为旧口径,分析勿跨版本拼接。
仓侧改表 / 改字段 / 改口径前的影响评估见 改表前影响评估。
6. 观察与收尾
窗口期内盯:
| 信号 | 动作 |
|---|---|
| 新事件量 ≈ 旧事件量(切流日) | 正常 |
| 新事件暴跌、旧事件仍高 | 发版覆盖率或映射错误 |
| 必填字段缺失率超阈值 | 阻断切 current / 催客户端 |
| ADS vs 对账 diff 超阈值 | 不发布,回滚 current |
窗口结束:下线旧事件映射、归档变更单、更新字典状态为 deprecated。
常见坑(至少这些)
先发客户端、后改仓
静默丢数窗口以「业务发现」收场。偷改旧指标 SQL 的含义
历史趋势断裂且无人知;应新 version。无验证就上线
漏参、错时机,脏数据进一周才暴露。只改 ADS、不改埋点/DWD
出口好看,源头仍双轨。兼容窗口无限期
旧事件永远不删,字典再次膨胀。回刷与当日任务抢资源且无门禁
补数打满集群;发布未经验收。Kafka schema 与埋点字典不同步
一端加字段一端未知,见 Schema 演进篇。
如何验收(带数字的前后对比)
| 指标 | 改前(示例) | 改后(目标) |
|---|---|---|
| 变更导致的静默少计/错计天数 | 如 ≥ 3 天 | 0(验证+门禁挡住) |
| 新事件必填字段缺失率 | 如 > 10% | ≤ 约定(如 2%) |
| 切流日新旧事件量相对差 | ≤ 约定(如 5%,排除自然波动) | |
| ADS 发布前对账 diff | 未跑或 > 1% | ≤ 阈值且门禁通过 |
| 旧事件下线是否按期 | 遥遥无期 | 变更单写死日期并执行 |
Checklist:
- [ ] 变更单字段齐全,血缘下游已列
- [ ] 埋点上线前验证记录存在
- [ ] 口径变更使用新 version/新名,无静默改义
- [ ] ADS/API 经出数门禁再切 current
- [ ] 是否回刷有书面结论;回刷走补数专篇流程
- [ ] 兼容窗口有结束日与下线动作
text
验收记录模板:
change_id:
类型:埋点 / 口径 / 两者
兼容窗口:
验证结论:
门禁 / 灰度:
是否回刷及范围:
旧事件/旧 version 下线日:
签字(数据+产品):相关面试题
题库小程序链接待定;先用站内锚点占位。
- [ ] 题:口径变更为什么禁止静默改同名字段含义?(考察点:新 version/新名)→ 占位:
#todo-interview-tracking-metric-no-silent - [ ] 题:埋点上线前验证记录缺了为什么不能切流?(考察点:上线前验证记录存在)→ 占位:
#todo-interview-tracking-metric-precheck - [ ] 题:ADS 切 current 前要对齐哪类门禁?(考察点:出数门禁后再切;对账 diff≤阈值)→ 占位:
#todo-interview-tracking-metric-ads-gate - [ ] 题:兼容窗口结束要做什么?(考察点:写死旧事件/旧 version 下线日并执行)→ 占位:
#todo-interview-tracking-metric-compat-end
改写说明:综合 Wood 埋点治理/设计与指标口径管理,改写成「单次变更可照着做」的流程文;与口径一致性、ADS 发布、Schema 演进、补数专篇分工明确。无未公开公司数据。