Creating Performance Collection Rules in SCOM 2012 with PowerShell
This is a continuation of a Data Center Automation series of posts that I have been working on with Anders Bengtsson. The first post in this series was Creating Management Packs in SCOM 2012 with PowerShell. This script is also included as an activity in the Operations Manager Admin Integration Pack.
Syntax:
.\CreatePerformanceCollectionRule.ps1 -ManagementServer 'om01.contoso.com' -ManagementPackID 'custom.example.test' -RuleID 'custom.example.test.rule.test1' -RuleName 'My Test Rule 1' -RuleDescription 'Test Rule' -RuleTarget 'Microsoft.Windows.Computer' -ComputerName '$Target/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$' -ObjectName 'Processor' -CounterName '% Processor Time' -AllInstances true -InstanceName '' -IntervalSeconds 300 -DWOnly false -Enabled true -IsOptimized true -Tolerance 10 -ToleranceType 'Percentage' -MaximumSampleSeparation 12
Parameters:
Name | Description |
ManagementServer | Name of MS to connect to |
ManagementPackID | ID of the MP you want to put the new rule in (it will create one if it doesn’t exist) |
RuleID | ID of the rule you want to create |
RuleName | Friendly name of the rule you want to create |
RuleDescription | Description of the rule |
RuleTarget | Class that you want to target the rule at |
ComputerName | Variable for the computer name. This will vary depending on your target. |
ObjectName | Name of the Performance Counter Object |
CounterName | Name of the Performance Counter |
AllInstances | Whether or not you want to collect all instances of this counter |
InstanceName | If AllInstances is false, then put the name of the instance you want to collect here or supply an empty string. |
IntervalSeconds | How often you want to collect this counter |
DWOnly | Set to true if you only want to place the counter in the data warehouse and not the OpsDB |
Enabled | Set to false if you don’t want this rule enabled by default |
IsOptimized | Set to true if you want to use the optimized data provider (see variables below) |
Tolerance | If using optimized, set this to a number. The counter won’t be collected if it doesn’t change by x number between iterations. This is optional and should only be set if you’re using the optimized data provider. |
ToleranceType | Percentage or Absolute. This is an optional parameter used if you’re using the optimized data provider. It corresponds to the Tolerance setting above. |
MaximumSampleSeparation | How many iterations will be skipped before forcing a collection. This is optional and only applies if you’re using the optimized data provider. |
1 Param(
2 [parameter(Mandatory=$true)]
3 $ManagementServer,
4 [parameter(Mandatory=$true)]
5 $ManagementPackID,
6 [parameter(Mandatory=$true)]
7 $RuleID,
8 [parameter(Mandatory=$true)]
9 $RuleName,
10 [parameter(Mandatory=$true)]
11 $RuleDescription,
12 [parameter(Mandatory=$true)]
13 $RuleTarget,
14 [parameter(Mandatory=$true)]
15 $ComputerName,
16 [parameter(Mandatory=$true)]
17 $ObjectName,
18 [parameter(Mandatory=$true)]
19 $CounterName,
20 [parameter(Mandatory=$true)]
21 $AllInstances,
22 [parameter(Mandatory=$true)]
23 $InstanceName,
24 [parameter(Mandatory=$true)]
25 $IntervalSeconds,
26 [parameter(Mandatory=$true)]
27 $DWOnly,
28 [parameter(Mandatory=$true)]
29 $Enabled,
30 [parameter(Mandatory=$true)]
31 $IsOptimized,
32 $Tolerance,
33 $ToleranceType,
34 $MaximumSampleSeparation
35 )
36
37 Write-Host "ManagementServer: "$ManagementServer
38 Write-Host "ManagementPackID: "$ManagementPackID
39 Write-Host "RuleID: "$RuleID
40 Write-Host "RuleName: "$RuleName
41 Write-Host "RuleDescription: "$RuleDescription
42 Write-Host "RuleTarget: "$RuleTarget
43 Write-Host "ComputerName: "$ComputerName
44 Write-Host "ObjectName: "$ObjectName
45 Write-Host "CounterName: "$CounterName
46 Write-Host "AllInstances: "$AllInstances
47 Write-Host "InstanceName: "$InstanceName
48 Write-Host "IntervalSeconds: "$IntervalSeconds
49 Write-Host "DWOnly: "$DWOnly
50 Write-Host "Enabled: "$Enabled
51 Write-Host "IsOptimized: "$IsOptimized
52 Write-Host "Tolerance: "$Tolerance
53 Write-Host "ToleranceType: "$ToleranceType
54 Write-Host "MaximumSampleSeparation: "$MaximumSampleSeparation
55
56 function CreateManagementPack
57 {
58 param([object]$ManagementServer, [string]$ManagementPackID)
59 $MPStore = New-Object Microsoft.EnterpriseManagement.Configuration.IO.ManagementPackFileStore
60 $MP = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPack($ManagementPackID, $ManagementPackID, (New-Object Version(1, 0, 0)), $MPStore)
61 $ManagementServer.ImportManagementPack($MP)
62 }
63
64 function CreateSystemPerformanceDataProviderModule
65 {
66 param([object]$Rule, [object]$ManagementServer)
67 $DSModuleType = $ManagementServer.GetMonitoringModuleTypes("System.Performance.DataProvider")[0]
68 $DSModule = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackDataSourceModule($Rule, "DS")
69 $DSModule.TypeID = [Microsoft.EnterpriseManagement.Configuration.ManagementPackDataSourceModuleType]$DSModuleType
70 $DSModule.Configuration = CreateSystemPerformanceDataProviderModuleConfig $CounterName $InstanceName $ObjectName $IntervalSeconds $AllInstances $ComputerName
71 $Rule.DataSourceCollection.Add($DSModule)
72 }
73
74 function CreateSystemPerformanceOptimizedDataProviderModule
75 {
76 param([object]$Rule, [object]$ManagementServer)
77 $DSModuleType = $ManagementServer.GetMonitoringModuleTypes("System.Performance.OptimizedDataProvider")[0]
78 $DSModule = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackDataSourceModule($Rule, "DS")
79 $DSModule.TypeID = [Microsoft.EnterpriseManagement.Configuration.ManagementPackDataSourceModuleType]$DSModuleType
80 $DSModule.Configuration = CreateSystemPerformanceOptimizedDataProviderModuleConfig $CounterName $InstanceName $ObjectName $IntervalSeconds $AllInstances $ComputerName $Tolerance $ToleranceType $MaximumSampleSeparation
81 $Rule.DataSourceCollection.Add($DSModule)
82 }
83
84 function CreateSystemPerformanceDataProviderModuleConfig
85 {
86 param([string]$CounterName, [string]$InstanceName, [string]$ObjectName, [int]$IntervalSeconds, [string]$AllInstances, [string]$ComputerName)
87 $oBuilder = New-Object System.Text.StringBuilder
88 [void]$oBuilder.AppendFormat("<ComputerName>{0}</ComputerName>", $ComputerName)
89 [void]$oBuilder.AppendFormat("<CounterName>{0}</CounterName>", (XMLEncode -s $CounterName))
90 [void]$oBuilder.AppendFormat("<ObjectName>{0}</ObjectName>", (XMLEncode -s $ObjectName))
91 if ($AllInstances -eq 'false') {[void]$oBuilder.AppendFormat("<InstanceName>{0}</InstanceName>", (XMLEncode -s $InstanceName))}
92 [void]$oBuilder.AppendFormat("<AllInstances>{0}</AllInstances>", $AllInstances)
93 [void]$oBuilder.AppendFormat("<Frequency>{0}</Frequency>", $IntervalSeconds)
94 return $oBuilder.ToString()
95 }
96
97 function CreateSystemPerformanceOptimizedDataProviderModuleConfig
98 {
99 param([string]$CounterName, [string]$InstanceName, [string]$ObjectName, [int]$IntervalSeconds, [string]$AllInstances, [string]$ComputerName)
100 $oBuilder = New-Object System.Text.StringBuilder
101 [void]$oBuilder.AppendFormat("<ComputerName>{0}</ComputerName>", $ComputerName)
102 [void]$oBuilder.AppendFormat("<CounterName>{0}</CounterName>", (XMLEncode -s $CounterName))
103 [void]$oBuilder.AppendFormat("<ObjectName>{0}</ObjectName>", (XMLEncode -s $ObjectName))
104 if ($AllInstances -eq 'false') {[void]$oBuilder.AppendFormat("<InstanceName>{0}</InstanceName>", (XMLEncode -s $InstanceName))}
105 else {[void]$oBuilder.Append("<InstanceName />")}
106 [void]$oBuilder.AppendFormat("<AllInstances>{0}</AllInstances>", $AllInstances)
107 [void]$oBuilder.AppendFormat("<Frequency>{0}</Frequency>", $IntervalSeconds)
108 [void]$oBuilder.AppendFormat("<Tolerance>{0}</Tolerance>", $Tolerance)
109 [void]$oBuilder.AppendFormat("<ToleranceType>{0}</ToleranceType>", $ToleranceType)
110 [void]$oBuilder.AppendFormat("<MaximumSampleSeparation>{0}</MaximumSampleSeparation>", $MaximumSampleSeparation)
111 return $oBuilder.ToString()
112 }
113
114 function CreatePerformanceCollectionWriteToDB
115 {
116 param([object]$Rule, [object]$ManagementServer)
117 $WAModuleTypeDB = $ManagementServer.GetMonitoringModuleTypes("Microsoft.SystemCenter.CollectPerformanceData")[0]
118 $WAModuleDB = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackWriteActionModule($Rule, "WriteToDB")
119 $WAModuleDB.TypeID = [Microsoft.EnterpriseManagement.Configuration.ManagementPackWriteActionModuleType]$WAModuleTypeDB
120 $Rule.WriteActionCollection.Add($WAModuleDB)
121 }
122
123 function CreatePerformanceCollectionWriteToDW
124 {
125 $WAModuleTypeDW = $ManagementServer.GetMonitoringModuleTypes("Microsoft.SystemCenter.DataWarehouse.PublishPerformanceData")[0]
126 $WAModuleDW = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackWriteActionModule($Rule, "WriteToDW")
127 $WAModuleDW.TypeID = [Microsoft.EnterpriseManagement.Configuration.ManagementPackWriteActionModuleType]$WAModuleTypeDW
128 $Rule.WriteActionCollection.Add($WAModuleDW)
129 }
130
131 function XMLEncode
132 {
133 param([string]$s)
134 $s = $s.Replace("&", "&")
135 $s = $s.Replace("<", "<")
136 $s = $s.Replace(">", ">")
137 $s = $s.Replace('"', """)
138 $s = $s.Replace("'", "'")
139 return $s.ToString()
140 }
141
142 Write-Host "Adding SCOM Snap-in"
143 Add-PSSnapin Microsoft.EnterpriseManagement.OperationsManager.Client
144
145 Write-Host "Connecting to SCOM Management Group"
146 $ManagementServer = New-Object Microsoft.EnterpriseManagement.ManagementGroup($ManagementServer)
147
148 Write-Host "Getting MP Information and Incrementing Version"
149 try
150 {
151 $MP = $ManagementServer.GetManagementPacks($ManagementPackID)[0]
152 $VIncrement = $MP.Version.ToString().Split('.')
153 $VIncrement[$VIncrement.Length - 1] = ([system.int32]::Parse($VIncrement[$VIncrement.Length - 1]) + 1).ToString()
154 $MP.Version = ([string]::Join(".", $VIncrement))
155 }
156 catch
157 {
158 Write-Host "MP Not Found, Creating New MP"
159 CreateManagementPack $ManagementServer $ManagementPackID
160 $MP = $ManagementServer.GetManagementPacks($ManagementPackID)[0]
161 }
162
163 Write-Host "Creating New Rule"
164 $Rule = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackRule($MP, $RuleID)
165
166 Write-Host "Creating Data Source Section of Rule"
167 [bool]$IsOptimized = [System.Convert]::ToBoolean($IsOptimized)
168 if (!$IsOptimized) {CreateSystemPerformanceDataProviderModule $Rule $ManagementServer}
169 else {CreateSystemPerformanceOptimizedDataProviderModule $Rule $ManagementServer}
170
171 Write-Host "Creating Write Action Section of Rule"
172 CreatePerformanceCollectionWriteToDW $Rule $ManagementServer
173 [bool]$DWOnly = [System.Convert]::ToBoolean($DWOnly)
174 if (!($DWOnly)){CreatePerformanceCollectionWriteToDB $Rule $ManagementServer}
175
176 Write-Host "Adding Rule Target"
177 $Rule.Target = $ManagementServer.GetMonitoringClasses($RuleTarget)[0]
178
179 Write-Host "Adding Rule Category"
180 $Rule.Category = [Microsoft.EnterpriseManagement.Configuration.ManagementPackCategoryType]::PerformanceCollection
181
182 Write-Host "Adding Display Name"
183 $Rule.DisplayName = (XMLEncode -s $RuleName)
184
185 Write-Host "Adding Description"
186 $Rule.Description = (XMLEncode -s $RuleDescription)
187
188 Write-Host "Setting Enabled Property"
189 [bool]$Enabled = [System.Convert]::ToBoolean($Enabled)
190 If (!($Enabled)){$Rule.Enabled = [Microsoft.EnterpriseManagement.Configuration.ManagementPackMonitoringLevel]::false}
191
192 Write-Host "Writing Changes via SDK"
193 $MP.AcceptChanges()
194
195 Write-Host "Script Completed"