什么是通话详单 (CDR)?

通话详单是电话系统为每次通话写入的一行数据:谁打给了谁、发生了什么、持续了多久、花了多少钱。

计费系统和调试工具需要相同的数据,但获取的时间不同。大多数平台为它们提供各自独立的副本。在 Bird 上,一条记录同时服务于两者,并且在通话结束后立即可读。这改变了核对时需要注意的两件事:什么算一个分段,以及费用何时到达。

记录里有什么?

一条记录包含三组字段,分别回答三个不同的问题。

发生了什么。 status 是通话结果,取值为 answered、no answer、rejected、failed 或 unknown。与之对应的 SIP 响应是最终的 SIP 代码。如果是 Bird 而非运营商拒绝了通话,拒绝原因会标明未通过的检查项。这三者结合起来就是诊断依据,SIP 响应代码的含义介绍了它们如何组合。

何时发生的。 Started 是 Bird 收到通话的时间。Answered 是通话被接听的时间,或记录通话未被接听。Ended 是通话被拆除的时间。对于来电,Inbound route 记录了被叫号码当时设定的处理方式,Trunk 则标明通话进入或送达的中继线路。

费用多少。 计费时长、总时长以及通话费用。

记录中还有两个标识符,它们不可互换。call ID(vcl_…)是记录自身的标识符。向支持团队引用它,并在你自己的日志中与之关联。session ID(vcs_…)由同一通话的所有分段共享。

为什么一次通话显示为两条记录?

因为一条记录描述的是一个分段而非一次通话,而有些通话包含多个分段。

转接通话就是一个例子:入站分段和出站分段是独立的记录,共享一个 session ID。如果把记录当作通话来计数,被转接的通话会被多算;如果跨记录累加时长,重叠的部分会被重复计算。

session ID 可以解决这个问题。当你关注通话时,按 session ID 分组;当你关注分段时,逐条读取记录。选择哪种方式取决于你的问题:送达问题是分段层面的问题,而客户体验或通话量问题通常是会话层面的问题。

为什么费用和时长对不上?

计费时长不包含振铃时间。费用在通话结束后才写入,而非与通话同时写入。

计费时长不等于总时长。 计费时长从接听开始,到挂断结束。总时长包含了通话接通前的振铃时间。记录中两者都有。如果核对时错用了字段,每个已接听的通话都会偏差振铃时长,每个未接听的通话则会偏差整个时长。

费用在通话结束后才到达。 记录在完成计费后才包含费用,这并不是通话结束的那一刻。立即获取的记录可能在其他方面都完整,但没有价格。如果你在近实时计算支出,有费用时读取费用,没有费用时切勿将其视为零。这不是小事:费用缺失和费用为零在这里是两个不同的事实,混为一谈会导致支出被低估。

不过,等待并不总是正确做法。未接听的通话没有费用,也永远不会有。已接听但仍然没有费用的通话,也不是在等待计费。记录本身不会告诉你当前属于哪种情况。请拿着 call ID 联系支持团队,而不是继续轮询。

哪些通话不会出现?

在 Bird 准入之前就被拒绝的通话不会留下记录,因此日志并不是到达你账户的所有通话的完整记录。

Bird 完全无法准入的通话在记录创建之前就被拒绝了,因此它永远不会出现在日志中。中继线路的 IP 白名单就是这类拒绝之一。来自不在白名单上的地址的通话会在 SIP 层被拒绝,通常不会产生记录。因此,探测你中继线路的攻击者可以产生大量流量,却在你最先想到去查看的地方不留任何痕迹。配置错误的 PBX(企业内部路由通话的电话系统)从新地址发起通话时也会出现同样的情况。

实际影响是,"there is nothing in the call log" 回答的问题比看上去的要窄。它表示没有通话被准入,而不是没有通话被尝试过。当电话系统报告通话失败而日志为空时,应首先检查白名单,而不是最后才检查。语音故障排查涵盖了该路径的其余内容。

如何导出记录?

查看单个通话时,在通话日志中打开它并读取上述字段。日志支持过滤和搜索,并将进行中的通话与已结束的通话分开显示。

查看批量通话时,语音 API 以可分页的记录形式返回通话。语音统计端点按天、小时、国家和响应代码对其进行聚合。关于规律性的问题应通过统计数据来回答,而非逐页翻阅记录。

通话日志记录了一条记录包含的每个字段以及列表的过滤方式。

简而言之

  1. 一次通话可以产生多条记录。

    每个分段都有自己的记录,通过共享的 session ID 将它们归为一组。一次转接通话是两条记录,而不是一条。

  2. 计费时长是从接听到挂断。

    它不等于总时长,总时长包含了振铃时间。两者都会被记录,所以要确保核对的是正确的那个。

  3. 费用一开始不在记录中,有时永远不会出现。

    记录在完成计费后才会包含费用。如果一个已接听的通话仍然没有费用,那并不是在等待计费,请拿着 call ID 联系支持团队。

  4. 有些通话根本不会产生记录。

    在 Bird 准入之前就被拒绝的通话不会在日志中留下任何内容,因此日志并不是到达你账户的所有通话的完整记录。

付诸实践。

继续查看此主题的文档、指南和示例。

获取实施简报

基于同一网络构建。

测试 API 密钥即刻获取。添加付款方式并验证发送者身份后,即可解锁生产环境。

你的下一个创意。 随时连接。