Свободный бит: Logstash_Prefix_Key не работает должным образом с плагином вывода es

Я пытаюсь найти ключ в записи и использовать его в качестве префикса logstash в свободном доступе. Но этого не происходит, и Logstash_Prefix не заменяется на Logstash_Prefix_Key, хотя указанный ключ существует в расширенном журнале из фильтра kubernetes.

Идеальным поведением фильтра кубернетов является обогащение журналов, прочитанных из входного пути через плагин input, данными кубернетов, такими как имя модуля, идентификатор модуля, имя пространства имен и т. Д. И когда журналы после применения фильтра передаются в источник вывода через es выход плагин. Я использовал Logstash_Prefix_Key, чтобы получить ключ kubernetes.pod_name, и дал Logstash_Prefix как pod_name. Несмотря на то, что я могу видеть ключ kubernetes.pod_name в Kibana, журналы сохраняются с префиксом pod_name (что означает, что Logstash_Prefix_Key не найден в записях журнала, поэтому он использует Logstash_Prefix).

Образец кода

input-kubernetes.conf: |
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/*.log
        Parser            docker
        DB                /var/log/flb_kube.db
        Mem_Buf_Limit     2GB
        Skip_Long_Lines   On
        Refresh_Interval  10

  filter-kubernetes.conf: |
    [FILTER]
        Name                kubernetes
        Match               kube.*
        Kube_URL            https://kubernetes.default.svc.cluster.local:443
        Merge_Log           Off
        K8S-Logging.Parser  On

  output-elasticsearch.conf: |
    [OUTPUT]
        Name            es
        Match           kube.*
        Host            ${FLUENT_ELASTICSEARCH_HOST}
        Port            ${FLUENT_ELASTICSEARCH_PORT}
        HTTP_User       ${FLUENT_ELASTICSEARCH_USER}
        HTTP_Passwd     ${FLUENT_ELASTICSEARCH_PASSWORD}
        Logstash_Format On
        Logstash_Prefix pod_name
        Logstash_Prefix_Key kubernetes.pod_name
        Retry_Limit     False

Поскольку я новичок в стеке EFK, Может ли кто-нибудь помочь мне с этим


person coder here    schedule 21.09.2020    source источник


Ответы (3)


UPD: теперь поддерживается! https://github.com/fluent/fluent-bit/issues/421#issuecomment-766912018 Должен быть в выпуске Fluent Bit v1.7!


Индексы Dynamic ElasticSearch в настоящее время не поддерживаются в FluentBit. Вот связанная с этим проблема: https://github.com/fluent/fluent-bit/issues/421. Вы можете указать только строковые (жестко запрограммированные) префиксы.

Обходной путь заключается в использовании вместо этого сборщика журналов fluentd, который поддерживает динамические индексы: https://docs.fluentd.org/output/elasticsearch#index_name-optional. Для этого есть диаграмма сообщества: https://github.com/helm/charts/tree/master/stable/fluentd

UPD: теперь поддерживается! https://github.com/fluent/fluent-bit/issues/421#issuecomment-766912018 Должен быть в выпуске Fluent Bit v1.7!

person Max Lobur    schedule 21.09.2020

Недавно пытался сделать то же самое, и хотя то, что сказал Макс Лобур выше, верно, что fluentbit не поддерживал это до еще не выпущенной версии 1.7. Однако мне все же удалось добиться этого с текущей версией, используя фильтр nest, см. https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch. под Logstash_Prefix_Key написано

При включении: значение в записи, принадлежащее ключу, будет найдено и перезаписано Logstash_Prefix для генерации индекса. Если ключ / значение не найден в записи, опция Logstash_Prefix будет действовать как резерв. Вложенные ключи не поддерживаются (при желании можно использовать плагин фильтра вложенности для удаления вложенности)

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

В вашем случае pod_name вложен в kubernetes, чтобы по-прежнему можно было его использовать, вам придется поднять его с этого уровня. см. здесь .

Вот как заставить его работать в вашем случае:

filter-kubernetes.conf: |
[FILTER]
    Name                kubernetes
    Match               kube.*
    Kube_URL            https://kubernetes.default.svc.cluster.local:443
    Merge_Log           Off
    K8S-Logging.Parser  On

[FILTER]
    Name                nest
    Match               *
    Operation           lift
    Nested_under        kubernetes
    Add_prefix          kubernetes_

output-elasticsearch.conf: |
[OUTPUT]
    Name            es
    Match           kube.*
    Host            ${FLUENT_ELASTICSEARCH_HOST}
    Port            ${FLUENT_ELASTICSEARCH_PORT}
    HTTP_User       ${FLUENT_ELASTICSEARCH_USER}
    HTTP_Passwd     ${FLUENT_ELASTICSEARCH_PASSWORD}
    Logstash_Format On
    Logstash_Prefix pod_name
    Logstash_Prefix_Key kubernetes_pod_name
    Retry_Limit     False

то, что мы делаем здесь, - это поднимаем все внутри объекта kubernetes на уровень выше и добавляем к ним префикс kubernetes_, так что ваш pod_name станет kubernetes_pod_name. Затем вы передаете kubernetes_pod_name Logstash_prefix_key. Значение kubernetes_pod_name затем используется для генерации индекса и будет возвращаться к logstash_prefix только в том случае, если для kubernetes_pod_name не существует пары ключ / значение.

person olaCodeTech    schedule 04.02.2021

Вы можете использовать:

Logstash_Prefix_Key kubernetes['pod_name']

Это работает на моей машине с использованием образа докера: fluent/fluent-bit:1.7

person mrk    schedule 14.05.2021