/v2/summary 接口 placedOrder 为 0 问题排查方案
问题描述
/v2/summary 接口返回的 placedOrder 字段为 0,但实际应该为 1。需要排查问题出现在哪个环节。
排查思路
按照数据流向逐步验证各个环节的数据是否正确:
- 原始数据层 (UserActivity)
- 处理后数据层 (ProcessedUserActivity)
- 统计数据层 (UserActivityStatistic)
- 汇总数据层 (UserActivitySummary)
- 接口查询层
排查步骤
步骤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:检查定时任务执行情况
检查相关定时任务是否正常执行:
- 查看日志中是否有处理指定日期范围的记录
- 查看是否有错误信息
- 确认 _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)
}
可能的问题原因
- 数据未正确处理:原始 UserActivity 记录未正确处理到 ProcessedUserActivity
- 会话处理问题:sessionId 分配异常导致记录被过滤
- 消费者ID缺失:consumerId 为空或无效导致记录被过滤
- 广告来源判断错误:fromAd 字段计算错误导致记录被归类到错误的分组
- 定时任务异常:汇总任务未执行或执行出错
- 去重逻辑问题:在汇总阶段去重时错误地过滤了订单记录
解决方案
根据排查结果采取相应措施:
- 如果原始数据存在问题,检查数据采集逻辑
- 如果处理过程有问题,检查 ProcessedUserActivity 生成逻辑
- 如果统计数据有问题,检查 UserActivityStatistic 生成逻辑
- 如果汇总过程有问题,修复 _generate_summary_data 方法中的逻辑
- 如果是定时任务问题,检查任务调度和执行日志