埋点基础设计整理

15 阅读7分钟

埋点系统设计方案总纲

项目背景

为了更好地了解用户行为,提升产品体验和业务决策,我们需要建立一套完整的埋点数据收集和分析系统。该系统需要支持多平台(iOS、Android、H5),具备实时数据上报、批量处理、数据去重、敏感信息脱敏等核心功能。

核心需求分析

1. 上报时机要求

  • 实时上报:用户触发事件(如点击、提交)立即上报,确保关键行为数据不丢失
  • 批量上报:非实时性事件(如页面停留时长、播放进度)在适当时机批量上报,减少网络请求压力
  • 崩溃数据优先上报:应用崩溃时的关键数据必须优先确保上报成功

2. 字段规范要求

所有埋点事件必须包含以下核心字段:

  • user_id:用户ID,未登录时使用设备ID替代
  • device_id:设备唯一标识,必填
  • timestamp:事件发生时间戳,精确到毫秒,必填
  • app_version:应用版本号,必填
  • system_version:系统版本,必填
  • network_type:网络类型(wifi/4g/3g/2g/unknown),必填

3. 去重机制要求

  • 同一事件在10秒内重复触发,仅上报一次
  • 通过事件名+关键属性组合生成唯一标识进行去重
  • 避免因用户误操作或页面刷新导致的数据冗余

4. 安全合规要求

  • 敏感信息(手机号、身份证号、评论内容等)必须脱敏处理
  • 禁止明文传输敏感数据
  • 支持配置化的脱敏规则

系统架构设计

整体架构图

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   iOS App       │    │   Android App   │    │     H5 App      │
│  (Obj-C SDK)    │    │   (Java SDK)    │    │  (JS SDK)       │
└─────────────────┘    └─────────────────┘    └─────────────────┘
         │                       │                       │
         └───────────────────────┼───────────────────────┘
                                 │
                    ┌─────────────────┐
                    │   埋点数据服务    │
                    │   (Java Spring) │
                    └─────────────────┘
                                 │
                    ┌─────────────────┐
                    │   管理后台       │
                    │   (Vue 3)       │
                    └─────────────────┘

技术栈选型

  • 服务端:Java Spring Boot + MongoDB + Redis
  • 管理后台:Vue 3 + TypeScript + Element Plus
  • 数据存储:MongoDB(埋点数据)+ PostgreSQL(配置数据)
  • 缓存服务:Redis(数据缓存、去重校验)
  • 消息队列:可选,用于高峰期数据缓冲

数据模型设计

核心数据结构

埋点事件数据模型
{
    // 核心必填字段
    user_id: "user_123",           // 用户ID,未登录时用device_id
    device_id: "device_abc123",    // 设备ID,必填
    timestamp: 1640995200000,      // 时间戳,毫秒级,必填
    app_version: "1.0.0",          // APP版本,必填
    system_version: "iOS 15.1",    // 系统版本,必填
    network_type: "wifi",          // 网络类型,必填

    // 事件信息
    event_name: "button_click",    // 事件名称
    event_type: "realtime",        // 事件类型:realtime/batch/crash
    properties: {                  // 事件属性(已脱敏)
        button_name: "login",
        page_name: "home",
        phone: "138****1234",      // 脱敏后的手机号
        comment: "***违规内容***"   // 脱敏后的评论
    },

    // 设备信息
    platform: "ios",               // 平台:ios/android/h5
    device_info: {
        model: "iPhone12",
        manufacturer: "Apple",
        screen_width: 375,
        screen_height: 812
    },

    // 系统字段
    create_time: ISODate(),        // 数据入库时间
    ip_address: "192.168.1.1",     // 客户端IP
    user_agent: "Mozilla/5.0..."   // User-Agent
}
事件配置模型
{
    event_name: "button_click",        // 事件名称
    display_name: "按钮点击",          // 显示名称
    description: "用户点击按钮事件",    // 描述
    properties: [                     // 属性定义
        {
            name: "button_name",
            type: "string",
            required: true,
            description: "按钮名称"
        },
        {
            name: "page_name",
            type: "string",
            required: false,
            description: "页面名称"
        }
    ],
    desensitize_rules: [              // 脱敏规则
        {
            field: "phone",
            method: "desensitize_phone"
        }
    ],
    status: 1,                       // 状态:1启用 0禁用
    create_time: ISODate(),
    update_time: ISODate()
}

上报策略设计

1. 实时上报 (Real-time Reporting)

  • 适用场景:用户交互事件(点击、提交、切换等)
  • 上报时机:事件触发后立即上报
  • 网络要求:需要网络连接,无网络时缓存等待
  • 数据量:单条数据上报

