Collect Availability of 3-Tier Application Instances

Microsoft.SystemCenter.ApplicationMonitoring.360.Template.Dashboards.CollectAvailabilityRule (Rule)

Element properties:

TargetMicrosoft.SystemCenter.ApplicationMonitoring.360.Template.3TierApplication
CategoryPerformanceCollection
EnabledTrue
Alert GenerateFalse
RemotableTrue

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Windows.TimedPowerShell.PerformanceProvider Default
WriteToDB WriteAction Microsoft.SystemCenter.CollectPerformanceData Default
WriteToDW WriteAction Microsoft.SystemCenter.DataWarehouse.PublishPerformanceData Default

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 &#x201C;OperationsManager&#x201D;
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>