但企业使用Lync Server或者Skype for Business时,涉及到多种登陆客户端版本以及语音通话,用户状态等信息,这些信息如果提取出来进行分析,相信对于运维管理员来说是非常有帮助,可以快速直观了解到当前时间整个企业环境中用户使用Lync或SFB(Skype for Business)的状态,虽然Lync Server或SFB Server提供了默认的报表功能,但对于我们管理员来说更像看到定制化的数据并实时或及时展现,那么下面我就采用PowerBI为大家演示如何进行这些数据的提取以及展现

在此之前呢,需要先连接下SFB的数据库结构以及每一个数据库负责什么功能类型的数据

  • RTC实例:负责存储所有后端数据库,包括主CMS,响应组配置,位置数据等(RTC也是SFB的默认实例名称)

clip_image001

  • rgsconfig:包含响应组的配置,如代理,工作流,队列等

clip_image002

  • cpsdyn:包含呼叫寄存的动态信息

  • rtcshared:承载会议目录

  • rgsdyn:包含响应组使用的动态“实时”信息

  • XDS:这是SFB的中央管理存储数据库(CMS),包含Lync拓扑,配置和策略

  • RTCAB:存储SFB的地址薄信息

  • RTCXDS:存储用户数据的备份

  • LIS:存储Lync服务器的位置配置信息,如子网,端口,交换机等

clip_image003

  • RTCLOCAL实例:负责存储主CMS数据库的本地副本

clip_image004

  • RTC:存储用户信息,如联系人列表,预定的会议等

  • RTCDYN:存储用户的动态实时数据,如当前状态,从什么设备登陆等信息

  • LYNCLOCAL实例:

clip_image005

  • lyss:是一个存储框架,供不同SFB存储服务使用者访问SFB的存储平台,例如与Exchange集成的存档信息

  • 归档和监控实例(MSSQLSEVER):负责存储归档信息和监控数据

clip_image006

  • LCSlog:存储即时消息内容,P2P呼叫和会议数据信息

  • LCSCdr:存储详细的呼叫通话记录

  • QoEMetrics:存储呼叫使用体验质量的数据

了解了各个实例和数据库的存储用途就方便进行获取数据来进行分析了

我先来做一个UCMA的客户端连接统计分析,什么是UCMA呢?

UCMA是为了统一通信和协作提供了灵活的托管代码平台

首先还是先从SFB的SQL数据库中获取数据

clip_image007

输入SFB的SQL数据库

Select top 1000 (cast (RE.ClientApp as varchar (100))) as ClientVersion, R.UserAtHost as UserName, FE.Fqdn

  From rtcdyn.dbo.RegistrarEndpoint RE

  Inner Join rtcdyn.dbo.Endpoint EP on RE.EndpointId = EP.EndpointId

  Inner Join rtc.dbo.Resource R on R.ResourceId = RE.OwnerId

  Inner Join rtcdyn.dbo.FrontEnd FE on EP.RegistrarId = FE.FrontEndId

  Order By ClientVersion, UserName

clip_image008

输入访问凭证

clip_image009

加载,然后选择一个饼图,把ClientVersion放入图例中,把ClientVersion放入值里并选择计数

PS:因为我这没有UCMA访问连接数据故此图标没有任何数据展示出来

clip_image010

clip_image011

接下来我将再添加一个图标统计一个用户拥有多种客户端登陆我们如何展现出来的方法

同样的先获取SFB的SQL数据库

clip_image012

输入实例和数据库以及查询

SELECT rtc.dbo.Resource.UserAtHost as 'SIP Address', CAST(rtcdyn.dbo.RegistrarEndpoint.ClientApp as varchar(100)) as 'Client Version'

FROM rtcdyn.dbo.RegistrarEndpoint

INNER JOIN rtc.dbo.Resource

ON rtcdyn.dbo.RegistrarEndpoint.OwnerId = rtc.dbo.Resource.ResourceId

WHERE IsServerSource = 0

clip_image013

可以看到预览出来的2条数据,显示的是当前正在登陆使用的用户,分别是一个用户登陆的SFB以及一个SIP话机登陆的SFB,点击加载

