跳转到内容
搜索文档

子请求

最后更新 查看 MarkdownAgent 设置

当 Cloudflare Worker 拦截访客请求时,它可以发出称为子请求的额外出站 fetch 调用。默认情况下,每个子请求都会在 Logpush 中生成自己的日志条目,从而导致单个面向访客的请求产生多条日志行。

每个请求阶段都可以通过其日志字段进行识别。你也可以选择启用子请求合并,将子请求日志条目聚合到其父请求中,使 Logpush 任务为每个访客请求仅交付一条日志行。

识别日志类型

每个请求阶段都会生成自己的日志行。你可以使用以下字段区分它们。

访客请求 — 访客对你的 zone 的原始请求:

  • ClientRequestSource == "eyeball"

源站请求 — 从 Cloudflare 转发到你的源站服务器的请求:

  • OriginIP != "",或
  • OriginResponseStatus != 0(例如,OriginResponseStatus == 200)

Worker 子请求 — 由 Worker 发出的 fetch 调用:

  • WorkerSubrequest == true
  • ClientRequestSource == "edgeWorkerFetch"

要将子请求日志与其父请求关联,请将子请求的 ParentRayID 字段与父请求的 RayID 匹配。

子请求合并

子请求合并是 http_requests 数据集上的可选功能。启用子请求合并后,你的 Logpush 任务为每个访客请求交付一条日志行,子请求数据作为父日志记录上的嵌套数组字段嵌入。

合并资格

  • 每个父请求最多合并 50 个子请求。超出此限制的子请求将作为单独的日志条目原样通过。
  • 子请求必须在访客请求后 5 分钟内完成。超出此时间窗口的子请求将原样通过。

新的日志字段

启用子请求合并后,会向每个父请求日志记录添加 Subrequests 字段(array<object>)。数组中的每个元素包含该子请求的标准 http_requests 字段。

数组仅包含根据上述资格标准符合合并条件的子请求。不符合条件的子请求将作为单独的日志条目出现。如果请求没有子请求,或没有符合条件的子请求,该字段将为空([])。

启用子请求合并

可以通过 API 或 Cloudflare 仪表板启用子请求合并。

仪表板

  1. 在 Cloudflare 仪表板中,前往域名(也称为 zone)级别的 Logpush 页面。 Go to Logpush ↗
  2. 选择 Create a Logpush job,或在现有的 http_requests 任务旁选择 Edit。
  3. 在 Advanced Options 下,启用 Subrequest merging 开关。
  4. 选择 Save。

API

  1. 要在新任务上启用子请求合并,请在请求正文中设置 "merge_subrequests": true

所需的 API 令牌权限

至少需要以下令牌权限之一:

  • 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
  }'

示例日志输出

未启用子请求合并时,发出一个子请求的 Worker 会产生两条单独的日志记录:

{"RayID":"abc123","ParentRayID":"","ClientIP":"203.0.113.1","EdgeResponseStatus":200, ...}
{"RayID":"def456","ParentRayID":"abc123","ClientIP":"203.0.113.1","EdgeResponseStatus":200, ...}

启用子请求合并后,会生成一条将子请求嵌套在内的记录:

{
  "RayID": "abc123",
  "ParentRayID": "",
  "ClientIP": "203.0.113.1",
  "EdgeResponseStatus": 200,
  "Subrequests": [
    {
      "RayID": "def456",
      "ClientIP": "203.0.113.1",
      "EdgeResponseStatus": 200
    }
  ]
}

这篇文档对您有帮助吗?