[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