如何创建具有三种状态的SCOM管理包监视器

时间:2018-02-13 11:34:49

标签: c# monitoring health-monitoring scom management-pack

我开发与SCOM的集成。但我是一个绿色的手。

我创建了管理包XML,它运行正常。

请查看以下管理包:

Not monitored

我已使用SCOM SDKImportManagementPack方法安装了此管理包。

我也开发了example中描述的入站连接器。

我可以使用我的连接器发送发现数据,性能指标和事件。它工作正常。

导入成功的结果在屏幕截图中: enter image description here

正确创建了监控对象。

但是这些对象有Resource Status健康状态。

我的主要问题是如何改变健康状况?

我对健康状况的逻辑非常简单:

  1. 如果Ready(请在屏幕截图和管理包XML中查看此属性)属性等于Success,则健康状态为Resource Status
  2. 如果Down属性等于Error,则健康状态为Not monitored
  3. 否则健康状况为Param( [array]$ServersToQuery = (hostname), [datetime]$StartTime = "January 1, 1970" ) foreach ($Server in $ServersToQuery) { $LogFilter = @{ LogName = 'Microsoft-Windows-TerminalServices-LocalSessionManager/Operational' ID = 21, 23, 24, 25 StartTime = $StartTime } $AllEntries = Get-WinEvent -FilterHashtable $LogFilter -ComputerName $Server $AllEntries | Foreach { $entry = [xml]$_.ToXml() [array]$Output += New-Object PSObject -Property @{ TimeCreated = $_.TimeCreated User = $entry.Event.UserData.EventXML.User IPAddress = $entry.Event.UserData.EventXML.Address EventID = $entry.Event.System.EventID ServerName = $Server } } } $FilteredOutput += $Output | Select TimeCreated, User, ServerName, IPAddress, @{Name='Action';Expression={ if ($_.EventID -eq '21'){"logon"} if ($_.EventID -eq '22'){"Shell start"} if ($_.EventID -eq '23'){"logoff"} if ($_.EventID -eq '24'){"disconnected"} if ($_.EventID -eq '25'){"reconnection"} } } $Date = (Get-Date -Format s) -replace ":", "." $FilePath = "$env:USERPROFILE\Desktop\$Date`_RDP_Report.csv" $FilteredOutput | Sort TimeCreated | Export-Csv $FilePath -NoTypeInformation Write-host "Writing File: $FilePath" -ForegroundColor Cyan Write-host "Done!" -ForegroundColor Cyan
  4. 我查看了很多文档(herehere),发现我需要创建监视器,监视器类型,表达式规则来改变健康状态。

    我还检查了XML示例here

    但我不明白如何定义我的表达式以及如何向管理包XML文件添加必要的信息。

    对我来说,最好的答案是完整的XML示例,其中包含我的逻辑表达式规则的实现。

    提前致谢。

1 个答案:

答案 0 :(得分:2)

首先让我警告你,这不是通过可发现的类属性监视某些东西的合适方法。 SCOM数据库是在假设的情况下设计的,所有配置属性都是静态的。比如说,磁盘大小或CPU数量并不经常变化。通过这样做,您将导致配置流失。有关详细信息,请参阅Kevin Holman的文章:https://blogs.technet.microsoft.com/kevinholman/2009/10/04/what-is-config-churn/

但是,你仍然可以做到这一点。请参考下面的MP XML。主要思想是制作一个伪造的脚本,在一个Property Bag中打包class属性,然后条件检测可以分析它。

