|
@@ -1,2 +1,1518 @@
|
|
|
+Acc Module
|
|
|
|
|
|
+Jiri Kuthan
|
|
|
|
|
|
+ iptel.org
|
|
|
+ <[email protected]>
|
|
|
+
|
|
|
+Bogdan-Andrei Iancu
|
|
|
+
|
|
|
+ Voice Sistem SRL
|
|
|
+ <[email protected]>
|
|
|
+
|
|
|
+Ramona-Elena Modroiu
|
|
|
+
|
|
|
+ rosdev.ro
|
|
|
+ <[email protected]>
|
|
|
+
|
|
|
+Edited by
|
|
|
+
|
|
|
+Bogdan-Andrei Iancu
|
|
|
+
|
|
|
+ Voice Sistem SRL
|
|
|
+ <[email protected]>
|
|
|
+
|
|
|
+Edited by
|
|
|
+
|
|
|
+Sven Knoblich
|
|
|
+
|
|
|
+ 1&1 Internet AG
|
|
|
+ <[email protected]>
|
|
|
+
|
|
|
+ Copyright © 2002, 2003 FhG FOKUS
|
|
|
+
|
|
|
+ Copyright © 2004, 2006 Voice Sistem SRL
|
|
|
+
|
|
|
+ Copyright © 2011 1&1 Internet AG
|
|
|
+ __________________________________________________________________
|
|
|
+
|
|
|
+ Table of Contents
|
|
|
+
|
|
|
+ 1. Admin Guide
|
|
|
+
|
|
|
+ 1. Overview
|
|
|
+
|
|
|
+ 1.1. General Example
|
|
|
+
|
|
|
+ 2. Extra accounting
|
|
|
+
|
|
|
+ 2.1. Overview
|
|
|
+ 2.2. Definitions and syntax
|
|
|
+ 2.3. How it works
|
|
|
+
|
|
|
+ 3. Multi Call-Legs accounting
|
|
|
+
|
|
|
+ 3.1. Overview
|
|
|
+ 3.2. Configuration
|
|
|
+ 3.3. Logged data
|
|
|
+
|
|
|
+ 4. Call Data Record generation
|
|
|
+
|
|
|
+ 4.1. Overview
|
|
|
+ 4.2. CDR Extra
|
|
|
+
|
|
|
+ 4.2.1. Definitions and syntax
|
|
|
+
|
|
|
+ 4.3. CDR with Multi Call-Legs
|
|
|
+
|
|
|
+ 4.3.1. Overview
|
|
|
+ 4.3.2. Configuration
|
|
|
+
|
|
|
+ 4.3.2.1. Example for a spiraled Proxy
|
|
|
+
|
|
|
+ 4.3.3. Logged data
|
|
|
+
|
|
|
+ 5. Dependencies
|
|
|
+
|
|
|
+ 5.1. Kamailio Modules
|
|
|
+ 5.2. External Libraries or Applications
|
|
|
+
|
|
|
+ 6. Parameters
|
|
|
+
|
|
|
+ 6.1. early_media (integer)
|
|
|
+ 6.2. failed_transaction_flag (integer)
|
|
|
+ 6.3. failed_filter (string)
|
|
|
+ 6.4. report_ack (integer)
|
|
|
+ 6.5. report_cancels (integer)
|
|
|
+ 6.6. detect_direction (integer)
|
|
|
+ 6.7. acc_prepare_flag (integer)
|
|
|
+ 6.8. acc_prepare_always (integer)
|
|
|
+ 6.9. multi_leg_info (string)
|
|
|
+ 6.10. log_flag (integer)
|
|
|
+ 6.11. log_missed_flag (integer)
|
|
|
+ 6.12. log_level (integer)
|
|
|
+ 6.13. log_facility (string)
|
|
|
+ 6.14. log_extra (string)
|
|
|
+ 6.15. db_flag (integer)
|
|
|
+ 6.16. db_missed_flag (integer)
|
|
|
+ 6.17. db_table_acc (string)
|
|
|
+ 6.18. db_table_missed_calls (string)
|
|
|
+ 6.19. db_url (string)
|
|
|
+ 6.20. acc_method_column (string)
|
|
|
+ 6.21. acc_from_tag_column (string)
|
|
|
+ 6.22. acc_to_tag_column (string)
|
|
|
+ 6.23. acc_callid_column (string)
|
|
|
+ 6.24. acc_sip_code_column (string)
|
|
|
+ 6.25. acc_sip_reason_column (string)
|
|
|
+ 6.26. acc_time_column (string)
|
|
|
+ 6.27. db_extra (string)
|
|
|
+ 6.28. db_insert_mode (integer)
|
|
|
+ 6.29. diameter_flag (integer)
|
|
|
+ 6.30. diameter_missed_flag (integer)
|
|
|
+ 6.31. diameter_client_host (string)
|
|
|
+ 6.32. diameter_client_port (int)
|
|
|
+ 6.33. diameter_extra (string)
|
|
|
+ 6.34. cdr_enable (integer)
|
|
|
+ 6.35. cdr_expired_dlg_enable (integer)
|
|
|
+ 6.36. cdr_start_on_confirmed (integer)
|
|
|
+ 6.37. cdr_facility (integer)
|
|
|
+ 6.38. cdr_extra (string)
|
|
|
+ 6.39. cdr_extra_nullable (integer)
|
|
|
+ 6.40. cdr_start_id (string)
|
|
|
+ 6.41. cdr_end_id (string)
|
|
|
+ 6.42. cdr_duration_id (string)
|
|
|
+ 6.43. cdr_log_enable (int)
|
|
|
+ 6.44. cdrs_table (str)
|
|
|
+ 6.45. time_mode (int)
|
|
|
+ 6.46. time_attr (str)
|
|
|
+ 6.47. time_exten (str)
|
|
|
+ 6.48. time_format (str)
|
|
|
+ 6.49. reason_from_hf (int)
|
|
|
+ 6.50. clone_msg (int)
|
|
|
+ 6.51. cdr_on_failed (int)
|
|
|
+
|
|
|
+ 7. Functions
|
|
|
+
|
|
|
+ 7.1. acc_log_request(comment)
|
|
|
+ 7.2. acc_db_request(comment, table)
|
|
|
+ 7.3. acc_request(comment, table)
|
|
|
+ 7.4. acc_diam_request(comment)
|
|
|
+
|
|
|
+ 2. Frequently Asked Questions
|
|
|
+
|
|
|
+ List of Examples
|
|
|
+
|
|
|
+ 1.1. early_media example
|
|
|
+ 1.2. failed_transaction_flag example
|
|
|
+ 1.3. failed_filter example
|
|
|
+ 1.4. report_ack example
|
|
|
+ 1.5. report_cancels example
|
|
|
+ 1.6. detect_direction example
|
|
|
+ 1.7. acc_prepare_flag example
|
|
|
+ 1.8. acc_prepare_flag example
|
|
|
+ 1.9. multi_leg_info example
|
|
|
+ 1.10. log_flag example
|
|
|
+ 1.11. log_missed_flag example
|
|
|
+ 1.12. log_level example
|
|
|
+ 1.13. log_facility example
|
|
|
+ 1.14. log_extra example
|
|
|
+ 1.15. db_flag example
|
|
|
+ 1.16. db_missed_flag example
|
|
|
+ 1.17. db_table_acc example
|
|
|
+ 1.18. db_table_missed_calls example
|
|
|
+ 1.19. db_url example
|
|
|
+ 1.20. acc_method_column example
|
|
|
+ 1.21. acc_from_tag_column example
|
|
|
+ 1.22. acc_to_tag_column example
|
|
|
+ 1.23. acc_callid_column example
|
|
|
+ 1.24. acc_sip_code_column example
|
|
|
+ 1.25. acc_sip_reason_column example
|
|
|
+ 1.26. acc_time_column example
|
|
|
+ 1.27. db_extra example
|
|
|
+ 1.28. db_insert_mode example
|
|
|
+ 1.29. diameter_flag example
|
|
|
+ 1.30. diameter_missed_flag example
|
|
|
+ 1.31. diameter_client_host example
|
|
|
+ 1.32. diameter_client_host example
|
|
|
+ 1.33. diameter_extra example
|
|
|
+ 1.34. cdr_enable example
|
|
|
+ 1.35. cdr_expired_dlg_enable example
|
|
|
+ 1.36. cdr_start_on_confirmed example
|
|
|
+ 1.37. cdr_facility example
|
|
|
+ 1.38. cdr_extra example
|
|
|
+ 1.39. cdr_extra_nullable example
|
|
|
+ 1.40. cdr_start_id example
|
|
|
+ 1.41. cdr_end_id example
|
|
|
+ 1.42. cdr_duration_id example
|
|
|
+ 1.43. cdr_log_enable example
|
|
|
+ 1.44. cdrs_table example
|
|
|
+ 1.45. time_mode example
|
|
|
+ 1.46. time_attr example
|
|
|
+ 1.47. time_exten example
|
|
|
+ 1.48. time_format example
|
|
|
+ 1.49. reason_from_hf
|
|
|
+ 1.50. clone_msg
|
|
|
+ 1.51. cdr_on_failed
|
|
|
+ 1.52. acc_log_request usage
|
|
|
+ 1.53. acc_db_request usage
|
|
|
+ 1.54. acc_db_request usage
|
|
|
+ 1.55. acc_diam_request usage
|
|
|
+
|
|
|
+Chapter 1. Admin Guide
|
|
|
+
|
|
|
+ Table of Contents
|
|
|
+
|
|
|
+ 1. Overview
|
|
|
+
|
|
|
+ 1.1. General Example
|
|
|
+
|
|
|
+ 2. Extra accounting
|
|
|
+
|
|
|
+ 2.1. Overview
|
|
|
+ 2.2. Definitions and syntax
|
|
|
+ 2.3. How it works
|
|
|
+
|
|
|
+ 3. Multi Call-Legs accounting
|
|
|
+
|
|
|
+ 3.1. Overview
|
|
|
+ 3.2. Configuration
|
|
|
+ 3.3. Logged data
|
|
|
+
|
|
|
+ 4. Call Data Record generation
|
|
|
+
|
|
|
+ 4.1. Overview
|
|
|
+ 4.2. CDR Extra
|
|
|
+
|
|
|
+ 4.2.1. Definitions and syntax
|
|
|
+
|
|
|
+ 4.3. CDR with Multi Call-Legs
|
|
|
+
|
|
|
+ 4.3.1. Overview
|
|
|
+ 4.3.2. Configuration
|
|
|
+
|
|
|
+ 4.3.2.1. Example for a spiraled Proxy
|
|
|
+
|
|
|
+ 4.3.3. Logged data
|
|
|
+
|
|
|
+ 5. Dependencies
|
|
|
+
|
|
|
+ 5.1. Kamailio Modules
|
|
|
+ 5.2. External Libraries or Applications
|
|
|
+
|
|
|
+ 6. Parameters
|
|
|
+
|
|
|
+ 6.1. early_media (integer)
|
|
|
+ 6.2. failed_transaction_flag (integer)
|
|
|
+ 6.3. failed_filter (string)
|
|
|
+ 6.4. report_ack (integer)
|
|
|
+ 6.5. report_cancels (integer)
|
|
|
+ 6.6. detect_direction (integer)
|
|
|
+ 6.7. acc_prepare_flag (integer)
|
|
|
+ 6.8. acc_prepare_always (integer)
|
|
|
+ 6.9. multi_leg_info (string)
|
|
|
+ 6.10. log_flag (integer)
|
|
|
+ 6.11. log_missed_flag (integer)
|
|
|
+ 6.12. log_level (integer)
|
|
|
+ 6.13. log_facility (string)
|
|
|
+ 6.14. log_extra (string)
|
|
|
+ 6.15. db_flag (integer)
|
|
|
+ 6.16. db_missed_flag (integer)
|
|
|
+ 6.17. db_table_acc (string)
|
|
|
+ 6.18. db_table_missed_calls (string)
|
|
|
+ 6.19. db_url (string)
|
|
|
+ 6.20. acc_method_column (string)
|
|
|
+ 6.21. acc_from_tag_column (string)
|
|
|
+ 6.22. acc_to_tag_column (string)
|
|
|
+ 6.23. acc_callid_column (string)
|
|
|
+ 6.24. acc_sip_code_column (string)
|
|
|
+ 6.25. acc_sip_reason_column (string)
|
|
|
+ 6.26. acc_time_column (string)
|
|
|
+ 6.27. db_extra (string)
|
|
|
+ 6.28. db_insert_mode (integer)
|
|
|
+ 6.29. diameter_flag (integer)
|
|
|
+ 6.30. diameter_missed_flag (integer)
|
|
|
+ 6.31. diameter_client_host (string)
|
|
|
+ 6.32. diameter_client_port (int)
|
|
|
+ 6.33. diameter_extra (string)
|
|
|
+ 6.34. cdr_enable (integer)
|
|
|
+ 6.35. cdr_expired_dlg_enable (integer)
|
|
|
+ 6.36. cdr_start_on_confirmed (integer)
|
|
|
+ 6.37. cdr_facility (integer)
|
|
|
+ 6.38. cdr_extra (string)
|
|
|
+ 6.39. cdr_extra_nullable (integer)
|
|
|
+ 6.40. cdr_start_id (string)
|
|
|
+ 6.41. cdr_end_id (string)
|
|
|
+ 6.42. cdr_duration_id (string)
|
|
|
+ 6.43. cdr_log_enable (int)
|
|
|
+ 6.44. cdrs_table (str)
|
|
|
+ 6.45. time_mode (int)
|
|
|
+ 6.46. time_attr (str)
|
|
|
+ 6.47. time_exten (str)
|
|
|
+ 6.48. time_format (str)
|
|
|
+ 6.49. reason_from_hf (int)
|
|
|
+ 6.50. clone_msg (int)
|
|
|
+ 6.51. cdr_on_failed (int)
|
|
|
+
|
|
|
+ 7. Functions
|
|
|
+
|
|
|
+ 7.1. acc_log_request(comment)
|
|
|
+ 7.2. acc_db_request(comment, table)
|
|
|
+ 7.3. acc_request(comment, table)
|
|
|
+ 7.4. acc_diam_request(comment)
|
|
|
+
|
|
|
+1. Overview
|
|
|
+
|
|
|
+ 1.1. General Example
|
|
|
+
|
|
|
+ ACC module is used to account transactions information to different
|
|
|
+ backends like syslog and SQL. With the separate module, radius support
|
|
|
+ is enabled.
|
|
|
+
|
|
|
+ There is some very early support of the Diameter protocol in the code
|
|
|
+ which is no longer included by default and will be deleted in coming
|
|
|
+ releases. This support is not up to date with the current Diameter
|
|
|
+ protocols and is disabled. If you need Diameter support, please use the
|
|
|
+ ims_charging module.
|
|
|
+
|
|
|
+ To account a transaction and to choose which set of backends to be
|
|
|
+ used, the script writer just has to set some flags (see the module
|
|
|
+ parameters section for flag definitions Section 6, “Parameters”). If
|
|
|
+ the accounting flag for a specific backend is set, the acc module will
|
|
|
+ then report on completed transaction. A typical usage of the module
|
|
|
+ takes no acc-specific script command -- the functionality binds
|
|
|
+ invisibly through transaction processing. Script writers just need to
|
|
|
+ mark the transaction for accounting with proper setflag. Even so, the
|
|
|
+ module allows the script writter to force accounting in special cases
|
|
|
+ via some script functions.
|
|
|
+
|
|
|
+ The accounting module will log by default a fixed set of attributes for
|
|
|
+ the transaction - if you customize your accounting by adding more
|
|
|
+ information to be logged, please see the next chapter about extra
|
|
|
+ accounting - Section 2, “Extra accounting”.
|
|
|
+
|
|
|
+ The fixed minimal accounting information is:
|
|
|
+ * Request Method name
|
|
|
+ * From header TAG parameter
|
|
|
+ * To header TAG parameter
|
|
|
+ * Call-Id
|
|
|
+ * 3-digit Status code from final reply
|
|
|
+ * Reason phrase from final reply
|
|
|
+ * Time stamp when transaction was completed
|
|
|
+
|
|
|
+ If a value is not present in request, the empty string is accounted
|
|
|
+ instead.
|
|
|
+
|
|
|
+ Note that:
|
|
|
+ * A single INVITE may produce multiple accounting reports -- that's
|
|
|
+ due to SIP forking feature.
|
|
|
+ * All flags related to accounting need to be set in request
|
|
|
+ processing route - only the "missed-call" flag may be toggled from
|
|
|
+ other types of routes.
|
|
|
+ * If a UA fails in middle of conversation, a proxy will never find
|
|
|
+ out about it. In general, a better practice is to account from an
|
|
|
+ end-device (such as PSTN gateway), which best knows about call
|
|
|
+ status (including media status and PSTN status in case of the
|
|
|
+ gateway). However, CDR-base logging has the option to log existing
|
|
|
+ information from expired dialogs (the dlg_vars in cdr_extra) Please
|
|
|
+ see cdr_expired_dlg_enable parameter - Section 6.35,
|
|
|
+ “cdr_expired_dlg_enable (integer)”.
|
|
|
+
|
|
|
+ The SQL backend support is compiled in the module. For DIAMETER you
|
|
|
+ need to enable it by recompiling the module with properly set defines:
|
|
|
+ uncomment the DDIAM_ACC lines in modules/acc/Makefile.
|
|
|
+
|
|
|
+ NOTE: diameter support was developed for DISC (DIameter Server Client
|
|
|
+ project at http://developer.berlios.de/projects/disc/). This project
|
|
|
+ seems to be no longer maintained and DIAMETER specifications were
|
|
|
+ updated in the meantime. Thus, the DIAMETER part in the module is
|
|
|
+ obsolete and needs rework to be usable with opendiameter or other
|
|
|
+ DIAMETER servers.
|
|
|
+
|
|
|
+1.1. General Example
|
|
|
+
|
|
|
+loadmodule "modules/acc/acc.so"
|
|
|
+modparam("acc", "log_level", 1)
|
|
|
+modparam("acc", "log_flag", 1)
|
|
|
+
|
|
|
+if (uri=~"sip:+40") /* calls to Romania */ {
|
|
|
+ if (!proxy_authorize("sip_domain.net" /* realm */,
|
|
|
+ "subscriber" /* table name */)) {
|
|
|
+ proxy_challenge("sip_domain.net" /* realm */, "0" /* no qop */ );
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (method=="INVITE" && !check_from()) {
|
|
|
+ log("from!=digest\n");
|
|
|
+ sl_send_reply("403","Forbidden");
|
|
|
+ }
|
|
|
+
|
|
|
+ setflag(1); /* set for accounting (the same value as in log_flag!)
|
|
|
+ t_relay(); /* enter stateful mode now */
|
|
|
+};
|
|
|
+
|
|
|
+2. Extra accounting
|
|
|
+
|
|
|
+ 2.1. Overview
|
|
|
+ 2.2. Definitions and syntax
|
|
|
+ 2.3. How it works
|
|
|
+
|
|
|
+2.1. Overview
|
|
|
+
|
|
|
+ Along the static default information, ACC modules allows dynamical
|
|
|
+ selection of extra information to be logged. This allows you to log any
|
|
|
+ pseudo-variable (AVPs, parts of the request, etc).
|
|
|
+
|
|
|
+2.2. Definitions and syntax
|
|
|
+
|
|
|
+ Selection of extra information is done via xxx_extra parameters by
|
|
|
+ specifying the names of additional information you want to log. This
|
|
|
+ information is defined via pseudo-variables and may include headers,
|
|
|
+ AVPs values or other message or system values. The syntax of the
|
|
|
+ parameter is:
|
|
|
+ * xxx_extra = extra_definition (';'extra_definition)*
|
|
|
+ * extra_definition = log_name '=' pseudo_variable
|
|
|
+
|
|
|
+ The full list of supported pseudo-variables in Kamailio is available
|
|
|
+ at: http://www.kamailio.org/wiki/cookbooks/devel/pseudovariables
|
|
|
+
|
|
|
+ Note: For all the ACK processed by tm, the registered callbacks (like
|
|
|
+ acc module) will be called with the corresponding INVITE transaction
|
|
|
+ contexts as long as this is still available. This means that the ACK
|
|
|
+ callbacks will see the AVPs setup for the INVITE transaction and not
|
|
|
+ the AVPs setup before t_relay().
|
|
|
+
|
|
|
+ Via log_name you define how/where the data will be logged. Its meaning
|
|
|
+ depends of the accounting support which is used:
|
|
|
+ * LOG accounting - log_name will be just printed along with the data
|
|
|
+ in log_name=data format;
|
|
|
+ * DB accounting - log_name will be the name of the DB column where
|
|
|
+ the data will be stored.IMPORTANT: add in db acc table the columns
|
|
|
+ corresponding to each extra data;
|
|
|
+ * RADIUS accounting - log_name will be the AVP name used for packing
|
|
|
+ the data into RADIUS message. The log_name will be translated to
|
|
|
+ AVP number via the dictionary. IMPORTANT: add in RADIUS dictionary
|
|
|
+ the log_name attribute.
|
|
|
+ * DIAMETER accounting - log_name will be the AVP code used for
|
|
|
+ packing the data into DIAMETER message. The AVP code is given
|
|
|
+ directly as integer, since DIAMETER has no dictionary support yet.
|
|
|
+ IMPORTANT: log_name must be a number.
|
|
|
+
|
|
|
+2.3. How it works
|
|
|
+
|
|
|
+ Some pseudo variables may return more than one value (like headers or
|
|
|
+ AVPs). In this case, the returned values are embedded in a single
|
|
|
+ string in a comma-separated format.
|
|
|
+
|
|
|
+3. Multi Call-Legs accounting
|
|
|
+
|
|
|
+ 3.1. Overview
|
|
|
+ 3.2. Configuration
|
|
|
+ 3.3. Logged data
|
|
|
+
|
|
|
+3.1. Overview
|
|
|
+
|
|
|
+ A SIP call can have multiple legs due forwarding actions. For example
|
|
|
+ user A calls user B which forwards the call to user C. There is only
|
|
|
+ one SIP call but with 2 legs ( A to B and B to C). Accounting the legs
|
|
|
+ of a call is required for proper billing of the calls (if C is a PSTN
|
|
|
+ number and the call is billed, user B must pay for the call - as last
|
|
|
+ party modifing the call destination-, and not A - as initiator of the
|
|
|
+ call. Call forwarding on server is only one example which shows the
|
|
|
+ necessity of the having an accounting engine with multiple legs
|
|
|
+ support.
|
|
|
+
|
|
|
+3.2. Configuration
|
|
|
+
|
|
|
+ First how it works: The idea is to have a set of AVPs and for each call
|
|
|
+ leg to store a set of values in the AVPs. The meaning of the AVP
|
|
|
+ content is stricly decided by the script writer - it can be the origin
|
|
|
+ and source of the leg, its status or any other related information. If
|
|
|
+ you have a set of 4 AVPS (AVP1, AVP2, AVP3, AVP4), then for the "A call
|
|
|
+ B and B forwards to C" example, you need to set a different set of
|
|
|
+ values for the AVPs for each leg ([A,B] and [B,C]) . The script writer
|
|
|
+ must take care and properly insert all these AVP from the script (in
|
|
|
+ proper order and with the correct type).
|
|
|
+
|
|
|
+ When the accounting information for the call will be written/sent, all
|
|
|
+ the call-leg pairs will be added (based on the found AVP sets).
|
|
|
+
|
|
|
+ By default, the multiple call-leg support is disabled - it can be
|
|
|
+ enabled just be setting the per-leg set of AVPs via the multi_leg_info
|
|
|
+ module parameter.
|
|
|
+
|
|
|
+3.3. Logged data
|
|
|
+
|
|
|
+ For each call, all the values of the AVP set (which defines a call-leg)
|
|
|
+ will be logged. How the information will be actually logged, depends of
|
|
|
+ the data backend:
|
|
|
+ * syslog -- all leg-sets will be added to one record string as
|
|
|
+ AVP1=xxx, AVP2=xxxx ,... sets.
|
|
|
+ * database -- each pair will be separately logged (due DB data
|
|
|
+ structure constraints); several records will be written, the
|
|
|
+ difference between them being only the fields corresponding to the
|
|
|
+ call-leg info.
|
|
|
+
|
|
|
+Note
|
|
|
+ You will need to add in your DB (all acc related tables) the colums
|
|
|
+ for call-leg info (a column for each AVP of the set).
|
|
|
+ * Radius -- all sets will be added to the same Radius accounting
|
|
|
+ message as RADIUS AVPs - for each call-leg a set of RADIUS AVPs
|
|
|
+ will be added (corresponding to the per-leg AVP set). Note that
|
|
|
+ Radius support is in a separate module - acc_radius.
|
|
|
+
|
|
|
+Note
|
|
|
+ You will need to add in your dictionary the RADIUS AVPs used in
|
|
|
+ call-leg AVP set definition.
|
|
|
+
|
|
|
+4. Call Data Record generation
|
|
|
+
|
|
|
+ 4.1. Overview
|
|
|
+ 4.2. CDR Extra
|
|
|
+
|
|
|
+ 4.2.1. Definitions and syntax
|
|
|
+
|
|
|
+ 4.3. CDR with Multi Call-Legs
|
|
|
+
|
|
|
+ 4.3.1. Overview
|
|
|
+ 4.3.2. Configuration
|
|
|
+
|
|
|
+ 4.3.2.1. Example for a spiraled Proxy
|
|
|
+
|
|
|
+ 4.3.3. Logged data
|
|
|
+
|
|
|
+4.1. Overview
|
|
|
+
|
|
|
+ In addition to transaction-based logging, it is possible to generate
|
|
|
+ and log Call Data Records (CDRs) directly from Kamailio. Apart from a
|
|
|
+ basic set of CDR fields which are always included (covering start time,
|
|
|
+ end time, and duration), the approach allows flexible specification of
|
|
|
+ additional fields that should be taken into account using the
|
|
|
+ configuration script. This is very similar to how transaction-based
|
|
|
+ logging may be customized with the exception that CDRs rely on dialogs
|
|
|
+ instead of transactions to store relevant information during a call.
|
|
|
+
|
|
|
+ In order to set up CDR generation, you must enable the CDR switch and
|
|
|
+ load the dialog module. You probably also want to specify a set of
|
|
|
+ pseudo-variables that define more relevant CDR fields. Pseudo-variables
|
|
|
+ may be assigned arbitrarily during script execution, and the module
|
|
|
+ will make sure that the variable content will be transformed into a CDR
|
|
|
+ by the end of the dialog.
|
|
|
+
|
|
|
+ To use CDR logging in a correct manner, you should only use the
|
|
|
+ dialog-based pseudo-variables (dlg_var) from the dialog module. This
|
|
|
+ allows you to save values right from the beginning through all requests
|
|
|
+ and replies until termination of the call. While not recommended, it is
|
|
|
+ still possible to use other pseudo-variables as well. Except for
|
|
|
+ pseudo-variables valid in the call-final transaction, however,
|
|
|
+ information given will not be stored in the CDR as they cannot be
|
|
|
+ accessed by the end of the call when the CDR is logged.
|
|
|
+
|
|
|
+ Sometimes, dialogs expire because the UA has a problem and a final
|
|
|
+ message is never transmitted. You can toggle on/off the generation of
|
|
|
+ CDR-based logging in such cases with only the dlg_vars showing by using
|
|
|
+ the cdr_expired_dlg_enable parameter - Section 6.35,
|
|
|
+ “cdr_expired_dlg_enable (integer)”. Default behavior is not logging.
|
|
|
+
|
|
|
+4.2. CDR Extra
|
|
|
+
|
|
|
+ This section is similar to the “LOG accounting” part of Section 2,
|
|
|
+ “Extra accounting”.
|
|
|
+
|
|
|
+4.2.1. Definitions and syntax
|
|
|
+
|
|
|
+ Selection of extra information is done similar to the transaction extra
|
|
|
+ Section 2.2, “Definitions and syntax”.
|
|
|
+ * cdr_extra = cdr_extra_definition (';'cdr_extra_definition)*
|
|
|
+ * cdr_extra_definition = cdr_log_name '=' pseudo_variable
|
|
|
+
|
|
|
+ See also Section 6.38, “cdr_extra (string)”.
|
|
|
+
|
|
|
+ The full list of supported pseudo-variables in Sip-Router is available
|
|
|
+ at: http://sip-router.org/wiki/cookbooks/pseudo-variables/devel
|
|
|
+
|
|
|
+4.3. CDR with Multi Call-Legs
|
|
|
+
|
|
|
+4.3.1. Overview
|
|
|
+
|
|
|
+ As mentioned in Section 3, “Multi Call-Legs accounting”, a leg
|
|
|
+ represents a parallel or forwarded call. In contrast to the normal
|
|
|
+ accounting the cdr logging uses dialogs instead of transaction to log
|
|
|
+ data. This may reduce the amount of information but it also make it
|
|
|
+ possible to combine all important data in one cdr at once. A second
|
|
|
+ mechanism to process multiple data-sets into one cdr is not further
|
|
|
+ necessary.
|
|
|
+
|
|
|
+4.3.2. Configuration
|
|
|
+
|
|
|
+ When you route messages multiple times through your proxy (e.g. to
|
|
|
+ handle “call-forwardings”) you have to use detect_spirals from the
|
|
|
+ dialog modules. Otherwise the proxy can't identify and reuse existing
|
|
|
+ dialogs.
|
|
|
+
|
|
|
+ To get the correct call-forwarding-chain you have to store each cf*
|
|
|
+ with the corresponding caller and callee in a dialog based
|
|
|
+ pseudo-variable (dlg_var) (e.g. chain=B;cfa;C|C;cfnr;D). Additionally
|
|
|
+ it is necessary to store the caller and callee for each leg. All this
|
|
|
+ helps to identify the involved phone parners and forwarding chain. When
|
|
|
+ you route such calls multiple times to the same Proxy, you could store
|
|
|
+ the caller and callee within an transaction based avp and write it into
|
|
|
+ the dialog based dlg_var pv during a 200 INVITE.
|
|
|
+
|
|
|
+4.3.2.1. Example for a spiraled Proxy
|
|
|
+
|
|
|
+...
|
|
|
+# A calls B (transaction 1)
|
|
|
+$avp(caller)='A'
|
|
|
+$avp(callee)='B';
|
|
|
+$dlg_var(chain)='';
|
|
|
+
|
|
|
+# B cfa C (transaction 2)
|
|
|
+$avp(caller)='B'
|
|
|
+$avp(callee)='C';
|
|
|
+$dlg_var(chain)='B;cfu;C';
|
|
|
+
|
|
|
+# C cfnr D (transaction 3)
|
|
|
+$avp(caller)='C'
|
|
|
+$avp(callee)='D';
|
|
|
+$dlg_var(chain)=$dlg_var(chain) + "|" + "C;cfnr;D";
|
|
|
+
|
|
|
+# C confirms call (200 reply of transaction 2)
|
|
|
+$dlg_var(caller) = $avp(caller); #caller='B'
|
|
|
+$dlg_var(callee) = $avp(callee); #callee='C'
|
|
|
+...
|
|
|
+
|
|
|
+4.3.3. Logged data
|
|
|
+
|
|
|
+ For each call, all dialog corresponding variables will be logged. After
|
|
|
+ a call is finished, the generated call data record information will be
|
|
|
+ logged as string (VAR1=xxx,VAR2=xxxx,...) to the syslog.
|
|
|
+
|
|
|
+5. Dependencies
|
|
|
+
|
|
|
+ 5.1. Kamailio Modules
|
|
|
+ 5.2. External Libraries or Applications
|
|
|
+
|
|
|
+5.1. Kamailio Modules
|
|
|
+
|
|
|
+ The module depends on the following modules (in the other words the
|
|
|
+ listed modules must be loaded before this module):
|
|
|
+ * tm -- Transaction Manager
|
|
|
+ * a database module -- If SQL support is used.
|
|
|
+ * rr -- Record Route, if “detect_direction” module parameter is
|
|
|
+ enabled.
|
|
|
+ * dialog -- Dialog, if “cdr_enable” module parameter is enabled.
|
|
|
+
|
|
|
+5.2. External Libraries or Applications
|
|
|
+
|
|
|
+ The following libraries or applications must be installed before
|
|
|
+ running Kamailio with this module loaded:
|
|
|
+ * None
|
|
|
+
|
|
|
+6. Parameters
|
|
|
+
|
|
|
+ 6.1. early_media (integer)
|
|
|
+ 6.2. failed_transaction_flag (integer)
|
|
|
+ 6.3. failed_filter (string)
|
|
|
+ 6.4. report_ack (integer)
|
|
|
+ 6.5. report_cancels (integer)
|
|
|
+ 6.6. detect_direction (integer)
|
|
|
+ 6.7. acc_prepare_flag (integer)
|
|
|
+ 6.8. acc_prepare_always (integer)
|
|
|
+ 6.9. multi_leg_info (string)
|
|
|
+ 6.10. log_flag (integer)
|
|
|
+ 6.11. log_missed_flag (integer)
|
|
|
+ 6.12. log_level (integer)
|
|
|
+ 6.13. log_facility (string)
|
|
|
+ 6.14. log_extra (string)
|
|
|
+ 6.15. db_flag (integer)
|
|
|
+ 6.16. db_missed_flag (integer)
|
|
|
+ 6.17. db_table_acc (string)
|
|
|
+ 6.18. db_table_missed_calls (string)
|
|
|
+ 6.19. db_url (string)
|
|
|
+ 6.20. acc_method_column (string)
|
|
|
+ 6.21. acc_from_tag_column (string)
|
|
|
+ 6.22. acc_to_tag_column (string)
|
|
|
+ 6.23. acc_callid_column (string)
|
|
|
+ 6.24. acc_sip_code_column (string)
|
|
|
+ 6.25. acc_sip_reason_column (string)
|
|
|
+ 6.26. acc_time_column (string)
|
|
|
+ 6.27. db_extra (string)
|
|
|
+ 6.28. db_insert_mode (integer)
|
|
|
+ 6.29. diameter_flag (integer)
|
|
|
+ 6.30. diameter_missed_flag (integer)
|
|
|
+ 6.31. diameter_client_host (string)
|
|
|
+ 6.32. diameter_client_port (int)
|
|
|
+ 6.33. diameter_extra (string)
|
|
|
+ 6.34. cdr_enable (integer)
|
|
|
+ 6.35. cdr_expired_dlg_enable (integer)
|
|
|
+ 6.36. cdr_start_on_confirmed (integer)
|
|
|
+ 6.37. cdr_facility (integer)
|
|
|
+ 6.38. cdr_extra (string)
|
|
|
+ 6.39. cdr_extra_nullable (integer)
|
|
|
+ 6.40. cdr_start_id (string)
|
|
|
+ 6.41. cdr_end_id (string)
|
|
|
+ 6.42. cdr_duration_id (string)
|
|
|
+ 6.43. cdr_log_enable (int)
|
|
|
+ 6.44. cdrs_table (str)
|
|
|
+ 6.45. time_mode (int)
|
|
|
+ 6.46. time_attr (str)
|
|
|
+ 6.47. time_exten (str)
|
|
|
+ 6.48. time_format (str)
|
|
|
+ 6.49. reason_from_hf (int)
|
|
|
+ 6.50. clone_msg (int)
|
|
|
+ 6.51. cdr_on_failed (int)
|
|
|
+
|
|
|
+6.1. early_media (integer)
|
|
|
+
|
|
|
+ Should be early media (any provisional reply with body) accounted too ?
|
|
|
+
|
|
|
+ Default value is 0 (no).
|
|
|
+
|
|
|
+ Example 1.1. early_media example
|
|
|
+...
|
|
|
+modparam("acc", "early_media", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.2. failed_transaction_flag (integer)
|
|
|
+
|
|
|
+ Per transaction flag which says if the transaction should be accounted
|
|
|
+ also in case of failure (status>=300).
|
|
|
+
|
|
|
+ Default value is not-set (no flag).
|
|
|
+
|
|
|
+ Example 1.2. failed_transaction_flag example
|
|
|
+...
|
|
|
+modparam("acc", "failed_transaction_flag", 4)
|
|
|
+...
|
|
|
+
|
|
|
+6.3. failed_filter (string)
|
|
|
+
|
|
|
+ A string of failure response codes from 300 to 999 separated by commas.
|
|
|
+ Failed transaction will not be accounted if its response code is in the
|
|
|
+ list even when failed_transaction_flag is set.
|
|
|
+
|
|
|
+ Default value is not-set (failure filtering is off).
|
|
|
+
|
|
|
+ Example 1.3. failed_filter example
|
|
|
+...
|
|
|
+modparam("acc", "failed_filter", "404,407")
|
|
|
+...
|
|
|
+
|
|
|
+6.4. report_ack (integer)
|
|
|
+
|
|
|
+ Shall acc attempt to account e2e ACKs too ? Note that this is really
|
|
|
+ only an attempt, as e2e ACKs may take a different path (unless RR
|
|
|
+ enabled) and mismatch original INVITE (e2e ACKs are a separate
|
|
|
+ transaction). The flag for accounting has to be set for each ACK as
|
|
|
+ well.
|
|
|
+
|
|
|
+ Default value is 0 (no).
|
|
|
+
|
|
|
+ Example 1.4. report_ack example
|
|
|
+...
|
|
|
+modparam("acc", "report_ack", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.5. report_cancels (integer)
|
|
|
+
|
|
|
+ By default, CANCEL reporting is disabled -- most accounting
|
|
|
+ applications wants to see INVITE's cancellation status. Turn on if you
|
|
|
+ explicitly want to account CANCEL transactions.
|
|
|
+
|
|
|
+ Default value is 0 (no).
|
|
|
+
|
|
|
+ Example 1.5. report_cancels example
|
|
|
+...
|
|
|
+modparam("acc", "report_cancels", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.6. detect_direction (integer)
|
|
|
+
|
|
|
+ Controlles the direction detection for sequential requests. If enabled
|
|
|
+ (non zero value), for sequential requests with upstream direction (from
|
|
|
+ callee to caller), the FROM and TO will be swapped (the direction will
|
|
|
+ be preserved as in the original request).
|
|
|
+
|
|
|
+ It affects all values related to TO and FROM headers (body, URI,
|
|
|
+ username, domain, TAG).
|
|
|
+
|
|
|
+ Default value is 0 (disabled).
|
|
|
+
|
|
|
+ Example 1.6. detect_direction example
|
|
|
+...
|
|
|
+modparam("acc", "detect_direction", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.7. acc_prepare_flag (integer)
|
|
|
+
|
|
|
+ Per transaction flag which says if the transaction may be accounted
|
|
|
+ later, with flags set in TM module specific routes (e.g., like
|
|
|
+ failure_route). If this flag is not set and acc or missed_call flag are
|
|
|
+ not set either in request route block, there is no way to mark the
|
|
|
+ request for transaction later unless you set acc_prepare_always. If
|
|
|
+ either acc or missed_call flags are set in request route block, there
|
|
|
+ is no need to set this flag.
|
|
|
+
|
|
|
+ Default value is not-set (no flag).
|
|
|
+
|
|
|
+ Example 1.7. acc_prepare_flag example
|
|
|
+...
|
|
|
+modparam("acc", "acc_prepare_flag", 5)
|
|
|
+...
|
|
|
+
|
|
|
+6.8. acc_prepare_always (integer)
|
|
|
+
|
|
|
+ Prepare all request even if acc_prepare_flag is not set to mark the
|
|
|
+ request for transaction later.
|
|
|
+
|
|
|
+ Default value is not-set (previous behaviour).
|
|
|
+
|
|
|
+ Example 1.8. acc_prepare_flag example
|
|
|
+...
|
|
|
+modparam("acc", "acc_prepare_always", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.9. multi_leg_info (string)
|
|
|
+
|
|
|
+ Defines the AVP set to be used in per-call-leg accounting. See
|
|
|
+ Section 3, “Multi Call-Legs accounting” for a detailed description of
|
|
|
+ the Multi Call-Legs accounting.
|
|
|
+
|
|
|
+ If empty, the multi-leg accounting support will be disabled.
|
|
|
+
|
|
|
+ Default value is 0 (disabled).
|
|
|
+
|
|
|
+ Example 1.9. multi_leg_info example
|
|
|
+...
|
|
|
+# for syslog-based accounting, use any text you want to be printed
|
|
|
+modparam("acc", "multi_leg_info",
|
|
|
+ "text1=$avp(src);text2=$avp(dst)")
|
|
|
+# for mysql-based accounting, use the names of the columns
|
|
|
+modparam("acc", "multi_leg_info",
|
|
|
+ "leg_src=$avp(src);leg_dst=$avp(dst)")
|
|
|
+# for DIAMETER-based accounting, use the DIAMETER AVP ID (as integer)
|
|
|
+modparam("acc", "multi_leg_info",
|
|
|
+ "2345=$avp(src);2346=$avp(dst)")
|
|
|
+...
|
|
|
+
|
|
|
+6.10. log_flag (integer)
|
|
|
+
|
|
|
+ Request flag which needs to be set to account a transaction via syslog.
|
|
|
+
|
|
|
+ Default value is not-set (no flag).
|
|
|
+
|
|
|
+ Example 1.10. log_flag example
|
|
|
+...
|
|
|
+modparam("acc", "log_flag", 2)
|
|
|
+...
|
|
|
+
|
|
|
+6.11. log_missed_flag (integer)
|
|
|
+
|
|
|
+ Request flag which needs to be set to account missed calls via syslog.
|
|
|
+
|
|
|
+ Default value is not-set (no flag).
|
|
|
+
|
|
|
+ Example 1.11. log_missed_flag example
|
|
|
+...
|
|
|
+modparam("acc", "log_missed_flag", 3)
|
|
|
+...
|
|
|
+
|
|
|
+6.12. log_level (integer)
|
|
|
+
|
|
|
+ Log level at which accounting messages are issued to syslog.
|
|
|
+
|
|
|
+ Default value is 1 (L_NOTICE).
|
|
|
+
|
|
|
+ Example 1.12. log_level example
|
|
|
+...
|
|
|
+modparam("acc", "log_level", 2) # Set log_level to 2 (L_INFO)
|
|
|
+...
|
|
|
+
|
|
|
+6.13. log_facility (string)
|
|
|
+
|
|
|
+ Log facility to which accounting messages are issued to syslog. This
|
|
|
+ allows to easily seperate the accounting specific logging from the
|
|
|
+ other log messages.
|
|
|
+
|
|
|
+ Default value is LOG_DAEMON.
|
|
|
+
|
|
|
+ Example 1.13. log_facility example
|
|
|
+...
|
|
|
+modparam("acc", "log_facility", "LOG_DAEMON")
|
|
|
+...
|
|
|
+
|
|
|
+6.14. log_extra (string)
|
|
|
+
|
|
|
+ Extra values to be logged. See section Section 2, “Extra accounting”
|
|
|
+ for more details.
|
|
|
+
|
|
|
+ Default value is NULL.
|
|
|
+
|
|
|
+ Example 1.14. log_extra example
|
|
|
+...
|
|
|
+modparam("acc", "log_extra", "ua=$hdr(User-Agent);uuid=$avp(i:123)")
|
|
|
+...
|
|
|
+
|
|
|
+6.15. db_flag (integer)
|
|
|
+
|
|
|
+ Request flag which needs to be set to account a transaction -- database
|
|
|
+ specific.
|
|
|
+
|
|
|
+ Default value is not-set (no flag).
|
|
|
+
|
|
|
+ Example 1.15. db_flag example
|
|
|
+...
|
|
|
+modparam("acc", "db_flag", 2)
|
|
|
+...
|
|
|
+
|
|
|
+6.16. db_missed_flag (integer)
|
|
|
+
|
|
|
+ Request flag which needs to be set to account missed calls -- database
|
|
|
+ specific.
|
|
|
+
|
|
|
+ Default value is not-set (no flag).
|
|
|
+
|
|
|
+ Example 1.16. db_missed_flag example
|
|
|
+...
|
|
|
+modparam("acc", "db_missed_flag", 3)
|
|
|
+...
|
|
|
+
|
|
|
+6.17. db_table_acc (string)
|
|
|
+
|
|
|
+ Table name of accounting successfull calls -- database specific. It can
|
|
|
+ contain config variables that will be evaluated at runtime.
|
|
|
+
|
|
|
+ Default value is “acc”
|
|
|
+
|
|
|
+ Example 1.17. db_table_acc example
|
|
|
+...
|
|
|
+modparam("acc", "db_table_acc", "myacc_table")
|
|
|
+modparam("acc", "db_table_acc", "acc_$time(year)_$time(mon)")
|
|
|
+...
|
|
|
+
|
|
|
+6.18. db_table_missed_calls (string)
|
|
|
+
|
|
|
+ Table name for accounting missed calls -- database specific. It can
|
|
|
+ contain config variables that will be evaluated at runtime.
|
|
|
+
|
|
|
+ Default value is “missed_calls”
|
|
|
+
|
|
|
+ Example 1.18. db_table_missed_calls example
|
|
|
+...
|
|
|
+modparam("acc", "db_table_missed_calls", "myMC_table")
|
|
|
+...
|
|
|
+
|
|
|
+6.19. db_url (string)
|
|
|
+
|
|
|
+ SQL address -- database specific. If is set to NULL or emty string, the
|
|
|
+ SQL support is disabled.
|
|
|
+
|
|
|
+ Default value is “NULL” (SQL disabled).
|
|
|
+
|
|
|
+ Example 1.19. db_url example
|
|
|
+...
|
|
|
+modparam("acc", "db_url", "mysql://user:password@localhost/kamailio")
|
|
|
+...
|
|
|
+
|
|
|
+6.20. acc_method_column (string)
|
|
|
+
|
|
|
+ Column name in accounting table to store the request's method name as
|
|
|
+ string.
|
|
|
+
|
|
|
+ Default value is “method”.
|
|
|
+
|
|
|
+ Example 1.20. acc_method_column example
|
|
|
+...
|
|
|
+modparam("acc", "acc_method_column", "method")
|
|
|
+...
|
|
|
+
|
|
|
+6.21. acc_from_tag_column (string)
|
|
|
+
|
|
|
+ Column name in accounting table to store the From header TAG parameter.
|
|
|
+
|
|
|
+ Default value is “from_tag”.
|
|
|
+
|
|
|
+ Example 1.21. acc_from_tag_column example
|
|
|
+...
|
|
|
+modparam("acc", "acc_from_tag_column", "from_tag")
|
|
|
+...
|
|
|
+
|
|
|
+6.22. acc_to_tag_column (string)
|
|
|
+
|
|
|
+ Column name in accounting table to store the To header TAG parameter.
|
|
|
+
|
|
|
+ Default value is “to_tag”.
|
|
|
+
|
|
|
+ Example 1.22. acc_to_tag_column example
|
|
|
+...
|
|
|
+modparam("acc", "acc_to_tag_column", "to_tag")
|
|
|
+...
|
|
|
+
|
|
|
+6.23. acc_callid_column (string)
|
|
|
+
|
|
|
+ Column name in accounting table to store the request's Callid value.
|
|
|
+
|
|
|
+ Default value is “callid”.
|
|
|
+
|
|
|
+ Example 1.23. acc_callid_column example
|
|
|
+...
|
|
|
+modparam("acc", "acc_callid_column", "callid")
|
|
|
+...
|
|
|
+
|
|
|
+6.24. acc_sip_code_column (string)
|
|
|
+
|
|
|
+ Column name in accounting table to store the final reply's numric code
|
|
|
+ value in string format.
|
|
|
+
|
|
|
+ Default value is “sip_code”.
|
|
|
+
|
|
|
+ Example 1.24. acc_sip_code_column example
|
|
|
+...
|
|
|
+modparam("acc", "acc_sip_code_column", "sip_code")
|
|
|
+...
|
|
|
+
|
|
|
+6.25. acc_sip_reason_column (string)
|
|
|
+
|
|
|
+ Column name in accounting table to store the final reply's reason
|
|
|
+ phrase value.
|
|
|
+
|
|
|
+ Default value is “sip_reason”.
|
|
|
+
|
|
|
+ Example 1.25. acc_sip_reason_column example
|
|
|
+...
|
|
|
+modparam("acc", "acc_sip_reason_column", "sip_reason")
|
|
|
+...
|
|
|
+
|
|
|
+6.26. acc_time_column (string)
|
|
|
+
|
|
|
+ Column name in accounting table to store the time stamp of the
|
|
|
+ transaction completion in date-time format.
|
|
|
+
|
|
|
+ Default value is “time”.
|
|
|
+
|
|
|
+ Example 1.26. acc_time_column example
|
|
|
+...
|
|
|
+modparam("acc", "acc_time_column", "time")
|
|
|
+...
|
|
|
+
|
|
|
+6.27. db_extra (string)
|
|
|
+
|
|
|
+ Extra values to be logged into database - DB specific. See section
|
|
|
+ Section 2, “Extra accounting” for more details.
|
|
|
+
|
|
|
+ Default value is NULL.
|
|
|
+
|
|
|
+ Example 1.27. db_extra example
|
|
|
+...
|
|
|
+modparam("acc", "db_extra", "ct=$hdr(Content-type); email=$avp(s:email)")
|
|
|
+...
|
|
|
+
|
|
|
+6.28. db_insert_mode (integer)
|
|
|
+
|
|
|
+ If set to 1, use INSERT DELAYED to add records to accounting tables
|
|
|
+ when the DB driver has support for it. If no INSERT DELAYED support is
|
|
|
+ offered by DB driver, then standard INSERT is used. Beware that MySQL
|
|
|
+ InnoDB engine doesn't support INSERT DELAYED, thus be sure the acc
|
|
|
+ tables are defined with different type (e.g., MyISAM).
|
|
|
+
|
|
|
+ If set to 2, async insert is used if the db driver module has support
|
|
|
+ for it and if async_workers core parameter value is greater than 0. If
|
|
|
+ not, then standard INSERT is used.
|
|
|
+
|
|
|
+ Default value is 0 (no INSERT DELAYED nor async insert).
|
|
|
+
|
|
|
+ Example 1.28. db_insert_mode example
|
|
|
+...
|
|
|
+modparam("acc", "db_insert_mode", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.29. diameter_flag (integer)
|
|
|
+
|
|
|
+ Request flag which needs to be set to account a transaction -- DIAMETER
|
|
|
+ specific.
|
|
|
+
|
|
|
+ Default value is not-set (no flag).
|
|
|
+
|
|
|
+ Example 1.29. diameter_flag example
|
|
|
+...
|
|
|
+modparam("acc", "diameter_flag", 2)
|
|
|
+...
|
|
|
+
|
|
|
+6.30. diameter_missed_flag (integer)
|
|
|
+
|
|
|
+ Request flag which needs to be set to account missed calls -- DIAMETER
|
|
|
+ specific.
|
|
|
+
|
|
|
+ Default value is not-set (no flag).
|
|
|
+
|
|
|
+ Example 1.30. diameter_missed_flag example
|
|
|
+...
|
|
|
+modparam("acc", "diameter_missed_flag", 3)
|
|
|
+...
|
|
|
+
|
|
|
+6.31. diameter_client_host (string)
|
|
|
+
|
|
|
+ Hostname of the machine where the DIAMETER Client is running --
|
|
|
+ DIAMETER specific.
|
|
|
+
|
|
|
+ Default value is “localhost”.
|
|
|
+
|
|
|
+ Example 1.31. diameter_client_host example
|
|
|
+...
|
|
|
+modparam("acc", "diameter_client_host", "3a_server.net")
|
|
|
+...
|
|
|
+
|
|
|
+6.32. diameter_client_port (int)
|
|
|
+
|
|
|
+ Port number where the Diameter Client is listening -- DIAMETER
|
|
|
+ specific.
|
|
|
+
|
|
|
+ Default value is 3000.
|
|
|
+
|
|
|
+ Example 1.32. diameter_client_host example
|
|
|
+...
|
|
|
+modparam("acc", "diameter_client_port", 3000)
|
|
|
+...
|
|
|
+
|
|
|
+6.33. diameter_extra (string)
|
|
|
+
|
|
|
+ Extra values to be logged via DIAMETER - DIAMETER specific. See section
|
|
|
+ Section 2, “Extra accounting” for more details.
|
|
|
+
|
|
|
+ Default value is NULL.
|
|
|
+
|
|
|
+ Example 1.33. diameter_extra example
|
|
|
+...
|
|
|
+modparam("acc", "diameter_extra", "7846=$hdr(Content-type);7847=$avp(s:email)")
|
|
|
+...
|
|
|
+
|
|
|
+6.34. cdr_enable (integer)
|
|
|
+
|
|
|
+ Should CDR-based logging be enabled?
|
|
|
+
|
|
|
+ 0 - off (default). 1 - on.
|
|
|
+
|
|
|
+ Example 1.34. cdr_enable example
|
|
|
+...
|
|
|
+modparam("acc", "cdr_enable", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.35. cdr_expired_dlg_enable (integer)
|
|
|
+
|
|
|
+ Should CDR-based logging be enabled in case of expired dialogs?
|
|
|
+
|
|
|
+ 0 - off (default). 1 - on.
|
|
|
+
|
|
|
+ Example 1.35. cdr_expired_dlg_enable example
|
|
|
+...
|
|
|
+modparam("acc", "cdr_expired_dlg_enable", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.36. cdr_start_on_confirmed (integer)
|
|
|
+
|
|
|
+ Should the start time be taken from the time when the dialog is
|
|
|
+ created, or when the dialog is confirmed?
|
|
|
+
|
|
|
+ 0 - use time of dialog creation (default). 1 - use time of dialog
|
|
|
+ confirmation.
|
|
|
+
|
|
|
+ Example 1.36. cdr_start_on_confirmed example
|
|
|
+...
|
|
|
+modparam("acc", "cdr_start_on_confirmed", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.37. cdr_facility (integer)
|
|
|
+
|
|
|
+ Log facility to which CDR messages are issued to syslog. This allows to
|
|
|
+ easily seperate CDR-specific logging from the other log messages.
|
|
|
+
|
|
|
+ Default value is LOG_DAEMON.
|
|
|
+
|
|
|
+ Example 1.37. cdr_facility example
|
|
|
+...
|
|
|
+modparam("acc", "cdr_facility", "LOG_DAEMON")
|
|
|
+...
|
|
|
+
|
|
|
+6.38. cdr_extra (string)
|
|
|
+
|
|
|
+ Set of pseudo-variables defining custom CDR fields. See Section 4.2,
|
|
|
+ “CDR Extra” for more details.
|
|
|
+
|
|
|
+ Default value is NULL.
|
|
|
+
|
|
|
+ Example 1.38. cdr_extra example
|
|
|
+...
|
|
|
+modparam("acc", "cdr_extra", "c1=$dlg_var(caller);c2=$dlg_var(callee)"
|
|
|
+...
|
|
|
+
|
|
|
+6.39. cdr_extra_nullable (integer)
|
|
|
+
|
|
|
+ Should custom CDR fields be saved as NULL?
|
|
|
+
|
|
|
+ If set to 0, custom CDR fields not defined in config operation (or set
|
|
|
+ to $null) will be saved as empty string. If set to 1, custom CDR fields
|
|
|
+ not defined in config operation (or set to $null) will be saved as
|
|
|
+ NULL.
|
|
|
+
|
|
|
+ Default value is 0.
|
|
|
+
|
|
|
+ Example 1.39. cdr_extra_nullable example
|
|
|
+...
|
|
|
+modparam("acc", "cdr_extra_nullable", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.40. cdr_start_id (string)
|
|
|
+
|
|
|
+ Modifying the id which is used to store the start time.
|
|
|
+
|
|
|
+ Default value is 'start_time'
|
|
|
+
|
|
|
+ Example 1.40. cdr_start_id example
|
|
|
+...
|
|
|
+modparam("acc", "cdr_start_id", "start")
|
|
|
+...
|
|
|
+
|
|
|
+6.41. cdr_end_id (string)
|
|
|
+
|
|
|
+ Modifying the id which is used to store the end time.
|
|
|
+
|
|
|
+ Default value is 'end_time'
|
|
|
+
|
|
|
+ Example 1.41. cdr_end_id example
|
|
|
+...
|
|
|
+modparam("acc", "cdr_end_id", "end")
|
|
|
+...
|
|
|
+
|
|
|
+6.42. cdr_duration_id (string)
|
|
|
+
|
|
|
+ Modify the id which is used to store the duration.
|
|
|
+
|
|
|
+ Default value is 'duration'
|
|
|
+
|
|
|
+ Example 1.42. cdr_duration_id example
|
|
|
+...
|
|
|
+modparam("acc", "cdr_duration_id", "d")
|
|
|
+...
|
|
|
+
|
|
|
+6.43. cdr_log_enable (int)
|
|
|
+
|
|
|
+ Control if CDR-based accounting should be written to syslog.
|
|
|
+
|
|
|
+ 0 - off. 1 - on (default).
|
|
|
+
|
|
|
+ Example 1.43. cdr_log_enable example
|
|
|
+...
|
|
|
+modparam("acc", "cdr_log_enable", 0)
|
|
|
+...
|
|
|
+
|
|
|
+6.44. cdrs_table (str)
|
|
|
+
|
|
|
+ Name of db table to store dialog-based CDRs.
|
|
|
+
|
|
|
+ Default value is "" (no db storage for dialog-based CDRs).
|
|
|
+
|
|
|
+ Example 1.44. cdrs_table example
|
|
|
+...
|
|
|
+modparam("acc", "cdrs_table", "acc_cdrs")
|
|
|
+...
|
|
|
+
|
|
|
+6.45. time_mode (int)
|
|
|
+
|
|
|
+ Store additional value related to the time of event.
|
|
|
+
|
|
|
+ Values can be:
|
|
|
+ * 0 - (default), save only unix timestamp for syslog and datetime for
|
|
|
+ database.
|
|
|
+ * 1 - save seconds in time_attr and microseconds in time_exten.
|
|
|
+ * 2 - save seconds.milliseconds in time_attr.
|
|
|
+ * 3 - save formatted time according to time_format parameter, using
|
|
|
+ the output of localtime(). Used for cdr entries too.
|
|
|
+ * 4 - save formatted time according to time_format parameter, using
|
|
|
+ the output of gmtime(). Used for cdr entries too.
|
|
|
+
|
|
|
+ Example 1.45. time_mode example
|
|
|
+...
|
|
|
+modparam("acc", "time_mode", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.46. time_attr (str)
|
|
|
+
|
|
|
+ Name of the syslog attribute or database column where to store
|
|
|
+ additional value related to the time of event.
|
|
|
+
|
|
|
+ For db accounting, the column has to be of different types, depending
|
|
|
+ on time_mode value. When time_mode is:
|
|
|
+ * 1 - time_attr column has to be int.
|
|
|
+ * 2 - time_attr column has to be double.
|
|
|
+ * 3 - time_attr column has to be varchar(128).
|
|
|
+ * 4 - time_attr column has to be varchar(128).
|
|
|
+
|
|
|
+ For time_mode=1, this attribute is not written in syslog, because time
|
|
|
+ value is already unix timestamp, but in db accounting time value is
|
|
|
+ datetime and requires a function to get the timestamp.
|
|
|
+
|
|
|
+ Example 1.46. time_attr example
|
|
|
+...
|
|
|
+modparam("acc", "time_attr", "seconds")
|
|
|
+...
|
|
|
+
|
|
|
+6.47. time_exten (str)
|
|
|
+
|
|
|
+ Name of the syslog attribute or database column where to store extended
|
|
|
+ value related to the time of event.
|
|
|
+
|
|
|
+ It is used now only for time_mode=1 and database column has to be int:
|
|
|
+
|
|
|
+ Example 1.47. time_exten example
|
|
|
+...
|
|
|
+modparam("acc", "time_exten", "microsecs")
|
|
|
+...
|
|
|
+
|
|
|
+6.48. time_format (str)
|
|
|
+
|
|
|
+ Specify the format to print the time for time_mode 3 or 4.
|
|
|
+
|
|
|
+ Default value is %Y-%m-%d %H:%M:%S".
|
|
|
+
|
|
|
+ Example 1.48. time_format example
|
|
|
+...
|
|
|
+modparam("acc", "time_format", "%Y/%m/%d %H:%M:%S")
|
|
|
+...
|
|
|
+
|
|
|
+6.49. reason_from_hf (int)
|
|
|
+
|
|
|
+ Tells where to take sip_reason from. If value is 0, sip_reason is taken
|
|
|
+ from status line. Otherwise, sip_reason is taken from Reason header
|
|
|
+ field(s) if present. Currently only the first Reason header is used.
|
|
|
+
|
|
|
+ Default value is 0.
|
|
|
+
|
|
|
+ Example 1.49. reason_from_hf
|
|
|
+...
|
|
|
+modparam("acc", "reason_from_hf", 1)
|
|
|
+...
|
|
|
+
|
|
|
+6.50. clone_msg (int)
|
|
|
+
|
|
|
+ If set to 1, request structure from transaction is cloned temporarily
|
|
|
+ in the callback to get acc attributes. It is required if you account
|
|
|
+ values from SIP headers to avoid concurent access to the shared memory
|
|
|
+ transaction structure, specially when accounting 1xx events. If set to
|
|
|
+ 0, it uses directly the shared memory structure, be sure you store all
|
|
|
+ needed attributes in AVPs/XAVPs inside request route.
|
|
|
+
|
|
|
+ Default value is 1.
|
|
|
+
|
|
|
+ Example 1.50. clone_msg
|
|
|
+...
|
|
|
+modparam("acc", "clone_msg", 0)
|
|
|
+...
|
|
|
+
|
|
|
+6.51. cdr_on_failed (int)
|
|
|
+
|
|
|
+ If set to 1, the module stores the CDR for a failed dialog (calls not
|
|
|
+ answered). If set to 0, those records are not stored, only those for
|
|
|
+ answered calls.
|
|
|
+
|
|
|
+ Default value is 1.
|
|
|
+
|
|
|
+ Example 1.51. cdr_on_failed
|
|
|
+...
|
|
|
+modparam("acc", "cdr_on_failed", 0)
|
|
|
+...
|
|
|
+
|
|
|
+7. Functions
|
|
|
+
|
|
|
+ 7.1. acc_log_request(comment)
|
|
|
+ 7.2. acc_db_request(comment, table)
|
|
|
+ 7.3. acc_request(comment, table)
|
|
|
+ 7.4. acc_diam_request(comment)
|
|
|
+
|
|
|
+7.1. acc_log_request(comment)
|
|
|
+
|
|
|
+ acc_request reports on a request, for example, it can be used to report
|
|
|
+ on missed calls to off-line users who are replied 404 - Not Found. To
|
|
|
+ avoid multiple reports on UDP request retransmission, you would need to
|
|
|
+ embed the action in stateful processing.
|
|
|
+
|
|
|
+ Meaning of the parameters is as follows:
|
|
|
+ * comment - Comment to be appended. The string can contain any number
|
|
|
+ of pseudo-variables.
|
|
|
+
|
|
|
+ This function can be used from ANY_ROUTE.
|
|
|
+
|
|
|
+ Example 1.52. acc_log_request usage
|
|
|
+...
|
|
|
+acc_log_request("Some comment");
|
|
|
+$var(code) = 404;
|
|
|
+$avp(reason) = "Not found";
|
|
|
+acc_log_request("$var(code) Error: $avp(reason)");
|
|
|
+...
|
|
|
+
|
|
|
+7.2. acc_db_request(comment, table)
|
|
|
+
|
|
|
+ Like acc_log_request, acc_db_request reports on a request. The report
|
|
|
+ is sent to database at “db_url”, in the table referred to in the second
|
|
|
+ action parameter.
|
|
|
+
|
|
|
+ Meaning of the parameters is as follows:
|
|
|
+ * comment - Comment to be appended. The string can contain any number
|
|
|
+ of pseudo-variables.
|
|
|
+ * table - Database table to be used. It can contain config variables
|
|
|
+ that are evaluated at runtime.
|
|
|
+
|
|
|
+ This function can be used from ANY_ROUTE.
|
|
|
+
|
|
|
+ Example 1.53. acc_db_request usage
|
|
|
+...
|
|
|
+acc_db_request("Some comment", "SomeTable");
|
|
|
+acc_db_request("Some comment", "acc_$time(year)_$time(mon)");
|
|
|
+acc_db_request("$var(code) Error: $avp(reason)", "SomeTable");
|
|
|
+...
|
|
|
+
|
|
|
+7.3. acc_request(comment, table)
|
|
|
+
|
|
|
+ Wrapper around acc_log_request and acc_db_request functions, writing
|
|
|
+ the accounting record to LOG and DATABASE backends. If “db_url”
|
|
|
+ parameter is not set, the acc record is written only to LOG backend.
|
|
|
+
|
|
|
+ Meaning of the parameters is as follows:
|
|
|
+ * comment - Comment to be used for generating the SIP response code
|
|
|
+ and text fields, if in the format “CODE TEXT”. The CODE should be a
|
|
|
+ valid SIP response code (100..699). The TEXT can be one or many
|
|
|
+ words. If CODE is missing, then 0 is used. The parameter can
|
|
|
+ contain pseudo-variables.
|
|
|
+ * table - Database table to be used. It can contain config variables
|
|
|
+ that are evaluated at runtime.
|
|
|
+
|
|
|
+ This function can be used from ANY_ROUTE.
|
|
|
+
|
|
|
+ Example 1.54. acc_db_request usage
|
|
|
+...
|
|
|
+acc_request("100 Received", "acc");
|
|
|
+acc_request("100 Received", "acc_$time(year)_$time(mon)");
|
|
|
+acc_db_request("$var(code) $avp(reason)", "acc");
|
|
|
+...
|
|
|
+
|
|
|
+7.4. acc_diam_request(comment)
|
|
|
+
|
|
|
+ Like acc_log_request, acc_diam_request reports on a request. It reports
|
|
|
+ to the configured Diameter server.
|
|
|
+
|
|
|
+ Meaning of the parameters is as follows:
|
|
|
+ * comment - Comment to be appended. The string can contain any number
|
|
|
+ of pseudo-variables.
|
|
|
+
|
|
|
+ This function can be used from ANY_ROUTE.
|
|
|
+
|
|
|
+ Example 1.55. acc_diam_request usage
|
|
|
+...
|
|
|
+acc_diam_request("Some comment");
|
|
|
+acc_diam_request("$var(code) Error: $avp(reason)");
|
|
|
+...
|
|
|
+
|
|
|
+Chapter 2. Frequently Asked Questions
|
|
|
+
|
|
|
+ 2.1. What happened with old log_fmt parameter
|
|
|
+ 2.2. What happened with old multi_leg_enabled parameter
|
|
|
+ 2.3. What happened with old src_leg_avp_id and dst_leg_avp_id
|
|
|
+ parameters
|
|
|
+
|
|
|
+ 2.4. Where can I find more about Kamailio?
|
|
|
+ 2.5. Where can I post a question about this module?
|
|
|
+ 2.6. How can I report a bug?
|
|
|
+
|
|
|
+ 2.1.
|
|
|
+
|
|
|
+ What happened with old log_fmt parameter
|
|
|
+
|
|
|
+ The parameter became obsolete with the restructure of the data logged
|
|
|
+ by ACC module (refer to the Overview chapter). For similar behaviour
|
|
|
+ you can use the extra accouting (see the coresponding chapter).
|
|
|
+
|
|
|
+ 2.2.
|
|
|
+
|
|
|
+ What happened with old multi_leg_enabled parameter
|
|
|
+
|
|
|
+ The parameter becaome obsolete by the addition of the new
|
|
|
+ multi_leg_info parameter. The multi-leg accouting is automatically
|
|
|
+ enabled when multi_leg_info is defined.
|
|
|
+
|
|
|
+ 2.3.
|
|
|
+
|
|
|
+ What happened with old src_leg_avp_id and dst_leg_avp_id parameters
|
|
|
+
|
|
|
+ The parameter was replaced by the more generic new parameter
|
|
|
+ multi_leg_info. This allows logging (per-leg) of more information than
|
|
|
+ just dst and src.
|
|
|
+
|
|
|
+ 2.4.
|
|
|
+
|
|
|
+ Where can I find more about Kamailio?
|
|
|
+
|
|
|
+ Take a look at https://www.kamailio.org/.
|
|
|
+
|
|
|
+ 2.5.
|
|
|
+
|
|
|
+ Where can I post a question about this module?
|
|
|
+
|
|
|
+ First at all check if your question was already answered on one of our
|
|
|
+ mailing lists:
|
|
|
+ * User Mailing List -
|
|
|
+ https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users
|
|
|
+ * Developer Mailing List -
|
|
|
+ https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev
|
|
|
+
|
|
|
+ E-mails regarding any stable Kamailio release should be sent to
|
|
|
+ <[email protected]> and e-mails regarding development
|
|
|
+ versions should be sent to <[email protected]>.
|
|
|
+
|
|
|
+ If you want to keep the mail private, send it to
|
|
|
+ <[email protected]>.
|
|
|
+
|
|
|
+ 2.6.
|
|
|
+
|
|
|
+ How can I report a bug?
|
|
|
+
|
|
|
+ Please follow the guidelines provided at:
|
|
|
+ https://github.com/kamailio/kamailio/issues.
|