You can automate the URL monitoring setup to use one or more agent computers to monitor a Web site or Web-based application. The URL monitoring information is created by using a template and then added to a Management Pack. You specify the URL that you want to monitor, one or more fully qualified domain names of the computers that will monitor the URL, the display name of the monitoring type that is created in a Management Pack, and the display name of the Management Pack you want to add the type to.

After you set up URL monitoring, you must also create a state view and an alert view for the newly created type in the Management Pack. This allows you to view the alerts that are generated from monitoring the URL and view the health state of the URL.

The following example sets up URL monitoring for an agent computer.

Visual Basic  Copy Code
' URL monitoring example.
Imports System
Imports System.Collections.ObjectModel
Imports Microsoft.EnterpriseManagement
Imports Microsoft.EnterpriseManagement.Common
Imports Microsoft.EnterpriseManagement.Configuration
Imports Microsoft.EnterpriseManagement.Monitoring
Imports System.Xml
Imports System.Globalization
Imports System.Collections.Generic


Namespace SDKSamples
	Class Program
		Private Shared mg As ManagementGroup = Nothing

		Public Overloads Shared Function Main(ByVal args() As String) As Integer
			' The URL to monitor.
			Dim url As String = "http://www.microsoft.com"

			' One or more fully qualified domain names for the watcher nodes, 
			' which must have the Operations Manager agent installed.
			' Replace the placeholder name below with a real computer name.
			Dim watcherNodes As List(Of String) = New List(Of String)
			watcherNodes.Add("computerName.domain.com")

			' The display name of the type that will be created.  This will appear in the 
			' authoring space and when you create a state view or alert view.
			Dim displayName As String = "TestURLMonitoring"

			' The display name of the Management Pack that the URL monitoring logic 
			' will be added into.
			Dim targetMP As String = "Sample Management Pack"

			mg = New ManagementGroup("localhost")

			Dim configDocXML As String = CreateConfigurationXmlDoc(url, watcherNodes, displayName)
			Dim template As ManagementPackTemplate = GetUrlMonitoringTemplate()
			Dim mp As ManagementPack = GetManagementPack(targetMP)

			Dim folderId As String = String.Format("WebAppFolder{0}", System.Guid.NewGuid().ToString("N"))

			mp.ProcessMonitoringTemplate(template, configDocXML, folderId, displayName, "folder description goes here")
		End Function 'Main


		Private Shared Function GetUrlMonitoringTemplate() As MonitoringTemplate
			Dim criteria As String = "Name = 'Microsoft.SystemCenter.WebApplication.SingleUrl.Template'"
			Dim templateCriteria As New MonitoringTemplateCriteria(criteria)
			Dim template As MonitoringTemplate = Nothing

			template = mg.GetMonitoringTemplates(templateCriteria)(0)

			Return template
		End Function 'GetUrlMonitoringTemplate


		'/ <summary>
		'/ Gets the specified ManagementPack.
		'/ </summary>
		Private Shared Function GetManagementPack(ByVal displayName As String) As ManagementPack
			Dim criteria As String = String.Format("DisplayName = '{0}'", displayName)
			Dim mpCriteria As New ManagementPackCriteria(criteria)
			Dim mp As ManagementPack = Nothing

			Try
				mp = mg.GetManagementPacks(mpCriteria)(0)
			Catch e As ArgumentOutOfRangeException

				Throw New InvalidOperationException("Could not find the specified Management Pack: " + criteria)
			End Try
			Return mp
		End Function 'GetManagementPack



		Private Shared Sub AddChildElement(ByVal parentElement As XmlElement, ByVal newElementName As String, ByVal value As String)
			Dim document As XmlDocument = parentElement.OwnerDocument
			Dim newElement As XmlElement = document.CreateElement(newElementName)

			newElement.InnerText = value
			parentElement.AppendChild(newElement)
		End Sub 'AddChildElement


		Private Shared Function CreateConfigurationXmlDoc(ByVal url As String, ByVal watcherNodes As List(Of String), _
			ByVal displayName As String)

			Dim configDoc As New XmlDocument()
			Dim rootNode As XmlElement = configDoc.CreateElement("Configuration")
			Dim typeId As String
			Dim watcherNodesList As String
			Dim uniqueKey As String

			configDoc.AppendChild(rootNode)

			typeId = String.Format(CultureInfo.InvariantCulture, "WebApplication_{0}", Guid.NewGuid().ToString("N"))
			AddChildElement(rootNode, "TypeId", typeId)
			AddChildElement(rootNode, "Name", displayName)
			AddChildElement(rootNode, "Description", "")
			AddChildElement(rootNode, "LocaleId", "ENU")
			AddChildElement(rootNode, "Verb", "GET")
			AddChildElement(rootNode, "URL", url)
			AddChildElement(rootNode, "Version", "HTTP/1.1")
			AddChildElement(rootNode, "PollIntervalInSeconds", "120")
			AddWatcherNodeIds(rootNode, watcherNodes)

			watcherNodesList = CreateWatcherComputerList(watcherNodes)

			AddChildElement(rootNode, "WatcherComputersList", watcherNodesList)

			uniqueKey = Guid.NewGuid().ToString()

			AddChildElement(rootNode, "UniquenessKey", uniqueKey)
			AddChildElement(rootNode, "Proxy", "")
			AddChildElement(rootNode, "ProxyUserName", "")
			AddChildElement(rootNode, "ProxyPassword", "")
			AddChildElement(rootNode, "ProxyAuthenticationScheme", "None")
			AddChildElement(rootNode, "CredentialUserName", "")
			AddChildElement(rootNode, "CredentialPassword", "")
			AddChildElement(rootNode, "AuthenticationScheme", "None")

			Return configDoc.InnerXml
		End Function

		Private Shared Sub AddWatcherNodeIds(ByVal rootNode As XmlElement, _
			ByVal watcherNodes As List(Of String))

			Dim includeListElement As XmlElement
			includeListElement = rootNode.OwnerDocument.CreateElement("IncludeList")

			rootNode.AppendChild(includeListElement)

			If watcherNodes.Count = 0 Then
				Throw New InvalidOperationException("No watcher nodes defined.")
			End If

			Dim watcherNode As String
			For Each watcherNode In watcherNodes
				Dim computerMonitoringObject As MonitoringObject
				computerMonitoringObject = GetComputerMonitoringObject(watcherNode)

				If computerMonitoringObject Is Nothing Then
					Console.WriteLine("watcher nodes not found.")
				Else
					AddChildElement(includeListElement, "MonitoringObjectId", computerMonitoringObject.Id.ToString())
				End If
			Next watcherNode
		End Sub

		Private Shared Function CreateWatcherComputerList(ByVal watcherNodes As List(Of String)) As String

			Dim watcherNodesList As String = String.Empty
			If watcherNodes.Count = 0 Then
				Throw New InvalidOperationException("No watcher nodes defined.")
			Else
				Dim i As Integer
				For i = 0 To watcherNodes.Count - 1
					watcherNodesList += watcherNodes(i)

					If i < watcherNodes.Count - 2 Then
						watcherNodesList += " | "
					End If
				Next i
				watcherNodesList = String.Format("({0})", watcherNodesList)
			End If
			Return watcherNodesList
		End Function


		Private Shared Function GetComputerMonitoringObject(ByVal computerFQDN As String) As MonitoringObject
			Dim monitoringObjectCriteria As MonitoringObjectCriteria
			Dim windowsComputerClass As MonitoringClass
			Dim monitoringObject As MonitoringObject

			windowsComputerClass = mg.GetMonitoringClass(SystemMonitoringClass.WindowsComputer)

			monitoringObjectCriteria = New MonitoringObjectCriteria(String.Format("PrincipalName = '{0}'", computerFQDN), windowsComputerClass)
			Try
				monitoringObject = mg.GetMonitoringObjects(monitoringObjectCriteria)(0)
				Return monitoringObject
			Catch e As ArgumentOutOfRangeException

				Throw New InvalidOperationException("Could not find the specified monitoring object: " + computerFQDN)

			End Try

		End Function

	End Class 'Program
