- Published on
神策数据分析开发接入文档
- Authors

- Name
- Cassian Florin
- @ynyng90660098
🎯 神策数据分析开发接入文档
快速集成神策数据分析,实现精准的用户行为追踪
📖 概述
神策数据分析(Sensors Analytics)是一款专业的用户行为分析产品。本文档基于 SensorsConfig.java 配置类,详细说明如何在项目中集成神策数据分析功能。
✨ 功能特性
🔄 多种上报模式
支持 DEBUG、BATCH 等多种数据上报模式
⚙️ 自动配置
自动配置神策 SDK 客户端,开箱即用
🔥 配置热更新
支持 @RefreshScope 配置热更新
📊 完整埋点 API
提供完整的埋点 API 接口
🏗️ 技术架构
应用层 → ISensorsAnalytics → Consumer → 神策服务器 (埋点接口) (数据消费者) (数据收集)
📦 依赖配置
Maven 依赖
在项目的 pom.xml 中添加神策 SDK 依赖:
<!-- 引入神策分析 SDK -->
<dependency>
<groupId>com.sensorsdata.analytics.javasdk</groupId>
<artifactId>SensorsAnalyticsSDK</artifactId>
<version>3.6.8</version>
</dependency>
📋 版本兼容性
组件 | 版本要求 |
|---|---|
JDK 版本 | 1.8+ |
Spring Boot 版本 | 2.x+ |
神策 SDK 版本 | 3.6.8 |
⚙️ 配置说明
配置属性类
项目中使用 SensorsDataProperties 类来管理神策相关配置:
@RefreshScope
@Data
@Component
@ConfigurationProperties(prefix = "sensorsdata")
public class SensorsDataProperties {
/**
* 神策服务地址
*/
private String serverUrl;
/**
* 埋点模式
*/
private String trackMode;
/**
* 神策事件名称
*/
private String eventName;
/**
* 批量发送配置
*/
private BatchMode batch;
@Data
public static class BatchMode {
/**
* 快速批量发送模式"每次发送"条数阈值
*/
private Integer bulkSize;
/**
* 缓存队列最大条数
*/
private Integer maxCacheSize;
/**
* 超时时间(秒)
*/
private Integer timeoutSeconds;
}
}
跟踪模式枚举
支持的跟踪模式定义在 SensorsTrackModeEnums 中:
public enum SensorsTrackModeEnums implements EnumLookUp<String> {
DEBUG("debug", "测试上报"),
BATCH("batch", "批量模式"),
FAST_BATCH("fast_batch", "快速批量模式");
}
📝 配置参数详解
参数 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
serverUrl | String | ✅ 是 | 神策服务器地址 | https://api.example.com/sa?project=stage |
trackMode | String | ✅ 是 | 埋点模式 |
|
eventName | String | ❌ 否 | 默认事件名称 | d_h5_trilateral_credit_claim_click |
batch.bulkSize | Integer | ❌ 否 | 批量发送条数阈值 | 100 |
batch.maxCacheSize | Integer | ❌ 否 | 缓存队列最大条数 | 10000 |
batch.timeoutSeconds | Integer | ❌ 否 | 超时时间(秒) | 30 |
🔧 代码集成
配置类
将 SensorsConfig.java 添加到项目中:
/**
* @author 开发者
* @date 2025/11/11 15:55:00
*/
@Slf4j
@Configuration
public class SensorsConfig {
@Resource
private SensorsDataProperties sensorsDataProperties;
@Bean(destroyMethod = "shutdown")
public ISensorsAnalytics init() {
SensorsTrackModeEnums trackModeEnums =
EnumLookUp.getEnumInstance(SensorsTrackModeEnums.class, sensorsDataProperties.getTrackMode());
switch (trackModeEnums) {
case DEBUG:
// 注意:debug 模式数据不会写入服务器
// URL 会从 https://api.example.com/sa?project=stage
// 变为 https://api.example.com/debug?project=default
log.info("sensorsData debug mode");
return new SensorsAnalytics(new DebugConsumer(sensorsDataProperties.getServerUrl(), true));
case BATCH:
log.info("sensorsData batch mode");
return new SensorsAnalytics(new BatchConsumer(sensorsDataProperties.getServerUrl()));
}
log.info("sensorsData default mode [batch]");
return new SensorsAnalytics(new BatchConsumer(sensorsDataProperties.getServerUrl()));
}
}
提示
确保 SensorsDataProperties 和 SensorsTrackModeEnums 在项目的 classpath 中。
💻 使用示例
基本埋点
@Service
public class UserBehaviorService {
@Resource
private ISensorsAnalytics sensorsAnalytics;
@Resource
private SensorsDataProperties sensorsDataProperties;
/**
* 用户点击事件埋点
*/
public void trackUserClick(String userId, String creditApplyNo, String scene) {
Map<String, Object> properties = new HashMap<>();
properties.put("f_credit_apply_no", creditApplyNo);
properties.put("f_quotient_scene", scene);
properties.put("timestamp", System.currentTimeMillis());
// 发送埋点数据
sensorsAnalytics.track(userId, false, sensorsDataProperties.getEventName(), properties);
// 立即刷新(可选)
sensorsAnalytics.flush();
}
}
业务场景示例
@Service
public class CreditApplyService {
@Resource
private ISensorsAnalytics sensorsAnalytics;
@Resource
private SensorsDataProperties sensorsDataProperties;
/**
* 授信申请成功埋点
*/
public void trackCreditApplySuccess(CreditApply creditApply, Partner partner) {
Map<String, Object> properties = new HashMap<>();
properties.put("f_credit_apply_no", creditApply.getSeqNo());
properties.put("f_quotient_scene", partner.getPartnerCode());
properties.put("f_credit_amount", creditApply.getCreditAmount());
properties.put("f_apply_time", creditApply.getCreateTime());
// 使用随机 UUID 作为匿名用户标识
String distinctId = UUID.randomUUID().toString();
sensorsAnalytics.track(distinctId, false, sensorsDataProperties.getEventName(), properties);
sensorsAnalytics.flush();
}
}
测试代码
@Test
public void testSensorsAnalytics() {
Map<String, Object> properties = new HashMap<>();
properties.put("f_credit_apply_no", "CA20251111000001");
properties.put("f_quotient_scene", "miniWallet");
properties.put("f_event_type", "click");
sensorsAnalytics.track(
UUID.randomUUID().toString(),
false,
"d_h5_trilateral_credit_claim_click",
properties
);
sensorsAnalytics.flush();
}
🔐 配置示例
🛠️ 开发环境
使用 DEBUG 模式进行调试
🧪 测试环境
使用 BATCH 模式进行测试
🚀 生产环境
使用 BATCH 模式,优化性能
开发环境配置
# application-dev.yml
sensorsdata:
server-url: https://api.example.com/sa?project=dev
track-mode: debug
event-name: d_h5_trilateral_credit_claim_click
batch:
bulk-size: 50
max-cache-size: 5000
timeout-seconds: 10
测试环境配置
# application-test.yml
sensorsdata:
server-url: https://api.example.com/sa?project=stage
track-mode: batch
event-name: d_h5_trilateral_credit_claim_click
batch:
bulk-size: 100
max-cache-size: 10000
timeout-seconds: 30
生产环境配置
# application-prod.yml
sensorsdata:
server-url: https://api.example.com/sa?project=production
track-mode: batch
event-name: d_h5_trilateral_credit_claim_click
batch:
bulk-size: 200
max-cache-size: 20000
timeout-seconds: 60
Nacos 配置中心
如果使用 Nacos 配置中心,可以在对应的 dataId 中添加:
# example-backend.yml
sensorsdata:
server-url: ${sensors.server.url:https://api.example.com/sa?project=stage}
track-mode: ${sensors.track.mode:batch}
event-name: ${sensors.event.name:d_h5_trilateral_credit_claim_click}
batch:
bulk-size: ${sensors.batch.bulk-size:100}
max-cache-size: ${sensors.batch.max-cache-size:10000}
timeout-seconds: ${sensors.batch.timeout-seconds:30}
⚠️ 注意事项
重要提醒
- 切勿在生产环境使用 DEBUG 模式
- DEBUG 模式的数据不会写入服务器
- 会自动修改 server URL 格式
- 部分环境可能不支持 debug 模式的 project name
- 建议在开发环境使用独立的测试项目
🚀 性能优化
• 生产环境建议使用
batch模式• 合理设置
bulkSize• 设置合适的
timeoutSeconds
- • 埋点操作建议异步执行
- • 避免影响主业务流程
- • 使用线程池管理
- • 捕获所有异常
- • 记录错误日志
- • 不影响主业务
异常处理示例:
try {
sensorsAnalytics.track(distinctId, isLoginId, eventName, properties);
sensorsAnalytics.flush();
} catch (Exception e) {
log.error("神策埋点失败", e);
// 不影响主业务流程
}
📊 数据规范
字段命名规范
✓ 使用
f_前缀表示业务字段- ✓ 采用下划线命名法
✓ 示例:
f_credit_apply_no、f_quotient_scene
类型 | 说明 | 示例 |
|---|---|---|
字符串 | 用户ID、业务编号等 | "CA20251111000001" |
数值 | 金额、数量等 | 10000 |
时间戳 | 使用毫秒级时间戳 | 1699689600000 |
必填字段
✓ distinctId - 用户唯一标识
✓ eventName - 事件名称
✓ properties - 事件属性
🔍 问题排查
常见问题
❓ Q1:配置不生效怎么办?
- 检查
@ConfigurationProperties注解是否正确 - 确认配置文件路径和格式
- 验证 Nacos 配置是否正确推送
❓ Q2:DEBUG 模式看不到数据?
- DEBUG 模式数据不会写入服务器
- 检查控制台日志输出
- 确认 URL 格式是否正确转换
❓ Q3:批量模式数据延迟?
- 检查
timeoutSeconds配置 - 手动调用
flush()立即发送 - 调整
bulkSize参数
📝 日志调试
开启神策 SDK 日志:
logging:
level:
com.sensorsdata: DEBUG
com.example.backend.config.SensorsConfig: DEBUG
🏥 健康检查
@Component
public class SensorsHealthCheck {
@Resource
private ISensorsAnalytics sensorsAnalytics;
@PostConstruct
public void checkSensorsStatus() {
try {
// 发送测试事件
Map<String, Object> testProps = new HashMap<>();
testProps.put("test", "health_check");
sensorsAnalytics.track("health_check", false, "system_health_check", testProps);
log.info("神策数据分析初始化成功");
} catch (Exception e) {
log.error("神策数据分析初始化失败", e);
}
}
}
🎯 最佳实践
代码组织
📦 统一埋点服务
创建统一的埋点服务类,封装通用逻辑,便于维护和管理。
🏷️ 事件常量管理
使用常量类管理所有事件名称,避免硬编码,减少错误。
统一埋点服务:
@Service
public class SensorsTrackingService {
@Resource
private ISensorsAnalytics sensorsAnalytics;
public void trackEvent(String userId, String eventName, Map<String, Object> properties) {
// 统一的埋点逻辑
}
}
事件常量管理:
public class SensorsEventConstants {
public static final String CREDIT_APPLY_CLICK = "d_h5_trilateral_credit_claim_click";
public static final String USER_REGISTER = "d_user_register";
public static final String ORDER_CREATE = "d_order_create";
}
📊 监控告警
监控指标
- 📈 埋点成功率监控
- ⏱️ 数据发送延迟监控
- 🚨 异常情况告警
🗂️ 数据治理
定期清理测试数据
建立完整的数据字典
制定埋点规范文档
📚 附录
相关文件清单
📄
SensorsConfig.java- 神策配置类📄
SensorsDataProperties.java- 配置属性类📄
SensorsTrackModeEnums.java- 跟踪模式枚举
参考链接
开始使用神策数据分析,深入了解用户行为吧!