目录
埋点采集什么信息
Java 里常见的埋点实现方式
1. 代码硬编码埋点(最基础)
2. AOP 切面埋点(Java 项目最常用!)
3. 中间件 / 异步埋点
4. 字节码埋点(探针,如 SkyWalking)
埋点分类(后端视角)
埋点和普通日志的区别
常见坑(Java 后端踩坑点)
典型使用场景
埋点(Event Tracking):在代码中插入一段统计代码,用来采集用户行为、系统事件的数据,上报给后端 / 大数据平台,用于分析。
简单一句话:在程序关键位置 “埋上数据采集逻辑”,发生事件时自动记录信息。
Java 后端埋点,大多不是前端点击那种,更多是服务侧事件埋点。
埋点采集什么信息
一般会记录:
- 事件名称:
order_create、pay_success、user_login - 主体 ID:用户 ID、订单 ID、设备 ID
- 时间戳、环境:服务 IP、机房、版本号
- 业务属性:订单金额、商品类型、渠道来源
- 上下文:traceId(链路追踪 ID)
Java 里常见的埋点实现方式
1. 代码硬编码埋点(最基础)
业务方法里直接调用埋点 SDK 发送事件:
java
// 下单成功后埋点 public void createOrder(OrderDTO dto) { orderService.save(dto); // 埋点:上报订单创建事件 tracker.track("order_create", Map.of( "userId", dto.getUserId(), "orderId", dto.getOrderId(), "amount", dto.getAmount() )); }缺点:侵入业务代码,到处写埋点代码,容易漏、容易忘删。
2. AOP 切面埋点(Java 项目最常用!)
利用 Spring AOP,不改动业务代码,通过注解 / 切点拦截方法,在方法成功 / 异常时自动上报埋点。
java
// 自定义埋点注解 @Target(ElementType.METHOD) public @interface EventTrack { String eventName(); } // 业务代码只加注解,无埋点逻辑 @EventTrack(eventName = "order_create") public void createOrder(OrderDTO dto) { orderService.save(dto); }切面统一捕获参数、异常、耗时,上报埋点。低侵入,企业项目首选。
3. 中间件 / 异步埋点
埋点上报不能阻塞主业务!
- 本地队列 + 异步线程批量发送
- 发到 Kafka/RocketMQ,由消费端投递到数仓 / 分析平台
❌ 禁忌:同步调用 HTTP 上报埋点,网络超时会拖垮业务接口。
4. 字节码埋点(探针,如 SkyWalking)
通过 Java Agent,无代码侵入,在类加载时修改字节码自动采集接口调用、异常、耗时,属于监控类埋点,一般不用来上报业务事件。
埋点分类(后端视角)
- 业务埋点:业务事件,下单、支付、退款,用于产品运营、转化分析。
- 性能埋点:接口耗时、DB 耗时、异常次数,属于监控。
- 日志埋点:打印结构化日志,日志平台采集后当作事件(很多小公司直接用日志当埋点)。
埋点和普通日志的区别
- 日志:偏向排查问题,内容自由,文本为主。
- 埋点:偏向数据分析,字段固定、结构化,每条代表一个可统计事件,用于报表、漏斗、用户画像。
常见坑(Java 后端踩坑点)
- 埋点同步上报,阻塞主流程;
- 埋点丢失:异步队列满、消息丢了;
- 重复上报:重试场景,导致统计数据不准;
- 字段不统一:同一个事件,不同开发传参名字不一样;
- 敏感信息泄露:埋点带上手机号、身份证。
典型使用场景
- 产品:统计下单转化率、支付成功率;
- 运营:统计活动参与人数;
- 技术:接口异常率、慢调用统计。