← Cloudflare Logs / logs / logpush / logpush-job
Подзапросы
Когда Cloudflare Worker перехватывает запрос посетителя, он может отправлять дополнительные исходящие вызовы fetch, называемые подзапросами. По умолчанию каждый подзапрос создаёт собственную запись журнала в Logpush, поэтому одному запросу посетителя соответствует несколько строк журнала.
Каждый этап запроса можно определить по его полям в журнале. Также можно включить объединение подзапросов: тогда записи подзапросов агрегируются в родительский запрос, и задание Logpush формирует одну строку журнала на каждый запрос посетителя.
Определение типов журналов
Каждый этап запроса создаёт собственную строку журнала. Различить их можно по следующим полям.
Запрос посетителя : исходный запрос от посетителя к вашей зоне:
- ClientRequestSource == "eyeball"
Запрос к origin-серверу : запрос, перенаправленный с Cloudflare на ваш исходный сервер:
- OriginIP != "", or
- OriginResponseStatus != 0 (например, OriginResponseStatus == 200)
Подзапрос Worker : вызов fetch, отправленный со стороны Worker:
- WorkerSubrequest == true
- ClientRequestSource == "edgeWorkerFetch"
Чтобы сопоставить запись журнала дочернего запроса с родительским запросом, сравните поле ParentRayID дочернего запроса со значением RayID родительского запроса.
Объединение подзапросов
Объединение подзапросов представляет собой функцию набора данных http_requests, которую нужно включить самостоятельно. После включения этой функции задание Logpush формирует одну строку журнала на каждый запрос посетителя, а данные подзапросов встраиваются в родительскую запись журнала в виде поля с вложенным массивом.
Критерии объединения
- В одном родительском запросе объединяется не более 50 подзапросов. Подзапросы сверх этого лимита передаются без изменений как отдельные записи журнала.
- Подзапросы должны завершаться в течение 5 минут после запроса посетителя. Подзапросы, превышающие этот интервал, передаются без изменений.
Новое поле журнала
Когда объединение подзапросов включено, Subrequests поле (array<object>) добавляется в каждую запись лога родительского запроса. Каждый элемент массива содержит стандартные поля http_requests для этого подзапроса.
Массив включает только подзапросы, которые соответствуют критериям объединения, указанным выше. Подзапросы, не соответствующие критериям, отображаются как отдельные записи журнала. Поле будет пустым ([]), если у запроса нет подзапросов или ни один из них не соответствует критериям.
Включение объединения подзапросов
Объединение подзапросов можно включить через API или панель управления Cloudflare.
Dashboard
- В панели управления Cloudflare перейдите на страницу Logpush на уровне домена (также называемого зоной). Перейдите в Logpush ↗
- Выберите Create a Logpush job или выберите Edit рядом с существующим заданием http_requests.
- В разделе Advanced Options включите переключатель Subrequest merging.
- Выберите Save.
API
- Чтобы включить объединение дочерних запросов для нового задания, укажите в теле запроса "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
}
]
}