Cloudflare Worker が訪問者のリクエストをインターセプトすると、サブリクエストと呼ばれる追加の外向き fetch を発行できます。既定では、各サブリクエストが Logpush に独自のログエントリを生成するため、訪問者向けの 1 リクエストに対して複数のログ行が残ります。
各リクエスト段階は、ログフィールドで識別できます。サブリクエストのマージを有効にすると、サブリクエストのログエントリを親リクエストに集約し、Logpush ジョブが訪問者リクエストごとに 1 行のログを配信します。
各リクエスト段階は、それぞれ独自のログ行を生成します。次のフィールドで区別できます。
訪問者リクエスト — 訪問者からゾーンへの元のリクエストです:
- ClientRequestSource == "eyeball"
オリジンリクエスト — Cloudflare からオリジンサーバーへ転送されたリクエストです:
- OriginIP != ""、または
- OriginResponseStatus != 0(例: OriginResponseStatus == 200)
Worker サブリクエスト — Worker が発行した fetch です:
- WorkerSubrequest == true
- ClientRequestSource == "edgeWorkerFetch"
サブリクエストのログを親と対応付けるには、サブリクエストの ParentRayID フィールドを、親リクエストの RayID と照合します。
サブリクエストのマージは、http_requests データセットで希望した場合に使える機能です。有効にすると、Logpush ジョブは訪問者リクエストごとに 1 行のログを配信し、サブリクエストのデータは親ログレコード上の入れ子配列フィールドとして埋め込まれます。
- 親リクエストあたり最大 50 件のサブリクエストがマージされます。この上限を超えたサブリクエストは、変更せず個別のログエントリとしてそのまま渡されます。
- サブリクエストは、訪問者リクエストから 5 分以内に完了する必要があります。この時間を超えたサブリクエストは、変更せずそのまま渡されます。
サブリクエストのマージを有効にすると、各親リクエストのログレコードに Subrequests フィールド(array<object>)が追加されます。配列の各要素には、そのサブリクエストの標準的な http_requests フィールドが含まれます。
配列に含まれるのは、上記の対象条件を満たすサブリクエストだけです。対象外のサブリクエストは、別のログエントリとして現れます。リクエストにサブリクエストがない場合、または対象になるものがなければ、フィールドは空([])になります。
サブリクエストのマージは、API または Cloudflare ダッシュボードで有効にできます。
- Cloudflare ダッシュボードで、ドメイン(ゾーン)レベルの Logpush ページを開きます。 Logpush を開く ↗
- Create a Logpush job を選ぶか、既存の http_requests ジョブの横にある Edit を選びます。
- Advanced Options で、Subrequest merging のトグルを有効にします。
- Save を選びます。
- 新規ジョブでサブリクエストのマージを有効にするには、リクエスト本文に
"merge_subrequests": trueを設定します。
次のトークン権限のうち、少なくとも 1 つが必要です。
- Logs Write
Logpush ジョブを作成する
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/logpush/jobs" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"name": "<DOMAIN_NAME>",
"destination_conf": "s3://<BUCKET_PATH>?region=us-east-1",
"dataset": "http_requests",
"output_options": {
"field_names": [
"ClientIP",
"ClientRequestHost",
"ClientRequestMethod",
"ClientRequestURI",
"EdgeStartTimestamp",
"EdgeResponseStatus",
"RayID",
"ParentRayID",
"Subrequests"
],
"timestamp_format": "rfc3339"
},
"merge_subrequests": true,
"enabled": true
}'既存ジョブでサブリクエストのマージを有効にする場合:
Logpush ジョブを更新する
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/logpush/jobs/$JOB_ID" \
--request PUT \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"merge_subrequests": true
}'サブリクエストのマージなしでは、1 件のサブリクエストを行う Worker は 2 件の別々のログレコードを生成します。
{"RayID":"abc123","ParentRayID":"","ClientIP":"203.0.113.1","EdgeResponseStatus":200, ...}
{"RayID":"def456","ParentRayID":"abc123","ClientIP":"203.0.113.1","EdgeResponseStatus":200, ...}サブリクエストのマージを有効にすると、サブリクエストが入れ子になった 1 件のレコードが生成されます。
{
"RayID": "abc123",
"ParentRayID": "",
"ClientIP": "203.0.113.1",
"EdgeResponseStatus": 200,
"Subrequests": [
{
"RayID": "def456",
"ClientIP": "203.0.113.1",
"EdgeResponseStatus": 200
}
]
}