Text Call Detail Records

From TBwiki
(Difference between revisions)
Jump to: navigation, search
m (the the -> the)
(Adding details on how to deal with CDR logs with incoherencies)
Line 165: Line 165:
 
== Redundancy ==
 
== Redundancy ==
  
In a [[TMG7800]] configuration, with redundant TMG-Control servers, only the active server writes the CDR logs.
+
In a [[TMG7800]] configuration, with redundant TMG-Control servers, only the active server writes the CDR logs. Since the active server may change over time, CDR parsing must take into account that CDR logs may be found in files from the two servers.
 +
 
  
 
The analysis of the logs for the purpose of extracting billing information must be done after combining the two logs, from both TMG-Control servers, sorting the entries by timestamp for example. See how to [[TMG:Retrieve_Text_CDR|Retrieve Text CDR here]].
 
The analysis of the logs for the purpose of extracting billing information must be done after combining the two logs, from both TMG-Control servers, sorting the entries by timestamp for example. See how to [[TMG:Retrieve_Text_CDR|Retrieve Text CDR here]].
  
It is worth noting that an entry will never be duplicated. Some CDR records can be lost during transition from active to standby following a system fault. Consequently, a CDR analysis script must handle the case where a call answered log does not match any call termination log.
+
== CDR entry loss due to switchover ==
 +
It is worth noting that some CDR records can be lost during transition from active to standby following a system fault. Consequently, a CDR analysis script must handle few "corner" cases:
 +
=== A "Start" CDR entry without corresponding "End" entry ===
 +
This happens if a call was terminated during the switchover period.
 +
 
 +
==> In that case, billing the call is not possible, the "End" CDR information was lost.
 +
 
 +
=== A "End" CDR entry without corresponding "Start" entry ===
 +
This happens if a call was answered just before the HA switchover occurred, and the CDR entry was not yet flushed to disk.
 +
 
 +
==> In that case, billing can still be done using the "End" entry's "end time" versus "connected time" (unless connected time is 0, meaning the call was never answered)
 +
 
 +
=== A call with two "End" CDR entries ===
 +
This case may happen after some partial HA switchover of the Toolpack system:
 +
* The CDR generating application (Gateway) remains alive, but looses it's connection with toolpack_engine
 +
* After a timeout, it destroys it's call contexts, and thus writes CDR "End" entries.
 +
* Later, connection with toolpack_engine is re-established, and some calls were still valid and connected
 +
* The Gateway application re-synchronizes with these calls. These call continue normally until they're hung-up
 +
* When hung-up, another "End" CDR entry is written
 +
 
 +
==> In that case, billing can be done by using the "end time" of the second CDR entry, minus the "connected time" of the first CDR entry.
  
 
== How to retrieve CDR  ==
 
== How to retrieve CDR  ==

Revision as of 15:10, 19 October 2012

Text call detail records (CDR) can be used on the TMG800, TMG3200 or TMG7800. The Call Detail Records are saved in a log file on a local disk. There is an entry done for each call leg, at the start of a call and at the end of the call. In addition you can configure the system to update the CDRs periodically (update).

The format of the CDR traces is defined by configuration, using variables that are replaced by the Gateway application when writing to the log. For example, the following variable will be replaced by the called number: @{CalledNumber}

In order to save disk space and simplify the archiving and backup of CDR log files, this log file is automatically archived (gzipped) and rotated every N seconds, as specified by the system configuration.


Contents

Enabling text CDR

Text CDR functionality is enabled through the Toolpack Web Portal:

  • Go to the Gateway->Configurations menu.
  • Click on Use CDR behavior to enable the CDR behavior
  • Expand the CDR Options section
  • In CDR Mode, select Text CDR
  • Expand the Text CDR parameters section
  • Configure the Text CDR parameters the way you want, using the parameters describe below

CDR Mode 2 6.jpg