clip_image014

分别添加2个切片器,分别在2个切片器选择SIP Address和Client Version查看每一个用户拥有登陆的客户端版本或者每一个客户端版本对应哪些用户在使用的分析展现

clip_image015

再添加一个饼图查看客户端占比情况,这时如果有新的用户登陆,那么数据也是可以点击刷新获取到的

clip_image016

接下来我想了解统计每一个用户的状态,是空闲还是忙碌还是离开等,同样先获取SFB的SQL数据库

SELECT LOWER(UserAtHost) AS UserAtHost, Status=

CASE

WHEN Availability BETWEEN 0 AND 2999 THEN Availability

WHEN Availability BETWEEN 3000 AND 4499 THEN 'Available'

WHEN Availability BETWEEN 4500 and 5999 THEN 'Available - Idle'

WHEN Availability BETWEEN 6000 and 7499 THEN 'Busy'

WHEN Availability BETWEEN 7500 and 8999 THEN 'Busy - Idle'

WHEN Availability BETWEEN 9000 and 11999 THEN 'Do not Disturb'

WHEN Availability BETWEEN 12000 and 14999 THEN 'Be right back'

WHEN Availability BETWEEN 15000 and 17999 THEN 'Away'

WHEN Availability >= 18000 THEN 'Offline'

END,

LastPubTime

FROM rtc.dbo.Resource Resource

RIGHT JOIN (

SELECT

Instance.PublisherId,

SUBSTRING(Instance.Data, CHARINDEX('<availability>', Instance.Data) + 14, CHARINDEX('</availability>', Instance.Data) - CHARINDEX('<availability>', Instance.Data) - 14) AS Availability,

Instance.LastPubTime

FROM (

SELECT PublisherId, cast(substring(Data, 0, 256) AS varchar(256)) AS Data, LastPubTime FROM rtcdyn.dbo.PublishedInstance WHERE ContainerNum = 2 AND CategoryId = 4

UNION ALL

SELECT PublisherId, cast(substring(Data, 0, 256) AS varchar(256)) AS Data, LastPubTime FROM rtc.dbo.PublishedStaticInstance WHERE ContainerNum = 2 AND CategoryId = 4

) AS Instance

WHERE

CHARINDEX('aggregateState', Data) > 0

) AS UserAndAvailability ON Resource.ResourceId = PublisherId

/*WHERE UserAtHost = 'somebody@example.com' COLLATE SQL_Latin1_General_CP1_CI_AS*/

ORDER BY UserAtHost, LastPubTime DESC

clip_image017

点击加载,可以预览看到用户的状态,这里大部分都是Offine

clip_image018

创建一个环形图,并把Status状态作为图例,UserAtHost百分比作为值,这样可以统计看到不在线的占多少,在线的占多少

clip_image019

接下来再继续看看音频呼叫的质量状况,主要想看看每天平均的丢包率以及MOS意见平均分数

首先先来看看每天的平均丢包率

同样的,先获取SFB的SQL数据

select top 10000 convert(date,SessionTime) as [Date], avg(PacketLo***ate) as [Packet Loss Rate] from AudioStreamDetailView group by convert(date,SessionTime) order by convert(date,SessionTime)

clip_image020

加载

clip_image021

拖一个堆积面积图,Date设置轴,把Packet Loss Rate作为值,再开启数据标签即可看到走势

clip_image022

接下来再看看MOS意见平均分数

 select top 10000 convert(date,SessionTime) as [Date], avg(OverallAvgNetworkMOS) as [Overall MOS] from AudioStreamDetailView group by convert(date,SessionTime) order by convert(date,SessionTime)

clip_image023

加载

clip_image024

还是选择堆积面积图,把Date设置为轴,把Overall MOS设置值并选择平均值

clip_image025

在上面这张图做好的基础上,我再点击分区图,把该视图从堆积面积图改成分区图

clip_image026

在分区图下可以添加走向线,进行数据预测走向

clip_image027

可以设置走向线的参数

clip_image028

同理我再把之前做的每日平均丢包率的堆积面积图也改成分区图并添加一个平均线

