经过一周多的鏖战, X-MSG-IM
的分布式信令跟踪能力已基本具备, 特点是:
实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口.
完备. 可以完整地回放整个业务流程.
代码零侵入.
下面以客户端在域内的附着流程为例进行演示说明. 此流程涉及到三个系统网元:
x-msg-ap
, 访问点.x-msg-im-hlr
, 用户归属位置.x-msg-im-auth
, 鉴权中心.
分为以下步骤:
客户端向
x-msg-ap
发起附着请求.x-msg-ap
向x-msg-im-hlr
透传此请求.x-msg-im-hlr
向x-msg-im-auth
询问此附着请求中的token等参数是否有效.x-msg-im-auth
向x-msg-im-hlr
回送附着结果.x-msg-im-hlr
向x-msg-ap
回送附着结果.x-msg-ap
向客户端透传附着结果,
信令跟踪在每个RX/TX
位置都有测点
, 也就是下图中的: A, B, C, D, E, F, G, H, I, J
. 每个测点上都抓取XSC协议从传输层到应用层每一个字节.
下面这张表则是上图10个测点的部分关键信息. 它们由一个trace-id
进行关联, 通过span-id
和parent-span-id
的继承关系组成了一个完整的RPC链.
代码零侵入演示
- A, B, I, J测点, 在
x-msg-ap
网元上
/* x-msg-ap处理来自客户端的附着请求. */
void XmsgImHlrAttachSimple::handle(SptrXitp trans /* 事务. */, shared_ptr<XmsgImHlrAttachSimpleReq> req)
{
shared_ptr<XmsgNeUsr> hlr = XmsgNeGroupMgr::instance()->getHlr(); /* 获取x-msg-im-hlr网元句柄. */
XmsgImChannel::cast(hlr->channel)->begin(req, [trans](SptrXiti itrans) /* 向x-msg-im-hlr透传. */
{
shared_ptr<XmsgImHlrAttachSimpleRsp> rsp = static_pointer_cast<XmsgImHlrAttachSimpleRsp>(itrans->endMsg); /* x-msg-im-hlr回来的响应. */
trans->end(rsp); /* 事务结束, 直接将响应透传回客户端. */
}, nullptr, trans);
}
- C, D, G, H测点, 在
x-msg-im-hlr
网元上
/* x-msg-im-hlr收到x-msg-ap透传过来的客户端附着请求. */
void XmsgImHlrAttachSimple::handle(shared_ptr<XmsgNeUsr> nu, const string& ccid, SptrXitp trans, shared_ptr<XmsgImHlrAttachSimpleReq> req)
{
shared_ptr<XmsgNeUsr> auth = XmsgNeGroupMgr::instance()->getAuth(); /* 获取x-msg-im-auth网元句柄. */
XmsgImChannel::cast(auth->channel)->begin(req, [trans](SptrXiti itrans) /* 向x-msg-im-auth透传. */
{
shared_ptr<XmsgImHlrAttachSimpleRsp> rsp = static_pointer_cast<XmsgImHlrAttachSimpleRsp>(itrans->endMsg); /* x-msg-im-auth回来的响应. */
trans->end(rsp); /* 直接将响应透传回x-msg-ap. */
}, nullptr, trans);
}
- E, F测点, 在
x-msg-im-auth
网元上
/* x-msg-im-auth收到x-msg-im-hlr透传过来的客户端附着请求. */
void XmsgImAuthClientAttachSimple::handle(shared_ptr<XmsgNeUsr> nu, SptrXitp trans, shared_ptr<XmsgImHlrAttachSimpleReq> req)
{
shared_ptr<XmsgImHlrAttachSimpleRsp> rsp(new XmsgImHlrAttachSimpleRsp());
rsp->set_usr("usr");
rsp->set_secret("secret");
LOG_DEBUG("x-msg-im-client attach successful, req: %s, rsp: %s", req->ShortDebugString().c_str(), rsp->ShortDebugString().c_str())
trans->end(rsp); /* 直接将响应透传回x-msg-im-hlr. */
}