잊지 않겠습니다.

'Performace Monitoring'에 해당되는 글 1건

  1. 2009.07.29 WMI Performance Monitoring
indows에서 System의 모든 Monitoring은 WMI를 통해서 가능하다.
WMI를 이용하는 경우, Remote에서 접근이 용의하다는 장점과 Server군의 경우 다양한 속성들을 모두 Monitoring할 수 있다는 큰 장점을 가지고 있다. 또한, 기본적인 WMI의 Query를 통해서 값을 얻는 것이 아닌, .NET에서는 WMI에 대한 Event Handling이 가능하다. 

지정될 수 있는 Event는 http://msdn.microsoft.com/en-us/library/aa394583(VS.85).aspx을 참조.

모니터링 소스는 다음과 같다. 

01.ConnectionOptions connectionOptions = new ConnectionOptions()
02.     {
03.            Authentication = AuthenticationLevel.Default,
04.            Username = @"UserName",
05.            Password = @"Password",
06.            EnablePrivileges = true,
07.            Impersonation = ImpersonationLevel.Impersonate
08.      };
09.             
10.ManagementScope scope = new ManagementScope(@"\\hyperv\root\cimv2", connectionOptions);
11.scope.Connect();
12. 
13.//__InstanceCreationEvent : Wmi instance create event
14.//__InstanceModificationEvent : Wmi instance value modified event
15.//__InstanceDeletionEvent : Wmi instance delete event
16.//__InstanceOperationEvent : Wmi instance method call event
17. 
18.WqlEventQuery wQuery = new WqlEventQuery("Select * From __InstanceModificationEvent Within 1 " + "Where TargetInstance ISA 'Win32_PerfFormattedData_Tcpip_NetworkInterface'");
19. 
20.ManagementEventWatcher watcher = new ManagementEventWatcher(scope, wQuery);
21.watcher.EventArrived += new EventArrivedEventHandler(DisplayWatcherEvent);
22.watcher.Start();
23. 
24.Console.ReadLine();
25.             
26.watcher.Stop();

일반적인 Monitoring Handling과 동일하다. 특징이 나타나는 곳은 오히려 Event 처리기쪽이 더 특징이 나타난다.

01.private static void DisplayWatcherEvent(object sender, EventArrivedEventArgs e)
02.{
03.    foreach(var property in e.NewEvent.Properties)
04.    {
05.        if(property.Name == "TargetInstance")
06.        {
07.            ManagementBaseObject managementObject = property.Value as ManagementBaseObject;
08.            if (managementObject == null)
09.            {
10.                Console.WriteLine("Data convert is null");
11.            }
12.            else
13.            {
14.                var bytesPerSec = managementObject.Properties["BytesTotalPersec"].Value;
15.                var bytesReceivedPersec = managementObject.Properties["BytesReceivedPersec"].Value;
16.                var bytesSentPersec = managementObject.Properties["BytesSentPersec"].Value;
17.                string name = managementObject.Properties["Name"].Value.ToString();
18. 
19.                Console.WriteLine("{0}\t{1}\t{2}\t{3}",
20.                    name.Substring(0, 4), bytesPerSec, bytesReceivedPersec, bytesSentPersec);
21.            }
22.        }
23.    }
24.}
특징으로 보이는 것이 EventArrivedEventArgs에서 Property의 Value형태로 WMI Instance의 값이 전달된다는 점이다. 그리고, Performance Counter의 경우에는 이전값, 현재값이 Property의 Name으로 전달되기 때문에 Diff. Monitoring에도 용의하다. 


Posted by Y2K
,