/v2/summary 接口 placedOrder 为 0 问题排查方案

问题描述

/v2/summary 接口返回的 placedOrder 字段为 0,但实际应该为 1。需要排查问题出现在哪个环节。

排查思路

按照数据流向逐步验证各个环节的数据是否正确:

  1. 原始数据层 (UserActivity)
  2. 处理后数据层 (ProcessedUserActivity)
  3. 统计数据层 (UserActivityStatistic)
  4. 汇总数据层 (UserActivitySummary)
  5. 接口查询层

排查步骤

步骤1:检查原始数据层 (UserActivity)

首先检查 UserActivity 集合中是否存在相关的订单放置记录。

// 查询指定时间范围内的订单放置记录
db.UserActivity.find({
  "activityName": "USER_ACTIVITY_ORDER_PLACED",
  "createdAt": {
    $gte: ISODate("2025-11-25T00:00:00.000-08:00"),
    $lte: ISODate("2025-12-02T23:59:59.999-08:00")
  },
  "postId": "6ff59f85-6b2b-486c-a7e6-33d1a1979da9"
})

预期结果:应该能找到至少一条记录。

步骤2:检查处理后数据层 (ProcessedUserActivity)

检查 ProcessedUserActivity 集合中是否包含相应的处理后记录。

// 查询处理后的订单放置记录
db.ProcessedUserActivity.find({
  "activityName": "USER_ACTIVITY_ORDER_PLACED",
  "createdAt": {
    $gte: ISODate("2025-11-25T00:00:00.000-08:00"),
    $lte: ISODate("2025-12-02T23:59:59.999-08:00")
  },
  "postId": "6ff59f85-6b2b-486c-a7e6-33d1a1979da9"
}).pretty()

重点关注:

  • 记录是否存在于 ProcessedUserActivity 集合中
  • consumerId 字段是否存在且有效
  • sessionId 字段是否存在

步骤3:检查统计数据层 (UserActivityStatistic)

检查 UserActivityStatistic 集合中的统计数据。

// 查询统计记录
db.UserActivityStatistic_America/Los_Angeles_v2.find({
  "date": {
    $gte: "2025-11-25",
    $lte: "2025-12-02"
  },
  "postId": "6ff59f85-6b2b-486c-a7e6-33d1a1979da9",
  "placedOrder": {$gt: 0}
}).pretty()

重点关注:

  • 是否存在 placedOrder 为 true 的记录
  • consumerId 是否有效
  • fromAd 字段值

步骤4:检查汇总数据层 (UserActivitySummary)

检查最终的汇总数据。

// 查询汇总记录
db.UserActivitySummary_America/Los_Angeles_v2.find({
  "date": {
    $gte: "2025-11-25",
    $lte: "2025-12-02"
  },
  "postId": "6ff59f85-6b2b-486c-a7e6-33d1a1979da9"
}).pretty()

观察 placedOrder 字段值是否为 0。

步骤5:检查定时任务执行情况

检查相关定时任务是否正常执行:

  1. 查看日志中是否有处理指定日期范围的记录
  2. 查看是否有错误信息
  3. 确认 _generate_summary_data 方法是否被正确调用

步骤6:手动验证汇总逻辑

如果前面步骤都正常,但汇总结果仍为 0,可以手动验证汇总逻辑:

// 获取指定范围的所有统计记录
var stats = db.UserActivityStatistic_America/Los_Angeles_v2.find({
  "date": {
    $gte: "2025-11-25",
    $lte: "2025-12-02"
  },
  "postId": "6ff59f85-6b2b-486c-a7e6-33d1a1979da9"
}).toArray()

// 按广告来源和postId分组并统计placedOrder
var grouped = {}
stats.forEach(function(stat) {
  var key = stat.fromAd + "_" + stat.postId
  if (!grouped[key]) {
    grouped[key] = {
      visitors: new Set(),
      orderPlacers: new Set()
    }
  }

  if (stat.uniqueVisitors) {
    grouped[key].visitors.add(stat.consumerId)
  }

  if (stat.placedOrder) {
    grouped[key].orderPlacers.add(stat.consumerId)
  }
})

// 输出各组的统计结果
for (var key in grouped) {
  print("Group: " + key)
  print("  Unique Visitors: " + grouped[key].visitors.size)
  print("  Order Placers: " + grouped[key].orderPlacers.size)
}

可能的问题原因

  1. 数据未正确处理:原始 UserActivity 记录未正确处理到 ProcessedUserActivity
  2. 会话处理问题:sessionId 分配异常导致记录被过滤
  3. 消费者ID缺失:consumerId 为空或无效导致记录被过滤
  4. 广告来源判断错误:fromAd 字段计算错误导致记录被归类到错误的分组
  5. 定时任务异常:汇总任务未执行或执行出错
  6. 去重逻辑问题:在汇总阶段去重时错误地过滤了订单记录

解决方案

根据排查结果采取相应措施:

  1. 如果原始数据存在问题,检查数据采集逻辑
  2. 如果处理过程有问题,检查 ProcessedUserActivity 生成逻辑
  3. 如果统计数据有问题,检查 UserActivityStatistic 生成逻辑
  4. 如果汇总过程有问题,修复 _generate_summary_data 方法中的逻辑
  5. 如果是定时任务问题,检查任务调度和执行日志

results matching ""

    No results matching ""