Я имею дело с файлами журнала, содержащими такие части, как:
538,486K of 1,048,576K
Они представляют использование памяти (пространство кучи Java) в удобочитаемом формате. Я хотел бы отслеживать эти числа в таблицах Кибаны. Для этого я хотел бы как-то использовать фильтр Grok Logstash для анализа этих чисел, но я не знаю, как обрабатывать (т.е. игнорировать) разделитель тысяч.
В идеале у меня было бы что-то, что также могло бы обрабатывать «К» и умножать на тысячу. На данный момент мне неизвестно, что какая-либо система ведет журнал в единицах, отличных от килобайта, но я бы предпочел не делать этого предположения.
Я думаю, что ответ rutter должен работать в моем случае. Вот что я сделал до того, как это прочитал:
filter {
grep {
match => { "message" => "...something identifying the message..." }
drop => false
add_tag => [ "MyMarker" ]
}
if "MyMarker" in [tags] {
grok {
match => [ "message", "...(?<rawCurValue>[0-9,]+)K of (?<rawMaxValue>[0-9,]+)K..." ]
break_on_match => false
}
if "_grokparsefailure" not in [tags] {
ruby {
code => "
if(event['rawCurValue'])
event['curValue'] = Integer(event['rawCurValue'].gsub(',','')) * 1000
end
if(event['rawMaxValue'])
event['maxValue'] = Integer(event['rawMaxValue'].gsub(',','')) * 1000
end
"
}
}
}
}
Я подозреваю, что его можно было бы сделать более кратким, но, похоже, это работает.
В mutate
фильтр позволяет заменять текст на gsub
вариант.
gsub
принимает массив, где каждая тройка значений указывает:
Технически он поддерживает регулярные выражения, но в этом случае нам это не нужно.
Сначала удалим запятые. Достаточно просто.
Во-вторых, мы размножаемся. Должен K
умножить на 1000? Если так, то мне кажется, что мы можем просто заменить K
с участием 000
.
Собираем их вместе:
filter {
mutate {
gsub {[
"some_field", ",", "",
"some_field", "K", "000"
]}
}
}
При необходимости вы можете добавить другие варианты замены.
В зависимости от ваших обстоятельств, K
можно умножить на 1024, что будет немного сложнее. Я не вижу никакого решения прямо из коробки, но вы можете использовать ruby
фильтр для выполнения некоторых арифметических операций.