End Namespace 'SDKSamples
C#  Copy Code
/// <summary> 
/// URL monitoring example.
/// </summary>
using System;
using System.Collections.ObjectModel;
using Microsoft.EnterpriseManagement;
using Microsoft.EnterpriseManagement.Common;
using Microsoft.EnterpriseManagement.Configuration;
using Microsoft.EnterpriseManagement.Monitoring;
using System.Xml;
using System.Globalization;
using System.Collections.Generic;

namespace SDKSamples
{
	class Program
	{
		private static ManagementGroup mg = null;

		static void Main(string[] args)
		{
			// The URL to monitor.
			string url = "http://www.microsoft.com";

			// One or more fully qualified domain names for the watcher nodes, 
			// which must have the Operations Manager agent installed.
			// Replace the placeholder name below with a real computer name.
			List<string> watcherNodes = new List<string>();
			watcherNodes.Add("computerName.domain.com");

			// The display name of the type that will be created.  This will appear in the 
			// authoring space and when you create a state view or alert view.
			string displayName = "TestURLMonitoring";

			// The display name of the Management Pack that the URL monitoring logic 
			// will be added into.
			string targetMP = "Sample Management Pack";

			mg = new ManagementGroup("localhost");

			string configDocXML = CreateConfigurationXmlDoc(url, watcherNodes, displayName);
			ManagementPackTemplate template = GetUrlMonitoringTemplate();
			ManagementPack mp = GetManagementPack(targetMP);

			string folderId = string.Format("WebAppFolder{0}", Guid.NewGuid().ToString("N"));
			mp.ProcessMonitoringTemplate(template, configDocXML, folderId, displayName, "folder description goes here");

	}

		private static MonitoringTemplate GetUrlMonitoringTemplate()
		{
			string criteria = "Name = 'Microsoft.SystemCenter.WebApplication.SingleUrl.Template'";
			MonitoringTemplateCriteria templateCriteria = new MonitoringTemplateCriteria(criteria);
			MonitoringTemplate template = null;

			template = mg.GetMonitoringTemplates(templateCriteria)[0];

			return template;
	}