clip_image029

接下来把每一个可视化视图都添加下标题便于识别该视图是显示的什么标题

clip_image030

接下来再做一个分析就是我们经常会用到Lync或SFB的屏幕共享,那么我们需要监测下这个RDP的延迟,一般低于400毫秒是用户体验最好的,所以我们也可以基于400毫秒为基线来进行监测

同样先获取SFB的SQL数据

select top 10000 convert(date,StartTime) as [Date], avg (RDPTileProcessingLatencyAverage) as [Latency] from ASCallAggView group by convert(date,StartTime) order by convert(date,StartTime)

clip_image031

拉一个分区图,把Date作为轴,Latency作为值,因为我的是测试环境没人共享,所以看不到数据,但需要添加一个恒线设置值为400,这样就看到每一个用户查看每一帧所需的时间与恒线400毫秒比对是高还是低作为用户体验是好是坏的评判依据了

clip_image032

按照同样的方法再创建一个分区图,来测量电话会议中应用程序共享时的抖动

select top 10000 convert(date,ConferenceDateTime) as [Date], avg (JitterInterArrival) as [Jitter] from QoEReportsASCallListView group by convert(date,ConferenceDateTime) order by convert(date,ConferenceDateTime)

clip_image033

以Date为轴,Jitter的计数或者平均值来作为值

clip_image034

我会定义三个常量值来分别定义好,一般,差的水平,这3个水平线也用不同的颜色区分,绿色代表好,×××一般,红色差

clip_image035

接下来再创建一个呼叫报告,按周来统计查看呼叫记录

select top 10000 DATEPART(wk,SessionIdTime) as [Week], count(*) as Calls from VoipDetailsView where year(getdate()) = year(SessionIdTime) and (ToUri = 'uri@domain.com') group by DATEPART(wk,SessionIdTime) order by DATEPART(wk,SessionIdTime)

clip_image036

以week为轴,Calls的计数为值,开启数据表标签和走向线

PS:测试环境没有数据,所以这里空白(好尴尬啊)

clip_image037

如果我们要为指定的一个用户创建生成一组数据展示3个月的呼叫和分钟数,那么我们需要再添加2个可视化视图,一个视图用于数据表,一个用户电话分钟数

select top 1000 Convert(date, SessionIdTime) as [Date], SessionIdTime,ToPhone as [To Phone], FromPhone as [From Phone], ResponseTime as [Start Time], EndTime as [End Time], DATEDIFF(mi,ResponseTime, EndTime) as [Minutes] from VoipDetailsView where InviteTime > getdate()-93 and InviteTime < getdate()+1 and (ToUri = 'user@domain' or FromUri = 'user@domain') order by SessionIdTime desc

clip_image038

拖一个表来显示这些所有的通话记录数据,当然还可以再添加一个分区图来看通话时间的分析,因为测试环境没有数据,所有我这里不再演示,基本和上面的分区图设置是差不多的

clip_image039

接下来加入噪音监测

select top 10000 convert(date,SessionTime) as [Date], avg(CallerRxAGCNoiseLevel) as [Caller Noise], avg(CalleeRxAGCNoiseLevel) as [Callee Noise] from AudioStreamDetailView group by convert(date,SessionTime) order by convert(date,SessionTime)

clip_image040

加载

clip_image041

选择折线图,以日期为轴,噪音为值

clip_image042

最后我再分析一个视频通话的发送接收丢失率和低速率百分比分析

select top 10000 convert(date,ConferenceDateTime) as [Date], avg (SendFrameRateAverage) as [Send Frame Rate], avg(RecvFrameRateAverage) as [Receive Frame Rate], avg(VideoPacketLo***ate) as [Video Loss Rate], avg(LowFrameRateCallPercent) as [Low Rate Percent] from QoEReportsVideoUserAgentView group by convert(date,ConferenceDateTime) order by convert(date,ConferenceDateTime)

clip_image043

拖一个簇状柱形图,以Date为轴,其他均为值,很可惜我这里也是没有数据,所以只能把功能介绍给大家了

clip_image044

最后经过我的排版和美化就大功告成了

clip_image045