Я установил несколько док-контейнеров, в которых контейнер fluentd отправляет журналы в формате JSON в контейнер Elasticsearch (который, в свою очередь, читается Kibana). Я настроил fluentd для получения журналов через UDP, так как наши приложения регистрируют, отправляя UDP-сообщения. Это работает, но по какой-то причине происходит большая задержка, и текучие журналы достигают ES только через 5 минут.
Моя конфигурация fluentd:
<system>
log_level debug
</system>
<source>
@type udp
@label @udp_stream
tag ma.udp_events
<parse>
@type json
time_key $.log.@timestamp
keep_time_key true
</parse>
port 20001
bind 0.0.0.0
message_length_limit 1MB
source_hostname_key client_host
source_address_key client_addr
</source>
<label @udp_stream>
<match **>
@type copy
<store>
@type elasticsearch
host elastic
port 9200
index_name logs.${app_environment}.${app_category}.${app_area}.${app_name}
include_tag_key true
reload_connections true
reconnect_on_error false
reload_on_failure false
<buffer tag, app_environment, app_category, app_area, app_name>
flush_at_shutdown true
flush_mode immediate
flush_thread_count 8
flush_thread_interval 1
flush_thread_burst_interval 1
retry_forever true
retry_type exponential_backoff
retry_max_interval 30
retry_wait 1
chunk_limit_size 1K
queue_limit_length 8
</buffer>
</store>
</match>
</label>
Помимо этих настроек, есть тот же источник для TCP и еще один источник для tail. Я пытался удалить их, но проблема, похоже, в другом. Я читал об этой 5-минутной задержке, связанной с буферами, но я надеялся, что более детальная политика очистки поможет.
Журналы имеют размер всего от 1 КБ до 2 КБ, и я тестирую их, отправляя журналы вручную, поэтомутам над головой я просто отправляю несколько раз в минуту. Я бы хотел, чтобы он быстро очистил свои буферы. После некоторых исследований SO и некоторых блогов, я изменил раздел буфера, но безрезультатно. Конечно, я делаю ошибку, но не могу ее найти. Любая помощь будет высоко ценится.
РЕДАКТИРОВАТЬ:
Кажется, что я не могу получить журналы от Fluentd к ES менее чем за 5 минут. Однако я попытался удалить раздел буфера, ожидая, что он будет быстрее. Хотя я вижу текучие журналы о промывке и очистке кусков, почему-то они не сразу доставляются. Моя конфигурация тестирования немного отличается от исходной публикации, потому что я установил новый ключ в JSON (который я назвал "@es_index_name"), а также удалил раздел буфера.
I 'читаем здесь :
"td-agent непрерывно загружает журналы каждые 5 минут. Вы можете заставить td-agent сбрасывать буферизованные журналы в облако, отправляя сигнал SIGUSR1."
В любом случае, моя текущая конфигурация тестирования:
<label @udp_stream>
<match **>
@type copy
<store>
@type elasticsearch
host elastic
port 9200
prefer_oj_serializer true
target_index_key @es_index_name
include_tag_key true
reload_connections true
reconnect_on_error false
reload_on_failure false
flush_interval 5s
</store>
<store>
@type stdout
</store>
</match>
</label>
Помимо строк, которые я удалил при попытке упростить, важная строка здесь:
target_index_key @ es_index_name
РЕДАКТИРОВАТЬ 2: По какой-то причине после того, как я развернул этот контейнер как рабочую нагрузку Kubernetes, журналы начали очищаться, как и ожидалось. Я не знаю, почему это происходит, но, в конце концов, я хотел, чтобы это работало так. Теперь одно из наших приложений отправляет журнал UDP на наш Fluentd, и Kibana требуется всего несколько секунд, чтобы отобразить его на своих инструментальных панелях.