请注意,您无法将显示器设置为"未初始化"陈述明确。仅在以下情况下才会初始化监视器:

  1. 它刚刚创建。
  2. 退出维护模式。
  3. 监控工作流程可以发送信号以将监视器设置为健康,警告或严重状态,但如果没有信号,则健康状态会保留其最后状态。

    另请注意,我使用了2007方案和对齐引用,以及更改了别名。我还没有对它进行过测试,但它编译时没有错误。 ENU现在是一种默认语言。

    <ManagementPack ContentReadable="true" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Manifest>
        <Identity>
          <ID>CloudMonix.ResourceMonitoring</ID>
          <Version>1.0.0.6</Version>
        </Identity>
        <Name>CloudMonix.ResourceMonitoring</Name>
        <References>
          <Reference Alias="SC">
            <ID>Microsoft.SystemCenter.Library</ID>
            <Version>6.1.7221.0</Version>
            <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
          </Reference>
          <Reference Alias="Windows">
            <ID>Microsoft.Windows.Library</ID>
            <Version>6.1.7221.0</Version>
            <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
          </Reference>
          <Reference Alias="Health">
            <ID>System.Health.Library</ID>
            <Version>6.1.7221.0</Version>
            <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
          </Reference>
          <Reference Alias="System">
            <ID>System.Library</ID>
            <Version>6.1.7221.0</Version>
            <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
          </Reference>
        </References>
      </Manifest>
      <TypeDefinitions>
        <EntityTypes>
          <ClassTypes>
            <ClassType ID="CloudMonix.ResourceMonitoring.Resource" Accessibility="Public" Abstract="false" Base="System!System.Entity" Hosted="false" Singleton="false">
              <Property ID="ResourceId" Type="string" Key="true" CaseSensitive="false" MinLength="1" Length="256" />
              <Property ID="ResourceType" Type="string" Key="false" CaseSensitive="false" MinLength="1" Length="256" />
              <Property ID="ResourceStatus" Type="string" Key="false" CaseSensitive="false" MinLength="1" Length="256" />
              <Property ID="ResourceGroups" Type="string" Key="false" CaseSensitive="false" MinLength="1" Length="1024" />
            </ClassType>
          </ClassTypes>
        </EntityTypes>
        <ModuleTypes>
          <DataSourceModuleType ID="CloudMonix.ResourceMonitoring.ResourceStatus.DataSource" Accessibility="Internal" Batching="false">
            <Configuration>
              <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
              <xsd:element minOccurs="0" name="SyncTime" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
              <xsd:element minOccurs="1" name="ResourceStatus" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
            </Configuration>
            <OverrideableParameters>
              <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
              <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
            </OverrideableParameters>
            <ModuleImplementation>
              <Composite>
                <MemberModules>
                  <DataSource ID="DS_Scheduler" TypeID="System!System.Scheduler">
                    <Scheduler>
                      <SimpleReccuringSchedule>
                        <Interval Unit="Seconds">$Config/IntervalSeconds$</Interval>
                        <SyncTime>$Config/SyncTime$</SyncTime>
                      </SimpleReccuringSchedule>
                      <ExcludeDates />
                    </Scheduler>
                  </DataSource>
                  <ProbeAction ID="PA_PackageData" TypeID="Windows!Microsoft.Windows.PowerShellPropertyBagProbe">
                    <ScriptName>Set-PropertyBagWithValue.ps1</ScriptName>
                    <ScriptBody>
    
    param($data)
    $api = New-Object -comObject 'MOM.ScriptAPI'
    $bag = $api.CreatePropertyBag()
    $bag.AddValue("ResourceStatus", $data)
    $bag
    
                    </ScriptBody>
                    <Parameters>
                      <Parameter>
                        <Name>data</Name>
                        <Value>$Config/ResourceStatus$</Value>
                      </Parameter>
                    </Parameters>
                    <TimeoutSeconds>300</TimeoutSeconds>
                  </ProbeAction>
                </MemberModules>
                <Composition>
                  <Node ID="PA_PackageData">
                    <Node ID="DS_Scheduler" />
                  </Node>
                </Composition>
              </Composite>
            </ModuleImplementation>
            <OutputType>System!System.PropertyBagData</OutputType>
          </DataSourceModuleType>
        </ModuleTypes>
        <MonitorTypes>
          <UnitMonitorType ID="CloudMonix.ResourceMonitoring.ResourceStatus.MonitorType" Accessibility="Internal">
            <MonitorTypeStates>
              <MonitorTypeState ID="Ready" NoDetection="false" />
              <MonitorTypeState ID="Down" NoDetection="false" />
            </MonitorTypeStates>
            <Configuration>
              <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
              <xsd:element minOccurs="0" name="SyncTime" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
              <xsd:element minOccurs="1" name="ResourceStatus" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
            </Configuration>
            <OverrideableParameters>
              <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
              <OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string" />
            </OverrideableParameters>
            <MonitorImplementation>
              <MemberModules>
                <DataSource ID="DS_ResourceStatus" TypeID="CloudMonix.ResourceMonitoring.ResourceStatus.DataSource">
                  <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                  <SyncTime>$Config/SyncTime$</SyncTime>
                  <ResourceStatus>$Config/ResourceStatus$</ResourceStatus>
                </DataSource>
                <ConditionDetection ID="CD_Ready" TypeID="System!System.ExpressionFilter">
                  <Expression>
                    <SimpleExpression>
                      <ValueExpression>
                        <XPathQuery Type="String">Property[@Name='ResourceStatus']</XPathQuery>
                      </ValueExpression>
                      <Operator>Equal</Operator>
                      <ValueExpression>
                        <Value Type="String">Ready</Value>
                      </ValueExpression>
                    </SimpleExpression>
                  </Expression>
                </ConditionDetection>
                <ConditionDetection ID="CD_Down" TypeID="System!System.ExpressionFilter">
                  <Expression>
                    <SimpleExpression>
                      <ValueExpression>
                        <XPathQuery Type="String">Property[@Name='ResourceStatus']</XPathQuery>
                      </ValueExpression>
                      <Operator>Equal</Operator>
                      <ValueExpression>
                        <Value Type="String">Down</Value>
                      </ValueExpression>
                    </SimpleExpression>
                  </Expression>
                </ConditionDetection>
              </MemberModules>
              <RegularDetections>
                <RegularDetection MonitorTypeStateID="Ready">
                  <Node ID="CD_Ready">
                    <Node ID="DS_ResourceStatus" />
                  </Node>
                </RegularDetection>
                <RegularDetection MonitorTypeStateID="Down">
                  <Node ID="CD_Down">
                    <Node ID="DS_ResourceStatus" />
                  </Node>
                </RegularDetection>
              </RegularDetections>
            </MonitorImplementation>
          </UnitMonitorType>
        </MonitorTypes>
      </TypeDefinitions>
      <Monitoring>
        <Monitors>
          <UnitMonitor ID="CloudMonix.ResourceMonitoring.ResourceStatus.UnitMonitor" Accessibility="Public" Enabled="true" Target="CloudMonix.ResourceMonitoring.Resource" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="CloudMonix.ResourceMonitoring.ResourceStatus.MonitorType" ConfirmDelivery="false">
            <Category>AvailabilityHealth</Category>
            <AlertSettings AlertMessage="CloudMonix.ResourceMonitoring.ResourceStatus.UnitMonitor.AlertMessage">
              <AlertOnState>Error</AlertOnState>
              <AutoResolve>true</AutoResolve>
              <AlertPriority>Normal</AlertPriority>
              <AlertSeverity>MatchMonitorHealth</AlertSeverity>
            </AlertSettings>
            <OperationalStates>
              <OperationalState ID="Ready" MonitorTypeStateID="Ready" HealthState="Success" />
              <OperationalState ID="Down" MonitorTypeStateID="Down" HealthState="Error" />
            </OperationalStates>
            <Configuration>
              <IntervalSeconds>300</IntervalSeconds>
              <SyncTime />
              <ResourceStatus>$Target/Property[Type="CloudMonix.ResourceMonitoring.Resource"]/ResourceStatus$</ResourceStatus>
            </Configuration>
          </UnitMonitor>
        </Monitors>
      </Monitoring>
      <Presentation>
        <Views>
          <View ID="CloudMonix.ResourceMonitoring.MainView" Accessibility="Public" Enabled="true" Target="CloudMonix.ResourceMonitoring.Resource" TypeID="SC!Microsoft.SystemCenter.StateViewType" Visible="true">
            <Category>Operations</Category>
            <Criteria>
              <InMaintenanceMode>false</InMaintenanceMode>
            </Criteria>
            <Presentation>
              <ColumnInfo Index="0" SortIndex="0" Width="100" Grouped="false" Sorted="true" IsSortable="true" Visible="true" SortOrder="Descending">
                <Name>State</Name>
                <Id>CloudMonix.ResourceMonitoring.Resource</Id>
              </ColumnInfo>
              <ColumnInfo Index="1" SortIndex="-1" Width="100" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
                <Name>Resource Type</Name>
                <Id>ResourceType</Id>
              </ColumnInfo>
              <ColumnInfo Index="2" SortIndex="-1" Width="100" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
                <Name>Resource Name</Name>
                <Id>DisplayName</Id>
              </ColumnInfo>
              <ColumnInfo Index="3" SortIndex="-1" Width="100" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
                <Name>Resource Status</Name>
                <Id>ResourceStatus</Id>
              </ColumnInfo>
              <ColumnInfo Index="4" SortIndex="-1" Width="100" Grouped="false" Sorted="false" IsSortable="true" Visible="true" SortOrder="Ascending">
                <Name>Resource Groups</Name>
                <Id>ResourceGroups</Id>
              </ColumnInfo>
            </Presentation>
            <Target />
          </View>
        </Views>
        <Folders>
          <Folder ID="CloudMonix.ResourceMonitoring.MainFolder" Accessibility="Public" ParentFolder="SC!Microsoft.SystemCenter.Monitoring.ViewFolder.Root" />
        </Folders>
        <FolderItems>
          <FolderItem ElementID="CloudMonix.ResourceMonitoring.MainView" Folder="CloudMonix.ResourceMonitoring.MainFolder" />
        </FolderItems>
        <StringResources>
          <StringResource ID="CloudMonix.ResourceMonitoring.ResourceStatus.UnitMonitor.AlertMessage" />
        </StringResources>
      </Presentation>
      <LanguagePacks>
        <LanguagePack ID="ENU" IsDefault="true">
          <DisplayStrings>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring">
              <Name>CloudMonix Resource Monitoring</Name>
              <Description></Description>
            </DisplayString>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring.MainFolder">
              <Name>CloudMonix Folder</Name>
              <Description></Description>
            </DisplayString>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring.MainView">
              <Name>CloudMonix Resource View</Name>
              <Description></Description>
            </DisplayString>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring.Resource">
              <Name>CloudMonix Resource</Name>
              <Description></Description>
            </DisplayString>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring.Resource" SubElementID="ResourceId">
              <Name>Resource Id</Name>
              <Description></Description>
            </DisplayString>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring.Resource" SubElementID="ResourceType">
              <Name>Resource Type</Name>
              <Description></Description>
            </DisplayString>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring.Resource" SubElementID="ResourceStatus">
              <Name>Resource Status</Name>
              <Description></Description>
            </DisplayString>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring.Resource" SubElementID="ResourceGroups">
              <Name>Resource Groups</Name>
              <Description></Description>
            </DisplayString>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring.ResourceStatus.UnitMonitor">
              <Name>Resource Status Unit Monitor</Name>
              <Description>Resource Status Unit Monitor</Description>
            </DisplayString>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring.ResourceStatus.UnitMonitor.AlertMessage">
              <Name>Alert</Name>
              <Description>Alert</Description>
            </DisplayString>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring.ResourceStatus.UnitMonitor" SubElementID="Ready">
              <Name>Ready</Name>
              <Description>Ready</Description>
            </DisplayString>
            <DisplayString ElementID="CloudMonix.ResourceMonitoring.ResourceStatus.UnitMonitor" SubElementID="Down">
              <Name>Down</Name>
              <Description>Down</Description>
            </DisplayString>
          </DisplayStrings>
          <KnowledgeArticles></KnowledgeArticles>
        </LanguagePack>
      </LanguagePacks>
    </ManagementPack>