背景
SIPtrace模块提供存储进来和出去
的SIP消息到数据库
或者发送到第三方的服务器
。
两种方式存储信息:
- sip_trace(): 记录会话的SIP消息
- trace_mode: 自动记录所有的SIP消息
官方文档地址: siptrace, kamailio的版本:
version: kamailio 5.8.5 (x86_64/linux)
重要参数解析
|
|
重要函数
sip_trace([address][, correlation_id][, mode])
存储或者转发当前的SIP message/transaction/dialog到数据库,mode参数:
- 当前的message(’m')
- 当前的transaction(’t')
- 当前的dialog(’d')
sip_trace_mode(tmode)
设置追踪模式,tmode参数:
- “m”/“M” message
- “t”/“T” transaction
- “d”/“D” dialog
sip_trace_msg(vmsg, saddr, taddr, daddr, corrid)
发送vmsg
到 HEP server(daddr
), 设置saddr
为源地址, taddr
为目的地址, corrid
为correlation_id
。
saddr
和taddr
为proto:ip:port
, daddr
为:sip:ip:port
hlog([correlation_id,] message)
发送log事件到HEP3 server
实战
存储到数据库
- 记录所有:
|
|
不需要调用sip_trace()
, 所有的信息都能存储到数据表sip_trace
中.
可以看到,REGISTER
, INVITE
, BYE
等SIP消息都能存储到数据库中,还有direction
字段, 表示当前SIP消息是in
还是out
.
wss
也能记录到数据库中。
但是这种记录所有的信息,太频繁了,sip_trace
表还得分表, 影响性能。接下来介绍如何只记录指定的SIP消息。
-
记录指定的SIP消息
- 追踪所有的,过滤掉不想要的SIP消息
1 2 3 4 5 6 7 8 9 10
loadmodule "siptrace.so" modparam("siptrace", "db_url", DBURL) modparam("siptrace", "trace_on", 1) modparam("siptrace", "trace_mode", 2) ... event_route[siptrace:msg] { if(is_method("OPTIONS")|| is_method("REGISTER")) { drop(); } }
数据库可以看到
REGISTER
没被记录到数据库中.- 追踪指定的SIP消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
loadmodule "siptrace.so" modparam("siptrace", "db_url", DBURL) modparam("siptrace", "traced_user_avp", "$avp(user)") modparam("siptrace", "trace_on", 1) modparam("siptrace", "trace_init_mode", 0) ... request_route{ ... route(WITHINDLG); ... if (is_method("INVITE") && !has_totag()) { dlg_manage(); sip_trace_mode("t"); sip_trace(); } } route[WITHINDLG] { if (!has_totag()) return; sip_trace_mode("t"); ... }
记录会话的SIP消息:
- 使用
sip_trace_mode("d")
报错failed to serialize siptrace info! Won't trace dialog!
, 数据库中只记录INVITE
其他的信令没有,已提issue解答。
注意:
trace_mode
不要设置成2,不然还是存所有的SIP信息,sip_trace_mode("d")
就没有用.
发送到HEP server
- hep server
本次的hep server使用的是:hep-connect
|
|
- kamailio配置
|
|
说明几点配置问题:
trace_to_database
要设置成0,不然需要配置数据库sip_trace_mode()
要设置成t
,如果设置成d
,会报错failed to serialize siptrace info! Won't trace dialog!
,目前暂未成功使用过d
.sip_trace_mode("t")
, 如果想要跟踪完整的会话信令,并不是收到INVITE
设置一次就可以了,还要在has_totag()
里再设置一次, 否则只能跟踪200OK
之前的信令,接通之后的BYE
,ACK
都不会跟踪到。sip_trace_mode("t")
设置之后还可以再设置sip_trace()
,效果是一样的。
-
测试效果 完整的记录:
-
HEP 以
tcp
的方式发送
|
|
其他的配置和上面的一样, HEPv3默认使用的是tcp
协议, 需要在duplicate_uri
和send_sock_addr
中添加;transport=tcp
虽然listen
监听的是tcp:5461
,但是因为kamailio
是客户端,所以其发出去的tcp
端口是随机的,但是kamailio
还是要检查你是否监听了5461
端口
说明:hep-connect
目前只支持HEPv3 udp
方式,我测试使用自己修改的方式接收数据的。