Как читать json без экранирования во fluentd?

У меня есть настройка с Fluent Bit, отправляющая данные в формате Elasticsearch в Haproxy в SSL. Haproxy завершает работу SSL и пересылает данные в Fluentd. Теперь проблема в том, что Fluentd получает данные без экранирования и, следовательно, не может пересылать их в ES.

Fluentd получает эти данные (я добавил разрыв строки для удобства чтения в Stackoverflow):

2020-09-14 11:07:16 +0000 [error]: #0 failed to process request error_class=RuntimeError 
error="Received event is not json: {\"index\":{\"_index\":\"fluent_bit\",\"_type\":\"my_type
\"}}\n{\"@timestamp\":\"2020-09-14T11:07:15.173Z\",\"cpu_p\":3.583333333333333,\"user_p\":2.75,
\"system_p\":0.8333333333333334,\"cpu0.p_cpu\":4,\"cpu0.p_user\":1,\"cpu0.p_system
\":3,\"cpu1.p_cpu\":2,\"cpu1.p_user\":1,\"cpu1.p_system\":1,\"cpu2.p_cpu\":4,\"cpu2.p_user
\":3,\"cpu2.p_system\":1,\"cpu3.p_cpu\":6,\"cpu3.p_user\":4,\"cpu3.p_system\":2,\"cpu4.p_cpu
\":3,\"cpu4.p_user\":3,\"cpu4.p_system\":0,\"cpu5.p_cpu\":6,\"cpu5.p_user\":6,\"cpu5.p_system
\":0,\"cpu6.p_cpu\":4,\"cpu6.p_user\":3,\"cpu6.p_system\":1,\"cpu7.p_cpu\":4,\"cpu7.p_user
\":4,\"cpu7.p_system\":0,\"cpu8.p_cpu\":3,\"cpu8.p_user\":2,\"cpu8.p_system\":1,\"cpu9.p_cpu
\":3,\"cpu9.p_user\":3,\"cpu9.p_system\":0,\"cpu10.p_cpu\":1,\"cpu10.p_user\":0,\"cpu10.p_system
\":1,\"cpu11.p_cpu\":2,\"cpu11.p_user\":2,\"cpu11.p_system\":0}\n"

Несколько заметок для добавления:

  1. Я мог бы отправить из Fluentbit все по HTTP, и это сработало бы, но в этом случае я теряю метку времени, индекс и тип индекса.
  2. Должен быть синтаксический анализатор или фильтр, который просто берет текущий неэкранированный json в Fluentd и преобразует его, но я не могу найти Эми на практике. Я открыт для любого решения в любом стеке.

Настройки Fluent Bit:

[OUTPUT]
    Name             es
    Match            *
    Host             <my-domain>
    Port             443
    Index            fluent_bit
    Type             my_type
    # + TLS settings

Настройки Fluentd:

<source>
  @type http
  port 8888
  bind 0.0.0.0
  body_size_limit 32m
  keepalive_timeout 10s
  add_remote_addr true
  format json
</source>

Основные настройки бэкэнда HAProxy:

backend nodes
  mode          http
  option        forwardfor
  timeout       server 15m
  balance       roundrobin
  server        elastic-us-east-1a ip:port check inter 5000 downinter 500

person David Bensoussan    schedule 14.09.2020    source источник


Ответы (1)


Причина такого поведения в том, что вы используете [OUTPUT] Name es, но отправляете на fluentd-сервер вместо ES. Если вы хотите, чтобы журналы проходили через централизованный сервер пересылки журналов (сервер fleuntd), прежде чем попасть в ES, используйте это:

FluentBit

...
[OUTPUT]
    Name          forward
...

Свободно

...
<source>
  type forward
  bind 0.0.0.0
  port 24224
</source>

<match **>
 @type elasticsearch
 ...
</match>
...

Документы FluentBit о пересылке журналов: https://docs.fluentbit.io/manual/pipeline/outputs/forward

ИЛИ есть возможность отправить из FluentBit в ES напрямую: https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch

person Max Lobur    schedule 14.09.2020
comment
Я пытался. Без HAProxy в потоке он работает нормально, но с ним я просто получаю invalid helo message во fluentbit - person David Bensoussan; 15.09.2020
comment
Здесь не могу помочь с HAProxy. У вас есть возможность отправить через перенаправитель журналов fluentd, а оттуда балансировку нагрузки на несколько узлов ES с помощью fluend: docs.fluentd.org/output/elasticsearch#hosts-optional, без HAProxy. К сожалению, сам fluentbit не поддерживает балансировку нагрузки ES github.com/fluent/fluent -bit-kubernetes-logging / issues / 43. - person Max Lobur; 15.09.2020
comment
Я не пытаюсь отправлять журналы Haproxy, а просто перенаправляю трафик. В настоящий момент я использую HAProxy для некоторых правил, например, запрещаю удаление, но поскольку есть аутентификация клиента, ее можно пропустить. - person David Bensoussan; 15.09.2020