我是标题
  • 介绍
  • 产品使用指南
    • 新手入门
      • 神策分析是什么
      • 神策分析能做什么
      • 神策分析怎么解决问题
      • 神策分析的数据来源
    • 功能介绍
      • 基本概念
        • 行为分析常用名词
        • 神策分析相关名词
        • 基础指标配置说明
        • 属性筛选条件说明
      • 分析模块
        • 事件分析
        • Session 分析
        • 漏斗分析
        • 留存分析
        • 分布分析
        • 归因分析
        • 用户路径分析
        • 网页热力分析
        • APP 点击分析
        • 间隔分析
        • 用户属性分析
        • 搜索用户
        • 用户分群
          • 用户分群(1.14 版本)
          • 用户分群
          • 用户分群(1.13 之前版本)
        • 用户行为序列
        • 书签及数据概览
          • 数据概览(1.11 之前版本)
          • 概览分组
          • 渠道对比组件使用说明
          • 预置概览
        • 自定义查询
      • 辅助功能
        • 事件分类
        • 查询抽样
        • 权限管理
          • 角色权限与账号(1.14 版本)
        • 预警管理
        • 元数据管理
        • 可视化全埋点
        • 维度字典
        • 正则表达式
        • 推荐分享
        • 小版本升级
        • 掌上神策分析
  • 技术指南
    • 数据采集
      • 数据模型
      • 数据格式
      • 调试模式
        • 调试模式动态配置
      • 数据校验
      • 导入实时查看
        • 导入实时查看(新版本)
        • 导入实时查看(老版本)
      • 埋点管理
      • 多项目
      • 如何准确的标识用户
      • 新增用户及首日首次标记
    • 快速接入指南
      • 接入前准备(全员阅读)
      • 如何准确的标识用户 (全员阅读)
      • 事件设计 (需求方阅读)
      • SDK 采集数据 (开发必读)
        • JavaScript 快速使用
        • 微信小程序快速使用
        • Android 快速使用
        • iOS 快速使用
        • Java 快速使用
      • 数据校验(测试必读)
    • 客户端 SDK
      • C++ SDK
      • 微信小程序 SDK
        • 微信小程序 SDK 历史版
        • 微信小程序 SDK 标准版
        • 微信小程序 SDK 插件版
        • 微信小程序 SDK 自定义全埋点版
      • 支付宝小程序 SDK
      • 百度小程序 SDK
      • JavaScript SDK
        • 常见问题
        • 全埋点(AutoTrack)
        • 点击图(HeatMap)
        • 单页面
        • 关闭页面发数据
      • Android SDK
        • 常见问题
        • 全埋点(AutoTrack)
        • 点击图(HeatMap)
      • iOS SDK
        • 常见问题
        • 全埋点(AutoTrack)
        • 点击图(HeatMap)
      • 打通 App 与 H5
      • App 第三方框架
        • React Native(Android & iOS)
        • Flutter(Android & iOS)
        • Weex(iOS)
        • Weex(Android)
        • 第三方 H5 页面嵌入 js(iOS)
        • 第三方 H5 页面嵌入 js(Android)
      • APICloud SDK
    • 服务端 SDK
      • C SDK
        • C SDK Demo
      • CSharp SDK
      • Java SDK
        • Java SDK Demo
      • Python SDK
      • PHP SDK
      • Ruby SDK
      • Golang SDK
      • Node SDK
    • 公共属性
    • 渠道追踪
      • App 渠道追踪
      • Web 渠道追踪
      • 小程序渠道追踪
      • 渠道对接
      • 渠道链接管理
    • 数据导入
      • BatchImporter
      • LogAgent
        • LogAgent 场景使用示例
      • FormatImporter
      • HdfsImporter
      • 数据导入常见问题
    • 数据导出
      • 查询 API
      • 订阅实时数据
      • 使用 JDBC 进行数据访问
      • 数据迁移
    • 辅助工具
      • 数据清理工具使用说明
      • 多项目管理工具使用说明
      • 元数据创建工具使用说明
      • 环境检测工具使用说明
    • 高级功能
      • 数据接入 API
      • App 消息推送
      • 虚拟属性和维度表
      • 数据预处理模块
      • 服务转发配置
      • 使用 HTTPS 的数据接入
      • API
        • 查询 API
        • 功能 API
          • 分群 API(1.12 及之前版本)
          • 分群 API(1.13 版本)
          • 分群 API(1.14 版本)
          • 埋点统计 API(1.11 及之前版本)
          • 埋点统计 API(1.12 及之后版本)
      • 第三方登录
      • 数据归档
  • 最佳实践
    • 功能应用示例
      • 事件分析
      • 漏斗分析
      • 留存分析
      • 分布分析
      • 间隔分析
      • 用户分群
      • 自定义查询
      • 用户行为序列
    • 复杂分析场景
      • 定位商品销量变化原因
  • 常见问题
  • 产品更新日志
