I develop integration with SCOM. But I am a green hand in it.
I have created management pack XML and it works fine.
Please review management pack below:
<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>
I have installed this management pack using SCOM SDK and ImportManagementPack method.
Also I have developed Inbound Connector as described in example.
I can send discovery data, performance metrics and events using my connector. And it works fine.
The result of successful import is on the screenshot:
The monitoring objects were created correctly.
But these objects have Not monitored
Health State.
My main question is how to change Health State?
My logic for Health State is very simple:
- If
Resource Status
(please look this property in the screenshot and in management pack XML) property is equal toReady
then Health State isSuccess
. - If
Resource Status
property is equal toDown
then Health State isError
. - Otherwise Health State is
Not monitored
.
I have reviewed many documents (here and here) and found that I need to create monitor, monitor types, expression rules for changing Health State.
Also I have checked XML examples here.
But I don't understand how to define my expressions and how to add necessary information to management pack XML file.
The best answer for me is complete XML example with implementation of expression rules of my logic.
Thanks in advance.
first of all let me warn you, that this is not an appropriate way to monitor something via discoverable class properties. SCOM database is designed in assumption, that all configuration properties are static. Say, disk size or number of CPUs doesn't change often. By doing that, you causes configuration churn. Please refer to Kevin Holman's article for details: https://blogs.technet.microsoft.com/kevinholman/2009/10/04/what-is-config-churn/
However, you still can do that. Please refer to the MP XML below. The main idea is to make a fake script which packages class property in a Property Bag, so then a Condition Detection can analyse it.
Please be aware, that you cannot set a monitor into "Not Initialized" state explicitly. A monitor is not initialized only if:
A monitoring workflow can send a signal to set monitor to either healthy, warning or critical state, but if no signal comes, then health state preserves its last state.
Also note, that I used 2007 scheme and aligned references, as well as changed aliases. I haven't tested it, but it is compiled with no errors. ENU is a default language now.