Risto, 

Thank you for this. It makes sense, and you've taken the trouble to explain all 
the nuances that I would have otherwise missed. Wow. 

I'm going to work through this on Monday. 

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: Friday, 22 September, 2023 15:42:28
> Subject: Re: [Simple-evcorr-users] Storing a sequence counter in a context

> 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.

>> The part I think I'm not getting is due to my lack of understanding of Perl 
>> (and
>> specifically perl syntax).

>> The first rule can create the context:

>> add call_uniqueid_seq_$4 1 (where $4 is the unique ID for that call)

>> But then in subsequent rules I want to do something like this:

>> call_uniqueid_seq_$4 ++
>> However I don't expect that to be valid syntax (especially since that store 
>> is
>> for strings), so I have to figure out something else.

>> I was working my head around just 'pop'ing the value off the event store, and
>> then adding 1 to it, but I realized I have no clue how to do this.

>> So, I am hoping that I am just missing something obvious, but, failing that, 
>> I
>> guess I need to understand how I would do something like:

>> pop call_uniqueid_seq_$4 %sequence_num
>> add call_uniqueid_seq_$4 %sequence_num+1
>> I feel like I'm on the wrong track here, but I'm not finding the answers in 
>> the
>> man page, or tutorial, or anywhere else, and my knowledge of Perl is
>> insufficient to help make sense of this.

>> Any thoughts or advice or clues would be greatly appreciated.

>> --
>> 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 ]
>> _______________________________________________
>> Simple-evcorr-users mailing list
>> [ mailto:Simple-evcorr-users@lists.sourceforge.net |
>> Simple-evcorr-users@lists.sourceforge.net ]
>> [ https://lists.sourceforge.net/lists/listinfo/simple-evcorr-users |
>> https://lists.sourceforge.net/lists/listinfo/simple-evcorr-users ]
_______________________________________________
Simple-evcorr-users mailing list
Simple-evcorr-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/simple-evcorr-users

Reply via email to