埋点基础设计整理

28 阅读8分钟

埋点系统设计方案总纲(一期简化版)

项目背景

为了更好地了解用户行为,提升产品体验和业务决策,我们需要建立一套埋点数据收集系统。一期重点实现批量上报功能,支持多平台(iOS、Android、H5)数据收集和基础存储。

一期核心需求

上报策略

  • 批量上报:收集用户行为数据,在页面离开、应用切换到后台、达到阈值时批量上报,减少网络请求压力

数据格式规范

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

字段名类型说明示例
event_keykeyword事件keyregister_success
event_namekeyword事件名称完成注册
event_timedate事件时间2026-01-22 15:00:00
event_typekeyword事件类型查询
user_idkeyword用户ID123456
user_namekeyword用户名张三
device_idkeyword设备idabcdef123456
platformkeyword操作系统类型Android
network_typekeyword网络型号wifi
os_versionkeyword系统版本号16.5.1
app_versionkeywordApp 版本号5.2.0
function_pathkeyword模块/页面/功能注册/注册/完成注册
function_namekeyword点击功能名称注册
user_tokenkeyword用户tokenabcdefg1234561
extraParamtext扩展参数JSON{"attr1":"手机","attr2":"App Store"}

extraParam说明:

  • 存储格式:JSON字符串格式存储扩展参数,用于客户端本地数据库
  • 参数键名:使用 attr1, attr2, attr3... 格式作为键名
  • 动态配置:根据不同事件类型动态传递所需参数
  • 转换逻辑:SDK上报时将extraParam JSON解析并展开为接口需要的attr字段

数据转换流程:

  1. 采集阶段:SDK接收attr对象 → 转换为JSON字符串 → 存储到extraParam字段
  2. 上报阶段:从数据库读取extraParam → JSON解析 → 展开为attr1,attr2...字段 → 发送到接口
  3. 接口要求:服务器接收的是展开的attr字段,不是JSON字符串

转换代码示例:

// 存储时:对象 → JSON字符串
const eventData = {
  attr1: "手机",
  attr2: "App Store",
  attr3: "无"
};
const extraParam = JSON.stringify(eventData); // 存储到数据库

// 上报时:JSON字符串 → 展开对象
const parsedData = JSON.parse(extraParam); // 从数据库读取
const requestData = {
  event_key: "register_success",
  // ... 其他字段
  ...parsedData // 展开为 attr1, attr2, attr3...
};
// 发送到接口

数据存储格式示例(本地数据库):

{
  "event_key": "register_success",
  "event_name": "完成注册",
  "function_name": "注册",
  "function_path": "注册/注册/完成注册",
  "event_time": "2026-01-22 15:00:00",
  "user_id": "user_001",
  "user_name": "张三",
  "device_id": "device_abc123",
  "platform": "android",
  "network_type": "wifi",
  "os_version": "13.2",
  "app_version": "1.0.5",
  "user_token": "token_123456",
  "extraParam": "{\"attr1\":\"手机\",\"attr2\":\"App Store\",\"attr3\":\"无\",\"attr4\":\"无\",\"attr5\":\"无\"}",
  "status": 0
}

数据传输格式示例(接口上报,extraParam会被展开):

{
  "events": [
    {
      "event_key": "register_success",
      "event_name": "完成注册",
      "function_name": "注册",
      "function_path": "注册/注册/完成注册",
      "event_time": "2026-01-22 15:00:00",
      "user_id": "user_001",
      "user_name": "张三",
      "device_id": "device_abc123",
      "platform": "android",
      "network_type": "wifi",
      "os_version": "13.2",
      "app_version": "1.0.5",
      "user_token": "token_123456",
      "attr1": "手机",
      "attr2": "App Store",
      "attr3": "无",
      "attr4": "无",
      "attr5": "无"
    }
  ]
}

系统架构设计

整体架构图

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

技术栈选型

  • 服务端:Java Spring Boot + Elasticsearch + Redis
  • 客户端存储
    • iOS:SQLite
    • Android:SQLite
    • H5:IndexedDB
  • 数据压缩:GZIP + Protobuf(一期必选)
  • 数据存储:Elasticsearch(埋点数据存储和检索)

一期核心功能

1. 数据采集SDK

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

  • 事件跟踪:track(eventName, properties)
  • 用户管理:setUserId(), setUserProperties()
  • 设备信息:自动采集设备和系统信息
  • 配置管理:从后台获取上报策略配置
  • 本地存储:SQLite/IndexedDB数据持久化(extraParam JSON格式)
  • 数据转换:上报时将extraParam JSON解析并展开为attr字段
  • 状态管理:跟踪数据上传状态,防止重复上传
  • 数据压缩:GZIP + Protobuf压缩后传输
  • 定时任务:根据配置定时批量上报

2. 数据处理服务

  • 配置接口/api/config/buried-point - 提供上报策略配置
  • 数据接收/api/events/track - 批量接收压缩的埋点数据
  • 数据解压:自动解压GZIP + Protobuf数据
  • 数据验证:格式校验、必填字段检查
  • 数据存储:存储到Elasticsearch
  • 响应格式:统一的API响应结构

3. 批量上报机制

上报策略配置
  • 配置接口/api/config/buried-point - 获取上报配置参数
  • 配置参数
    • batch_size:批量上报条数阈值(默认50条)
    • report_interval:定时上报间隔(秒,默认30秒)
