Как я могу проанализировать человекочитаемое количество байта в Logstash?

Я имею дело с файлами журнала, содержащими части, такие как:

538,486K of 1,048,576K

Они представляют использование памяти (пространство "кучи" Java) представленный в человекочитаемом формате. Я хотел бы отследить те числа в диаграммах в Kibana. Чтобы сделать это, я хотел бы так или иначе использовать фильтр grok Logstash для парсинга этих чисел, но я не знаю, как обработать (т.е. проигнорировать), тысячи разделителя.

Идеально у меня было бы что-то, что может также обработать "K" и умножиться на одна тысяча. В данный момент я не знаю, что любая система входит в систему единица кроме килобайта, но я предпочел бы не делать то предположение.

1
задан 5 March 2015 в 01:48
2 ответа

Фильтр mutate позволяет заменять текст на gsub Параметр .

gsub принимает массив, в котором каждый триплет значений указывает:

  • Имя целевого поля
  • Шаблон поиска
  • Шаблон замены [12 27] Технически он поддерживает регулярные выражения, но в данном случае нам это не нужно.

    Во-первых, мы удалим запятые. Достаточно просто.

    Во-вторых, мы умножаем. Следует ли K умножить на 1000? Если это так, мне кажется, что мы можем просто заменить K на 000 .

    Собираем все вместе:

    filter {
        mutate {
            gsub {[
                "some_field", ",", "",
                "some_field", "K", "000"
            ]}
        }
    }
    

    При необходимости вы можете добавить другие варианты замены.

    В зависимости от ваших обстоятельств, K может умножаться на 1024, что будет немного сложнее. Я не вижу никакого решения прямо из коробки, но вы можете использовать фильтр ruby ​​ для выполнения некоторых арифметических операций.

1
ответ дан 3 December 2019 в 20:58

Я думаю, что ответ 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
        "
      }
    }
  }
}

Я подозреваю, что его можно было бы сделать более кратким, но, похоже, это работает.

1
ответ дан 3 December 2019 в 20:58

Теги

Похожие вопросы