Используя drools вычислить продолжительность событий в текстовом журнале - PullRequest
1 голос
/ 28 января 2012

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

Рассматриваемое событие начинается в одной строке журнала, но может закончиться либо успешным завершением, либо необычным прерыванием.Вот что у меня проблемы с захватом.Вот как могут выглядеть записи журнала (когда другие строки журнала отфильтрованы):

Jan 24 06:50:29 app[623]:  CallOriginateCmd
Jan 24 07:19:27 app[616]:  Client ended the call 
Jan 24 09:00:18 app[623]:  CallOriginateCmd
Jan 24 09:34:48 app[616]:  Client ended the call 
Jan 24 11:03:56 app[623]:  CallOriginateCmd
Jan 24 12:56:58 app[616]:  Client ended the call 
Jan 24 15:48:11 app[623]:  CallOriginateCmd
Jan 24 16:13:24 app[616]:  Client ended the call 
Jan 24 17:16:16 app[623]:  CallOriginateCmd
Jan 24 18:48:51 app[616]:  Client ended the call 
Jan 25 06:09:01 app[623]:  CallOriginateCmd
Jan 25 06:09:24 app[623]:  Failure: timeout sending Config 
Jan 25 06:09:26 app[623]:  CallOriginateCmd
Jan 25 06:09:50 app[623]:  Failure: timeout sending Config 

Я пытаюсь создать правила, которые связывают вызов 24 января 06:50:29 с 07:19.: Завершение 27, вызов 25 января 06:09:01 с ошибкой 06:09:24 и т. Д. Мои правила ниже не создают объект Call () с нужным мне временем начала / конца.

Вот схема моего кода:

rule "Found Call Start"
    when
        LogEntry( message matches ".*CallOriginateCmd.*", logTimestamp : timestamp )
    then
        Call call = new Call();
        call.setStarttime( logTimestamp );
        call.setPartial ( true );
        insert( call );
        AnalysisLog.debug( logTimestamp, "Call Started" );
end

rule "Found Call End"
    when
        LogEntry( message matches ".*Client ended the call.*", logTimestamp : timestamp )
        call : Call( partial == true )
    then
        call.setEndtime( logTimestamp );
        call.setPartial( false );
        call.setFailure( false );
        update( call );
        AnalysisLog.debug( logTimestamp, "Call Ended." );
end

rule "Found Call Failure"
    when 
        LogEntry( message matches ".*timeout sending Config.*", logTimestamp : timestamp )
        call : Call( partial == true )
    then
        call.setEndtime( logTimestamp );
        call.setPartial( false );
        call.setFailure( true );
        update( call );
        AnalysisLog.debug( logTimestamp, "Call Failed." );
end

Вывод сверху:

Jan 17 22:53:04: Call Started
Jan 18 02:10:23: Call Failed.
Jan 17 23:09:23: Call Started
Jan 18 02:10:23: Call Failed.
Jan 17 23:25:39: Call Started

Кажется, что каждый вызов соответствует Failed, хотя только последний вызов в журнале должен

Я думал, что код:

call : Call( partial == true )

в предложении «когда» будет связывать начало + конец или начало + прерывание вместе, но это, очевидно, не делает этого.

Вместо этого, я полагаю, мне нужно найти способ в предложении «когда» найти вызов, где logTimestamp ближе всего к времени начала вызова.Возможно ли это?

TIA

Ответы [ 2 ]

1 голос
/ 29 января 2012

Я не вижу никаких полей корреляции в вашем журнале, поэтому я предполагаю, что сообщения всегда последовательны? то есть сообщение начинает вызов, и следующее сообщение либо завершает, либо вызывает сбой. Если это так, есть много способов сделать это, но вы можете попробовать что-то вроде этого:

rule "Found Call End"
    when
        $s : LogEntry( message matches ".*CallOriginateCmd.*" )
        $e : LogEntry( message matches ".*Client ended the call.*" )
        not LogEntry( timestamp > $s.timestamp && timestamp < $e.timestamp )
    then
        Call call = new Call();
        call.setStarttime( $s.getTimestamp() );
        call.setEndtime( $e.getTimestamp() );
        call.setFailure( false );
        retract( $s );
        retract( $e );
        insert( call );
        AnalysisLog.debug( logTimestamp, "Call Ended." );
end

Напишите аналогичное правило для сценария неудачного вызова. Если в вашем журнале есть поля корреляции, просто добавьте ограничения для сопоставления правильных LogEntries.

0 голосов
/ 28 января 2012

Вы проверили Drools Fusion, вы сможете работать с LogEntry как событиями, позволяющими вам использовать временные операторы для проверки того, что событие начального вызова происходит до события конечного вызова.Drools Fusion также обеспечит вам автоматическое управление жизненным циклом событий.Я все еще пытаюсь понять, какова ваша главная цель, помимо технических проблем.Приветствия

...