System Center Manageability Live Site Collect Availability PowerShell Script Performance Timed Data Source

Microsoft.SystemCenter.Azure.CollectAvailability.PerformanceProvider (DataSourceModuleType)

Use this module for collecting performance data that uses a PowerShell script to collect the data. This module returns data of System.Performance.Data type. The schedule is based on an interval (in seconds), and can be configured to be synchronized to a specific time. The StrictErrorHandling parameter should almost always be set to "false", so that failures in the discovery will not result in the entire workflow being unloaded. For more information on this module, refer to "Operations Manager Module Types Reference" online.

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityPublic
RunAsSystem.PrivilegedMonitoringAccount
OutputTypeSystem.Performance.Data

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource System.SimpleScheduler Default
PA ProbeAction Microsoft.Windows.PowerShellPropertyBagProbe Default
CD ConditionDetection System.Performance.DataGenericMapper Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
IntervalSecondsint$Config/IntervalSeconds$Interval in Seconds
SyncTimestring$Config/SyncTime$Sync Time
TimeoutSecondsint$Config/TimeoutSeconds$Timeout Seconds

Source Code:

<DataSourceModuleType ID="Microsoft.SystemCenter.Azure.CollectAvailability.PerformanceProvider" Accessibility="Public" RunAs="System!System.PrivilegedMonitoringAccount" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="IntervalSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SyncTime" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="DS" TypeID="System!System.SimpleScheduler">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime>$Config/SyncTime$</SyncTime>
</DataSource>
<ProbeAction ID="PA" TypeID="Windows!Microsoft.Windows.PowerShellPropertyBagProbe">
<ScriptName>Microsoft.SystemCenter.Azure.CollectAvailability.PerformanceProvider.ps1</ScriptName>
<ScriptBody><Script>Param($rootEntityId)

$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

# this function is originally created by Sam Patton during 360 dashboard improvement
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
#
# 1, 2, 5, and 8 are 'available' for purposes of this calculation
#

$goodTime = 0
$totalTime = $rs.Results[0].Values[0]

$goodTime += $rs.Results[0].Values[1]
$goodTime += $rs.Results[0].Values[2]
$goodTime += $rs.Results[0].Values[5]
$goodTime += $rs.Results[0].Values[8]

$percentage = (100.0 * $goodTime) / $totalTime

return [Math]::Round($percentage, 2)
}

$instancesList = @()

# get the root managed entity instance and add into list
$rootInstance = Get-SCOMClassInstance -Id $rootEntityId
$instancesList += $rootInstance

# get all related function instances and add into list
$referenceRelationshipClass = Get-SCOMRelationship -Name Microsoft.SystemCenter.MicrosoftAzure.DA.ServiceDeployment.Contains.ClientPerspective
$clientPerspectiveInstance = Get-SCOMRelationshipInstance -SourceInstance $rootInstance | where {$_.RelationshipId -eq $referenceRelationshipClass.Id}
if($clientPerspectiveInstance -ne $null)
{
$referenceFunctionCPRelationshipClass = Get-SCOMRelationship -Name Microsoft.SystemCenter.MicrosoftAzure.DA.ClientPerspective.Hosts.Function
$relationshipInstances = Get-SCOMRelationshipInstance -SourceInstance $clientPerspectiveInstance.TargetObject | where {$_.RelationshipId -eq $referenceFunctionCPRelationshipClass.Id}

if($relationshipInstances -ne $null)
{
foreach ($relationshipInstance in $relationshipInstances)
{
$instancesList += Get-SCOMClassInstance -Id $relationshipInstance.TargetObject.Id
}
}
}

# go through each instance in the list and get the availability data and generate performance data
$api = New-Object -ComObject 'MOM.ScriptAPI'

foreach ($instance in $instancesList)
{
if($instance -ne $null)
{
$availability = GetManagedEntityAvailability($instance)

$bag = $api.CreateTypedPropertyBag(2)
$bag.AddValue('Instance', $instance.DisplayName)
$bag.AddValue('Availability', [System.Double]$availability)
$api.AddItem($bag)
$bag
}
}</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>rootEntityId</Name>
<Value>$Target/Id$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<StrictErrorHandling>false</StrictErrorHandling>
</ProbeAction>
<ConditionDetection ID="CD" TypeID="Performance!System.Performance.DataGenericMapper">
<ObjectName>Manageability</ObjectName>
<CounterName>Availability</CounterName>
<InstanceName>$Data/Property[@Name='Instance']$</InstanceName>
<Value>$Data/Property[@Name='Availability']$</Value>
</ConditionDetection>
</MemberModules>
<Composition>
<Node ID="CD">
<Node ID="PA">
<Node ID="DS"/>
</Node>
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>Performance!System.Performance.Data</OutputType>
</DataSourceModuleType>