FluentBit: добавьте динамический индекс es

#fluent-bit

Вопрос:

У меня есть рабочий fluent-bit:1.7 вывод, который мне нужен для Elasticsearch и создания динамического индекса на основе метки k8s = name . Мне нужно следующее соглашение для индекса:

infra-${app_name}-yyyy.mm.dd

Пример: infra-mongodb-2021.01.01 , infra-postgresql-2021.01.01 , infra-kafka-2021.01.01 и т.д…

Это моя конфигурация ФИЛЬТРА и ВЫВОДА:

 [FILTER]
    Name             kubernetes
    Match            kube.*
    Merge_Log        Off
    Keep_Log         Off

[OUTPUT]
    Name  es
    Match kube.*
    Host ${ES_HOST}
    Logstash_Format On
    Logstash_Prefix_Key kubernetes['labels']['name']
 

Но он генерирует следующий индекс: mongodb-2021.01.01

Это почти сделано, мне просто нужно всегда добавлять infra- префикс.

Просто для ясности, мне нужно что-то вроде:

     Logstash_Prefix_Key infra-${kubernetes['labels']['name']}
 

Ответ №1:

Я сделал это с помощью плагина Lua, чтобы создать поле в записи с именем индекса, а затем использовать это поле как Logstash_Prefix_Key

Сценарий Lua (на основе https://github.com/fluent/fluent-bit/blob/master/scripts/append_tag.lua):

 function append_es_index(tag, timestamp, record)
    new_record = record

    if (record["cluster_name"] ~= nil) then
        es_index = record["cluster_name"]
    else
        es_index = "k8s"
    end

    if (record["kubernetes"] ~= nil) then
        kube = record["kubernetes"]
        if (kube["namespace_name"] ~= nil and string.len(kube["namespace_name"]) > 0) then
            es_index = es_index .. "." .. kube["namespace_name"]
        end
        
        if (kube["labels"] ~= nil) then
            labels = kube["labels"]

            if (labels["app"] ~= nil and string.len(labels["app"]) > 0) then
                es_index = es_index .. "." .. labels["app"]
            elseif (labels["k8s-app"] ~= nil and string.len(labels["k8s-app"]) > 0) then 
                es_index = es_index .. "." .. labels["k8s-app"]
            elseif (labels["name"] ~= nil and string.len(labels["name"]) > 0) then 
                es_index = es_index .. "." .. labels["name"]
            end
        end
    end

    new_record["es_index"] =  es_index

    return 1, timestamp, new_record
end 
 

Конфигурация фильтров Fluentbit:

 [FILTER]
    Name                kubernetes
    ...
[FILTER]
    Name record_modifier
    Match *
    Record cluster_name my-test-cluster
[FILTER]
    Name    lua
    Match   *
    script  /fluent-bit/scripts/append_es_index.lua
    call    append_es_index
 

Ответ №2:

Другой способ достичь аналогичного результата-создать метку или аннотацию для ваших модулей

например

 [OUTPUT]
  Name                es
  Logstash_Prefix_Key kubernetes['labels']['log-key']
...
 

развертывание yml на основе документов

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
        log-key: infra-nginx # log-key label will be used in Logstash_Prefix_Key
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
 

таким образом, вы сможете объединить несколько «динамических» данных, например, также пространство имен