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
目录
- 管理员指南
- 概述
- 依赖
2.1 Kamailio 模块
2.2 外部库或应用程序 - 参数
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 之前,必须安装以下库或应用程序:
- jansson:用于编码、解码和操作 JSON 数据的 C 库。
官网:http://www.digip.org/jansson/
3. 参数
3.1 acc_flag(整数)
请求标志,用于标记需要计费的事务。参见 acc_output_mqueue
和 acc_output_syslog
。
默认值为未设置(无标志)。
示例 1.1. acc_flag 示例
modparam("acc_json", "acc_flag", 2)
3.2 acc_missed_flag(整数)
请求标志,用于标记需要计费的未接呼叫。参见 acc_output_mqueue
和 acc_output_syslog
。
默认值为未设置(无标志)。
示例 1.2. acc_missed_flag 示例
modparam("acc_json", "acc_missed_flag", 3)
3.3 acc_extra(字符串)
要添加到 JSON 字典中的额外值。
默认值为 NULL。
示例 1.3. acc_extra 示例
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 示例
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 示例
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 示例
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 使用示例
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 示例
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 示例
modparam("acc_json", "acc_log_facility", "LOG_LOCAL0")
3.10 acc_log_level(整数)
指定 syslog 的日志级别。
默认值为 1(L_NOTICE
)。
示例 1.10. acc_log_level 示例
modparam("acc_json", "acc_log_level", 2) # 设置为 2(L_INFO)
3.11 cdr_enable(整数)
启用 CDR 报告,每个呼叫生成一条记录,依赖于对话框模块。
可选值:
- 0:关闭(默认)。
- 1:启用。
示例 1.11. cdr_enable 示例
modparam("acc_json", "cdr_enable", 1)
3.12 cdr_extra(字符串)
定义自定义 CDR 字段的伪变量集。
默认值为 NULL。
示例 1.12. cdr_extra 示例
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 示例
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 示例
modparam("acc_json", "cdr_expired_dlg_enable", 1)
3.15 cdr_output_mqueue(整数)
需要 mqueue
模块。ACC 模块会将 JSON CDR 事件排队到指定的消息队列中。可以使用 rtimer
模块的 exec
访问队列并处理事件。
默认值为未设置(不启用消息队列)。
示例 1.15. cdr_output_mqueue 使用示例
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 示例
modparam("acc_json", "cdr_log_facility", "LOG_LOCAL0")
3.18 cdr_log_level(整数)
指定 syslog 的日志级别。
默认值为 1(L_NOTICE
)。
示例 1.17. cdr_log_level 示例
modparam("acc_json", "cdr_log_level", 2) # 设置为 2(L_INFO)
总结
通过以上参数和示例,可以灵活配置 ACC_JSON 模块,将计费信息以 JSON 格式输出到消息队列或 syslog,并支持自定义字段和时间格式。