如果你多次运行相同的 GraphQL Analytics API 查询并收到略有不同的结果,这是由 Adaptive Bit Rate (ABR) 采样引起的。ABR 根据查询复杂度和时间动态调整数据分辨率,可能导致不同查询运行之间出现轻微差异。
要减少差异,请查询较短的时间范围(按日或按周而非按月),使用聚合数据集(带 Groups 后缀的节点),并请求 confidence intervals 以了解数据质量。更多信息,请参阅 Sampling。
Cloudflare 的数据管道在全球网络中处理每秒超过 7 亿个事件。为每个查询实时处理所有这些数据将成本高昂且耗时。
采样分析数据子集而非每个数据点。Cloudflare 使用 Adaptive Bit Rate (ABR) 采样确保即使处理大型数据集,查询也能快速完成。
ABR 以多种分辨率存储数据:
- 100% — 完整数据(用于较小数据集)
- 10% — 10% 样本(中等分辨率)
- 1% — 1% 样本(较低分辨率)
运行查询时,ABR 根据查询复杂度、请求的时间范围、要检索的行数和当前系统负载动态选择最佳分辨率。
结果可能因以下原因而异:
- 动态分辨率选择 — ABR 可能根据系统条件在不同查询运行中选择不同的采样分辨率。
- 长时间范围 — 一次查询 30 天是昂贵操作,会触发更激进的采样。
- 高查询复杂度 — 具有许多 filter 或 aggregation 的复杂查询可能以不同方式采样。
- 系统负载 — 在高流量期间,系统可能应用更激进的采样以确保公平资源分配。
例如,两次运行相同的 30 天查询可能一次返回 3,500 个对象,另一次返回 3,600 个对象。这表明使用了不同的采样分辨率。
可以。采样数据高度可靠,提供与完整数据集同样可信的洞察。Cloudflare 的采样技术捕获整个数据集的基本特征。
聚合指标(总计、平均值、百分位数)根据样本大小进行外推,因此报告的指标准确代表整个数据集。基于数千行的结果很可能具有代表性。
不要一次查询整个月,而是将查询拆分为较小间隔(按日或按周)。
之前(差异更大):
datetime_geq: "2024-09-01T00:00:00Z"
datetime_lt: "2024-10-01T00:00:00Z"之后(更一致):
datetime_geq: "2024-09-01T00:00:00Z"
datetime_lt: "2024-09-02T00:00:00Z"然后在客户端聚合结果。较小的时间窗口不太可能触发激进的采样阈值。
优先使用带 Groups 后缀的数据节点而非原始 adaptive 数据集。聚合数据经过预处理,较少受采样变异性影响。
例如,使用 httpRequestsAdaptiveGroups 而非原始事件数据。
始终在查询中包含 orderBy 以确保一致的结果排序:
orderBy: [datetime_ASC]对于 adaptive 数据集,请求 confidence intervals 以了解数据质量并验证采样:
confidence(level: 0.95) {
count {
estimate
lower
upper
sampleSize
}
}更高的 sampleSize 表示更可靠的结果。
| 问题 | 缓解措施 |
|---|---|
| 不同运行结果有差异 | 查询较短的时间范围(按日或按周而非按月) |
| 大型查询上的激进采样 | 将查询拆分为较小时间间隔并在客户端聚合 |
| 需要一致的排序 | 为所有查询添加 orderBy 子句 |
| 需要验证数据质量 | 请求 confidence intervals 以检查样本大小和准确性 |
| 使用原始 adaptive 数据 | 切换到聚合数据集(带 Groups 后缀的节点) |