How to Create a Unit Monitor

Applies To: System Center 2012 - Operations Manager

[This topic is pre-release documentation and is subject to change in future releases. Blank topics are included as placeholders.]

Unit monitors are used to monitor specific counters, events, scripts, and services. Unit monitors can be rolled up to either dependency or aggregate rollup monitors. You have the option to set the monitor to generate an alert.

For an example of how to create a unit monitor to monitor an event log see, How to Create an Event Log Unit Monitor.

The following code example shows how to create a unit monitor that monitors the state of a service:

//
// Creates a unit monitor. 
//
using Microsoft.EnterpriseManagement;
using Microsoft.EnterpriseManagement.Administration;
using Microsoft.EnterpriseManagement.Common;
using Microsoft.EnterpriseManagement.Configuration;
using Microsoft.EnterpriseManagement.Monitoring;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;

namespace SDKSamples
{
    class Program
    {
        //-------------------------------------------------------------------
        static void Main(string[] args)
        {
            ManagementGroup               mg;
            ManagementPack                mp;
            ManagementPackClass               monitoringClass;
            ManagementPackClassCriteria monitoringClassCriteria;
            ManagementPackUnitMonitor     serviceMonitor;
            ManagementPackUnitMonitorType serviceMonitorType;
 
            mg = new ManagementGroup("localhost");
 
            mp = mg.ManagementPacks.GetManagementPacks(new ManagementPackCriteria("Name='SampleManagementPack'"))[0];
 
            monitoringClassCriteria = new ManagementPackClassCriteria(
                "DisplayName='Windows Server 2003 Operating System'");
            monitoringClass = mg.EntityTypes.GetClasses(monitoringClassCriteria)[0];
 
            serviceMonitorType = mg.Monitoring.GetUnitMonitorTypes(
                new ManagementPackUnitMonitorTypeCriteria("Id = 'Microsoft.Windows.CheckNTServiceStateMonitorType'"))[0];
            serviceMonitor = new ManagementPackUnitMonitor(
                mp, "SampleServiceMonitor", ManagementPackAccessibility.Internal);
            
            serviceMonitor.DisplayName = "Sample Service Monitor";          
            serviceMonitor.TypeID = serviceMonitorType;
            serviceMonitor.Target = monitoringClass;
 
            ConfigureAlertSettings(serviceMonitor,serviceMonitorType,mp);            
            ConfigureHealthStates(serviceMonitor, serviceMonitorType);            
            SpecifyMonitorConfiguration(serviceMonitor); 
            SpecifyParentMonitor(serviceMonitor, mg);
 
            mp.Verify();
            
            //Save the changes into the management pack.
            mp.AcceptChanges();
        }
 
        private static void SpecifyParentMonitor(
            ManagementPackUnitMonitor   serviceMonitor, 
            ManagementGroup             mg
            )
        {
            ManagementPackAggregateMonitor  parentMonitor;
            ManagementPackMonitorCriteria monitorCriteria;

            monitorCriteria = new ManagementPackMonitorCriteria("Name='System.Health.AvailabilityState'");
            parentMonitor = (ManagementPackAggregateMonitor)mg.Monitoring.GetMonitors(monitorCriteria)[0];
            serviceMonitor.ParentMonitorID  = parentMonitor;
        }
 
        //-------------------------------------------------------------------
        private static void SpecifyMonitorConfiguration(
            ManagementPackUnitMonitor serviceMonitor
            )
        {
            string monitorConfig;
 
            monitorConfig = @"<ComputerName>$Target/Host/Property[Type=""Windows!Microsoft.Windows.Computer""]/NetworkName$</ComputerName>
                                        <ServiceName>Alerter</ServiceName>";
            
            serviceMonitor.Configuration = monitorConfig;
        }
 
        //-------------------------------------------------------------------
        private static void ConfigureHealthStates(
            ManagementPackUnitMonitor       serviceMonitor,
            ManagementPackUnitMonitorType   serviceMonitorType
            )
        {
            ManagementPackUnitMonitorOperationalState healthyState;
            ManagementPackUnitMonitorOperationalState errorState;
 
            healthyState = new ManagementPackUnitMonitorOperationalState(serviceMonitor, "Success");
            errorState   = new ManagementPackUnitMonitorOperationalState(serviceMonitor, "Error");
 
            healthyState.HealthState        = HealthState.Success;
            healthyState.MonitorTypeStateID = "Running";
            
            errorState.HealthState          = HealthState.Error;
            errorState.MonitorTypeStateID   = "NotRunning";
 
            serviceMonitor.OperationalStateCollection.Add(healthyState);
            serviceMonitor.OperationalStateCollection.Add(errorState);
        }
 
        //-------------------------------------------------------------------
        private static void ConfigureAlertSettings(
            ManagementPackUnitMonitor       serviceMonitor,
            ManagementPackUnitMonitorType   unitMonitorType,
            ManagementPack                  mp
            )
        {   
            serviceMonitor.AlertSettings = new ManagementPackMonitorAlertSettings();
            serviceMonitor.AlertSettings.AlertOnState       = HealthState.Error;
            serviceMonitor.AlertSettings.AutoResolve        = true;
            serviceMonitor.AlertSettings.AlertPriority      = ManagementPackWorkflowPriority.Normal;
            serviceMonitor.AlertSettings.AlertSeverity      = ManagementPackAlertSeverity.Error;
            serviceMonitor.AlertSettings.AlertParameter1    = 
                @"$Target/Host/Property[Type=""Windows!Microsoft.Windows.Computer""]/NetworkName$"; //this points to the computer name            
 
            ManagementPackStringResource alertMessage;
            
            alertMessage = new ManagementPackStringResource(mp, "SampleAlertMessage");
 
            alertMessage.DisplayName = "The Alerter service is stopped";
            alertMessage.Description = "The Alerter service is stopped on computer {0}.";
 
            serviceMonitor.AlertSettings.AlertMessage = alertMessage;
        }        
    }
}

See Also

Other Resources

Automating Operations Manager Administration