2008年10月13日

如何把agent进入maintain模式

SCOM2007的最大特点之一就是面向对象的监控,而不同于MOM2005的面向服务器的监控。换句话说,如果我们的服务依赖多台服务器,或一台服务器上Host了多个服务,在MOM2005里是没法做到颗粒监控的。
如果你看了前面的文章,就会了解SCOM2007是按照对象来设置maintain模式的,而如果要把一台server进入maintain模式,应该怎么做呢,答案是把与server相关的三个对象设置到maintain模式,他们分别是:computer,health service和health service watcher,下面的代码说明了这个问题:

MonitoringObject[] monObjects = new MonitoringObject[3];
ManagementGroupAdministration administration = mg.GetAdministration();
AgentManagedComputerCriteria criteria = new AgentManagedComputerCriteria("Name = '" + serverName + "'");
ReadOnlyCollection agentManagedComputers = administration.GetAgentManagedComputers(criteria);
MonitoringObject monitoringObject = mg.GetMonitoringObject(agentManagedComputers[0].Id);
MonitoringObject hostedHealthService = agentManagedComputers[0].HostedHealthService;
monObjects[0] = monitoringObject;
monObjects[1] = hostedHealthService;
String query = "DisplayName = 'Health Service Watcher'";
MonitoringClassCriteria classCriteria = new MonitoringClassCriteria(query);
ReadOnlyCollection monClasses = mg.GetMonitoringClasses(classCriteria);
List listObjects = new List();
foreach (MonitoringClass monClass in monClasses)
listObjects.AddRange(mg.GetMonitoringObjects(monClass));
foreach (MonitoringObject monObject in listObjects)
if (monObject.DisplayName.ToUpper() == serverName.ToUpper())
monObjects[2] = monObject;
foreach (MonitoringObject monObject in monObjects)
monObject.ScheduleMaintenanceMode(DateTime.Now.ToUniversalTime(), Convert.ToDateTime(endTime).ToUniversalTime(), GetReason(reason), comment);

这样agent就被设置到maintain模式了。但是并没有把host在这台服务器上的IIS或SQL服务也设置到maintain模式,如果想把这台server下所有的服务也设置到maintain,应该这样用

monObject.ScheduleMaintenanceMode(DateTime.Now.ToUniversalTime(), Convert.ToDateTime(endTime).ToUniversalTime(), GetReason(reason), comment, TraversalDepth.Recursive);

多了一个叫做TraversalDepth的参数,这个参数有两个值,分别是:OneLevel和Recursive,如果要把对象下的所有子对象都设置maintain,应该使用TraversalDepth.Recursive。

说了这么多,应该提醒大家的是, SCOM2007已经提供了面向对象的监控,我们就应该用好这个特性,做好面向服务的监控。