写在前面
这将是一个完整的系列文章,关于如何使用Grafana来监控Lync/Skype for Business性能。在此之前,我从未在其他任何论坛见到过类似的文章,所以这将是任何看到这篇文档的读者第一次看到。
这个系列的文章将从不同的方面来监控Lync/Skype for Business服务器的指标,尤其是我们所熟知的一些指标,例如实时用户/设备连接数,实时会议数量,通话质量,路由组状态,服务器功能状态,CMS复制状态,甚至于TOP 10的报错,都会有一个全面的监控以及报表(Dashboard)展示。
写这一系列文章有2个目的:
- 将会对我所独立做过的这一件事的一个记录;
- 为读到这篇文章的读者一点启发,包括很多其他的产品(尤其是微软产品如Exchange,SCCM,AD等),都可以使用这样的逻辑来进行监控。
Grafana/SQL Server环境准备
这一段落的准备工作不在此文的写作范围内,论坛上很多文章都会对如何搭建Grafana以及SQL Server有详尽的步骤。所以此文假定的前提是您已经拥有了一套Grafana,以及一套已经搭建好的SQL Server环境。
下面进入到我们此系列的第一篇主题:
如何使用Grafana监控Lync/Skype服务器的实时连接用户/设备数
Skype服务器的实时用户/设备连接数来源
Skype服务器的实时连接用户数主要来源于Performace counter的数据,我们可以通过以下Powershell命令获取:
Get-Counter -ComputerName FrontEndServeName "\LS:USrv - Endpoint Cache\USrv - Active Registered Endpoints","\LS:USrv - Endpoint Cache\USrv - Active Registered Users" | Select-Object -ExpandProperty CounterSamples
多台Skype前端服务器的数据获取
当我们有多台Skype前端服务器时,我们可以对上一步骤中的命令进行扩展,生成一个脚本来遍历这些前端服务器,之后将数据存储在array中,代码如下:
$ConnectedEndpointArray = @()
$ConnectedUserArray = @()
$array = @()
foreach($FrontEndServer in (Get-CsPool -Identity FrontEndPoolName).Computers){
$Results = Get-Counter -ComputerName $FrontEndServer "\LS:USrv - Endpoint Cache\USrv - Active Registered Endpoints","\LS:USrv - Endpoint Cache\USrv - Active Registered Users" |
Select-Object -ExpandProperty CounterSamples
$ConnectedEndpoint = ($Results | select -ExpandProperty CookedValue)[0]
$ConnectedUser = ($Results | select -ExpandProperty CookedValue)[1]
$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name ServerName -Value $FrontEndServer
$obj | Add-Member -MemberType NoteProperty -Name ConnectedUser -Value $ConnectedUser
$obj | Add-Member -MemberType NoteProperty -Name ConnectedEndpoint -Value $ConnectedEndpoint
$array += $obj
$ConnectedEndpointArray += $ConnectedEndpoint
$ConnectedUserArray += $ConnectedUser
}
$ConnectedEndpointCount = $ConnectedEndpointArray | measure -Sum | select -ExpandProperty Sum
$ConnectedUserCount = $ConnectedUserArray | measure -Sum | select -ExpandProperty Sum
执行这段代码之后,我们就能得到前端池上的所有实时连接的用户以及设备数,并对其进行求和,分别存储在$ConnectedEndpointCount和$ConnectedUserCount这两个变量中,如下为结果示例:
在SQL Server中为数据存储创建表格
我们获取到上面步骤的数据之后,接下来我们就要到SQL Server中创建一个表格,用于将这些数据导入进去,并为之后Grafana取数来使用,创建表格SQL语句如下:
Create Table ActiveLyncUserAndEndpointCount
(
Date datetime,
Server nvarchar(450),
LyncUserCount int,
LyncEndpointCount int
)
将数据导入至SQL Server表中
SQL表创建完成后,我们可以使用如下Powershell脚本,来将导出的数据导入进去,脚本如下:
#Connect to SQL database
Function SQLConnectionSQL
{
param
(
[string]$server,
[string]$database,
[string]$uid,
[string]$pwd
)
$SQLCon = New-Object System.Data.SqlClient.SqlConnection
$SQLCon.ConnectionString = "Data Source=$server;Initial Catalog=$database;User ID=$uid;pwd=$pwd;"
try
{
$SQLCon.Open()
return $SQLCon
}
catch [exception]
{
Write-Warning ('Connect to database failed with error message:{0}' -f ,$_)
$SQLCon.Dispose()
return $null
}
}
$converttime = (get-date).AddHours(-8) | Get-Date -format "yyyy-MM-dd HH:mm:ss"
$Server = 'SQLServerName'
$DBName = 'DBName'
$userName = "UserName"
$Cred = "Password"
$conn = SQLConnectionSQL -server $Server -database $DBName -uid $userName -pwd $Cred
#导入单台前端数据
foreach($i in $array){
$ServerName = $i.ServerName
[int]$ConnectedUser = $i.ConnectedUser
[int]$ConnectedEndpoint = $i.ConnectedEndpoint
$cmd = "INSERT INTO ActiveLyncUserAndEndpointCount VALUES ('$converttime','$ServerName','$ConnectedUser','$ConnectedEndpoint')"
SQLCommand -SQLConnection $conn -command $cmd
}
#导入所有前端总数据
$cmd1 = "INSERT INTO ActiveLyncUserAndEndpointCount VALUES ('$converttime','TotalCount','$ConnectedUserCount','$ConnectedEndpointCount')"
SQLCommand -SQLConnection $conn -command $cmd1
导入完成后,我们看到的示例数据如下,其中包括了每台前端服务器的实时连接用户/设备数,以及总的连接数:
创建一个自动化任务计划(Task Schedule)
当我们将以上脚本各个部分整合之后,会形成一个完整的脚本,实现从数据采集到导入数据至SQL Server表中。那么为了实时获取到这些数据,我们需要创建一个任务计划,来设置为每3分钟采集一次数据。
任务计划的主要配置如下:
字段信息示例如下:
- Porgram/script : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
- Add Arguments(optional):-File D:\scrpit\GetSkypeUserAndEndpointConnection\Get-SkypeUserAndEndpointConnection.ps1
在Grafana中添加数据源
当我们做完以上所有工作后,我们实现了:
从Skype前端服务器获取数据->将数据每间隔3分钟,导入至SQL Server表中。那么接下来,我们需要在Grafana中添加数据源。这一部分将不在此文中赘述,论坛上有很多文章都会涉及到详尽的步骤。此文假定您已经将SQL Server数据源加入到了Grafana中。
为Grafana配置变量
为了同时展示每台Skype前端服务器的实时连接数,我们需要为这些服务器配置变量:
在Grafana的Dashboard界面,点击右上角的Dashboard settings:
之后在Variables中定义变量$FrontEdnServers,并输入SQL查询语句以从之前导入数据的表格中获取到服务器名,示例如下:
Select DISTINCT Server from [DB].[dbo].[TableName] Order By Server
在Grafana中创建Dashboard
变量创建完成后,我们即可到Dashboard界面创建我们的第一个Dashboard
为单台Skype前端服务器创建Dashboard
点击左侧的➕:
在弹出的New Panel界面,选择Add Query:
我们在Query的配置界面,选择之前添加的对应的SQL数据源,之后输入以下SQL查询语句,并选择时序(Time series)格式:
select TOP 1 LyncUserCount as 'User Count',LyncEndpointCount as 'Endpoint Count',$__timeEpoch(Date)
from [DB].[dbo].[TableName]
Where Server = '$FrontEndServers'
order by Date DESC
在Visualization界面,我们选择Gauge,并进行如下配置:
在General界面,为Dashboard起一个Title,之后保存:
最终我们将得到下面的一个Dashboard。同时由于我们设置了变量,可以点击箭头的位置来进行服务器切换以查看不同服务器的实时连接数:
为Skype前端服务器池创建Dashboard
除了展示单台服务器以外,通常情况下,我们还需要展示整个Skype前端池的实时连接数,并且需要看到变化趋势,那么我们可以按照如下步骤进行配置。
同单台配置相同,我们选择数据源之后,输入如下SQL语句:
SELECT
$__timeEpoch(Date),
LyncUserCount as 'Total User Count',
LyncEndpointCount as 'Total Endpoint Count'
FROM
[DB].[dbo].[TableName]
Where
Server = 'TotalCount'
ORDER BY
Date ASC
在Visualization界面我们进行如下配置:
为Dashboard命名,之后保存:
最终我们得到如下的一个用于查看实时连接总数的趋势图:
Dashboard效果展示
完成单台与多台的Dashboard之后,我们可以整合这两部分,最终的效果展示如下:
本章总结
在此篇文章中,我们了解了:
- 如何获取Skype服务器实时连接用户数/设备数
- 如何将数据导入SQL Server表
- 如何通过Grafana展示数据
在此系列文章的下一部分,我们将继续使用Grafana来展示如何获取服务器的实时会议数。