Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

サブリクエスト

最終更新 Markdown で表示Agent セットアップ

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 ダッシュボードで有効にできます。

ダッシュボード

  1. Cloudflare ダッシュボードで、ドメイン(ゾーン)レベルの Logpush ページを開きます。 Logpush を開く ↗
  2. Create a Logpush job を選ぶか、既存の http_requests ジョブの横にある Edit を選びます。
  3. Advanced Options で、Subrequest merging のトグルを有効にします。
  4. Save を選びます。

API

  1. 新規ジョブでサブリクエストのマージを有効にするには、リクエスト本文に "merge_subrequests": true を設定します。

必要な API トークンの権限

次のトークン権限のうち、少なくとも 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
    }
  ]
}

役に立ちましたか?