kamailio-ACC_JSON模块详解

ACC_JSON 模块

作者

Julien Chavanton
jchavanton@gmail.com

Julien Chavanton

flowroute.com
jchavanton@gmail.com

编辑

Julien Chavanton

flowroute.com
jchavanton@gmail.com

版权

© 2018 Flowroute.com


目录

  1. 管理员指南
    1. 概述
    2. 依赖
      2.1 Kamailio 模块
      2.2 外部库或应用程序
    3. 参数
      3.1 acc_flag(整数)
      3.2 acc_missed_flag(整数)
      3.3 acc_extra(字符串)
      3.4 acc_json_pre_encoded_prefix(字符串)
      3.5 acc_time_mode(整数)
      3.6 acc_time_format(字符串)
      3.7 acc_output_mqueue(整数)
      3.8 acc_output_syslog(整数)
      3.9 acc_log_facility(整数)
      3.10 acc_log_level(整数)
      3.11 cdr_enable(整数)
      3.12 cdr_extra(字符串)
      3.13 cdr_pre_encoded_prefix(字符串)
      3.14 cdr_expired_dlg_enable(字符串)
      3.15 cdr_output_mqueue(整数)
      3.16 cdr_output_syslog(整数)
      3.17 cdr_log_facility(整数)
      3.18 cdr_log_level(整数)

1. 概述

ACC_JSON 模块用于将事务信息以 JSON 字典的形式记录。它绑定到 ACC 模块的 API,并使用与其他后端相同的计费机制。

它可以将 JSON 字典输出到 MQUEUE 或 SYSLOG(即使 Kamailio 未使用 syslog)。


2. 依赖

2.1 Kamailio 模块

该模块依赖于以下模块(即以下模块必须在此模块之前加载):

  • acc:计费模块。
  • mqueue:消息队列模块(可选)。
2.2 外部库或应用程序

在运行 Kamailio 之前,必须安装以下库或应用程序:


3. 参数

3.1 acc_flag(整数)

请求标志,用于标记需要计费的事务。参见 acc_output_mqueueacc_output_syslog

默认值为未设置(无标志)。

示例 1.1. acc_flag 示例

kamailio 复制代码
modparam("acc_json", "acc_flag", 2)

3.2 acc_missed_flag(整数)

请求标志,用于标记需要计费的未接呼叫。参见 acc_output_mqueueacc_output_syslog

默认值为未设置(无标志)。

示例 1.2. acc_missed_flag 示例

kamailio 复制代码
modparam("acc_json", "acc_missed_flag", 3)

3.3 acc_extra(字符串)

要添加到 JSON 字典中的额外值。

默认值为 NULL。

示例 1.3. acc_extra 示例

kamailio 复制代码
modparam("acc_json", "acc_extra", "via=$hdr(Via[*]); email=$avp(s:email)")

3.4 acc_json_pre_encoded_prefix(字符串)

用于标识已预先编码为 JSON 的值的前缀。

默认值为 NULL。

示例 1.4. acc_json_pre_encoded_prefix 示例

kamailio 复制代码
modparam("acc_json", "acc_extra", "json_data=$avp(json_data);")
modparam("acc_json", "acc_json_pre_encoded_prefix", "json_")
...
$avp(json_data) = '{"b":2, "c":3}';

3.5 acc_time_mode(整数)

存储与事件时间相关的额外值。

可选值:

  • 0:默认值,仅保存 Unix 时间戳(syslog)或日期时间(数据库)。
  • 1:保存秒数到 time_attr,微秒数到 time_exten
  • 2:保存秒数.毫秒数到 time_attr
  • 3:根据 time_format 参数保存格式化时间(使用 localtime() 输出)。
  • 4:根据 time_format 参数保存格式化时间(使用 gmtime() 输出)。

示例 1.5. acc_time_mode 示例

kamailio 复制代码
modparam("acc_json", "acc_time_mode", 1)

3.6 acc_time_format(字符串)

