Olka
я уже не знаю, в какую сторону упороться, чтоб он начал парсить json внутри json'а
artb1sh
Siarhei
Siarhei
На log натравить
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
Aleksey
Olka
он в отдельный индекс писать начал. парсит поля.
одно, блин, НО! всё это он делает за 1970 и отсекает метадату кубера -_-
Rainbow
Olka
вообще пишут, что он по всем фильтрам проходит, а потом уже выводит остатки. Т.е. у меня сперва стоит "парси метаданные", потом стоит "а теперь парси в том, что получилось, поле "лог" и выводи, пожалуйста". А он такой "я не понимаю, что тебе нужно, поэтому делать ничего не буду". Но в то же время, если я добавляю отдельный match, он соображает, что нужно парсить, и выводит нужную инфу в отдельный индекс, но, как я уже говорила, делает это он за 1970.
Aleksey
вообще пишут, что он по всем фильтрам проходит, а потом уже выводит остатки. Т.е. у меня сперва стоит "парси метаданные", потом стоит "а теперь парси в том, что получилось, поле "лог" и выводи, пожалуйста". А он такой "я не понимаю, что тебе нужно, поэтому делать ничего не буду". Но в то же время, если я добавляю отдельный match, он соображает, что нужно парсить, и выводит нужную инфу в отдельный индекс, но, как я уже говорила, делает это он за 1970.
можешь полный конфиг кинуть для fluentd и для плагина ?
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>
Aleksey
Vitalii
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
Olka
всмысле? флюентом.
он демонсетом по нодам распространён, натравлен на /var/log/containers/*.log во fluent.conf прописано в match'е в какой эластик и по какому порту с каким индексом их слать. И он шлёт. Но вот распарсить поле log не дано ..
Aleksey
Olka
хм
Andrey
под контейнеры fluent-bit лучше заходит. если требуются какие то специфичные плагины, то можно форвардить из fluent-bit во fluentd и на нем извращаться
Olka
я вот как раз читала, что бит не умеет парсить вложенные json'ы
Aleksey
Olka
хммм
Aleksey
Aleksey
хммм
я вот тут подглядел
https://github.com/openstack/openstack-helm-infra/tree/master/fluent-logging
Olka
только вот вопрос. У меня и сам флюент хорошо логи собирает, проблема только с парсингом вложенного json'a. Ну т.е есть ли смысл собирать битом, а потом опять же страдать с fluentd и парсингом
Aleksey
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 синтаксис другой
Olka
Aleksey
Aleksey
в 1.3 синтаксис другой
версию подсказать не могу, так как этого контейнера уже нет под рукой, а в коле их уже обновили
Olka
ну тут принципиально, он выводит это в одной строке или всё же пишет отдельно каждую связку k:v ?
т.к при определённых манипуляциях он таки выводит мне логи, но в одну строку, что непригодно к использованию
Aleksey
Olka
ну да, я специально его сохраняю, чтоб хоть что-то выводил. А то, бывало, он и не парсит, и поле не сохраняет
Aleksey
𝚔𝚟𝚊𝚙𝚜
Olka
да, формат {"k:v","k:v", ...}
𝚔𝚟𝚊𝚙𝚜
А kapitan умеет хелм-чарты рендерить?
Aleksey
Olka
щас, как раз с новой конфигой запустила )
Aleksey
ну если вообще ничего не получается: фигач регекспами 🙂
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
Aleksey
других идей нет 🙂
Olka
лан, и на том спасибо )
G72K
Мм.. декларативное описание реакций на события, на этой штуке можно наверное операторы или сложные деплои или вообще полный цикл жизни приложения описать : от правил мержа, до переключения на другой датацентр. Из сомнительного: свой язык . Надо присмотреться: https://github.com/purpleidea/mgmt
bama^boy
bama^boy
https://fosdem.org/2019/schedule/event/mgmt/
Olka
используем почти в точно том же ключе, логи шлет приложение и 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}, но бывает и с вложенностью, тоже никаких проблем)
попробую, спасибо. Но у тебя версия, судя по синтаксису, не последняя, да?
Olka
понятно. ну у меня 1.3, там, конечно, разница большая. Ну мб попробую образ 0.12, если на новом не заработает
G72K
Vadim
Vladimir
ребят ткните носом где посмотреть текущие значения nodefs.available, nodefs.inodesFree, imagefs.available, imagefs.inodesFree. пытаюсь подебажить DiskPressure и как то не получается
G72K