Ещё

Как настроить буферы сбора логов

Буферы агента Vector и отправка в хранилище платформы.

Агент shturval-log-collector на каждом узле перед отправкой логов в платформу записывает их в свой дисковый буфер Vector. Также логи хранятся в каталоге контейнерных логов на диске узла и в VictoriaLogs.

МестоГде смотретьЧто ограничивает буфер
Файлы логов контейнеровкаталог /var/log/pods на диске узлаРаздел или квота узла. Как проверить диск и задать квоту — Логи контейнеров заполняют диск узла
Буфер агентакаталог узла /var/lib/vector. Том data монтирует его в контейнер агента как /vector-data-dirСумма размеров буферов этого агента. Около 1,25 ГиБ, если заполнены все пять
Хранилище платформыVictoriaLogs в кластере управленияСрок хранения в VLSingle

По умолчанию определены размер буферов и способ отправки логов. Вам может потребоваться изменить дефолтные значения, когда:

  • приёмникЭкземпляр VictoriaLogs в кластере управления, которому агент Vector отдаёт логи после буфера на хранение. недоступен и буфер уже заполнен;
  • после восстановления VictoriaLogs накопленные логи с нескольких узлов приходят одновременно и перегружают VictoriaLogs;
  • нужен буфер больше, чем 256 МиБ на одного получателяОдин из пяти получателей логов платформы (platform sinks): auditd, journald, k8s_audit, k8s_events или k8s_logs. У каждого свой дисковый буфер.. Перед этим на узле ограничьте каталог /var/lib/vector: выделите ему отдельный раздел диска или задайте дисковую квоту, чтобы буфер большего размера не занял весь диск узла.

Если требуется изменить срок хранения логов, см. Как настроить ротацию логов. Отключение отправки логов — см. Как управлять отправкой логов в платформе. Если необходимо настроить буфер внешнего хранилища, см. Как настроить сбор и перенаправление логов.

Не изменяйте вручную преднастроенные системные ClusterVectorPipeline: это может нарушить сбор, агрегацию и доставку логов. Параметры буфера измените через применение ShturvalServicePatch (SSP).

Параметры buffer

По умолчанию настроены параметры для каждого буфера всех получателей (sinks): auditd, journald, k8s_audit, k8s_events или k8s_logs:

ПараметрЗначение по умолчаниюДоступные значенияОписание
buffer.typediskmemoryСобытия хранятся в памяти процесса и теряются при перезапуске агента. Для этих получателей не используется., diskСобытия записываются на диск узла и сохраняются при перезапуске агента.В поставке выбран disk: буфер сохраняется при перезапуске агента
buffer.max_eventsне задаётсячисло событийТолько для буфера в памяти. Применяется при type: memory. В Vector для такого буфера по умолчанию около 500 событий. При дисковом буфере размер задаёт buffer
buffer.max_size268435488 байт, около 256 МиБчисло байтРазмер одного буфера. Для дискового буфера Vector это минимально возможное значение. Применяется при type: disk
buffer.when_fullblockblockКогда буфер заполнен, агент ждёт свободное место и не удаляет новые события., drop_newestКогда буфер заполнен, агент отбрасывает новое событие и продолжает чтение. Эти строки в хранилище не попадут. Включайте, только если такую потерю можно допустить.Поведение, когда буфер заполнен. Режимов «удалять самые старые» drop_oldest и кольцевого буфера в Vector нет. Цепочка из нескольких буферов с промежуточным режимом overflow не используется: Vector не считает этот режим готовым для эксплуатации и не гарантирует порядок событий.
request.concurrencyadaptiveadaptiveЧисло одновременных запросов к VictoriaLogs подстраивается под его ответы. или числоФиксированное число отключает адаптацию для этого получателя. Задавайте его, только если adaptive не подходит.Максимальное количество одновременных запросов, отправляемых sink (приёмником)
request.rate_limit_duration_secsне заданочисло секундПериод в секундах, за который sink отправляет не больше установленного лимита HTTP-запросов request.rate_limit_num. Число одновременных запросов задаёт request.concurrency
request.rate_limit_numне заданочисло запросовСколько HTTP-запросов sink отправляет за период request.rate_limit_duration_secs. Пока оба параметра не заданы, Vector не ограничивает частоту запросов. Предел действует и при concurrency: adaptive, и при фиксированном числе
kubernetes_logs.rotate_wait_secs60число секундПауза перед закрытием файла лога контейнера, который kubelet уже удалил. К размеру буфера не относится. При when_full: block и полном буфере цикл чтения до этой проверки не доходит: дескрипторы в /var/log/pods остаются открытыми, пока в буфере не появится место. При drop_newest source не блокируется; файлы закрываются после rotate_wait_secs.

Сумма пяти буферов по умолчанию около 1,25 ГиБ на узел. В /var/lib/vector должно быть свободно не меньше 1,25 ГиБ. Отдельного срока хранения у буфера нет. Агент удаляет фрагмент буфера после того, как полностью отправил его в приёмник. Запись на диск идёт примерно каждые 500 мс. Если записать буфер на диск не удалось, процесс в Vector останавливается.

