Перейти к содержимому
Fluentd

Fluentd

Открыть в Markdown

Fluentd собирает логи из файлов, контейнеров, syslog, приложений и многих других источников. Его встроенный выход HTTP отправляет их на адрес Fluentd в Status200, где они становятся доступными для поиска в Продукты → Журналы.

Как это работает

flowchart TB sources["Файлы, контейнеры, syslog, приложения"] --> fluentd["Fluentd"] fluentd -->|"Выход HTTP, JSON + ключ приёма"| ingest["Status200 /fluentd/logs"] ingest --> service["Служба, указанная в запросе"] service --> logs["Логи"]

От Fluentd до Status200

Fluentd отправляет записи пакетами в формате JSON, с вашим ключом приёма в заголовке x-status200-token и именем службы в x-status200-service-name. Status200 превращает каждую запись в лог этой службы и создаёт службу при первой отправке.

Перед началом

  • Установите Fluentd — см. руководство по установке.
  • Проект Status200. В Status200 Cloud телеметрия оплачивается за каждый принятый ГБ — см. цены, — а проекту на плане Free нужен способ оплаты, прежде чем он сможет отправлять телеметрию.
  • Ключ приёма телеметрии. Если его ещё нет:
  1. Откройте ключи приёма

    Перейдите в Продукты → Настройки проекта, откройте в боковом меню Телеметрия и APM и выберите Ключи приема.

    Страница ключей приёма телеметрии в настройках проекта

  2. Создайте ключ

    Нажмите Создать ключ приёма. В окне уже заполнено имя ключа и выбран тип Сервер — именно с таким ключом отправляют данные приложение или коллектор, — так что нажмите Создать ключ приёма, чтобы создать его, или сначала переименуйте.

  3. Скопируйте секрет

    Новый ключ открывается на отдельной странице. Скопируйте его Секретный ключ: это YOUR_SERVICE_TOKEN в конфигурации ниже.

    Страница ключа приёма телеметрии с его секретным ключом

Настройка Fluentd

Файл конфигурации Fluentd обычно находится в /etc/fluent/fluentd.conf, а для старого пакета td-agent — в /etc/td-agent/td-agent.conf.

  1. Добавьте выход HTTP

    Добавьте секцию <match>, которая отправляет записи в Status200. Замените YOUR_SERVICE_TOKEN вашим ключом приёма, а YOUR_SERVICE_NAME — именем, под которым должны появляться логи (любым на ваш выбор):

    fluentd.conf
    # Match all patterns
    <match **>
      @type http
    
      endpoint https://status200.ru/fluentd/logs
      open_timeout 2
    
      headers {"x-status200-token":"YOUR_SERVICE_TOKEN", "x-status200-service-name":"YOUR_SERVICE_NAME"}
    
      content_type application/json
      json_array true
    
      <format>
        @type json
      </format>
      <buffer>
        flush_interval 10s
        chunk_limit_size 900k
      </buffer>
    </match>

    json_array true отправляет каждый блок буфера одним массивом JSON, а flush_interval 10s отправляет буфер каждые 10 секунд. chunk_limit_size 900k держит каждый запрос меньше 1 МБ: больше Status200 на этом адресе не принимает.

  2. Перезапустите Fluentd

    Перезапустите службу Fluentd, чтобы она загрузила новый выход.

  3. Проверьте, что логи приходят

    Через несколько секунд после следующего сброса логи появятся в Продукты → Журналы. Служба появится в Продукты → Службы; если её ещё не было, Status200 создаст её.

Полный пример

Эта конфигурация принимает записи по протоколу forward Fluentd на порту 24224 и отправляет их все в Status200:

fluentd.conf
####
## Source descriptions:
##

## built-in TCP input
## @see https://docs.fluentd.org/input/forward
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match **>
  @type http

  endpoint https://status200.ru/fluentd/logs
  open_timeout 2

  headers {"x-status200-token":"YOUR_SERVICE_TOKEN", "x-status200-service-name":"YOUR_SERVICE_NAME"}

  content_type application/json
  json_array true

  <format>
    @type json
  </format>
  <buffer>
    flush_interval 10s
    chunk_limit_size 900k
  </buffer>
</match>

Чтобы отправлять разные источники как разные службы, используйте по одной секции <match> на тег, каждую со своим x-status200-service-name.

Как читаются записи

Status200 читает из каждой записи такие поля:

Поле логаБерётся из первого присутствующего поля средиПримечания
Телоmessage, log, msg, body, textСтрока лога. Запись без этих полей сохраняется целиком, в виде JSON.
Уровень важностиlevel, severity, loglevel, log_level, priority, severityText, severity_textНазвания вроде trace, debug, info, notice, warn, error, critical и fatal, в любом регистре. Любое другое значение сохраняется как Unspecified.
ID трассировкиtrace_id, traceId, traceidСвязывает лог с его трассировкой.
ID спанаspan_id, spanId, spanidСвязывает лог с его спаном.
Службазаголовок x-status200-service-nameFluentd, если заголовок не задан.
Время—Момент, когда Status200 получает запись.

Все остальные поля становятся атрибутами с именем fluentd. и названием поля, по которым можно искать и фильтровать: поле container_name — это @fluentd.container_name в обозревателе журналов. Вложенный объект разворачивается через точки, например в fluentd.kubernetes.pod_name, а список сохраняется в виде JSON.

Логи Fluentd проходят через ваши конвейеры логов, фильтры отбрасывания и правила маскирования, как и любые другие логи.

Собственная установка Status200

Замените https://status200.ru в endpoint на URL вашего экземпляра Status200: http(s)://YOUR_STATUS200_HOST/fluentd/logs.

Устранение неполадок

Fluentd пишет 401 от выхода HTTP

Ключ приёма отсутствует, неизвестен или истёк. Проверьте значение x-status200-token в headers.

Fluentd пишет 402 или 422

402: в Status200 Cloud проект на плане Free и без способа оплаты. Добавьте его в Настройки проекта → Биллинг и счета → Биллинг. 422: ключ отключён, или это ключ браузера. Снова включите Включено в настройках ключа или создайте ключ типа Сервер.

Fluentd пишет 413

Запрос больше 1 МБ, а больше Status200 на этом адресе не принимает. Задайте chunk_limit_size 900k в секции <buffer>, как в конфигурации выше.

Логи приходят под службой Fluentd

Нет заголовка x-status200-service-name. Добавьте его в headers в каждой секции <match>.

Тело лога показывает всю запись в виде JSON

Status200 берёт тело из первого присутствующего поля среди message, log, msg, body и text, а если ни одного из них нет, сохраняет запись целиком. Переименуйте поле со строкой лога в одно из этих, например фильтром record_transformer в Fluentd.

Если у вас есть вопросы или нужна помощь с конфигурацией, напишите нам на support@status200.ru.

Что дальше