受众:产品 / CTO / 协作方。本文档说明埋点数据从 ES 进入数仓的整体方案、合规取舍、协作约束。 实现细节见
kb/14-埋点同步-开发.md。
_search 导出,每行一个 ES hit 文档)traces-{YYYY-MM-DD} 滚动索引 ┌────────────────┐
│ 埋点 ES (prod) │
└────┬───────────┘
│
┌────────────┴─────────────┐
│ │
[增量路径] [历史路径]
每日 ES → Hive 一次性 .json.gz 文件
ES Storage Handler 按天解压解析
映射表 SELECT Python 脚本
│ │
└────────────┬─────────────┘
│
【入仓阶段脱敏】
(按事件类型应用规则)
│
▼
┌──────────────────┐
│ raw 层(数仓) │
└──────────────────┘
两条路径最终落到同一张 raw 表,schema 一致;脱敏规则共用同一份配置。
数仓默认 raw 层走 schema-on-read landing 范式(数据原样落、ods 阶段才做类型转换 / 脏数据识别,详见 kb/20-数仓分层与建模.md §8.1)。本场景主动破例:
| §8.1 理由 | 是否适用 | 说明 |
|---|---|---|
| 1. 隔离源端类型变化 | ✗ | 埋点 schema 长尾,新事件 / 新字段频繁,本就要求协作通知 |
| 2. 同步阶段不可失败 | △ | 部分适用,需对解析失败做容错处理 |
| 3. 保留原始精度与原文 | ✗ | 合规要求就是要丢字段,与"保原文"目标冲突 |
| 4. 脏数据可观测 | △ | 事件本身可观测,脱敏后字段不可回溯(合规接受这代价) |
| 5. schema-on-read 范式契合 | ✗ | 合规要求物理拦截敏感字段,不能等 ods 读取阶段才处理 |
3 条不适用 ≥ §8.1 阈值,破例成立。
破例代价(明示):
| 动作 | 含义 | 适用 |
|---|---|---|
drop |
字段直接删除,不入 raw | 高敏字段(地址、手机号、卡号等) |
mask |
字段保留但用脱敏函数处理 | 中敏字段(脱敏后的姓名、订单号末四位等) |
reject |
整事件不入 raw | 极敏感事件(如有) |
脱敏函数复用现有的 5 种:md5 / month_trunc / mask_middle / keep_first_n / keep_last_n(实现见开发文档)。
所有脱敏规则集中在一份配置文件(conf/tracking-mask.ini),格式与加载方式见开发文档。
候选选项(已否决):
- 选项 1(事件级白名单):任何新事件不在 conf 都不入仓——卡业务上线节奏,否决
- 选项 2(字段级白名单仅对已声明事件):含敏事件首次进 conf 时所有字段必须登记,后续上游加字段自动 drop——多一道保险但仍有"全新含敏事件没及时进 conf"风险,与选项 3 漏的根本场景相同,多余的复杂度不抵收益,否决
| 场景 | 处理 |
|---|---|
| 新事件 + 无敏感字段 | 默认入仓,无需通知 |
| 新事件 + 有敏感字段 | 强制走流程:埋点开发方 PR 注明 → 数仓更新配置 |
| 已有事件加敏感字段 | 同上 |
每日 ods 跑前对比当日 ES 出现的 event_name 集合 vs 配置已知集合,新增事件列表推 alerter(企微)。
数仓收到通知后人工判断是否含敏:
发现敏感字段误入仓时:
本方案仅覆盖 raw 层入仓 + 脱敏。后续阶段(不在本方案):