Olka
я уже не знаю, в какую сторону упороться, чтоб он начал парсить json внутри json'а
Siarhei
На log натравить
Olka
Через фильтр использовать парсер json
в том-то и дело, что не работает, он всё-равно выдаёт лог в формате {k1:v1, k2:v2}
Olka
щас конфигу покажу в общем
Olka
<filter kubernetes.**> @type parser key_name log # emit_invalid_record_to_error false <parse> @type json </parse> </filter>
Olka
при том я уже и 0.12, и 1.1.3, и 1.3 пробовала. Он либо тупо перестаёт всё парсить, либо выдаёт в json'e
Siarhei
Проверить что в файле лога нужного контейнера, проще оттестироваться на нджинкс ингресконтроллере, заюзав логфоомат аннотацию в джсоне
Olka
да я в общем-то просто захожу в логи пода и вижу, что он отсылает. Там обычный json
Siarhei
А должен быть внуттрений джсон заескеплен
Siarhei
Ссори с телефона пока на работу еду
Olka
просто те же логи через логстеш + файлбит нормально парсятся плагином json
Olka
а флюент ну ни в какую
Olka
я вот думаю, может, именно для логов этого контейнера сделать отдельный матч в отдельный индекс. Но это фигня какая-то будет.
Terry
Kapitan Очередной убийца helm - на этот раз с jinja2 и jsonnnet https://github.com/deepmind/kapitan
Olka
он в отдельный индекс писать начал. парсит поля. одно, блин, НО! всё это он делает за 1970 и отсекает метадату кубера -_-
Aleksey
он в отдельный индекс писать начал. парсит поля. одно, блин, НО! всё это он делает за 1970 и отсекает метадату кубера -_-
так если я не ошибаюсь там этот плагин как работает, ты ему говоришь в каком поле есть json и он просто его расправисвает на k:v и всё, остальное идёт лесом
Rainbow
Kapitan Очередной убийца helm - на этот раз с jinja2 и jsonnnet https://github.com/deepmind/kapitan
уже круто, что он не пытается делать kubectl apply внутри
Olka
вообще пишут, что он по всем фильтрам проходит, а потом уже выводит остатки. Т.е. у меня сперва стоит "парси метаданные", потом стоит "а теперь парси в том, что получилось, поле "лог" и выводи, пожалуйста". А он такой "я не понимаю, что тебе нужно, поэтому делать ничего не буду". Но в то же время, если я добавляю отдельный match, он соображает, что нужно парсить, и выводит нужную инфу в отдельный индекс, но, как я уже говорила, делает это он за 1970.
Igor
kannt Sie?
Уважительное Sie является местоимением третьего лица множественного лица, поэтому können Sie
Olka
<source> @type tail @id in_tail_container_logs path /var/log/containers/*.log pos_file /var/log/fluentd-containers.log.pos tag kubernetes.* read_from_head true <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source> <match fluent.**> @type null </match> <match kubernetes.var.log.containers.**fluentd**.log> @type null </match> <match kubernetes.var.log.containers.**kube-system**.log> @type null </match> <filter kubernetes.**> @type kubernetes_metadata </filter> <filter kubernetes.var.log.containers.**name**.log> @type parser key_name log # emit_invalid_record_to_error false <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </filter> <match kubernetes.var.log.containers.**name**.log> @type elasticsearch include_tag_key true <format> @type json </format> host host_ip port 9200 logstash_format true logstash_prefix name logstash_index name </match>
Olka
можешь полный конфиг кинуть для fluentd и для плагина ?
у fluent.conf всё стандартно, я хз, стоит ли конфигу скидывать
Rainbow
А какие с apply проблемы?
никаких, кроме того, что helm пытался заменить apply
Aleksey
у fluent.conf всё стандартно, я хз, стоит ли конфигу скидывать
конфиг для fluet-bit выглядит примерно так? [SERVICE] Daemon false Flush 5 Log_Level info Parsers_File parsers.conf [INPUT] DB /var/log/flb_kube.db Mem_Buf_Limit 5MB Name tail Parser docker Path /var/log/containers/*.log Tag kube.* [FILTER] Match kube.* Merge_JSON_Log true Name kubernetes
Olka
у меня fluentd
Aleksey
у меня fluentd
а логи чем собираются?
Olka
всмысле? флюентом. он демонсетом по нодам распространён, натравлен на /var/log/containers/*.log во fluent.conf прописано в match'е в какой эластик и по какому порту с каким индексом их слать. И он шлёт. Но вот распарсить поле log не дано ..
Olka
хм
Andrey
под контейнеры fluent-bit лучше заходит. если требуются какие то специфичные плагины, то можно форвардить из fluent-bit во fluentd и на нем извращаться
Olka
я вот как раз читала, что бит не умеет парсить вложенные json'ы
Olka
хммм
Aleksey
я вот как раз читала, что бит не умеет парсить вложенные json'ы
а ему только тейлить надо и тегать, можно поля дописывать
Aleksey
хммм
я вот тут подглядел https://github.com/openstack/openstack-helm-infra/tree/master/fluent-logging
Olka
только вот вопрос. У меня и сам флюент хорошо логи собирает, проблема только с парсингом вложенного json'a. Ну т.е есть ли смысл собирать битом, а потом опять же страдать с fluentd и парсингом
Aleksey
и да, вот как я вытаскивал json из сообщения, может поможет? <source> format json hosts 1.1.1.1 pass 12345 port 5672 queue nova_notifications.info tag nova.amqp @type amqp user openstack vhost / </source> <filter nova.amqp> format json key_name oslo.message reserve_data false @type parser </filter> <filter nova.amqp> rename_rule1 ^\_(.+) ${md[1]} @type rename_key </filter>
Olka
у тебя 0.12 ?
Olka
или 1.1.3 ?
Olka
в 1.3 синтаксис другой
Aleksey
при такой конфиге, т.е он у тебя json поля "oslo.message" парсит и в эластике по разным полям выводит, да?
он берёт значение в ключе oslo.messge , парсит на k:v и в эластик. Т.е. да.
Aleksey
в 1.3 синтаксис другой
версию подсказать не могу, так как этого контейнера уже нет под рукой, а в коле их уже обновили
Olka
ну тут принципиально, он выводит это в одной строке или всё же пишет отдельно каждую связку k:v ? т.к при определённых манипуляциях он таки выводит мне логи, но в одну строку, что непригодно к использованию
Olka
ну да, я специально его сохраняю, чтоб хоть что-то выводил. А то, бывало, он и не парсит, и поле не сохраняет
𝚔𝚟𝚊𝚙𝚜
Olka
да, формат {"k:v","k:v", ...}
𝚔𝚟𝚊𝚙𝚜
А kapitan умеет хелм-чарты рендерить?
Aleksey
да, формат {"k:v","k:v", ...}
можешь кинуть пруф? 🙂
Olka
щас, как раз с новой конфигой запустила )
Aleksey
ну если вообще ничего не получается: фигач регекспами 🙂
Olka
ну если вообще ничего не получается: фигач регекспами 🙂
ну это я тоже пробовала. Но он такого написал, что я демонсет в ужасе грохнула
Aleksey
ну это я тоже пробовала. Но он такого написал, что я демонсет в ужасе грохнула
да ладно, гляди какие они классные бывают 🙂 <filter neutron.amqp> enable_ruby true <record> object_name ${ if record["payload"].has_key?("network"); if record["payload"]["network"].has_key?("name"); record["payload"]["network"]["name"]; else; return ""; end; elsif record["payload"].has_key?("port"); if record["payload"]["port"].has_key?("name"); record["payload"]["port"]["name"]; end; elsif record["payload"].has_key?("subnet"); if record["payload"]["subnet"].has_key?("name"); record["payload"]["subnet"]["name"]; end; elsif record["payload"].has_key?("security_group"); if record["payload"]["security_group"].has_key?("name"); record["payload"]["security_group"]["name"]; end; else; return "" ; end} object_project ${record["context_project_name"]} object_status ${ if record["payload"].has_key?("network"); if record["payload"]["network"].has_key?("status"); record["payload"]["network"]["status"]; else; return ""; end; elsif record["payload"].has_key?("port"); if record["payload"]["port"].has_key?("status"); record["payload"]["port"]["status"]; end; elsif record["payload"].has_key?("subnet"); if record["payload"]["subnet"].has_key?("status"); record["payload"]["subnet"]["status"]; end; elsif record["payload"].has_key?("security_group"); if record["payload"]["security_group"].has_key?("status"); record["payload"]["security_group"]["status"]; end; else; return "" ; end} object_user ${record["context_user_name"]} </record> @type record_transformer </filter>
Olka
часть выходящего из него: {"bytes_in":"0","bytes_out":"4", ...}
Olka
может, реально уже с раби пробовать ...
Aleksey
часть выходящего из него: {"bytes_in":"0","bytes_out":"4", ...}
в примере там должны кавычки экранироваться 🙂
Aleksey
других идей нет 🙂
Olka
лан, и на том спасибо )
G72K
Мм.. декларативное описание реакций на события, на этой штуке можно наверное операторы или сложные деплои или вообще полный цикл жизни приложения описать : от правил мержа, до переключения на другой датацентр. Из сомнительного: свой язык . Надо присмотреться: https://github.com/purpleidea/mgmt
bama^boy
https://fosdem.org/2019/schedule/event/mgmt/
Zakhar
всмысле? флюентом. он демонсетом по нодам распространён, натравлен на /var/log/containers/*.log во fluent.conf прописано в match'е в какой эластик и по какому порту с каким индексом их слать. И он шлёт. Но вот распарсить поле log не дано ..
используем почти в точно том же ключе, логи шлет приложение и apache, логи приложения в json, apache - стандартный формат и используем такой конфиг <filter kubernetes.**> @type parser format /^"(?<request-id>[^ ]*)" (?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/ time_format %d/%b/%Y:%H:%M:%S %z key_name log suppress_parse_error_log true hash_value_field apache reserve_data true </filter> <filter kubernetes.**> @type parser format json key_name log suppress_parse_error_log true reserve_data true hash_value_field app </filter> получаем оригинал в log, спаршеный json в app(он у нас не только {k:v}, но бывает и с вложенностью, тоже никаких проблем)
𝚔𝚟𝚊𝚙𝚜
А kapitan умеет хелм-чарты рендерить?
отвечу сам на свой вопрос: нет, не умеет
G72K
На фосдеме автор выступал. Пока кажется непригодным.
У товарища грустная история, начал пилить mgmt в редхате, потом они ансибл купили и ему кислород перекрыли
Zakhar
попробую, спасибо. Но у тебя версия, судя по синтаксису, не последняя, да?
Image: fluent/fluentd-kubernetes-daemonset:v0.12.43-cloudwatch - конфиг для вот этой
Olka
понятно. ну у меня 1.3, там, конечно, разница большая. Ну мб попробую образ 0.12, если на новом не заработает
Vadim
У товарища грустная история, начал пилить mgmt в редхате, потом они ансибл купили и ему кислород перекрыли
В процессе он всем перемыл мозг о том как велика и прекрасна его самописная тулза, как могуча и сильна она если наконец напишут к ней плагины сообщество
G72K
В процессе он всем перемыл мозг о том как велика и прекрасна его самописная тулза, как могуча и сильна она если наконец напишут к ней плагины сообщество
Ну он действительно похож на того, кто прям верит в лучший девопс мир. Но про сообщество он прав, любая тулза без поддержки масс сольётся
Vladimir
ребят ткните носом где посмотреть текущие значения nodefs.available, nodefs.inodesFree, imagefs.available, imagefs.inodesFree. пытаюсь подебажить DiskPressure и как то не получается