		/// <summary>
		/// Gets the specified ManagementPack.
		/// </summary>
		private static ManagementPack GetManagementPack(string displayName)
		{
			string criteria = string.Format("DisplayName = '{0}'", displayName);
			ManagementPackCriteria mpCriteria = new ManagementPackCriteria(criteria);
			ManagementPack mp = null;

			try
			{
				mp = mg.GetManagementPacks(mpCriteria)[0];
		}
			catch (ArgumentOutOfRangeException)
			{
				throw new InvalidOperationException(
					 "Could not find the specified Management Pack: " + criteria);
		}
			return mp;
	}


		private static void AddChildElement(XmlElement parentElement,
			string newElementName, string value)
		{
			XmlDocument document = parentElement.OwnerDocument;
			XmlElement newElement = document.CreateElement(newElementName);

			newElement.InnerText = value;
			parentElement.AppendChild(newElement);
	}

		private static string CreateConfigurationXmlDoc(
			string url,
			List<string> watcherNodes,
			string displayName
			)
		{
			XmlDocument configDoc = new XmlDocument();
			XmlElement rootNode = configDoc.CreateElement("Configuration");
			string typeId;
			string watcherNodesList;
			string uniqueKey;

			configDoc.AppendChild(rootNode);

			typeId = string.Format(CultureInfo.InvariantCulture,
								 "WebApplication_{0}",
								 Guid.NewGuid().ToString("N"));
			AddChildElement(rootNode, "TypeId", typeId);
			AddChildElement(rootNode, "Name", displayName);
			AddChildElement(rootNode, "Description", "");
			AddChildElement(rootNode, "LocaleId", "ENU");
			AddChildElement(rootNode, "Verb", "GET");
			AddChildElement(rootNode, "URL", url);
			AddChildElement(rootNode, "Version", "HTTP/1.1");
			AddChildElement(rootNode, "PollIntervalInSeconds", "120");
			AddWatcherNodeIds(rootNode, watcherNodes);

			watcherNodesList = CreateWatcherComputerList(watcherNodes);

			AddChildElement(rootNode, "WatcherComputersList", watcherNodesList);

			uniqueKey = Guid.NewGuid().ToString();

			AddChildElement(rootNode, "UniquenessKey", uniqueKey);
			AddChildElement(rootNode, "Proxy", "");
			AddChildElement(rootNode, "ProxyUserName", "");
			AddChildElement(rootNode, "ProxyPassword", "");
			AddChildElement(rootNode, "ProxyAuthenticationScheme", "None");
			AddChildElement(rootNode, "CredentialUserName", "");
			AddChildElement(rootNode, "CredentialPassword", "");
			AddChildElement(rootNode, "AuthenticationScheme", "None");

			return (configDoc.InnerXml);
	}

		private static void AddWatcherNodeIds(
			XmlElement rootNode,
			List<string> watcherNodes
			)
		{
			XmlElement includeListElement;
			includeListElement = rootNode.OwnerDocument.CreateElement("IncludeList");

			rootNode.AppendChild(includeListElement);

			if (watcherNodes.Count == 0)
			{
				throw new InvalidOperationException("No watcher nodes defined.");
		}

			foreach (string watcherNode in watcherNodes)
			{
				MonitoringObject computerMonitoringObject;
				computerMonitoringObject = GetComputerMonitoringObject(watcherNode);

				if (computerMonitoringObject == null)
				{
					Console.WriteLine("watcher nodes not found.");
			}
				else
				{
					AddChildElement(includeListElement,
									"MonitoringObjectId",
									computerMonitoringObject.Id.ToString());
			}
		}
	}

		private static string CreateWatcherComputerList(
			List<string> watcherNodes
			)
		{
			string watcherNodesList = string.Empty;
			if (watcherNodes.Count == 0)
			{
				throw new InvalidOperationException("No watcher nodes defined.");
		}
			else
			{
				for (int i = 0; i < watcherNodes.Count; i++)
				{
					watcherNodesList += watcherNodes[i];

					if (i < (watcherNodes.Count - 2))
					{
						watcherNodesList += " | ";
				}
			}
				watcherNodesList = string.Format("({0})", watcherNodesList);
		}
			return (watcherNodesList);
	}

		private static MonitoringObject GetComputerMonitoringObject(
			string computerFQDN
			)
		{
			MonitoringObjectCriteria monitoringObjectCriteria;
			MonitoringClass windowsComputerClass;
			MonitoringObject monitoringObject;

			windowsComputerClass = mg.GetMonitoringClass(SystemMonitoringClass.WindowsComputer);

			monitoringObjectCriteria = new MonitoringObjectCriteria(string.Format("PrincipalName = '{0}'", computerFQDN),
																	windowsComputerClass);
			try
			{
				monitoringObject = mg.GetMonitoringObjects(monitoringObjectCriteria)[0];
				return (monitoringObject);
		}
			catch (ArgumentOutOfRangeException)
			{
				throw new InvalidOperationException("Could not find the specified monitoring object: " + computerFQDN);
		}
	}
}
}

Send comments about this topic to Microsoft.