Collect Availability of 3-Tier Application Instances
Microsoft.SystemCenter.ApplicationMonitoring.360.Template.Dashboards.CollectAvailabilityRule (Rule)
Element properties: Member Modules:
Source Code: <Rule ID="Microsoft.SystemCenter.ApplicationMonitoring.360.Template.Dashboards.CollectAvailabilityRule" Enabled="true" Target="A3TL!Microsoft.SystemCenter.ApplicationMonitoring.360.Template.3TierApplication" ConfirmDelivery="false" Remotable="true" Priority="Normal" DiscardLevel="100">
<Category>PerformanceCollection</Category>
<DataSources>
<DataSource ID="DS" TypeID="Microsoft.Windows.TimedPowerShell.PerformanceProvider">
<IntervalSeconds>3600</IntervalSeconds>
<SyncTime/>
<ScriptName>Collect360AppAvailability.ps1</ScriptName>
<ScriptBody><Script>
Param($instanceId)
$SCOMPowerShellKey = "HKLM:\SOFTWARE\Microsoft\System Center Operations Manager\12\Setup\Powershell\V2"
$SCOMModulePath = Join-Path (Get-ItemProperty $SCOMPowerShellKey).InstallDirectory “OperationsManager”
Import-module $SCOMModulePath
function GetManagedEntityAvailability($instance)
{
$endTime = [DateTime]::UtcNow
$timeDiff = [TimeSpan]::FromHours(1)
$startTime = $endTime - $timeDiff
$params = New-Object Microsoft.EnterpriseManagement.Warehouse.StoredProcedureParameterCollection
$param = New-Object Microsoft.EnterpriseManagement.Warehouse.StoredProcedureParameter("StartTime", $startTime)
$params.Add($param)
$param = New-Object Microsoft.EnterpriseManagement.Warehouse.StoredProcedureParameter("EndTime", $endTime)
$params.Add($param)
$param = New-Object Microsoft.EnterpriseManagement.Warehouse.StoredProcedureParameter("ManagementGroup", $instance.ManagementGroup.Id)
$params.Add($param)
$param = New-Object Microsoft.EnterpriseManagement.Warehouse.StoredProcedureParameter("ManagedEntityGuid", $instance.Id)
$params.Add($param)
$param = New-Object Microsoft.EnterpriseManagement.Warehouse.StoredProcedureParameter("AggregationType", 20)
$params.Add($param)
$dw = $instance.ManagementGroup.GetDataWarehouse()
$rs = $dw.GetDataWarehouseData("SDK.Microsoft_SystemCenter_Visualization_Library_GetManagedEntityAvailability", $params)
#
# 0 - IntervalDurationMilliseconds
# 1 - InWhiteStateMilliseconds
# 2 - InGreenStateMilliseconds
# 3 - InYellowStateMilliseconds
# 4 - InRedStateMilliseconds
# 5 - InPlannedMaintenanceMilliseconds
# 6 - InUnplannedMaintenanceMilliseconds
# 7 - InDisabledStateMilliseconds
# 8 - HealthServiceUnavailableMilliseconds
#
# 2, 5, and 8 are 'available' for purposes of this calculation
# 1 is 'unknown' and will be subtracted out of the values
#
$goodTime = 0
$totalTime = $rs.Results[0].Values[0]
# return null if no value is found
if ([System.DBNull]::Value.Equals($totalTime))
{
return $null
}
else
{
$totalTime = $totalTime - $rs.Results[0].Values[1]
if ($totalTime -le 0)
{
return $null
}
$goodTime += $rs.Results[0].Values[2]
$goodTime += $rs.Results[0].Values[5]
$goodTime += $rs.Results[0].Values[8]
$percentage = (100.0 * $goodTime) / $totalTime
return $percentage
}
}
$instance = Get-SCOMClassInstance -Id $instanceId
$availability = GetManagedEntityAvailability($instance)
if ($availability -ne $null)
{
$api = New-Object -ComObject 'MOM.ScriptAPI'
$bag = $api.CreateTypedPropertyBag(2)
$bag.AddValue('Availability', [System.Double]$availability)
$api.AddItem($bag)
$bag
}
</Script> </ScriptBody>
<Parameters>
<Parameter>
<Name>instanceId</Name>
<Value>$Target/Id$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>300</TimeoutSeconds>
<StrictErrorHandling>false</StrictErrorHandling>
<ObjectName>3-Tier Application</ObjectName>
<CounterName>Availability</CounterName>
<InstanceName>$Target/Property[Type="System!System.Entity"]/DisplayName$</InstanceName>
<Value>$Data/Property[@Name='Availability']$</Value>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="WriteToDB" TypeID="SC!Microsoft.SystemCenter.CollectPerformanceData"/>
<WriteAction ID="WriteToDW" TypeID="SCDW!Microsoft.SystemCenter.DataWarehouse.PublishPerformanceData"/>
</WriteActions>
</Rule>