指定时间格式(用于 time_mode 为 3 或 4 时)。

默认值为 %Y-%m-%d %H:%M:%S

示例 1.6. acc_time_format 示例

kamailio 复制代码
modparam("acc_json", "acc_time_format", "%Y/%m/%d %H:%M:%S")

3.7 acc_output_mqueue(整数)

需要 mqueue 模块。ACC 模块会将 JSON 计费事件排队到指定的消息队列中。可以使用 rtimer 模块的 exec 访问队列并处理事件。

默认值为未设置(不启用消息队列)。

示例 1.7. acc_output_mqueue 使用示例

kamailio 复制代码
modparam("mqueue", "mqueue", "name=acc_events;size=100000")
modparam("acc_json", "acc_output_mqueue", "acc_events")
modparam("acc_json", "acc_flag", 2)
modparam("acc_json", "acc_extra", "caller_ip_port=$avp(caller_ip_port);")
modparam("rtimer", "timer", "name=nsqt;interval=1;mode=1;")
modparam("rtimer", "exec", "timer=nsqt;route=RUN_CDR_PUBLISH")
modparam("http_client", "keep_connections", 1)
modparam("http_client", "httpcon", "nsqd=>http://localhost:4151/pub?topic=acc")

route[RUN_ACC_PUBLISH] {
   $var(count) = 0;
   while (mq_fetch("acc_events")) {
      $var(q_size) = mq_size("acc_events");
      $var(count) = $var(count) + 1;
      xinfo("[RUN_ACC_PUBLISH][$var(q_size)][$var(count)][$mqk(acc_events)][$mqv(acc_events)]\n");
      $var(res) = http_connect_raw("nsqd", "", "application/json", $mqv(acc_events), "$var(nsq_res)");
      if ($var(res) < 0) {
         xerr("[RUN_ACC_PUBLISH][$var(res)] http_connect_raw: timeout or error !\n");
         mq_add("acc_events", "acc_key", "$mqv(acc_events)");
      } else if ($var(res) < 200 || $var(res) > 299) {
         xerr("[RUN_ACC_PUBLISH][$var(res)] http unexpected response code !\n");
         mq_add("acc_dead_letter_queue", "acc_key", "$mqv(acc_events)");
         return;
      }
   }
   if ($var(count) > 0 ) {
      xinfo("[RUN_CDR_PUBLISH]done count[$var(count)]\n");
   }
}

3.8 acc_output_syslog(整数)

控制是否将 ACC JSON 输出发送到 syslog。即使 Kamailio 未以守护进程模式运行或日志输出到 stdout/stderr,也可以使用 syslog。

默认值为未设置(无标志)。

示例 1.8. acc_output_syslog 示例

kamailio 复制代码
modparam("acc_json", "acc_output_syslog", 1)
modparam("acc_json", "acc_log_level", 2)
modparam("acc_json", "acc_log_facility", "LOG_DAEMON")

3.9 acc_log_facility(整数)

指定 syslog 的日志设施。

默认值为 LOG_DAEMON

示例 1.9. acc_log_facility 示例

kamailio 复制代码
modparam("acc_json", "acc_log_facility", "LOG_LOCAL0")

3.10 acc_log_level(整数)

指定 syslog 的日志级别。

默认值为 1(L_NOTICE)。

示例 1.10. acc_log_level 示例

kamailio 复制代码
modparam("acc_json", "acc_log_level", 2) # 设置为 2(L_INFO)

3.11 cdr_enable(整数)

启用 CDR 报告,每个呼叫生成一条记录,依赖于对话框模块。

可选值:

  • 0:关闭(默认)。
  • 1:启用。

示例 1.11. cdr_enable 示例

kamailio 复制代码
modparam("acc_json", "cdr_enable", 1)

3.12 cdr_extra(字符串)

定义自定义 CDR 字段的伪变量集。

默认值为 NULL。

示例 1.12. cdr_extra 示例