Configuration parameters

  • CDR log file path: Path of the CDR log file, relative to the current working directory of the Gateway application (e.g.[...]/toolpack/setup/12358/[major version]/apps/gateway).
  • CDR format (start): Format of the text CDR log written at the time the call is answered (or terminated if it was never answered). This format contains variables automatically replaced (see below).
  • CDR format (update): Format of the text CDR log written periodically during call if the CDR option Enable periodic CDR update is used. This format contains variables automatically replaced (see below).
  • CDR format (end): Format of the text CDR log written at the time the call is terminated. This format contains variables automatically replaced (see below).
  • Rotation delay in seconds: Delay, in seconds, at which the log file is rotated and gzipped. A delay of 3600 seconds will make log file rotate every hour, for example. NOTE: This parameter cannot be larger then 86400 seconds (1 day). A value of 0 will be considered equivalent to the maximum value.
  • Max total size of gzipped CDR logs: Maximum total size (in bytes) of all gzipped log file segments on disk. If ever total size exceeds this limit, older gzipped log files will be deleted. A value of 0 will be considered as unlimited size.

Text CDR Parameters.jpg

Available variables

The following variables exist and can be used to define the CDR log format.

Variables used for identifying call legs

*@{LegId}:                  Unique Id for this leg (32 bits value, but may eventually be upgraded to 64 bits value).
*@{OtherLegId}:             Id of the other call leg joined with current call leg.
*@{SessionId}:              Unique call identifier for two joined and answered call legs, including failed outgoing call attempts (route retry)
                            Formatted as 4 values of 32 bits, printed as 4 blocks of 8 hexadecimal characters separated by a space
                            Ex: a939d169 299ffcd0 00000000 00000000
                            Note: Call Transfer Target legs have separate SessionId. If you need an id to correlate a transferred call
                                  to the original call, use @{OriginalSessionId}.
*@{OriginalSessionId}:      Refers to @{SessionId} of the original legs for this call, in case of call transfer.
                            In fact, Transfer Target leg has a different value for @{SessionId}, but can be linked with the original call
                            legs through @{OriginalSessionId}.
*@{LinkId}:                 Same meaning as @{OriginalSessionId}, but presented as a 32 bits integer value.

For all Ids above, please see Known Limitations below for notes about uniqueness of these values.

Timestamps

*@{ConnectedTime}:          Time where the call was answered (and connected with another leg) (in number of seconds since epoch)
*@{ConnectedTime:format}:   Same as @{ConnectedTime} but with custom print format (local time zone), using 'strftime' style, with added
                            support for @m replaced by milliseconds.
                            Example format: %Y-%m-%d %H:%M:%S.@m  -> 2009-09-02 12:16:24.333
*@{ConnectedTimeUtc:format}:Same as @{ConnectedTime:format} but printed in UTC time, rather than local time zone.
*@{EndTime}:                Time where the call has started terminating (in number of seconds since epoch).
                            Note that slightly differs from the @{Timestamp}, since the 'End' CDR trace is printed once the call has
                            finished terminating,
                            while @{EndTime} reports the time where the call has started terminating (upon hangup for example).
*@{EndTime:format}:         Same as @{EndTime} but with custom print format (local time zone), using 'strftime' style, with added
                            support for @m replaced by milliseconds.
                            Example format: %Y-%m-%d %H:%M:%S.@m  -> 2009-09-02 12:16:24.333
*@{EndTimeUtc:format}:      Same as @{EndTime:format} but printed in UTC time, rather than local time zone.
*@{StartTime}:              Time where the call was created (in number of seconds since epoch)
*@{StartTime:format}:       Same as @{StartTime} but with custom print format (local time zone), using 'strftime' style, with added
                            support for @m replaced by milliseconds.
                            Example format: %Y-%m-%d %H:%M:%S.@m  -> 2009-09-02 12:16:24.333
