INTEGRITY Документация

Подзапросы

Когда Cloudflare Worker перехватывает запрос посетителя, он может отправлять дополнительные исходящие вызовы fetch, называемые подзапросами. По умолчанию каждый подзапрос создаёт собственную запись журнала в Logpush, поэтому одному запросу посетителя соответствует несколько строк журнала.

Каждый этап запроса можно определить по его полям в журнале. Также можно включить объединение подзапросов: тогда записи подзапросов агрегируются в родительский запрос, и задание Logpush формирует одну строку журнала на каждый запрос посетителя.

Определение типов журналов

Каждый этап запроса создаёт собственную строку журнала. Различить их можно по следующим полям.

Запрос посетителя : исходный запрос от посетителя к вашей зоне:

Запрос к origin-серверу : запрос, перенаправленный с Cloudflare на ваш исходный сервер:

Подзапрос Worker : вызов fetch, отправленный со стороны Worker:

Чтобы сопоставить запись журнала дочернего запроса с родительским запросом, сравните поле ParentRayID дочернего запроса со значением RayID родительского запроса.

Объединение подзапросов

Объединение подзапросов представляет собой функцию набора данных http_requests, которую нужно включить самостоятельно. После включения этой функции задание Logpush формирует одну строку журнала на каждый запрос посетителя, а данные подзапросов встраиваются в родительскую запись журнала в виде поля с вложенным массивом.

Критерии объединения

Новое поле журнала

Когда объединение подзапросов включено, Subrequests поле (array<object>) добавляется в каждую запись лога родительского запроса. Каждый элемент массива содержит стандартные поля http_requests для этого подзапроса.

Массив включает только подзапросы, которые соответствуют критериям объединения, указанным выше. Подзапросы, не соответствующие критериям, отображаются как отдельные записи журнала. Поле будет пустым ([]), если у запроса нет подзапросов или ни один из них не соответствует критериям.

Включение объединения подзапросов

Объединение подзапросов можно включить через API или панель управления Cloudflare.

Dashboard

  1. В панели управления Cloudflare перейдите на страницу Logpush на уровне домена (также называемого зоной). Перейдите в Logpush ↗
  2. Выберите Create a Logpush job или выберите Edit рядом с существующим заданием http_requests.
  3. В разделе Advanced Options включите переключатель Subrequest merging.
  4. Выберите Save.

API

  1. Чтобы включить объединение дочерних запросов для нового задания, укажите в теле запроса "merge_subrequests": true.

Необходимые разрешения API-токена

Требуется хотя бы одно из следующих разрешений токена:

Создать задание 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
    }
  ]
}