Powered by GitBook
On this page

Was this helpful?

  1. 技术指南
  2. 服务端 SDK
  3. Java SDK

Java SDK Demo

下面,是针对一个典型的电商产品,在后台服务端,使用 Java SDK 向神策分析系统发送数据的样例。

样例主要展示数据的记录能力,使用者需要根据自己的需求和具体的产品形态,来设计相应的 Event 和 Property。

    // 使用 ConcurrentLoggingConsumer 初始化 SensorsAnalytics
    // 将数据输出到 /data/sa 下的 access.log.2017-01-11 文件中,每天一个文件。需要配合 LogAgent 导入工具,把产生的数据导入到神策分析系统中。
    final SensorsAnalytics sa = new SensorsAnalytics(
            new SensorsAnalytics.ConcurrentLoggingConsumer("/data/sa/access.log")); 

    /*
    在这个Demo中,我们以一个典型的电商产品为例,描述一个用户从匿名访问网站,到下单购买商品,再到申请售后服务,
    这样一个整个环节,使用神策分析(以下简称SA)的产品,应该如何记录日志。

    特别需要注意的是,这个Demo只是描述SA的数据记录能力,并不是说使用者要完全照搬这些Event和Property的设计,
    使用者还是需要结合自己产品的实际需要,来做相应的设计和规划
     */

    // 1. 用户匿名访问网站
    String cookieId = "ABCDEF123456789"; // 用户未登录时,可以使用产品自己生成的cookieId来标注用户
    Map<String, Object> properties = new HashMap<String, Object>();
    // 1.1 访问首页
    /*
    前面有$开头的property字段,是SA提供给用户的预置字段
    对于预置字段,已经确定好了字段类型和字段的显示名
    */
    properties.clear();
    properties.put("$time", new Date());                // 这条event发生的时间,如果不设置的话,则默认是当前时间
    properties.put("$os", "Windows");                   // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");               // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");           // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("Channel", "baidu");                 // 用户是通过baidu这个渠道过来的
    sa.track(cookieId, false, "ViewHomePage", properties); // 记录访问首页这个event

    // 1.2 搜索商品
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");         // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("KeyWord", "XX手机");                // 搜索引擎引流过来时使用的关键词
    sa.track(cookieId, false, "SearchProduct", properties);      // 记录搜索商品这个event

    // 1.3 浏览商品
    properties.clear();
    properties.put("$os", "Windows");                 // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");             // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");         // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("ProductName", "xx手机");           // 商品名称
    properties.put("ProductType", "智能手机");         //  商品类别
    properties.put("ShopName", "XX官方旗舰店");         // 店铺名称
    sa.track(cookieId, false, "ViewProduct", properties);      // 记录浏览商品这个event

    // 2. 用户决定注册了
    String registerId = "123456";       // 用户注册时,分配给用户的注册Id

    // 2.1 通过,trackSignUP,把匿名ID和注册ID贯通起来
    sa.trackSignUp(registerId, cookieId);

    // 刷新一下,让埋点数据落到指定目录文件中
    sa.flush();

    // 2.2 用户注册时,填充了一些个人信息,可以用Profile接口记录下来
    Map<String, Object> profiles = new HashMap<String, Object>();
    profiles.put("$city", "武汉");      // 用户所在城市
    profiles.put("$province", "湖北");  // 用户所在省份
    profiles.put("$name", "昵称123");   // 用户的昵称
    profiles.put("Gender", "male");     // 用户的性别
    profiles.put("Birthday", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(
        "1984-11-03 " + "00:00:00"));                 // 用户的出生日期,特别注意,这个地方填入年龄是不合适的,因为年龄会随着时间而变化
    profiles.put("RegisterChannel", "baidu");  // 用户的注册渠道
    sa.profileSet(registerId, profiles);    // 此时传入的是注册ID了



    // 3. 用户注册后,进行后续行为
    // 3.1 提交订单和提交订单详情
    // 这个订单里面包含一个手机和两个手机膜
    // 订单的信息
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");         // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");   // 订单ID
    properties.put("ShipPrice", 10.0);             // 运费
    properties.put("OrderTotalPrice", 1234.0);         // 订单的总价格,默认是元
    sa.track(registerId, true, "SubmitOrder", properties); // 注意,此时使用的已经是注册ID了
    // 订单中手机这个商品的信息
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");     // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");  // 订单ID
    properties.put("ProductName", "XX手机");    // 商品名称
    properties.put("ProductType", "智能手机");   // 商品类别
    properties.put("ShopName", "XX官方旗舰店");  // 店铺名称
    properties.put("ProductUnitPrice", 1200.0);   // 商品单价
    properties.put("ProductAmount", 1.0);         // 商品数量,可以是个数,也可以是重量
    properties.put("ProductTotalPrice", 1200.0);  // 商品总价
    sa.track(registerId, true, "SubmitOrderDetail", properties);
    // 订单中手机膜这个商品的信息
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");     // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");  // 订单ID
    properties.put("ProductName", "5寸钢化膜");    // 商品名称
    properties.put("ProductType", "手机配件");   // 商品类别
    properties.put("ShopName", "XX手机外设店");  // 店铺名称
    properties.put("ProductUnitPrice", 12.0);   // 商品单价
    properties.put("ProductAmount", 2.0);         // 商品数量,可以是个数,也可以是重量
    properties.put("ProductTotalPrice", 24.0);  // 商品总价
    sa.track(registerId, true, "SubmitOrderDetail", properties);

    // 3.2 支付订单和支付订单详情
    // 整个订单的支付情况
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");         // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");   // 订单ID
    properties.put("ShipPrice", 10.0);             // 运费
    properties.put("OrderTotalPrice", 1234.0);         // 订单的总价格,默认是元
    properties.put("PaymentMethod", "AliPay");              // 支付方式
    properties.put("AllowanceAmount", 30.0);                   // 补贴金额
    properties.put("PaymentAmount", 1204.0);      // 实际支付的订单金额
    sa.track(registerId, true, "PayOrder", properties);
    // 手机这个商品的支付情况
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");     // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");  // 订单ID
    properties.put("ProductName", "XX手机");    // 商品名称
    properties.put("ProductType", "智能手机");   // 商品类别
    properties.put("ShopName", "XX官方旗舰店");  // 店铺名称
    properties.put("ProductUnitPrice", 1200.0);   // 商品单价
    properties.put("ProductAmount", 1.0);         // 商品数量,可以是个数,也可以是重量
    properties.put("ProductTotalPrice", 1200.0);  // 商品总价
    properties.put("ProductAllowanceAmount", 30.0); // 假设这个补贴是在手机上的折扣
    properties.put("ProductPaymentAmount", 1170.0); // 手机实际支付了这么多
    properties.put("PaymentMethod", "AliPay");      // 与订单保持一致
    sa.track(registerId, true, "PayOrderDetail", properties);
    // 手机膜这个商品的支付情况
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");     // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");  // 订单ID
    properties.put("ProductName", "5寸钢化膜");    // 商品名称
    properties.put("ProductType", "手机配件");   // 商品类别
    properties.put("ShopName", "XX手机外设店");  // 店铺名称
    properties.put("ProductUnitPrice", 12.0);   // 商品单价
    properties.put("ProductAmount", 2.0);         // 商品数量,可以是个数,也可以是重量
    properties.put("ProductTotalPrice", 24.0);  // 商品总价
    properties.put("ProductAllowanceAmount", 0.0); // 手机膜上并没有补贴
    properties.put("ProductPaymentAmount", 24.0); // 手机膜实际支付了这么多
    properties.put("PaymentMethod", "AliPay");      // 与订单保持一致
    sa.track(registerId, true, "PayOrderDetail", properties);

    // 3.3 假设这个用户支付后反悔了,要取消订单
    // 整个订单的取消情况
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");         // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");   // 订单ID
    properties.put("ShipPrice", 10.0);             // 运费
    properties.put("OrderTotalPrice", 1234.0);         // 订单的总价格,默认是元
    properties.put("PaymentMethod", "AliPay");              // 支付方式
    properties.put("AllowanceAmount", 30.0);                   // 补贴金额
    properties.put("PaymentAmount", 1204.0);      // 实际支付的订单金额
    properties.put("CancelReason", "地址填写错误"); // 取消订单的原因
    properties.put("CancelTiming", "AfterPay");   // 取消订单的时机
    sa.track(registerId, true, "CancelOrder", properties);
    // 手机这个商品的支付情况
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");     // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");  // 订单ID
    properties.put("ProductName", "XX手机");    // 商品名称
    properties.put("ProductType", "智能手机");   // 商品类别
    properties.put("ShopName", "XX官方旗舰店");  // 店铺名称
    properties.put("ProductUnitPrice", 1200.0);   // 商品单价
    properties.put("ProductAmount", 1.0);         // 商品数量,可以是个数,也可以是重量
    properties.put("ProductTotalPrice", 1200.0);  // 商品总价
    properties.put("ProductAllowanceAmount", 30.0); // 假设这个补贴是在手机上的折扣
    properties.put("ProductPaymentAmount", 1170.0); // 手机实际支付了这么多
    properties.put("PaymentMethod", "AliPay");      // 与订单保持一致
    properties.put("CancelReason", "地址填写错误"); // 取消订单的原因
    properties.put("CancelTiming", "AfterPay");   // 取消订单的时机
    sa.track(registerId, true, "CancelOrderDetail", properties);
    // 手机膜这个商品的支付情况
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");     // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");  // 订单ID
    properties.put("ProductName", "5寸钢化膜");    // 商品名称
    properties.put("ProductType", "手机配件");   // 商品类别
    properties.put("ShopName", "XX手机外设店");  // 店铺名称
    properties.put("ProductUnitPrice", 12.0);   // 商品单价
    properties.put("ProductAmount", 2.0);         // 商品数量,可以是个数,也可以是重量
    properties.put("ProductTotalPrice", 24.0);  // 商品总价
    properties.put("ProductAllowanceAmount", 0.0); // 手机膜上并没有补贴
    properties.put("ProductPaymentAmount", 24.0); // 手机膜实际支付了这么多
    properties.put("PaymentMethod", "AliPay");      // 与订单保持一致
    sa.track(registerId, true, "CancelOrderDetail", properties);

    // 4. 假设用户并没有取消订单,然后成功完成了配送
    // 手机这个商品的配送情况
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");     // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");  // 订单ID
    properties.put("ProductName", "XX手机");    // 商品名称
    properties.put("ProductType", "智能手机");   // 商品类别
    properties.put("ShopName", "XX官方旗舰店");  // 店铺名称
    properties.put("ProductUnitPrice", 1200.0);   // 商品单价
    properties.put("ProductAmount", 1.0);         // 商品数量,可以是个数,也可以是重量
    properties.put("ProductTotalPrice", 1200.0);  // 商品总价
    properties.put("ProductAllowanceAmount", 30.0); // 假设这个补贴是在手机上的折扣
    properties.put("ProductPaymentAmount", 1170.0); // 手机实际支付了这么多
    properties.put("PaymentMethod", "AliPay");      // 与订单保持一致
    properties.put("SupplyTime", 49.0);       // 订单运送用了49小时
    properties.put("SupplyMethod", "顺丰");   // 通过顺丰运送的
    sa.track(registerId, true, "ReceiveProduct", properties);
    // 手机膜这个商品的配送情况
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");     // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");  // 订单ID
    properties.put("ProductName", "5寸钢化膜");    // 商品名称
    properties.put("ProductType", "手机配件");   // 商品类别
    properties.put("ShopName", "XX手机外设店");  // 店铺名称
    properties.put("ProductUnitPrice", 12.0);   // 商品单价
    properties.put("ProductAmount", 2.0);         // 商品数量,可以是个数,也可以是重量
    properties.put("ProductTotalPrice", 24.0);  // 商品总价
    properties.put("ProductAllowanceAmount", 0.0); // 手机膜上并没有补贴
    properties.put("ProductPaymentAmount", 24.0); // 手机膜实际支付了这么多
    properties.put("PaymentMethod", "AliPay");      // 与订单保持一致
    properties.put("SupplyTime", 98.0);       // 订单运送用了98小时
    properties.put("SupplyMethod", "圆通");   // 通过顺丰运送的
    sa.track(registerId, true, "ReceiveProduct", properties);


    // 5. 假设产品有质量问题,用户申请了售后服务
    // 5.1 手机申请了维修
    // 提交了售后服务
    properties.clear();
    properties.put("$os", "Windows");         // 通过请求中的UA,可以解析出用户使用设备的操作系统是windows的
    properties.put("$os_version", "8.1");     // 操作系统的具体版本
    properties.put("$ip", "123.123.123.123");     // 请求中能够拿到用户的IP,则把这个传递给SA,SA会自动根据这个解析省份、城市
    properties.put("OrderId", "SN_123_AB_TEST");  // 订单ID
    properties.put("ProductName", "XX手机");    // 商品名称
    properties.put("ProductType", "智能手机");   // 商品类别
    properties.put("ShopName", "XX官方旗舰店");  // 店铺名称
    properties.put("ProductUnitPrice", 1200.0);   // 商品单价
    properties.put("ProductAmount", 1.0);         // 商品数量,可以是个数,也可以是重量
    properties.put("ProductTotalPrice", 1200.0);  // 商品总价
    properties.put("ProductAllowanceAmount", 30.0); // 假设这个补贴是在手机上的折扣
    properties.put("ProductPaymentAmount", 1170.0); // 手机实际支付了这么多
    properties.put("PaymentMethod", "AliPay");      // 与订单保持一致
    properties.put("ServiceContent", "维修");       // 手机申请了维修
    properties.put("ServiceStatus", "新提交");       // 售后服务的状态
    sa.track(registerId, true, "ServiceAfterSale", properties);
    // 产品被收到,开始维修了,记录一条新的数据
    properties.put("ServiceStatus", "维修中");       // 售后服务的状态
    sa.track(registerId, true, "ServiceAfterSale", properties);
    // 维修完成了,再记录一条新的数据
    properties.put("ServiceStatus", "维修完成");       // 售后服务的状态
    sa.track(registerId, true, "ServiceAfterSale", properties);

    // 刷新一下,让埋点数据落到指定目录文件中
    sa.flush();
PreviousJava SDKNextPython SDK

Last updated 6 years ago

Was this helpful?