Назначение тегов для истекших в logstash

У меня есть файл журнала, который выглядит, например, так:

2015-12-05 05:00:51 prefix1_sent 1
2015-12-05 05:00:52 prefix2_sent 2
2015-12-05 05:00:53 prefix1_received 1
2015-12-05 05:00:54 prefix2_received 2

Я хочу узнать, сколько времени заняло конкретное событие. Я использую просроченный плагин в logstash следующим образом:

....

grok {
        patterns_dir => "path"
        match => { 
            "message" => "%{TIMESTAMP:logtime}, %{EVENT:event}, %{SPLIT:ID}"
        }
    }

filter{
    if [event] == "(.)*sent" {
        if [event] == "prefix1(.)*" {
            kv {
                add_tag => [ "prefix1_sent" ]
            }
        } else if [event] == "prefix2(.)*" {
            kv {
                add_tag => [ "prefix2_sent" ]
            }
    } else if [event] == "(.)*received" {
        if [event] == "prefix1(.)*" {
            kv {
                add_tag => [ "prefix1_received" ]
            }
        } else if [event] == "prefix2(.)*" {
            kv {
                add_tag => [ "prefix2_received" ]
            }
        }
    }
}
filter{
    elapsed {
        start_tag => "prefix1_sent"
        end_tag => "prefix1_received"
        unique_id_field => "ID"
        new_event_on_match => false
    }
}
filter{
    elapsed {
        start_tag => "prefix2_sent"
        end_tag => "prefix2_received"
        unique_id_field => "ID"
        new_event_on_match => false
    }
}

....

Я не уверен, что мой синтаксис вложенного оператора if верен, если я понимаю использование «kv». Я новичок в логсташе. Однако я не могу найти тег в кибане с этой конфигурацией. Где я делаю ошибку?

Спасибо


person Wlad    schedule 20.01.2016    source источник


Ответы (1)


Несколько комментариев:

  • Ваши вложенные условные операторы в порядке.
  • Ваши сравнения с использованием регулярных выражений неверны. Используйте "=~" вместо "==".
  • add_tag ​​работает только тогда, когда работает базовый фильтр. Хотя вы можете использовать kv{}, на самом деле вы ничего не делаете с ключами/значениями, поэтому это может сбивать с толку. Большинство людей используют mutate{} для подобных вещей.

Эти изменения, вероятно, помогут вам встать на правильный путь.

Чтобы получить непрошенный совет, взгляните на свой рабочий процесс. Во-первых, вы применяете регулярное выражение с grok, чтобы создать три поля. Затем вы снова повторяете одно из них (2-3 раза), прежде чем делать add_field. Попробуй это:

  • в оригинальном grok{} разделите поле события на две части. Такой шаблон должен делать это: %{DATA:event_prefix}_%{DATA:event_verb}
  • перепишите свои условные выражения, чтобы они точно соответствовали этим двум полям.

Мало того, что это более «грокоподобно», но и будет быстрее применительно к большому набору данных.

person Alain Collins    schedule 20.01.2016