#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
таким образом, вы сможете объединить несколько «динамических» данных, например, также пространство имен