【问题标题】:How to create SCOM management pack monitor with three states如何创建具有三种状态的 SCOM 管理包监视器
【发布时间】:2018-02-13 11:34:49
【问题描述】:

我开发与 SCOM 的集成。但我是个新手。

我已经创建了管理包 XML,它工作正常。

请查看下面的管理包:

<ManagementPack xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ContentReadable="true">
  <Manifest>
    <Identity>
      <ID>CloudMonix.ResourceMonitoring</ID>
      <Version>1.0.0.0</Version>
    </Identity>
    <Name>CloudMonix Resource Monitoring Pack</Name>
    <References>
      <Reference Alias="System">
        <ID>System.Library</ID>
        <Version>7.5.8501.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="SystemCenter">
        <ID>Microsoft.SystemCenter.Library</ID>
        <Version>7.0.8437.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" Length="256" MinLength="1" />
          <Property ID="ResourceType" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="1" />
          <Property ID="ResourceStatus" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="1" />
          <Property ID="ResourceGroups" Type="string" Key="false" CaseSensitive="false" Length="1024" MinLength="1" />
        </ClassType>
      </ClassTypes>
    </EntityTypes>
  </TypeDefinitions>
  <Presentation>
    <Views>
      <View ID="CloudMonix.ResourceMonitoring.MainView" Accessibility="Public" Enabled="true" Target="CloudMonix.ResourceMonitoring.Resource" TypeID="SystemCenter!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="SystemCenter!Microsoft.SystemCenter.Monitoring.ViewFolder.Root" />
    </Folders>
    <FolderItems>
      <FolderItem ElementID="CloudMonix.ResourceMonitoring.MainView" Folder="CloudMonix.ResourceMonitoring.MainFolder" />
    </FolderItems>
  </Presentation>
  <LanguagePacks>
    <LanguagePack ID="ENU" IsDefault="false">
      <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>
      </DisplayStrings>
    </LanguagePack>
  </LanguagePacks>
</ManagementPack>

我已经使用 SCOM SDKImportManagementPack 方法安装了这个管理包。

我还开发了example 中所述的入站连接器。

我可以使用我的连接器发送发现数据、性能指标和事件。而且效果很好。

成功导入的结果在截图中:

监控对象已正确创建。

但是这些对象有Not monitored Health State。

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

我对健康状态的逻辑很简单:

  1. 如果Resource Status(请在屏幕截图和管理包XML 中查看此属性)属性等于Ready,则健康状态为Success
  2. 如果Resource Status 属性等于Down,则健康状态为Error
  3. 否则健康状态为Not monitored

查看了很多文档(herehere),发现需要创建监视器,监视器类型,改变健康状态的表达规则。

我还检查了 XML 示例 here

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

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

    但是,您仍然可以这样做。请参阅下面的 MP XML。主要思想是制作一个假脚本,将类属性封装在属性包中,然后条件检测可以对其进行分析。

    请注意,您不能将监视器显式设置为“未初始化”状态。只有在以下情况下才会初始化监视器:

    1. 刚刚创建。
    2. 退出维护模式。

    监控工作流可以发送信号以将监控设置为健康、警告或严重状态,但如果没有信号出现,则健康状态将保留其最后一个状态。

    另外请注意,我使用了 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>
    

    【讨论】:

    • 很有帮助!我已经阅读了 Kevin Holman 的文章,我认为我们需要改变我们的集成逻辑。我还找到了 Jakub Oleksy article。我们可以使用事件来改变健康状态,这个解决方案会更有效。我说的对吗?
    • 感谢您的反馈,感谢您对 Jakub 的文章。我不知道这种方法。了解它的细节会很有趣。但是,合理地假设事件方法有效,这种方法将更加有效。只是出于好奇,为什么不在 SCOM 上对监控对象运行实际查询呢?为什么使用连接器?
    • 我们有云监控system,我们尝试实现从我们的系统到SCOM的集成。我们的用户可以在我们的系统内创建多种类型的集成,但他无法访问外部数据。
    • 我明白了,既然你的目标在其他系统中被监控,那么监控它两次没有多大意义,所以你的方法是合理的。为了设置像您这样的“人工”实例的健康状态,您可以尝试您的发现,以及: 1. 创建一个事件(日志文件或 Windows 日志)驱动的监视器。使用标准工作流来捕捉模式或 Windows 事件。只需确保将这些事件发布到所有管理服务器,或为日志文件使用网络共享。 2. 看看微软对“Health Service Heartbeat Failure”监控器的实现。
    • 您能帮帮新的 SCOM question 吗?
    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2013-05-16
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多