Risto, 

That's important advice from a performance perspective, so thank you for that. 
I would have missed it and suffered as a result. 

If we decide to run SEC like a daemon, as the data is generated (which we might 
do), then all that stale data would have definitely caused us problems (the 
callid DOES get re-used, as you surmised). I'm sure I can figure out how to put 
a handler in to drop everything relating to a call once it's done. I'll do some 
reading (I always learn new things as I re-read the docs, so that's time well 
spent). 

I like the option to use Perl to handle the counter; I'll see how the 
performance does and decide based on that. 

Thanks as always for the help. 

Jim 

-- 
Jim Van Meggelen 
ClearlyCore Inc. 

+1-416-639-6001 (DID) 
+1-877-253-2716 (Canada) 
+1-866-644-7729 (USA) 
+1-416-425-6111 x6001 
jim.vanmegge...@clearlycore.com 
[ http://www.clearlycore.com/ | http://www.clearlycore.com ] 

Asterisk: The Definitive Guide 
FIFTH EDITION NOW AVAILABLE TO DOWNLOAD: 
[ https://cdn.oreillystatic.com/pdf/Asterisk_The_Definitive_Guide.pdf | 
https://cdn.oreillystatic.com/pdf/Asterisk_The_Definitive_Guide.pdf ] 

> From: "Risto Vaarandi" <risto.vaara...@gmail.com>
> To: "Jim Van Meggelen" <jim.vanmegge...@clearlycore.com>
> Cc: "simple-evcorr-users" <simple-evcorr-users@lists.sourceforge.net>
> Sent: Sunday, 24 September, 2023 04:35:50
> Subject: Re: [Simple-evcorr-users] Storing a sequence counter in a context

> hi Jim,
> many thanks for the clarification! I have a better understanding now about the
> nature of the problem.
> Because you are doing offline processing of an already existing log file,
> removing old contexts or old hash table keys (recommendation from the end of 
> my
> post) might not be so important, provided that call IDs are not reused for
> different calls in the processed log file, and the number of call IDs is not
> very large. That would keep the solution a bit more simple.
> kind regards,
> risto

> Kontakt Jim Van Meggelen (< [ mailto:jim.vanmegge...@clearlycore.com |
> jim.vanmegge...@clearlycore.com ] >) kirjutas kuupƤeval L, 23. september 2023
> kell 22:11:

>> Risto,

>> I cannot change the timestamps, as they are coded in the files I'm working 
>> with
>> (old data). Going forward, I also cannot guarantee that I will have control
>> over the source data, and it is likely that it will have a similar 
>> granularity.
>> Finally, there's no need for that level of granularity downstream; it is only
>> necessary that two events with the same timestamp are sequenced so that it is
>> clear which happened first.

>> It does seem a bit kludgy, but if I try to reduce the kludge in my SEC file, 
>> I
>> am almost certain to have to introduce kludge somewhere else, which is worse
>> (this way I only have SEC to maintain, rather than additional technology).

>> This way, I can feed relevant log files to SEC from any source, and trust 
>> that
>> I'll be able to handle them, so long as they follow standard Asterisk log
>> format.

>> Thanks again for your generous advice.

>> Jim

>> --
>> Jim Van Meggelen
>> ClearlyCore Inc.

>> +1-416-639-6001 (DID)
>> +1-877-253-2716 (Canada)
>> +1-866-644-7729 (USA)
>> +1-416-425-6111 x6001
>> [ mailto:jim.vanmegge...@clearlycore.com | jim.vanmegge...@clearlycore.com ]
>> [ http://www.clearlycore.com/ | http://www.clearlycore.com ]

>> Asterisk: The Definitive Guide
>> FIFTH EDITION NOW AVAILABLE TO DOWNLOAD:
>> [ https://cdn.oreillystatic.com/pdf/Asterisk_The_Definitive_Guide.pdf |
>> https://cdn.oreillystatic.com/pdf/Asterisk_The_Definitive_Guide.pdf ]

>>> From: "Risto Vaarandi" < [ mailto:risto.vaara...@gmail.com |
>>> risto.vaara...@gmail.com ] >
>>> To: "Jim Van Meggelen" < [ mailto:jim.vanmegge...@clearlycore.com |
>>> jim.vanmegge...@clearlycore.com ] >
>>> Cc: "simple-evcorr-users" < [ 
>>> mailto:simple-evcorr-users@lists.sourceforge.net |
>>> simple-evcorr-users@lists.sourceforge.net ] >
>>> Sent: Saturday, 23 September, 2023 03:51:02
>>> Subject: Re: [Simple-evcorr-users] Storing a sequence counter in a context

>>> hi Jim,
>>> the solutions from my previous post were provided without knowing the root 
>>> cause
>>> of the issue. If the main reason for the problem is the nature of the
>>> timestamps in the logs (that is, they are provided with an accuracy of a
>>> second), I would recommend using a different logging scheme with
>>> high-resolution timestamps. For example, as David has mentioned in his post,
>>> using syslog servers with RFC5424-based syslog protocol ( [
>>> https://datatracker.ietf.org/doc/html/rfc5424 |
>>> https://datatracker.ietf.org/doc/html/rfc5424 ] ) provides such timestamps
>>> out-of-the-box. I am not sure whether you can change the logging scheme for
>>> these particular application messages, but if you can, these timestamps are
>>> highly useful for many purposes like the investigation of past system faults
>>> and security incidents.
>>> kind regards,
>>> risto

>>>> hi Jim,

>>>> let me provide some suggestions how to accomplish this task. First, you 
>>>> could
>>>> utilize the context based approach that you have described in your post. In
>>>> that case, the numeral that has been retrieved from the context with the 
>>>> 'pop'
>>>> action needs to be incremented, and you can do it with the 'lcall' action 
>>>> that
>>>> invokes the relevant Perl code. Here is one example (I have added several 
>>>> of
>>>> extra actions into the rule for initializing the context):

>>>> type=single
>>>> ptype=regexp
>>>> pattern=call_id (\S+)
>>>> desc=call id $1
>>>> action=exists %e call_uniqueid_seq_$1; \
>>>> if %e ( none ) else ( add call_uniqueid_seq_$1 0); \
>>>> pop call_uniqueid_seq_$1 %sequence_num; \
>>>> lcall %sequence_num %sequence_num -> ( sub { $_[0] + 1 } ); \
>>>> add call_uniqueid_seq_$1 %sequence_num

>>>> The first two actions check if the context call_uniqueid_seq_* for the 
>>>> given
>>>> call exists, and if not, 0 is written into that context to initialize it:

>>>> exists %e call_uniqueid_seq_$1; \
>>>> if %e ( none ) else ( add call_uniqueid_seq_$1 0);

>>>> The 'pop' and 'add' actions (the 3rd and 5th action in the above rule) are
>>>> identical to the actions from your email.

>>>> The 'lcall' action (4th action in the above rule) increments the counter 
>>>> value
>>>> retrieved from the context by executing the following Perl one-line 
>>>> function:
>>>> sub { $_[0] + 1 }
>>>> That function takes the value of its parameter (that is, %sequence_num) and
>>>> returns an incremented value which is stored back into %sequence_num. Note 
>>>> that
>>>> %sequence_num appears twice in the 'lcall' action, since it acts both as an
>>>> input parameter for the Perl function and as the variable where the return
>>>> value from the function is stored.

>>>> There is also an alternative way for addressing the same assignment. This
>>>> approach involves keeping the counter for each call ID not in a SEC 
>>>> context,
>>>> but rather in a Perl hash table. That approach is more efficient, since the
>>>> counter value is not copied back and forth between the Perl function and 
>>>> the
>>>> SEC context each time it needs to be incremented. Instead, the counter 
>>>> value
>>>> stays in a Perl data structure during these increments. Here is a relevant 
>>>> rule
>>>> example:

>>>> type=single
>>>> ptype=regexp
>>>> pattern=call_id (\S+)
>>>> desc=call id $1
>>>> action=lcall %sequence_num $1 -> ( sub { ++$calls{$_[0]} } ); \
>>>> write - the new value for counter for call $1 is %sequence_num

>>>> The above example involves the use of a Perl hash (associative array) 
>>>> 'calls',
>>>> where the call ID serves as a key into the hash. For each key (call ID), 
>>>> the
>>>> hash stores the counter for that call ID. Each time the function
>>>> sub { ++$calls{$_[0]} }
>>>> gets called, the counter for the relevant call ID (the value of $1) is
>>>> incremented in the hash 'calls', and the result is stored to %sequence_num.

>>>> If you just want to retrieve the current value of the counter for some 
>>>> call ID
>>>> (the value of $1) without incrementing it, you can simply invoke the 
>>>> following
>>>> action:

>>>> lcall %sequence_num $1 -> ( sub { $calls{$_[0]} } )

>>>> With both the context-based and Perl-hash-based approach, one needs to 
>>>> think
>>>> about dropping stale contexts (or stale hash keys) for calls that are no 
>>>> longer
>>>> relevant. With contexts, you can remove them with the 'delete' action. In 
>>>> the
>>>> case you use the Perl hash for storing the counters, you can use the 
>>>> following
>>>> 'lcall' action for deleting a key from the hash 'calls':

>>>> lcall %sequence_num $1 -> ( sub { delete $calls{$_[0]} } )

>>>> I hope the above examples are useful.

>>>> kind regards,
>>>> risto

>>>> Kontakt Jim Van Meggelen (< [ mailto:jim.vanmegge...@clearlycore.com |
>>>> jim.vanmegge...@clearlycore.com ] >) kirjutas kuupƤeval R, 22. september 
>>>> 2023
>>>> kell 19:50:

>>>>> I am using SEC for an atypical use case, where rather than using log 
>>>>> events to
>>>>> correlate events for things like security events, I am using it to parse
>>>>> through Asterisk logs in order to capture a sequence of phone call events 
>>>>> (call
>>>>> comes in, auto attendant answers, user selects a digit, call is 
>>>>> transferred,
>>>>> etc). I have SEC write each to a CSV file, which can then be processed
>>>>> downstream for reporting (for example, I produced a Sankey chart using 
>>>>> this
>>>>> data).

>>>>> SEC has proven fantastic for this, however one minor issue has been that 
>>>>> the
>>>>> timestamps in the logs are not granular to smaller than a second, so it's
>>>>> possible for two or more events to occur within the same second. 
>>>>> Generally this
>>>>> doesn't cause a problem, but when sorting the CSV file elsewhere, this can
>>>>> result in out-of-sequence lines, if they both contain the exact same 
>>>>> timestamp.

>>>>> So, what I've been trying to figure out is how to store a counter that is 
>>>>> tied
>>>>> to the uniqueid of the call, and increment that with each event. I 
>>>>> figured I'd
>>>>> be able to do this by storing an integer in the event store of a context 
>>>>> (tied
>>>>> to the uniqueid for that call). I can then increment it as the various log
>>>>> lines of the call are processed in turn.
_______________________________________________
Simple-evcorr-users mailing list
Simple-evcorr-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/simple-evcorr-users

Reply via email to