*@{StartTimeUtc:format}:    Same as @{StartTime:format} but printed in UTC time, rather than local time zone.
*@{Timestamp}:              Time where this CDR log entry was written.
                            Should not be used for billing purposes. Use @{EndTime} for billing @{EndTime} reports the time where
                            the call has started terminating (hangup), while *@{Timestamp} the time where signaling confirmed the termination.
*@{Timestamp:format}:       Same as @{Timestamp} but with custom print format (local time zone), using 'strftime' style, with added
                            support for @m replaced by milliseconds.
                            Example format: %Y-%m-%d %H:%M:%S.@m  -> 2009-09-02 12:16:24.333
*@{TimestampUtc:format}:    Same as @{Timestamp:format} but printed in UTC time, rather than local time zone.


Information related to signaling

*@{CalledNumber}:           Called number
*@{CallingNumber}:          Calling number
*@{CallType}:               Call type ("Telephony" or "VOIP")
*@{NAP}:                    Name of the NAP this call leg is from
*@{OriginatorName}:         Direction of the call:
                             - "originate" (incoming call leg) - "answer" (outgoing call leg)
*@{Protocol}:               Type of protocol used ("SS7", "ISDN", or "SIP")
*@{TerminationCause}:       Cause of the call termination, printed as an integer value (refering enum TBCMC_CALL_REASON_CODE)
*@{TerminationCauseString}: Cause of the call termination, printed as an string value
*@{TerminationSource}:      Identifies the cause of the leg termination:
                              - "TermInd":       Terminating indication has been received on this leg
                              - "JoinedTermInd": Terminating indication has been received on the leg joined to current leg,
                                                 and has been forwarded to current leg
                              - "App":           Call control application has asked to drop the call
                              - "Engine":        Toolpack engine has decided to terminate this call
                                                 (generally due to local errors like disconnected TMedia)
*@{UserName}:               For SIP calls, name of the user.
*@{ChargeIndicator}:        For TDM (SS7 and CAS R2); received charge indicator in Alert message.

Information related to media, and others

*@{ApplicationName}:        Name of the application that has written this log ("Gateway")
*@{Codec}:                  Codec used for this call ("G711" for example)
*@{MediaInfo}:              Protocol type dependent information on the call leg.
                            For TDM (Telephony) calls (SS7 or ISDN): "trunk_name:timeslot_nb".
                            For VOIP calls (SIP): "codec@ip:port"
*@{RemoteIP}:               For VOIP calls, RTP IP address of the remote peer for this call leg.
*@{RemotePort}:             For VOIP calls, RTP UDP port of the remote peer for this call leg.
*@{TimeslotNumber}:         For TDM (Telephony) calls, timeslot number that this call was using for audio.
*@{TrunkName}:              For TDM (Telephony) calls, name of the trunk that this call was using for audio.

Known limitations

The following values may not be unique due to following limitations:

  • @{LegId}
  • @{OtherLegId}
  • @{SessionId}
  • @{CommonSessionId}
  • @{LinkId}

In case both gateway and toolpack_engine applications are are restarted at the same time:

  • Recently used values may be reused for new call legs (though not twice simultaneously). This is fixed starting with release 2.5.66, which guarantees values are not reused within 49 days
  • Active call legs will be re-assigned a different value. It is thus not possible to correlate "start" and "end" traces from one call that was active when applications were restarted. This is fixed starting with release 2.6.0

In both cases, the workaround is to analyze CDR logs, for billing, based only on the information found in the "end" trace (which should have all required information anyways)

Default values

The default values are as follows:


For the CDR that is printed when the call leg is answered:

@{Timestamp:%Y-%m-%d %H:%M:%S.@m%z},BEG,SessionId='@{SessionId}',LegId='@{LegId}',
StartTime='@{StartTime}',ConnectedTime='@{ConnectedTime}',Calling='@{CallingNumber}', 
Called='@{CalledNumber}',NAP='@{NAP}',Protocol='@{Protocol}',Direction='@{OrginatorName}' 

(Note: the above is a single line!)