触发条件
  • 页面离开时(beforeunload事件)
  • 应用切换到后台时
  • 数据条数达到阈值(从配置接口获取)
  • 定时上报(从配置接口获取时间间隔)
  • 网络恢复时
数据传输格式
  • 原始格式:JSON数组批量提交
  • 字段转换:extraParam JSON → 展开为attr1,attr2,attr3...字段
  • 压缩格式:JSON → Protobuf序列化 → GZIP压缩
  • Content-Typeapplication/x-protobuf-gzip
  • 解压处理:服务端自动解压并解析
本地存储策略
  • 数据库:SQLite(iOS/Android)/ IndexedDB(H5)

  • 存储原则:每一条记录存储完整的埋点数据结构,便于管理和查询

  • 数据表结构

    CREATE TABLE buried_point_events (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        -- 核心必填字段
        event_key TEXT NOT NULL,
        event_name TEXT,
        event_time TEXT NOT NULL,
        event_type TEXT DEFAULT 'batch',
        user_id TEXT,
        user_name TEXT,
        device_id TEXT NOT NULL,
        platform TEXT,
        network_type TEXT,
        os_version TEXT,
        app_version TEXT,
        function_path TEXT,
        function_name TEXT,
        user_token TEXT,
        extraParam TEXT,  -- JSON字符串存储扩展参数,如:{"attr1":"value1","attr2":"value2"}
        -- 状态管理字段
        status INTEGER DEFAULT 0,  -- 0:未上传 1:上传中 2:已上传 3:上传失败
        create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
        update_time DATETIME DEFAULT CURRENT_TIMESTAMP,
        -- 索引优化
        UNIQUE(event_key, device_id, event_time)  -- 防止重复数据
    );
    
    -- 创建索引提升查询性能
    CREATE INDEX idx_status ON buried_point_events(status);
    CREATE INDEX idx_create_time ON buried_point_events(create_time);
    CREATE INDEX idx_event_key ON buried_point_events(event_key);
    
上传状态管理
  • 0-未上传:新采集的数据,等待上报
  • 1-上传中:正在上传,防止重复上传
  • 2-已上传:上传成功,可清理
  • 3-上传失败:上传失败,下次上报时重新尝试
数据压缩策略
  • 压缩算法:GZIP + Protobuf
  • 压缩时机:批量数据上报前进行压缩
  • 解压处理:服务端接收后自动解压
  • 压缩效果:显著减少传输数据量,提高网络效率
防重复上传机制
  • 上传前检查状态,避免重复上传
  • 上传中状态锁定,上传完成后更新状态
  • 失败数据保持状态,下次触发上报时重新尝试
  • 定期清理已上传的过期数据

二期规划功能

核心功能扩展

  1. 实时上报:支持关键事件实时上报,确保数据不丢失
  2. 崩溃数据优先上报:应用崩溃时优先上报关键数据
  3. 去重机制:10秒内相同事件仅上报一次,避免数据冗余
  4. 敏感数据脱敏:自动脱敏手机号、身份证等敏感信息

管理后台系统

  1. 事件管理:配置和管理埋点事件
  2. 数据查询:支持多维度数据检索和统计
  3. 监控告警:系统状态监控和异常告警

高级功能

  1. 数据分析:基于Elasticsearch的实时数据分析
  2. 可视化报表:用户行为数据可视化展示
  3. API管理:开放数据查询API接口

一期实施计划

第一阶段:服务端开发(2周)

  1. 设计Elasticsearch索引结构
  2. 实现上报策略配置API接口(/api/config/buried-point
  3. 实现批量数据接收API接口(/api/events/track
  4. 实现数据解压功能(GZIP + Protobuf)
  5. 实现基础数据验证和存储
  6. 搭建Spring Boot项目框架

第二阶段:SDK开发(3周)

  1. iOS Objective-C SDK开发(本地SQLite存储、状态管理、GZIP+Protobuf压缩、批量上报)
  2. Android Java SDK开发(本地SQLite存储、状态管理、GZIP+Protobuf压缩、批量上报)
  3. H5 JavaScript SDK开发(IndexedDB存储、状态管理、GZIP+Protobuf压缩、批量上报)
  4. 各平台配置接口集成和压缩功能测试

第三阶段:测试上线(1周)

  1. 功能测试和性能测试
  2. 各平台集成验证
  3. 上线部署和监控

总结

一期埋点系统专注于批量上报的核心功能,采用简洁的数据格式(attr1-attr7传递事件特定参数),通过后台配置接口控制上报策略,客户端本地数据库存储确保数据可靠性。状态管理机制有效防止重复上传,确保数据的完整性和准确性。

核心特性:

  • 配置驱动:上报策略通过后台接口动态配置
  • 完整存储:本地存储完整埋点数据结构,便于管理和查询
  • 灵活扩展:extraParam JSON字段支持动态参数配置
  • 数据转换:本地JSON存储 → 接口展开字段的自动转换
  • 状态管理:四种状态标记防止重复上传和数据丢失
  • 简化重试:失败数据通过下次上报重新尝试,降低复杂性
  • 数据压缩:GZIP + Protobuf压缩显著减少传输量
  • 定时定量:灵活的上报触发机制适应不同场景

二期将扩展实时上报、去重机制、敏感数据脱敏、管理后台等高级功能,形成完整的埋点数据分析体系。

当前设计以实用性和快速上线为优先,满足业务方对基础数据收集的需求。