Логи Vanilla-операции YTsaurus Flow

Логи

Процессы Flow живут в джобах vanilla-операции, поэтому их логи пишутся в песочницу джобы: подробная история процесса — в файле logs/flow.log и, с обрезкой по размеру, в stderr джобы. По умолчанию раннер настраивает логирование так:

  • файл logs/flow.log сжимается zstd — и активный сегмент, и ротированные. Активный сегмент ротируется по достижении 256 MiB на диске, то есть уже в сжатом виде (max_segment_size); все сегменты вместе занимают не более 4 GiB (max_total_size_to_keep), самые старые сверх лимита удаляются. История поэтому длинная, но не бесконечная: у долго работающего пайплайна её начало вытесняется. Уровень info и выше; шумные инфраструктурные категории (Bus, Concurrency, RpcClient и другие) исключены, чтобы бюджет уходил на историю пайплайна;
  • тот же поток уровня info (плюс error исключённых категорий) пишется и в stderr джобы — он доступен со страницы операции в UI YTsaurus. YTsaurus хранит из него не больше max_stderr_size (по умолчанию 5 MiB): начало и конец потока, то есть запуск процесса и последние события перед завершением; середина у долго работающей джобы вытесняется.

Посмотреть logs/flow.log живой джобы можно через job shell; <job_id> берётся со страницы vanilla-операции (задачи controller и worker):

yt --proxy <cluster> run-job-shell <job_id>

Файл сжат, поэтому tail и grep по нему напрямую не работают — читать его нужно через zstd-декомпрессор. Это обычный поток zstd-фреймов, который понимает любой стандартный декомпрессор:

# внутри джобы: хвост активного сегмента
zstd -dc logs/flow.log | tail -n 100

Так виден только активный сегмент, а в нём — не больше 256 MiB истории. Остальное лежит в ротированных сегментах рядом, в том же каталоге logs/: при каждой ротации активный flow.log становится flow.log.1, прежний flow.log.1 — flow.log.2 и так далее, а под именем flow.log открывается новый пустой файл. Поэтому flow.log — всегда самый свежий сегмент, а чем больше номер, тем сегмент старее. Номера дополняются нулями до общей ширины (flow.log.01, flow.log.02, … когда сегментов больше девяти), так что порядок имён совпадает с числовым — и обратный порядок имён даёт сегменты от самого старого к активному:

# внутри джобы: вся сохранённая история, от старых записей к новым
ls -r -1 logs/flow.log* | xargs zstd -dc

Утилиты zstd в джобе может не оказаться: набор утилит определяется образом задачи. Если её нет, добавьте слой с ней через layers или system_layer_path задачи — см. Дополнительные параметры.

Уровень и состав логирования переопределяются через node_config-патч в блоке vanilla, секция logging — см. TLogManagerConfig.

Логи завершившихся джоб

Песочница джобы удаляется вместе с джобой, поэтому от завершившейся джобы остаётся только её stderr — он есть у упавших и штатно завершившихся джоб; у джобы, убитой при отмене операции, stderr может не сохраниться. Раннер по умолчанию задаёт в спецификации операции max_stderr_count = 150 (максимум планировщика), поэтому планировщик хранит stderr первых 150 завершившихся джоб операции, а не только первых десяти; значение переопределяется полем max_stderr_count блока vanilla. Возьмите <operation_id> со страницы Vanilla-операции, а <job_id> — из её задачи controller или worker; затем прочитайте сохранённый лог командой:

yt --proxy <cluster> get-job-stderr --operation <operation_id> --job-id <job_id>

См. также