同じ GraphQL Analytics API クエリを何度か実行して、結果がわずかに違う場合、原因は Adaptive Bit Rate(ABR)サンプリングです。ABR はクエリの複雑さとタイミングに応じてデータの解像度を動的に調整するため、実行ごとにわずかな差が出ることがあります。
ばらつきを抑えるには、期間を短くクエリする(月単位ではなく日単位または週単位)、集計済みデータセット(Groups 接尾辞のノード)を使う、信頼区間を取得してデータの品質を把握する、といった方法があります。詳細は サンプリング を参照してください。
Cloudflare のデータパイプラインは、グローバルネットワーク全体で毎秒 7 億件を超えるイベントを処理します。このデータをすべてのクエリでリアルタイムにすべて処理すると、コストと時間がかかりすぎます。
サンプリングは、すべてのデータポイントではなく、一部のデータを分析する手法です。Cloudflare は Adaptive Bit Rate(ABR)サンプリングを使い、大規模なデータセットでもクエリがすばやく完了するようにしています。
ABR は、データを複数の解像度で保存します。
- 100% — 全データ(小規模なデータセットで使用)
- 10% — 10% サンプル(中程度の解像度)
- 1% — 1% サンプル(低い解像度)
クエリを実行すると、ABR はクエリの複雑さ、指定した期間、取得する行数、現在のシステム負荷に応じて、最適な解像度を動的に選びます。
結果が変わる理由はいくつかあります。
- 動的な解像度の選択 — システムの状態によって、ABR は実行ごとに異なるサンプリング解像度を選ぶことがあります。
- 長い期間 — 30 日分を一度にクエリすると負荷が大きく、より積極的なサンプリングがかかります。
- クエリの複雑さ — フィルターや集計が多い複雑なクエリは、サンプリングのされ方が変わることがあります。
- システム負荷 — トラフィックが多い時間帯は、リソースを公平に配分するため、より積極的なサンプリングがかかることがあります。
たとえば、同じ 30 日分のクエリを 2 回実行すると、あるときは 3,500 件、別のときは 3,600 件になることがあります。これは、異なるサンプリング解像度が使われたことを示します。
はい。サンプリングされたデータは信頼性が高く、全データから得た洞察と同じくらい確実な洞察を得られます。Cloudflare のサンプリング手法は、データセット全体の本質的な特徴を捉えます。
集計メトリクス(合計、平均、パーセンタイル)はサンプルサイズに基づいて外挿されるため、報告されるメトリクスはデータセット全体を正しく表します。数千行に基づく結果は、全体をよく表している可能性が高いです。
1 か月分を一度にクエリする代わりに、より短い間隔(日単位または週単位)に分けます。
変更前(ばらつきが大きい):
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"その後、クライアント側で結果を集計します。短い時間窓は、積極的なサンプリングのしきい値に達しにくいです。
生の adaptive データセットよりも、Groups 接尾辞のノードを優先してください。集計済みデータは事前処理されており、サンプリングのばらつきを受けにくいです。
たとえば、生のイベントデータではなく httpRequestsAdaptiveGroups を使います。
結果の並びを安定させるため、クエリには必ず orderBy を含めます。
orderBy: [datetime_ASC]adaptive データセットでは、信頼区間 を取得してデータの品質を把握し、サンプリングを確認します。
confidence(level: 0.95) {
count {
estimate
lower
upper
sampleSize
}
}sampleSize が大きいほど、結果の信頼性は高くなります。
| 問題 | 対策 |
|---|---|
| 実行ごとに結果が変わる | 期間を短くクエリする(月単位ではなく日単位または週単位) |
| 大きなクエリで積極的なサンプリング | クエリを短い時間間隔に分け、クライアント側で集計する |
| 並びを安定させたい | すべてのクエリに orderBy 句を追加する |
| データの品質を確認したい | confidence 区間を取得し、サンプルサイズと精度を確認する |
| 生の adaptive データを使っている | 集計済みデータセット(Groups 接尾辞のノード)に切り替える |