[Kamailio-Users] Question about Timer, i need milliseconds

Daniel-Constantin Mierla miconda at gmail.com
Wed Jan 20 18:38:26 CET 2010


Hello,

On 1/20/10 6:10 PM, Alex Balashov wrote:
> Marco,
>
> On 01/20/2010 10:53 AM, Marco Bungalski wrote:
>
>> Hello all :-)
>>
>> I have a question about how to get a time-stamps with milliseconds. To
>> create my own CDR's, i write to my databases timestamps, with a command
>> like this:
>>
>> sql_query("ca", "UPDATE active_calls SET state = 'BILLING', end_time=$Ts
>> WHERE call_id='$ci'", "ra");
>>
>> I use the "$Ts"-variable, but with this i can get only "full" seconds.
>> But i need milliseconds for my billing-system. Otherwise i have
>> differences between my CDR's and my carrier's one.
>>
>> Example: A call has a duration of 0.2 seconds. In my CDR start- and
>> endtime is the same (=0 seconds), to my carrier a have 1 second to 
>> pay ;-)
>>
>> Is there a possibility to get a time-stamp or time with milliseconds?
>
> I do not know of any pseudovariables in Kamailio that expose the wall 
> clock time in milliseconds.

indeed it is none now. Could be added to the broken-time PV class in the 
future, not a big effort.

Just for general, $Ts is cached, it will return same value during config 
processing of same message (value taken when $Ts is evaluated firt time 
for a message), $TS is time snapshot everytime.

For now solution for this case is what you propose - use DB specific 
functions.

Cheers,
Daniel

>
> One thing you have to keep in mind, though, is that even if such a 
> facility were available - for example, it would be relatively simple 
> to expose via pseudovariables the microsecond values returned by 
> gettimeofday() down to the nearest millisecond - it would not always 
> be so precise.  The accuracy and resolution of userspace clocks can be 
> distorted and unpredictable and depends on many things.  While this 
> would probably not affect you if you're interested in a 1/10th second 
> granularity at most, it is still something to consider.
>
> To solve your problem, I suggest that you not update your records with 
> values from $Ts.  Instead, do it as the 'acc' module does and use the 
> wall clock time from the database itself, which does go down to the 
> sub-second level in the manner suggested by ISO timestamps.
>
> The function NOW() is available in both MySQL and PostgreSQL, and 
> probably most other RDBMs.  It returns a date string in the native 
> timestamp format used within those RDBMs.  In Postgres, which I am 
> most familiar with, this type is 'timestamp'. I think in MySQL it may 
> be called something else.
>
> So, for example, on 200 OK/pickup:
>
>    UPDATE cdr SET start_time = NOW(), ... WHERE call_id = $ci;
>
> And on BYE:
>
>    UPDATE cdr SET end_time = NOW(), ... WHERE call_id = $ci;
>
> Making the calculation (end_time - start_time) within the database, 
> cast and rounded appropriately by various mathematical functions 
> provided therein, would allow you to do the rounding up and/or the 
> application of fractional increments you're looking for.
>
> I personally use triggers and stored procedures on the event rows 
> produced by the 'acc' module to generate my own CDRs in my own desired 
> format from this data, using the 'db_extra' parameter to pass through 
> any other values I want from the proxy.  I do this in PostgreSQL;  I 
> do not know the practicality of this in MySQL.
>

-- 
Daniel-Constantin Mierla
* http://www.asipto.com/




More information about the Users mailing list