跳转到内容
搜索文档

GraphQL API 结果不一致

最后更新 查看 MarkdownAgent 设置

如果你多次运行相同的 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]

使用 confidence intervals

对于 adaptive 数据集,请求 confidence intervals 以了解数据质量并验证采样:

confidence(level: 0.95) {
  count {
    estimate
    lower
    upper
    sampleSize
  }
}

更高的 sampleSize 表示更可靠的结果。

快速参考

问题 缓解措施
不同运行结果有差异 查询较短的时间范围(按日或按周而非按月)
大型查询上的激进采样 将查询拆分为较小时间间隔并在客户端聚合
需要一致的排序 为所有查询添加 orderBy 子句
需要验证数据质量 请求 confidence intervals 以检查样本大小和准确性
使用原始 adaptive 数据 切换到聚合数据集(带 Groups 后缀的节点)

相关资源

这篇文档对您有帮助吗?