kamailio 复制代码
modparam("acc_json", "cdr_extra", "ci=$dlg_var(call_id);ft=$dlg_var(from_tag)")

3.13 cdr_pre_encoded_prefix(字符串)

用于标识已预先编码为 JSON 的值的前缀。

默认值为 NULL。

示例 1.13. cdr_pre_encoded_prefix 示例

kamailio 复制代码
modparam("acc_json", "cdr_extra", "json_data=$avp(json_data);")
modparam("acc_json", "cdr_pre_encoded_prefix", "json_")
...
$avp(json_data) = '{"b":2, "c":3}';

3.14 cdr_expired_dlg_enable(字符串)

是否在对话框过期时启用 CDR 日志记录?

可选值:

  • 0:关闭(默认)。
  • 1:启用。

示例 1.14. cdr_expired_dlg_enable 示例

kamailio 复制代码
modparam("acc_json", "cdr_expired_dlg_enable", 1)

3.15 cdr_output_mqueue(整数)

需要 mqueue 模块。ACC 模块会将 JSON CDR 事件排队到指定的消息队列中。可以使用 rtimer 模块的 exec 访问队列并处理事件。

默认值为未设置(不启用消息队列)。

示例 1.15. cdr_output_mqueue 使用示例

kamailio 复制代码
modparam("mqueue", "mqueue", "name=cdr_events;size=100000")
modparam("acc_json", "cdr_enable", 1)
modparam("acc_json", "cdr_output_mqueue", "cdr_events")
modparam("acc_json", "cdr_extra", "ci=$dlg_var(call_id)")
modparam("rtimer", "timer", "name=nsqt;interval=1;mode=1;")
modparam("rtimer", "exec", "timer=nsqt;route=RUN_CDR_PUBLISH")
modparam("http_client", "keep_connections", 1)
modparam("http_client", "httpcon", "nsqd=>http://localhost:4151/pub?topic=acc")

route[RUN_CDR_PUBLISH] {
   $var(count) = 0;
   while (mq_fetch("cdr_events")) {
      $var(q_size) = mq_size("cdr_events");
      $var(count) = $var(count) + 1;
      xinfo("[RUN_CDR_PUBLISH][$var(q_size)][$var(count)][$mqk(cdr_events)][$mqv(cdr_events)]\n");
      $var(res) = http_connect_raw("nsqd", "", "application/json", $mqv(cdr_events), "$var(nsq_res)");
      if ($var(res) < 0) {
         xerr("[RUN_CDR_PUBLISH][$var(res)] http_connect_raw: timeout or error !\n");
         mq_add("cdr_events", "cdr_key", "$mqv(cdr_events)");
      } else if ($var(res) < 200 || $var(res) > 299) {
         xerr("[RUN_CDR_PUBLISH][$var(res)] http unexpected response code !\n");
         mq_add("cdr_dead_letter_queue", "cdr_key", "$mqv(cdr_events)");
         return;
      }
   }
   if ($var(count) > 0 ) {
      xinfo("[RUN_CDR_PUBLISH]done count[$var(count)]\n");
   }
}

3.16 cdr_output_syslog(整数)

ACC 模块会将 JSON CDR 事件记录到 syslog。


3.17 cdr_log_facility(整数)

指定 syslog 的日志设施。

默认值为 LOG_DAEMON

示例 1.16. cdr_log_facility 示例

kamailio 复制代码
modparam("acc_json", "cdr_log_facility", "LOG_LOCAL0")

3.18 cdr_log_level(整数)

指定 syslog 的日志级别。

默认值为 1(L_NOTICE)。

示例 1.17. cdr_log_level 示例

kamailio 复制代码
modparam("acc_json", "cdr_log_level", 2) # 设置为 2(L_INFO)

总结

通过以上参数和示例,可以灵活配置 ACC_JSON 模块,将计费信息以 JSON 格式输出到消息队列或 syslog,并支持自定义字段和时间格式。