How to Automate the Setup of URL Monitoring
Applies To: Operations Manager 2007 R2, Operations Manager 2007 SP1, System Center Operations Manager 2007
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.
/// <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 = "https://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);
}
}
}
}
' 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 = "https://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