Увеличивайте buffer.max_size, только когда /var/lib/vector уже вынесен на отдельный раздел или квоту. Иначе больший буфер быстрее занимает диск узла.

Полный список параметров в модели буферизации Vector.

Если буфер заполнен

По умолчанию источник внутренних метрик (spec.agent.internalMetrics ресурса Vector) выключен. При включении источника можно определить заполненность по метрикам буфера:

МетрикаЧто показывает
vector_buffer_byte_sizeсколько байт сейчас занимает буфер
vector_buffer_eventsсколько событий лежит в буфере
vector_buffer_discarded_events_totalсколько событий отброшено. Растёт в режиме drop_newest

Без этих метрик степень заполнения буфера можно определить по диску узла: каталоги /var/lib/vector и /var/log/pods.

Режим when_full можно задать отдельно для каждого получателя. Чтобы изменить режим when_full у одного объекта buffer, выполните:

  1. Подготовьте манифест ShturvalServicePatch для shturval-log-collector. Модуль должен быть в режиме Авто. В режиме Ручной SSP может не примениться. Разница режимов — на странице Сбор и обработка логов (ClusterVectorPipeline).
  2. Загрузите манифест в кластере, где работает модуль, через импорт манифестов: Администрирование → Действия с кластером.
  3. Дождитесь применения. На странице модуля локального сбора логов статус сервиса сменится на Patched, а SSP появится на вкладке Применённые ShturvalServicePatch.

Не задавайте в том же объекте request.concurrency числом, если нужно оставить adaptive. Число отключает адаптацию для этого получателя.

Пример ShturvalServicePatch c режимом block

По умолчанию установлен режим block. При block sink ждёт место в буфере и передаёт обратное давление в source. Новые события не отбрасываются. Пока буфер полон, цикл чтения kubernetes_logs не доходит до закрытия уже удалённых файлов. kubelet удаляет ротированный файл, а агент всё ещё держит его открытым и не доходит до закрытия. Место на диске узла не освобождается. Если каталог /var/log/pods не ограничен, заполняется диск узла: контейнеры не могут писать файлы, новые поды не запускаются. У четырёх остальных получателей полный буфер тоже останавливает чтение своего источника, но каталог /var/log/pods заполняет именно сбор логов контейнеров.

Чтобы снова сохранять события после drop_newest, верните block. Пример для k8s_logs. Для auditd, journald, k8s_audit и k8s_events задаётся так же, внутри своего platform_logs_sink.

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-buffer-block
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      k8s_logs:
        platform_logs_sink:
          buffer:
            when_full: block

Пока буфер в режиме block полон, пауза в 60 секунд не начинается. Агент закроет удалённый файл, только когда в буфере появится место или процесс Vector завершится.

Пример ShturvalServicePatch c режимом drop_newest

Включайте drop_newest только у тех получателей, для которых потеря новых событий допустима. Пока буфер полностью заполнен, агент отбрасывает новое событие и продолжает читать источник. Для логов контейнеров удалённый файл закрывается после паузы в 60 секунд, и место на диске узла освобождается. Логи, не попавшие в буфер, в хранилище платформы не появятся.

Пример ShturvalServicePatch с drop_newest для всех получателей.

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-buffer-drop-newest
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      auditd:
        platform_logs_sink:
          buffer:
            when_full: drop_newest
      journald:
        platform_logs_sink:
          buffer:
            when_full: drop_newest
      k8s_audit:
        platform_logs_sink:
          buffer:
            when_full: drop_newest
      k8s_events:
        platform_logs_sink:
          buffer:
            when_full: drop_newest
      k8s_logs:
        platform_logs_sink:
          buffer:
            when_full: drop_newest

Отброшенные события отображаются в метрике Vector vector_buffer_discarded_events_total, если у агента включены внутренние метрики.

Параллельность запросов

По умолчанию для всех sinks число одновременных запросов подстраивается под ответы - request.concurrency: adaptive. Когда адаптация конкретному sink не подходит, вы можете ее изменить через применение SSP для shturval-log-collector. Лимит одновременных HTTP-запросов к sink начинается с меньшего значения. При успешных запросах без роста задержки ответов лимит увеличивается. При отказе sink из-за нагрузки, например, HTTP 429, или при заметном росте задержки лимит снижается, но не устанавливается ниже 1.

После восстановления sink сразу же не применяется заранее заданный максимум параллельных запросов. Накопленные события уходят постепенно. При простое sinks диск не освобождается: буфер заполняется до max_size, дальше действует политика режима when_full.

Фиксированное число, например, request.concurrency: 10, отключает адаптацию у этого sink.

По умолчанию request.rate_limit_duration_secs и request.rate_limit_num не заданы. Окно и число запросов в нём задают частоту HTTP-запросов sink, отдельно от числа одновременных запросов. По документации HTTP-sink Vector этот предел действует и при concurrency: adaptive, и при фиксированном числе. Пример из документации: окно 1 секунда и 10 запросов, то есть не больше 10 запросов в секунду.

Как проверить диск узла, включить project quota и согласовать ротацию kubelet, описано в разделе Логи контейнеров заполняют диск узла.