logstash вычислить прошедшее время не работает

У меня есть файл, содержащий серию таких сообщений:

component+branch.job                                 2014-09-04_21:24:46   2014-09-04_21:24:49

Это строка, несколько пробелов, первая дата и время, несколько пробелов и вторая дата и время. В настоящее время я использую такой фильтр:

  grok {
    match => [ "message", "%{WORD:componentName}\+%{WORD:branchName}\.%{DATA:jobType}\s+20%{DATE:dateStart}_%{TIME:timeStart}\s+20%{DATE:dateStop}_%{TIME:timeStop}" ]
  }
  mutate {
    add_field => {"tmp_start_timestamp" => "20%{dateStart}_%{timeStart}"}
    add_field => {"tmp_stop_timestamp" => "20%{dateStop}_%{timeStop}"}
  }
  date {
    match => [ "tmp_start_timestamp", "YYYY-MM-dd_HH:mm:ss" ]
    add_tag => [ "jobStarted" ]
  }
  date {
    match => [ "tmp_stop_timestamp", "YYYY-MM-dd_HH:mm:ss" ]
    target => "stop_timestamp"
    remove_field => ["tmp_stop_timestamp", "tmp_start_timestamp", "dateStart", "timeStart", "dateStop", "timeStop"]
    add_tag => [ "jobStopped" ]
  }
  elapsed {
    start_tag => "jobStarted"
    end_tag => "jobStopped"
    unique_id_field => "message"
  }

В результате я получаю поля "@timestamp" и "stop_timestamp" с данными о дате и времени и двумя тегами, без вычисления прошедшего времени. Что мне не хватает?

ОБНОВЛЕНИЕ

Я попытался разделить (как предложил @Rumbles) событие на два отдельных события, но каким-то образом logstash создает два одинаковых события:

input {
    stdin { type => "time" }
}
filter {
  grok {
    match => [ "message", "%{WORD:componentName}\+%{WORD:branchName}\.%{DATA:jobType}\s+20%{DATE:dateStart}_%{TIME:timeStart}\s+20%{DATE:dateStop}_%{TIME:timeStop}" ]
  }
  mutate {
    add_field => {"tmp_start_timestamp" => "20%{dateStart}_%{timeStart}"}
    add_field => {"tmp_stop_timestamp" => "20%{dateStop}_%{timeStop}"}
    update => [ "type", "start" ]
  }
  clone {
    clones => ["stop"]
  }
if [type] == "start" {
  date {
    match => [ "tmp_start_timestamp", "YYYY-MM-dd_HH:mm:ss" ]
    target => ["start_timestamp"]
    add_tag => [ "jobStarted" ]
  }
}
if [type] == "stop" {
  date {
    match => [ "tmp_stop_timestamp", "YYYY-MM-dd_HH:mm:ss" ]
    target => "stop_timestamp"
    remove_field => ["tmp_stop_timestamp", "tmp_start_timestamp", "dateStart", "timeStart", "dateStop", "timeStop"]
    add_tag => [ "jobStopped" ]
  }
}
  elapsed {
    start_tag => "jobStarted"
    end_tag => "jobStopped"
    unique_id_field => "message"
    timeout => 15
  }
}

output {
    stdout { codec => rubydebug }
}

person Damian Melniczuk    schedule 07.04.2015    source источник
comment
Ошибка Logstash 2299, по-видимому, является запросом на добавление функций, которые вы ищете. @Rumbles прав в отношении того, как он работает в настоящее время (должно быть два события).   -  person Chris Magnuson    schedule 07.09.2015


Ответы (1)


Я никогда не использовал этот фильтр, однако я только что быстро прочитал документацию и думаю, что понимаю проблему, с которой вы столкнулись.

Из вашего описания я полагаю, что вы пытаетесь запустить просроченный фильтр для одного события, из документации видно, что фильтр ожидает 2 события, одно с временем начала, второе с временем окончания, с общим идентификатором, помогающим фильтру чтобы определить, когда 2 события совпадают:

События, управляемые этим фильтром, должны иметь определенные свойства. Событие, описывающее запуск задачи («стартовое событие»), должно содержать тег, равный «start_tag». С другой стороны, событие, описывающее завершение задачи («событие завершения»), должно содержать тег, равный «end_tag». Оба этих двух типа событий должны иметь поле идентификатора, которое однозначно идентифицирует эту конкретную задачу. Имя этого поля хранится в «unique_id_field».

Каждое сообщение считается событием, поэтому вам нужно будет разделить ваши сообщения на два события, и каждая пара событий будет иметь уникальный идентификатор, чтобы помочь фильтру связать их вместе. Это не совсем аккуратное решение (разделить ваше событие на два события, а затем снова соединить их позже), может быть лучшее решение, о котором я не знаю.

person Rumbles    schedule 07.04.2015