For the CDR that is printed throughout the call duration at periodic intervals (if this option is enabled on the CDR behavior):

@{Timestamp:%Y-%m-%d %H:%M:%S.@m%z}: SessionId='@{SessionId}' LegId='@{LegId}'

For the CDR that is printed when the call leg is terminated:

@{Timestamp:%Y-%m-%d %H:%M:%S.@m%z},END,SessionId='@{SessionId}',LegId='@{LegId}',
StartTime='@{StartTime}',ConnectedTime='@{ConnectedTime}', EndTime='@{EndTime}',
FreedTime='@{Timestamp}',TerminationCause='@{TerminationCauseString}', 
Calling='@{CallingNumber}',Called='@{CalledNumber}',NAP='@{NAP}',Direction='@{OrginatorName}' 


(Note: the above is a single line!)

Examples

For example, one may define a short comma-separated value-based (CSV) CDR log file to minimize disk space requirements:

"@{LegId},@{ConnectedTime},@{EndTime},@{CallingNumber},@{CalledNumber},@{NAP}"

As another example, one may define a XML-based CDR log file:

<cdr_start>
 <time timestamp="@{Timestamp}" start_time="@{StartTime}" connect_time="@{ConnectedTime}" end_time="@{EndTime}"/>
 <id session_id="@{SessionId}" leg_id="@{LegId}" link_id="@{LinkId}"/>
 <number calling="@{CallingNumber}" called="@{CalledNumber}" direction="@{OrginatorName}"/>
 <info nap="@{NAP}" protocol="@{Protocol}" called="@{CalledNumber} media="@{MediaInfo}"/>
 <termination cause="@{TerminationCauseString}" source="@{TerminationSource}"/>
</cdr_start>


Redundancy

In a TMG7800 configuration, with redundant TMG-Control servers, only the active server writes the CDR logs. Since the active server may change over time, CDR parsing must take into account that CDR logs may be found in files from the two servers.


The analysis of the logs for the purpose of extracting billing information must be done after combining the two logs, from both TMG-Control servers, sorting the entries by timestamp for example. See how to Retrieve Text CDR here.

CDR entry loss due to switchover

It is worth noting that some CDR records can be lost during transition from active to standby following a system fault. Consequently, a CDR analysis script must handle few "corner" cases:

A "Start" CDR entry without corresponding "End" entry

This happens if a call was terminated during the switchover period.

==> In that case, billing the call is not possible, the "End" CDR information was lost.

A "End" CDR entry without corresponding "Start" entry

This happens if a call was answered just before the HA switchover occurred, and the CDR entry was not yet flushed to disk.

==> In that case, billing can still be done using the "End" entry's "end time" versus "connected time" (unless connected time is 0, meaning the call was never answered)

A call with two "End" CDR entries

This case may happen after some partial HA switchover of the Toolpack system:

  • The CDR generating application (Gateway) remains alive, but looses it's connection with toolpack_engine
  • After a timeout, it destroys it's call contexts, and thus writes CDR "End" entries.
  • Later, connection with toolpack_engine is re-established, and some calls were still valid and connected
  • The Gateway application re-synchronizes with these calls. These call continue normally until they're hung-up
  • When hung-up, another "End" CDR entry is written

==> In that case, billing can be done by using the "end time" of the second CDR entry, minus the "connected time" of the first CDR entry.

How to retrieve CDR

There are 2 ways to retrieve the text CDR manually or automatically. The procedures are described in Retrieve Text CDR.

Notes

  • This mode of operation is not recommended for TMG800 or TMG3200 with a flash disk (last shipment January 2011). However, the TMG800 or TMG3200 with SATA or SSD disk option is OK (use command tbproduct: if the command can be executed, the disk is SATA or SSD).
  • TelcoBridges does not recommend storing CDR logs via network file systems (NFS or other). We highly recommend writing to a local hard drive and have developed a background script that moves the gzipped log segments for backup or analysis.
Personal tools