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에도 용의하다.