Назад | Перейти на главную страницу

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

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

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 фильтр для выполнения некоторых арифметических операций.