2. 批量上报 (Batch Reporting)

  • 适用场景:非实时性数据(页面停留、播放进度、滑动轨迹等)
  • 上报时机
    • 页面离开时(beforeunload事件)
    • 应用切换到后台时
    • 批量数据达到阈值时(数量/时间)
    • 网络恢复时
  • 数据量:多条数据批量上报

3. 崩溃数据优先上报 (Crash Priority Reporting)

  • 触发条件:应用崩溃、JavaScript错误、未捕获的Promise错误
  • 上报机制
    • 同步上报,确保在应用退出前完成
    • 本地持久化,确保上报失败时不丢失
    • 高优先级网络请求
  • 数据内容:错误信息、堆栈信息、设备状态等

核心功能模块

1. 数据采集SDK

提供统一的数据采集接口,支持多平台:

  • 事件跟踪:track(eventName, properties)
  • 用户管理:setUserId(), setUserProperties()
  • 设备信息:自动采集设备和系统信息
  • 网络状态:实时监测网络变化
  • 数据缓存:离线数据本地缓存

2. 数据处理服务

  • 数据接收:HTTP接口接收埋点数据
  • 数据验证:格式校验、必填字段检查
  • 数据清洗:去重处理、数据标准化
  • 敏感脱敏:根据配置规则脱敏敏感信息
  • 数据存储:分库分表存储海量数据

3. 管理后台系统

  • 事件管理:配置埋点事件和属性
  • 脱敏配置:设置敏感数据脱敏规则
  • 数据查询:多维度数据检索和统计
  • 监控告警:系统状态监控和异常告警

去重机制设计

去重策略

  1. 时间窗口去重:10秒内相同事件仅上报一次
  2. 属性组合去重:基于事件名+关键属性生成唯一标识
  3. 设备维度去重:同一设备在时间窗口内的重复事件

去重算法

class EventDeduplicator {
    // 使用Redis存储去重标识,设置10秒过期
    async shouldReport(eventKey: string): Promise<boolean> {
        const exists = await redis.exists(`buried_point:${eventKey}`);
        if (!exists) {
            await redis.setex(`buried_point:${eventKey}`, 10, '1');
            return true;
        }
        return false;
    }

    generateEventKey(eventName: string, properties: any, deviceId: string): string {
        // 提取关键属性生成key
        const keyProps = this.getKeyProperties(eventName);
        const values = keyProps.map(prop => properties[prop] || '').join('|');
        return `${deviceId}:${eventName}:${values}`;
    }
}

安全与合规设计

敏感数据处理

  • 手机号脱敏:13812345678 → 138****5678
  • 身份证脱敏:440123199001011234 → 4****************1
  • 评论内容脱敏:自动识别敏感词并替换为***
  • 配置化脱敏:支持动态配置脱敏规则

数据传输安全

  • HTTPS加密传输
  • 数据压缩减少传输量
  • 请求频率限制防止恶意调用
  • IP白名单和API密钥认证

性能优化策略

1. 数据压缩

  • 使用GZIP压缩传输数据
  • 批量上报减少请求次数
  • 数据格式优化减小体积

2. 缓存策略

  • 本地缓存未上报数据
  • Redis缓存热点配置
  • CDN加速静态资源

3. 高可用设计

  • 服务多实例部署
  • 数据库读写分离
  • 消息队列异步处理
  • 监控和自动扩容

监控和运维

系统监控指标

  • 数据采集监控:上报成功率、延迟时间、数据完整性
  • 服务性能监控:响应时间、吞吐量、错误率
  • 数据质量监控:数据准确性、完整性、及时性
  • 业务指标监控:关键事件转化率、用户活跃度

告警机制

  • 数据上报异常告警
  • 服务可用性告警
  • 数据质量问题告警
  • 业务指标异常告警

实施计划

第一阶段:核心功能开发

  1. 设计数据模型和API接口
  2. 实现服务端数据接收和处理
  3. 开发管理后台基础功能
  4. 建立监控和告警体系

第二阶段:SDK开发

  1. iOS Objective-C SDK开发
  2. Android Java SDK开发
  3. H5 JavaScript SDK开发
  4. 各平台集成测试

第三阶段:优化完善

  1. 性能优化和压力测试
  2. 数据分析功能扩展
  3. 安全加固和合规检查
  4. 上线部署和运维

总结

本埋点系统设计方案充分考虑了多平台支持、数据安全性、系统性能和可维护性等方面的要求。通过分层架构设计,确保了系统的可扩展性和高可用性。实时上报、批量上报和崩溃数据优先上报相结合,保证了数据的完整性和及时性。内置的去重机制和敏感数据脱敏功能,确保了数据的质量和合规性。

后续将分别实现各平台的SDK,并进行详细的技术文档编写。