你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 通信服务语音呼叫和视频呼叫日志
Azure 通信服务提供的日志记录功能可用于监视和调试通信服务解决方案。 通过 Azure 门户配置这些功能。
本文中的内容指的是通过 Azure Monitor 启用的日志(另请参阅常见问题解答)。 要为通信服务启用这些日志,请参阅在诊断设置中启用日志记录。
数据概念
以下对数据概念的大致描述特定于语音呼叫和视频呼叫。 务必查看这些概念,以便你可以了解日志中捕获的数据的含义。
实体和 ID
熟悉以下术语:
呼叫:如数据所示,呼叫是由
correlationId
描述的抽象。 每个呼叫的correlationId
的值都是唯一的,并且是基于callStartTime
和callDuration
有时限的。参与者:代表终结点和服务器之间的连接。 只有在群组呼叫时,才存在参与者 (
participantId
)。终结点:最具唯一性的实体,由
endpointId
表示。 每次呼叫都是一个事件,包含来自两个或多个终结点的数据。 终结点代表呼叫的参与者。EndpointType
能告诉你终结点是人类用户(PSTN 或 VoIP)、机器人还是管理呼叫中多个参与者的服务器。 当endpointType
值为"Server"
时,不会为终结点分配唯一的 ID。 可以分析endpointType
和endpointId
值的数量,以确定有多少用户和其他非人类参与者(机器人和服务器)加入呼叫。适用于 Android 和 iOS 的本机 SDK 会跨多个呼叫为用户重复使用相同的
endpointId
值,从而使你能够理解跨会话的体验。 此过程与基于 Web 的终结点不同,后者会始终为每个新呼叫生成新的endpointId
值。流:最精细的实体。 每个方向(入站或出站)和
mediaType
值(例如Audio
或Video
)都有一个流。
数据定义
使用情况日志架构
properties | 说明 |
---|---|
Timestamp |
生成日志时的时间戳 (UTC)。 |
Operation Name |
与日志记录相关联的操作。 |
Operation Version |
如果通过 API 执行 Operation Name 操作,则 api-version 值与该操作关联。 如果没有任何 API 对应于此操作,则此版本表示操作的版本,以防与该操作关联的属性将来发生更改。 |
Category |
事件的日志类别。 类别是可以在资源上启用或禁用日志的粒度。 出现在事件的 properties blob 中的属性与日志类别和资源类型中的属性相同。 |
Correlation ID |
关联事件的 ID。 可以使用它来标识多个表之间的关联事件。 |
Properties |
适用于各种通信服务模式的其他数据。 |
Record ID |
使用情况记录的唯一 ID。 |
Usage Type |
使用模式(例如聊天、PSTN 或 NAT)。 |
Unit Type |
使用模式的使用情况所依据的单位类型(例如分钟数、兆字节或消息)。 |
Quantity |
此记录使用或消耗的单位数。 |
呼叫摘要日志架构
呼叫摘要日志包含有助于标识所有呼叫关键值属性的数据。 为呼叫中的每个 participantId
(在对等 [P2P] 呼叫的情况下为 endpointId
)值创建不同的呼叫摘要日志。
重要
呼叫摘要日志中的参与者信息因参与者租户而异。 如果参与者与通信服务资源不在同一租户内(也称为跨租户),则会修订 SDK 版本和 OS 版本。 跨租户的参与者分类为外部用户,他们由资源租户邀请加入呼叫并在呼叫期间协作。
properties | 说明 |
---|---|
time |
生成日志时的时间戳 (UTC)。 |
operationName |
与日志记录相关联的操作。 |
operationVersion |
如果通过 API 执行 operationName 操作,则 api-version 值与该操作关联。 如果没有任何 API 对应于此操作,则此版本表示操作的版本,以防与该操作关联的属性将来发生更改。 |
category |
事件的日志类别。 此属性是可以在资源上启用或禁用日志的粒度。 出现在事件的 properties blob 中的属性与日志类别和资源类型中的属性相同。 |
correlationId |
呼叫的唯一 ID。 它可从单次呼叫期间连接的所有参与者和终结点中标识相关事件,并且可用于联接来自不同日志的数据。 如果需要通过 Microsoft 打开支持案例,则可以使用 correlationId 值轻松标识你要排查故障的呼叫。 |
identifier |
用户的唯一 ID。 该标识可以是 Azure 通信服务用户、Microsoft Entra 用户 ID、Teams 匿名用户 ID 或 Teams 机器人 ID。 你可使用此 ID 来关联不同日志中的用户事件。 |
callStartTime |
呼叫开始的时间戳,获取依据为任何终结点第一次尝试连接的时间。 |
callDuration |
呼叫的持续时间,以秒为单位,获取依据为两个终结点之间第一次尝试连接的时间和最后一次连接结束的时间。 |
callType |
呼叫的类型。 它包含 "P2P" 或 "Group" 。 "P2P" 呼叫是仅在两个非服务器终结点之间的直接 1:1 连接。 "Group" 呼叫是具有两个以上终结点的呼叫,或是在连接之前作为 "Group" 而创建的呼叫。 |
teamsThreadId |
Teams 会话 ID。 仅当呼叫组织为 Teams 会议时,此 ID 才有意义。 然后,它代表 Microsoft Teams 和 Azure 通信服务之间的互操作性用例。 此 ID 在操作日志中是公开的。 你还可以通过聊天 API 获取此 ID。 |
participantId |
生成此 ID 是用于表示 "Participant" 终结点 (endpointType = "Server" ) 与服务器之间的双向连接。 当 callType = "P2P" 时,两个终结点之间为直接连接,不会生成 participantId 值。 |
participantStartTime |
参与者第一次连接尝试开始的时间戳。 |
participantDuration |
每个参与者连接的持续时间,以秒为单位,从 participantStartTime 到连接结束的时间戳为止。 |
participantEndReason |
参与者连接结束的原因。 它包含 SDK 为每个 participantId 值发出的呼叫 SDK 错误代码(如果相关)。 |
endpointId |
表示连接到呼叫的各个终结点的唯一 ID,其中 endpointType 定义终结点类型。 当该值为 null 时,连接的实体是通信服务服务器 (endpointType = "Server" )。 对于本机客户端,有时可为跨多个呼叫 ( correlationId ) 的同一用户保留 endpointId 值。 endpointId 值的数量将决定呼叫摘要日志的数量。 对于每个 endpointId 值,都会创建一个单独的摘要日志。 |
endpointType |
该值用于描述连接到呼叫的各个终结点的属性。 可以包含 "Server" 、"VOIP" 、"PSTN" 、"BOT" 或 "Unknown" 。 |
sdkVersion |
各个相关终结点使用的通信服务呼叫 SDK 版本的版本字符串(例如,"1.1.00.20212500" )。 |
osVersion |
表示每个终结点设备的操作系统和版本的字符串。 |
participantTenantId |
与参与者标识关联的 Microsoft 租户的 ID。 该租户可以是拥有 Azure 通信服务资源的 Azure 租户,也可以是 Microsoft 365 标识的 Microsoft 租户。 此字段用于指导跨租户编修。 |
participantType |
对参与者的描述,即其客户端(Azure 通信服务或团队)及其标识(Azure 通信服务或 Microsoft 365)的组合。 可能的值包括:Azure 通信服务(Azure 通信服务标识和 Azure 通信服务 SDK)、Teams(Teams 标识和 Teams 客户端)、作为 Teams 外部用户的 Azure 通信服务(Teams 呼叫或会议中的 Azure 通信服务标识和 Azure 通信服务 SDK)、作为 Microsoft 365 用户的 Azure 通信服务(Microsoft 365 标识和 Azure 通信服务客户端)和 Teams 语音应用。 |
pstnPartcipantCallType |
表示 PSTN 参与者的类型和方向,包括紧急呼叫、直接路由、转移、转接等。 |
ParticipantEndSubCode |
表示 SDK 为每个 participantId 值发出(相关时)的通话 SDK 错误子代码。 |
ResultCategory |
表示结束通话的参与者的类别。 它可以是以下 4 个值之一:Success、ExpectedError、UnexpectedClientError、UnexpectedServerError。 |
呼叫诊断架构
呼叫诊断日志提供有关终结点的重要信息和各个参与者的媒体传输信息。 它们还提供有助于了解呼叫质量问题的度量值。
对于呼叫中的每个终结点,将为终结点之间的出站媒体流(例如音频或视频)创建不同的呼叫诊断日志。 在 P2P 呼叫中,每个日志都包含与各个出站流相关的数据,而各个出站流则与各个终结点关联。 在群组呼叫中,participantId
用作密钥标识符,用于将相关出站日志加入到不同的参与者连接中。 呼叫诊断日志将保持不变,无论参与者租户如何,这些日志都是相同的。
注意
在本文中,对于所有跨租户的呼叫方案,P2P 和群组呼叫默认都位于同一租户内。 它们在整篇文章中都有相应的说明。
properties | 说明 |
---|---|
operationName |
与日志记录相关联的操作。 |
operationVersion |
如果通过 API 执行 operationName 操作,则 api-version 值与该操作关联。 如果没有任何 API 对应于此操作,则此版本表示操作的版本,以防与该操作关联的属性将来发生更改。 |
category |
事件的日志类别。 此属性是可以在资源上启用或禁用日志的粒度。 出现在事件的 properties blob 中的属性与日志类别和资源类型中的属性相同。 |
correlationId |
呼叫的唯一 ID。 它可从单个呼叫期间连接的所有参与者和终结点中标识相关事件。 如果需要通过 Microsoft 打开支持案例,则可以使用 correlationId 值轻松标识你要排查故障的呼叫。 |
participantId |
生成此 ID 是用于表示 "Participant" 终结点 (endpointType = "Server" ) 与服务器之间的双向连接。 当 callType = "P2P" 时,两个终结点之间为直接连接,不会生成 participantId 值。 |
identifier |
用户的唯一 ID。 该标识可以是 Azure 通信服务用户、Microsoft Entra 用户 ID、Teams 对象 ID 或 Teams 机器人 ID。 你可使用此 ID 来关联不同日志中的用户事件。 |
endpointId |
表示连接到呼叫的各个终结点的唯一 ID,其中 endpointType 定义终结点类型。 当该值为 null 时,连接的实体是通信服务服务器。 对于本机客户端,可在跨多个呼叫 (correlationId ) 中为同一用户保留 EndpointId ,但当客户端是 Web 浏览器时,该属性值对于每个呼叫都是唯一的。 |
endpointType |
该值用于描述各个 endpointId 实例的属性。 可以包含 "Server" 、"VOIP" 、"PSTN" 、"BOT" 、"Voicemail" 、"Anonymous" 或 "Unknown" 。 |
mediaType |
此字符串值用于描述在各个流内多个终结点之间传输的媒体类型。 可能的值包括 "Audio" 、"Video" 、"VBSS" (基于视频的屏幕共享)和 "AppSharing" 。 |
streamId |
非唯一的整数,与 mediaType 一起使用,可用于对同一 participantId 值的多个流进行唯一标识。 |
transportType |
字符串值,用于描述各个 participantId 值的网络传输协议。 可以包含 "UDP" 、"TCP" 或 "Unrecognized" 。 "Unrecognized" 指示系统无法确定传输协议是 TCP 还是 UDP。 |
roundTripTimeAvg |
表示在 participantDuration 期间中获取从一个终结点到另一个终结点的 IP 数据包所花费的平均时间。 这种网络传播延迟与两点之间的物理距离、光速以及在此过程中不同路由器花费的任何其他时间有关。 延迟以单向时间或往返时间 (RTT) 进行度量。 其值以毫秒为单位。 RTT 大于 500 毫秒会对呼叫质量产生负面影响。 |
roundTripTimeMax |
在群组呼叫的 participantDuration 期间或 P2P 呼叫的 callDuration 期间度量的到达媒体流的最大 RTT(以毫秒为单位)。 |
jitterAvg |
连续数据包之间的延迟的平均变化。 通过缓冲,Azure 通信服务可以适应某些级别的抖动。 当抖动超过缓冲时(大约在 jitterAvg 时间大于 30 毫秒)时,它可能会对质量产生负面影响。 以不同速度传入的数据包会导致说话者的声音听起来像机器人。 该指标在群组呼叫中的 participantDuration 期间或 P2P 呼叫中的 callDuration 期间内针对每个媒体流进行度量。 |
jitterMax |
在各个媒体流的数据包之间测得的最大抖动值。 网络突发情况可能会导致音频/视频通信流出现问题。 |
packetLossRateAvg |
丢失的数据包的平均百分比。 数据包丢失会对音频质量产生直接影响。 小型、单独的数据包丢失几乎不会产生任何影响,而连续的突发丢失则会导致音频完全中断。 被丢弃且未到达预期目的地的数据包会导致媒体出现间隙。 这种情况会导致丢失音节和单词,以及视频和共享断断续续。 如果数据包丢失率超过 10% (0.1),可能会对质量产生负面影响。 该指标在群组呼叫中的 participantDuration 期间或 P2P 呼叫中的 callDuration 期间内针对每个媒体流进行度量。 |
packetLossRateMax |
该值表示在群呼中的 participantDuration 期间或 P2P 呼叫中的 callDuration 期间每个媒体流的最大丢包率(百分比)。 网络突发情况可能会导致音频/视频通信流出现问题。 |
JitterBufferSizeAvg |
每个媒体流持续时间内抖动缓冲区的平均大小。 抖动缓冲区是一个共享数据区域,可以在其中收集、存储语音数据包并以均匀的间隔发送到语音处理器。 抖动缓冲器用于抵消抖动的影响。 抖动缓冲区可以是静态的,也可以是动态的。 静态抖动缓冲区设置为固定大小,而动态抖动缓冲区则可以根据网络状况调整大小。 抖动缓冲区的目标是向用户提供顺畅且不间断的音频和视频数据流。 在 Web SDK 中,这个 JitterBufferSizeAvg 是呼叫期间 jitterBufferDelay 的平均值。 jitterBufferDelay 是保留在抖动缓冲区中的音频示例或视频帧的持续时间。 通常,当 JitterBufferSizeAvg 值大于 200 毫秒时,它会对质量产生负面影响。 |
JitterBufferSizeMax |
在每个媒体流持续时间内测得的最大抖动缓冲区大小。 通常,当此值大于 200 毫秒时,它会对质量产生负面影响。 |
HealedDataRatioAvg |
在音频流持续时间内,修复程序成功重建或恢复的丢包或坏包的平均百分比。 修复数据率是衡量 VoIP 系统中使用的纠错技术有效性的指标。 如果该值大于 0.1 (10%),则认为流质量较差。 |
HealedDataRatioMax |
在每个媒体流持续时间内测得的最大修复数据比率。 如果该值大于 0.1 (10%),则认为流质量较差。 |
VideoFrameRateAvg |
视频/屏幕共享呼叫期间每秒传输的平均视频帧数。 视频帧速率会影响视频流的质量和平滑度,较高的帧速率通常会使运动更平顺、更流畅。 WebRTC 视频的标准帧速率通常为每秒 30 帧 (fps),尽管帧速率可能会因具体实施和网络条件而异。 如果该值小于 7(对于视频流)或小于 1(对于屏幕共享流),则认为流质量很差。 |
RecvResolutionHeight |
在视频/屏幕共享呼叫期间传输的传入视频流的平均垂直尺寸。 它以像素为单位进行测量,是决定视频流整体分辨率和质量的因素之一。 使用的具体分辨率可能取决于呼叫中涉及的设备的功能和网络条件。 如果该值小于 240(对于视频流)或小于 768(对于屏幕共享流),则认为流质量很差。 |
RecvFreezeDurationPerMinuteInMs |
传入视频/屏幕共享流的平均冻结持续时间(以每分钟毫秒数为单位)。 冻结通常是由于网络状况不佳造成的,并且会降低流质量。 如果该值大于 6,000 毫秒(对于视频流)或大于 25,000 毫秒(对于屏幕共享流),则认为流质量很差。 |
PacketUtilization |
为给定媒体流发送或接收的数据包。 通常通话时间越长,该值就会越高。 如果此值为零,则可能指示媒体未处于流动状态。 |
VideoBitRateAvg |
视频或屏幕共享流的平均比特率(每秒位数)。 低比特率值可能指示存在网络不佳问题。 可在此处找到所需的最小比特率(带宽):网络带宽。 |
VideoBitRateMax |
视频或屏幕共享流的最大比特率(每秒位数)。 低比特率值可能指示存在网络不佳问题。 可在此处找到所需的最小比特率(带宽):网络带宽。 |
StreamDirection |
媒体流的方向。 它可以是入站,也可以是出站。 |
CodecName |
用于处理媒体流的编解码器名称。 它可以是 OPUS、G722、H264S、SATIN 等。 |
呼叫客户端操作日志架构
呼叫客户端操作日志提供有关呼叫终结点和呼叫中涉及的参与者的客户端信息。 这些日志目前处于预览状态,显示呼叫中发生的客户端事件以及客户在呼叫期间执行的操作。
此日志提供有关呼叫期间所采取操作的详细信息,可用于通过使用 Azure 通信服务资源的呼叫诊断来可视化和调查呼叫问题。 详细了解呼叫诊断
properties | 说明 |
---|---|
CallClientTimeStamp |
在 SDK 上发生该操作时的时间戳 (UTC)。 |
OperationName |
在呼叫 SDK 上触发的操作的名称。 |
CallId |
呼叫的唯一 ID。 它可从单次呼叫期间连接的所有参与者和终结点中标识相关事件,并且可用于联接来自不同日志的数据。 它类似于呼叫摘要日志和呼叫诊断日志中的 correlationId。 |
ParticipantId |
每个呼叫回合(在群组呼叫中)或呼叫参与者(在对等呼叫中)的唯一标识符。 此 ID 是 CallSummary、CallDiagnostic、CallClientOperations 和 CallClientMediaStats 日志之间的主要关联点。 |
OperationType |
呼叫客户端操作。 |
OperationId |
标识 SDK 操作的唯一 GGUID。 |
DurationMs |
呼叫 SDK 操作失败或成功所花费的时间。 |
ResultType |
描述操作成功或失败的字段。 |
ResultSignature |
类似 HTTP 的失败或成功代码(200、500)。 |
SdkVersion |
正在使用的呼叫 SDK 版本。 |
UserAgent |
使用基于浏览器或呼叫 SDK 的平台的标准用户代理字符串。 |
ClientInstanceId |
标识 CallClient 对象的唯一 GGUID。 |
EndpointId |
表示连接到呼叫的各个终结点的唯一 ID,其中 endpointType 定义终结点类型。 当该值为 null 时,意味着连接的实体是通信服务服务器 (endpointType = "Server")。 对于本机客户端,有时可为跨多个呼叫 (correlationId) 的同一用户保留 endpointId 值。 endpointId 值的数量将决定呼叫摘要日志的数量。 对于每个 endpointId 值,都会创建一个单独的摘要日志。 |
OperationPayload |
根据操作而变化的动态负载,可提供更多特定于操作的详细信息。 |
“呼叫客户端媒体统计信息时序”日志架构
“呼叫客户端媒体统计信息时序日志”提供有关参与呼叫的各个参与者之间的媒体流的客户端信息。 这些日志目前处于有限预览状态,提供参与者之间音频、视频和屏幕共享媒体流的详细时序数据,默认聚合间隔为 10 秒。 日志包含有关媒体流类型、方向、编解码器和比特率属性(例如 max、min、average)的粒度时序信息。
此日志提供比呼叫诊断日志更详细的信息,以了解参与者之间的媒体流质量。 它可用于通过 Azure 通信服务资源的呼叫诊断可视化和调查呼叫的质量问题。 详细了解呼叫诊断
properties | 说明 |
---|---|
OperationName |
与日志记录相关联的操作。 |
CallId |
呼叫的唯一 ID。 它可从单次呼叫期间连接的所有参与者和终结点中标识相关事件,并且可用于联接来自不同日志的数据。 它类似于呼叫摘要日志和呼叫诊断日志中的 correlationId。 |
CallClientTimeStamp |
记录媒体统计信息时的时间戳。 |
MetricName |
媒体统计信息的名称,例如 Bitrate 、JitterInMs 、PacketsPerSecond 等。 |
Count |
在给定时间戳处采样的数据点数。 |
Sum |
采样的所有数据点的指标值之和。 |
Average |
采样的数据点的平均指标值。 平均值 = 总和/计数。 |
Minimum |
采样的所有数据点的指标值的最小值。 |
Maximum |
采样的所有数据点的指标值的最大值。 |
MediaStreamDirection |
媒体流的方向。 可以是 send 或 receive 。 |
MediaStreamType |
媒体流的类型。 可以是 video 、audio 或 screen 。 |
MediaStreamCodec |
用于对媒体流进行编码/解码的编解码器,例如 H264 、OPUS 、VP8 等。 |
ParticipantId |
生成的用于表示呼叫中每个终结点的唯一 ID。 |
ClientInstanceId |
表示在呼叫 SDK 中创建的呼叫客户端对象的唯一 ID。 |
EndpointId |
表示连接到呼叫的每个终结点的唯一 ID。 对于本机客户端,可在跨多个呼叫 (callIds ) 为同一用户保留 EndpointId,但当客户端是 Web 浏览器时,该属性值对于每个呼叫都是唯一的。 此日志中当前未检测 EndpointId 。 实现后,它将匹配 CallSummary/Diagnostics 日志中的值 |
RemoteParticipantId |
表示媒体流中远程终结点的唯一 ID。 例如,用户可以在同一呼叫中为其他用户呈现多个视频流。 每个视频流都有不同的 RemoteParticipantId 。 |
RemoteEndpointId |
与 EndpointId 相同,但它表示流远程端的用户。 |
MediaStreamId |
一个唯一 ID,表示呼叫中的每个媒体流。 MediaStreamId 当前未在客户端中检测。 实现后,它将匹配 CallDiagnostics 日志中的 streamId 列。 |
AggregationIntervalSeconds |
聚合媒体统计信息的时间间隔。 目前在通话 SDK 中,媒体指标每 1 秒采样一次,在日志中报告时,我们每 10 秒聚合所有样本。 因此,此表中的每一行最多有 10 个采样点。 |
P2P 呼叫与群组呼叫的对比
呼叫类型(由 callType
表示)有两种:
对等 (P2P) 呼叫:仅在两个终结点之间的连接,无服务器终结点。 P2P 呼叫是作为这两个终结点之间的呼叫而启动的,而不是在连接之前作为群组呼叫事件而创建的。
群组呼叫:连接了 2 个以上终结点的任何呼叫。 群组呼叫包括一个服务器终结点,以及每个终结点和服务器之间的连接。 如果 P2P 呼叫在呼叫过程中添加了其他终结点,则该呼叫不再是 P2P 呼叫,而是成为了群组呼叫。 使用
participantStartTime
和participantDuration
指标可以确定每个终结点加入呼叫的时间线。
日志结构
Azure 通信服务创建四种类型的日志:
呼叫摘要日志:包含有关呼叫的基本信息,包括所有相关 ID、时间戳、终结点和 SDK 信息。 对于呼叫中的每个参与者,通信服务都会创建一个不同的呼叫摘要日志。
如果有人重新加入呼叫,则该参与者将具有相同的
EndpointId
值,但具有不同的ParticipantId
值。 然后,该终结点可能会有两个呼叫摘要日志。呼叫诊断日志:包含有关“流”的信息,以及一组指示呼叫体验质量度量的指标。 对于呼叫中的每个
EndpointId
(包括服务器),Azure 通信服务会为终结点之间的每个媒体流(例如音频或视频)创建一个不同的呼叫诊断日志。呼叫客户端操作日志:包含详细的呼叫客户端事件。 这些日志事件是针对呼叫中的每个
EndpointId
生成,生成的事件日志的数量取决于参与者在呼叫期间执行的操作。呼叫客户端媒体统计信息日志:包含详细的媒体流值。 这些日志针对呼叫中的每个媒体流生成。 对于呼叫中的每个
EndpointId
(包括服务器),Azure 通信服务会为终结点之间的每个媒体流(例如音频或视频)创建一个不同的日志。 每个日志中生成的数据量取决于呼叫的持续时间和呼叫中的媒体流数。
在 P2P 呼叫中,每个日志都包含与各个出站流相关的数据,而各个出站流则与各个终结点关联。 在组呼叫中,与 endpointType
= "Server"
关联的每个流都会创建一个日志,其中包含入站流的数据。 所有其他流都会创建包含所有非服务器终结点的出站流数据的日志。 在群组呼叫中,将使用 participantId
值作为密钥从而将相关的入站和出站日志加入到单独的参与者连接中。
示例:P2P 呼叫
下图表示 P2P 呼叫中两个直接连接的终结点。 在此示例中,通信服务创建了两个呼叫摘要日志(每个 participantID
值一个)和四个呼叫诊断日志(每个媒体流一个)。
对于 Azure 通信服务呼叫客户端参与者,还有一系列呼叫客户端操作日志和呼叫客户端媒体统计信息时序日志。 这些日志的确切数量取决于呼叫的 SDK 操作类型以及呼叫持续时间。
示例:群组呼叫
下图表示具有三个 participantId
值(这意味着三个参与者)和一个服务器终结点的群组呼叫示例。 endpointId
的多个值可能会出现在多个参与者中,例如,当他们从同一设备重新加入呼叫时。 通信服务会为每个 participantId
值创建一个呼叫摘要日志。 它将创建四个呼叫诊断日志:每个 participantId
的每个媒体流一个。
对于 Azure 通信服务呼叫客户端参与者,呼叫客户端操作日志与 P2P 呼叫相同。 对于每个使用呼叫 SDK 的参与者,都会有一系列的呼叫客户端操作日志。
对于 Azure 通信服务呼叫客户端参与者,呼叫客户端操作日志和呼叫客户端媒体统计信息时序日志与 P2P 呼叫相同。 对于使用呼叫 SDK 的每个参与者,都会有一系列呼叫客户端操作日志和呼叫客户端媒体统计信息时序日志。
示例:跨租户 P2P 呼叫
下图显示了跨多个租户的两个参与者,他们在 P2P 呼叫中直接连接。 在此示例中,通信服务使用经过修订的 OS 和 SDK 版本创建一个呼叫摘要日志(每个参与者一个)。 通信服务还创建四个呼叫诊断日志(每个媒体流一个)。 每个日志包含与 participantID
的出站流相关的数据。
示例:跨租户群组呼叫
下图显示了一个群组呼叫示例,其中的三个 participantId
值跨多个租户。 通信服务使用经过修订的 OS 和 SDK 版本为每个参与者创建一个呼叫摘要日志。 通信服务还创建了四个与每个 participantId
值相关的呼叫诊断日志(每个媒体流一个)。
注意
此版本仅支持出站诊断日志。 可以修订与机器人和参与者关联的 OS 和 SDK 版本,因为通信服务以相同的方式处理参与者和机器人的标识。
示例数据
P2P 呼叫
以下是 P2P 呼叫中所有日志的共享字段:
"time": "2021-07-19T18:46:50.188Z",
"resourceId": "SUBSCRIPTIONS/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/RESOURCEGROUPS/ACS-TEST-RG/PROVIDERS/MICROSOFT.COMMUNICATION/COMMUNICATIONSERVICES/ACS-PROD-CCTS-TESTS",
"correlationId": "8d1a8374-344d-4502-b54b-ba2d6daaf0ae",
呼叫摘要日志
呼叫摘要日志共享操作和类别信息:
"operationName": "CallSummary",
"operationVersion": "1.0",
"category": "CallSummary",
以下是 VoIP 用户 1 的呼叫摘要:
"properties": {
"identifier": "acs:61fddbe3-0003-4066-97bc-6aaf143bbb84_0000000b-4fee-66cf-ac00-343a0d003158",
"callStartTime": "2021-07-19T17:54:05.113Z",
"callDuration": 6,
"callType": "P2P",
"teamsThreadId": "null",
"participantId": "null",
"participantStartTime": "2021-07-19T17:54:06.758Z",
"participantDuration": "5",
"participantEndReason": "0",
"endpointId": "570ea078-74e9-4430-9c67-464ba1fa5859",
"endpointType": "VoIP",
"sdkVersion": "1.0.1.0",
"osVersion": "Windows 10.0.17763 Arch: x64"
}
以下是 VoIP 用户 2 的呼叫摘要:
"properties": {
"identifier": "acs:7af14122-9ac7-4b81-80a8-4bf3582b42d0_06f9276d-8efe-4bdd-8c22-ebc5434903f0",
"callStartTime": "2021-07-19T17:54:05.335Z",
"callDuration": 6,
"callType": "P2P",
"teamsThreadId": "null",
"participantId": "null",
"participantStartTime": "2021-07-19T17:54:06.335Z",
"participantDuration": "5",
"participantEndReason": "0",
"endpointId": "a5bd82f9-ac38-4f4a-a0fa-bb3467cdcc64",
"endpointType": "VoIP",
"sdkVersion": "1.1.0.0",
"osVersion": "null"
}
以下是 VoIP 用户 1 的跨租户呼叫摘要日志:
"properties": {
"identifier": "1e4c59e1-r1rr-49bc-893d-990dsds8f9f5",
"callStartTime": "2022-08-14T06:18:27.010Z",
"callDuration": 520,
"callType": "P2P",
"teamsThreadId": "null",
"participantId": "null",
"participantTenantId": "02cbdb3c-155a-4b95-b829-6d56a45787ca",
"participantStartTime": "2022-08-14T06:18:27.010Z",
"participantDuration": "520",
"participantEndReason": "0",
"endpointId": "02cbdb3c-155a-4d98-b829-aaaaa61d44ea",
"endpointType": "VoIP",
"sdkVersion": "Redacted",
"osVersion": "Redacted"
}
以下是 PSTN 呼叫的呼叫摘要:
注意
无论是参与者的租户还是机器人的租户,P2P 或群组呼叫日志都会编辑 OS 和 SDK 版本。
"properties": {
"identifier": "b1999c3e-bbbb-4650-9b23-9999bdabab47",
"callStartTime": "2022-08-07T13:53:12Z",
"callDuration": 1470,
"callType": "Group",
"teamsThreadId": "19:36ec5177126fff000aaa521670c804a3@thread.v2",
"participantId": " b25cf111-73df-4e0a-a888-640000abe34d",
"participantStartTime": "2022-08-07T13:56:45Z",
"participantDuration": 960,
"participantEndReason": "0",
"endpointId": "8731d003-6c1e-4808-8159-effff000aaa2",
"endpointType": "PSTN",
"sdkVersion": "Redacted",
"osVersion": "Redacted"
}
呼叫诊断日志
呼叫诊断日志共享操作信息:
"operationName": "CallDiagnostics",
"operationVersion": "1.0",
"category": "CallDiagnostics",
以下是从 VoIP 终结点 1 到 VoIP 终结点 2 的音频流诊断日志:
"properties": {
"identifier": "acs:61fddbe3-0003-4066-97bc-6aaf143bbb84_0000000b-4fee-66cf-ac00-343a0d003158",
"participantId": "null",
"endpointId": "570ea078-74e9-4430-9c67-464ba1fa5859",
"endpointType": "VoIP",
"mediaType": "Audio",
"streamId": "1000",
"transportType": "UDP",
"roundTripTimeAvg": "82",
"roundTripTimeMax": "88",
"jitterAvg": "1",
"jitterMax": "1",
"packetLossRateAvg": "0",
"packetLossRateMax": "0"
}
以下是从 VoIP 终结点 2 到 VoIP 终结点 1 的音频流诊断日志:
"properties": {
"identifier": "acs:7af14122-9ac7-4b81-80a8-4bf3582b42d0_06f9276d-8efe-4bdd-8c22-ebc5434903f0",
"participantId": "null",
"endpointId": "a5bd82f9-ac38-4f4a-a0fa-bb3467cdcc64",
"endpointType": "VoIP",
"mediaType": "Audio",
"streamId": "1363841599",
"transportType": "UDP",
"roundTripTimeAvg": "78",
"roundTripTimeMax": "84",
"jitterAvg": "1",
"jitterMax": "1",
"packetLossRateAvg": "0",
"packetLossRateMax": "0"
}
以下是从 VoIP 终结点 1 到 VoIP 终结点 2 的视频流诊断日志:
"properties": {
"identifier": "acs:61fddbe3-0003-4066-97bc-6aaf143bbb84_0000000b-4fee-66cf-ac00-343a0d003158",
"participantId": "null",
"endpointId": "570ea078-74e9-4430-9c67-464ba1fa5859",
"endpointType": "VoIP",
"mediaType": "Video",
"streamId": "2804",
"transportType": "UDP",
"roundTripTimeAvg": "103",
"roundTripTimeMax": "143",
"jitterAvg": "0",
"jitterMax": "4",
"packetLossRateAvg": "3.146336E-05",
"packetLossRateMax": "0.001769911"
}
组呼叫
群组呼叫的数据在三个呼叫摘要日志和六个呼叫诊断日志中生成。 以下是呼叫中所有日志的共享字段:
"time": "2021-07-05T06:30:06.402Z",
"resourceId": "SUBSCRIPTIONS/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/RESOURCEGROUPS/ACS-TEST-RG/PROVIDERS/MICROSOFT.COMMUNICATION/COMMUNICATIONSERVICES/ACS-PROD-CCTS-TESTS",
"correlationId": "341acde7-8aa5-445b-a3da-2ddadca47d22",
呼叫摘要日志
呼叫摘要日志共享操作和类别信息:
"operationName": "CallSummary",
"operationVersion": "1.0",
"category": "CallSummary",
以下是 VoIP 终结点 1 的呼叫摘要:
"properties": {
"identifier": "acs:1797dbb3-f982-47b0-b98e-6a76084454f1_0000000b-1531-729f-ac00-343a0d00d975",
"callStartTime": "2021-07-05T06:16:40.240Z",
"callDuration": 87,
"callType": "Group",
"teamsThreadId": "19:meeting_MjZiOTAyN2YtZWU1Yi00ZTZiLT77777OOOOO99999jgxOTkw@thread.v2",
"participantId": "04cc26f5-a86d-481c-b9f9-7a40be4d6fba",
"participantStartTime": "2021-07-05T06:16:44.235Z",
"participantDuration": "82",
"participantEndReason": "0",
"endpointId": "5ebd55df-ffff-ffff-89e6-4f3f0453b1a6",
"endpointType": "VoIP",
"sdkVersion": "1.0.0.3",
"osVersion": "Darwin Kernel Version 18.7.0: Mon Nov 9 15:07:15 PST 2020; root:xnu-4903.272.3~3/RELEASE_ARM64_S5L8960X"
}
以下是 VoIP 终结点 3 的呼叫摘要:
"properties": {
"identifier": "acs:1797dbb3-f982-47b0-b98e-6a76084454f1_0000000b-1531-57c6-ac00-343a0d00d972",
"callStartTime": "2021-07-05T06:16:40.240Z",
"callDuration": 87,
"callType": "Group",
"teamsThreadId": "19:meeting_MjZiOTAyN2YtZWU1Yi00ZTZiLTk2ZDUtYTZlM2I2ZjgxOTkw@thread.v2",
"participantId": "1a9cb3d1-7898-4063-b3d2-26c1630ecf03",
"participantStartTime": "2021-07-05T06:16:40.240Z",
"participantDuration": "87",
"participantEndReason": "0",
"endpointId": "5ebd55df-ffff-ffff-ab89-19ff584890b7",
"endpointType": "VoIP",
"sdkVersion": "1.0.0.3",
"osVersion": "Android 11.0; Manufacturer: Google; Product: redfin; Model: Pixel 5; Hardware: redfin"
}
以下是 VoIP 终结点 2 的呼叫摘要:
"properties": {
"identifier": "null",
"callStartTime": "2021-07-05T06:16:40.240Z",
"callDuration": 87,
"callType": "Group",
"teamsThreadId": "19:meeting_MjZiOTAyN2YtZWU1Yi00ZTZiLT77777OOOOO99999jgxOTkw@thread.v2",
"participantId": "515650f7-8204-4079-ac9d-d8f4bf07b04c",
"participantStartTime": "2021-07-05T06:17:10.447Z",
"participantDuration": "52",
"participantEndReason": "0",
"endpointId": "46387150-692a-47be-8c9d-1237efe6c48b",
"endpointType": "PSTN",
"sdkVersion": "null",
"osVersion": "null"
}
以下是跨租户呼叫摘要日志:
"properties": {
"identifier": "1e4c59e1-r1rr-49bc-893d-990dsds8f9f5",
"callStartTime": "2022-08-14T06:18:27.010Z",
"callDuration": 912,
"callType": "Group",
"teamsThreadId": "19:meeting_MjZiOTAyN2YtZWU1Yi00ZTZiLT77777OOOOO99999jgxOTkw@thread.v2",
"participantId": "aa1dd7da-5922-4bb1-a4fa-e350a111fd9c",
"participantTenantId": "02cbdb3c-155a-4b95-b829-6d56a45787ca",
"participantStartTime": "2022-08-14T06:18:27.010Z",
"participantDuration": "902",
"participantEndReason": "0",
"endpointId": "02cbdb3c-155a-4d98-b829-aaaaa61d44ea",
"endpointType": "VoIP",
"sdkVersion": "Redacted",
"osVersion": "Redacted"
}
以下是将机器人作为参与者的跨租户呼叫摘要日志:
"properties": {
"identifier": "b1902c3e-b9f7-4650-9b23-9999bdabab47",
"callStartTime": "2022-08-09T16:00:32Z",
"callDuration": 1470,
"callType": "Group",
"teamsThreadId": "19:meeting_MmQwZDcwYTQtZ000HWE6NzI4LTg1YTAtNXXXXX99999ZZZZZ@thread.v2",
"participantId": "66e9d9a7-a434-4663-d91d-fb1ea73ff31e",
"participantStartTime": "2022-08-09T16:14:18Z",
"participantDuration": 644,
"participantEndReason": "0",
"endpointId": "69680ec2-5ac0-4a3c-9574-eaaa77720b82",
"endpointType": "Bot",
"sdkVersion": "Redacted",
"osVersion": "Redacted"
}
呼叫诊断日志
呼叫诊断日志共享操作信息:
"operationName": "CallDiagnostics",
"operationVersion": "1.0",
"category": "CallDiagnostics",
以下是从 VoIP 终结点 1 到服务器终结点的音频流的诊断日志:
"properties": {
"identifier": "acs:1797dbb3-f982-47b0-b98e-6a76084454f1_0000000b-1531-729f-ac00-343a0d00d975",
"participantId": "04cc26f5-a86d-481c-b9f9-7a40be4d6fba",
"endpointId": "5ebd55df-ffff-ffff-89e6-4f3f0453b1a6",
"endpointType": "VoIP",
"mediaType": "Audio",
"streamId": "14884",
"transportType": "UDP",
"roundTripTimeAvg": "46",
"roundTripTimeMax": "48",
"jitterAvg": "0",
"jitterMax": "1",
"packetLossRateAvg": "0",
"packetLossRateMax": "0"
}
以下是从服务器终结点到 VoIP 终结点 1 的音频流的诊断日志:
"properties": {
"identifier": null,
"participantId": "04cc26f5-a86d-481c-b9f9-7a40be4d6fba",
"endpointId": null,
"endpointType": "Server",
"mediaType": "Audio",
"streamId": "2001",
"transportType": "UDP",
"roundTripTimeAvg": "42",
"roundTripTimeMax": "44",
"jitterAvg": "1",
"jitterMax": "1",
"packetLossRateAvg": "0",
"packetLossRateMax": "0"
}
以下是从 VoIP 终结点 3 到服务器终结点的音频流的诊断日志:
"properties": {
"identifier": "acs:1797dbb3-f982-47b0-b98e-6a76084454f1_0000000b-1531-57c6-ac00-343a0d00d972",
"participantId": "1a9cb3d1-7898-4063-b3d2-26c1630ecf03",
"endpointId": "5ebd55df-ffff-ffff-ab89-19ff584890b7",
"endpointType": "VoIP",
"mediaType": "Audio",
"streamId": "13783",
"transportType": "UDP",
"roundTripTimeAvg": "45",
"roundTripTimeMax": "46",
"jitterAvg": "1",
"jitterMax": "2",
"packetLossRateAvg": "0",
"packetLossRateMax": "0"
}
以下是从服务器终结点到 VoIP 终结点 3 的音频流的诊断日志:
"properties": {
"identifier": "null",
"participantId": "1a9cb3d1-7898-4063-b3d2-26c1630ecf03",
"endpointId": null,
"endpointType": "Server"
"mediaType": "Audio",
"streamId": "1000",
"transportType": "UDP",
"roundTripTimeAvg": "45",
"roundTripTimeMax": "46",
"jitterAvg": "1",
"jitterMax": "4",
"packetLossRateAvg": "0",
P2P 和组呼叫的呼叫客户端操作日志和呼叫客户端媒体统计信息日志
对于呼叫客户端操作日志和呼叫客户端媒体统计信息时序日志,P2P 呼叫方案与群组呼叫方案没有区别,日志数量取决于 SDK 操作和呼叫时长。 以下代码是一个显示这些日志架构的泛型示例。
呼叫客户端操作日志
以下是“CreateView”操作的呼叫客户端操作日志:
"properties": {
"TenantId": "4e7403f8-515a-4df5-8e13-59f0e2b76e3a",
"TimeGenerated": "2024-01-09T17:06:50.3Z",
"CallClientTimeStamp": "2024-01-09T15:07:56.066Z",
"OperationName": "CreateView" ,
"CallId": "92d800c4-abde-40be-91e9-3814ee786b19",
"ParticipantId": "2656fd6c-6d4a-451d-a1a5-ce1baefc4d5c",
"OperationType": "client-api-request",
"OperationId": "0d987336-37e0-4acc-aba3-e48741d88103",
"DurationMs": "577",
"ResultType": "Succeeded",
"ResultSignature": "200",
"SdkVersion": "1.19.2.2_beta",
"UserAgent": "azure-communication-services/1.3.1-beta.1 azsdk-js-communication-calling/1.19.2-beta.2 (javascript_calling_sdk;#clientTag:904f667c-5f25-4729-9ee8-6968b0eaa40b). Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"ClientInstanceId": "d08a3d05-db90-415f-88a7-87ae74edc1dd",
"OperationPayload": "{"StreamType":"Video","StreamId":"2.0","Source":"remote","RemoteParticipantId":"remote"}",
"Type": "ACSCallClientOperations"
}
每个参与者可以有许多不同的呼叫指标。 你可以在 Azure 门户中的 Log Analytics 中运行以下查询,以列出呼叫客户端操作日志中的所有可能操作:
ACSCallClientOperations | distinct OperationName
呼叫客户端媒体统计信息时序日志
这里是媒体统计信息时序日志的示例。 它显示参与者的抖动指标,用于在特定时间戳处接收音频流。
"properties": {
"TenantId": "4e7403f8-515a-4df5-8e13-59f0e2b76e3a",
"TimeGenerated": "2024-01-10T07:36:51.771Z",
"OperationName": "CallClientMediaStatsTimeSeries" ,
"CallId": "92d800c4-abde-40be-91e9-3814ee786b19",
"CallClientTimeStamp": "2024-01-09T15:07:56.066Z",
"MetricName": "JitterInMs",
"Count": "2",
"Sum": "34",
"Average": "17",
"Minimum": "10",
"Maximum": "25",
"MediaStreamDirection": "recv",
"MediaStreamType": "audio",
"MediaStreamCodec": "OPUS",
"ParticipantId": "2656fd6c-6d4a-451d-a1a5-ce1baefc4d5c",
"ClientInstanceId": "d08a3d05-db90-415f-88a7-87ae74edc1dd",
"AggregationIntervalSeconds": "10",
"Type": "ACSCallClientMediaStatsTimeSeries"
}
每个参与者可以有许多不同的呼叫媒体统计信息指标。 可以在 Azure 门户的 Log Analytics 中运行以下查询,以显示此日志中的所有可能指标:
ACSCallClientMediaStatsTimeSeries | distinct MetricName
错误代码
participantEndReason
属性包含从一组呼叫 SDK 错误代码中获取的值。 你可以参考这些代码,以便针对每个终结点排除呼叫过程中的故障。 请参阅对通话 SDK、通话自动化 SDK、PSTN、聊天 SDK 和短信 SDK 的通话结束响应代码进行故障排除。