WindowsのCPU時間 【MIRACLE ZBX 1.8, 2.0, 2.2】
Windowsタスクマネージャにて表示できる"CPU 時間"を、Zabbixの監視で設定できるか?
Zabbixで提供されているキーでプロセスの時間を取得できるものを調査しました。
最近いただいたお問い合わせで、「Windowsタスクマネージャにて表示することができる、"CPU 時間"をZabbixの監視で設定できないか?」というものがありました。
Windowsでは実装・仕様が公開されていないことも多く、「同じもの」かどうかを判断することはできません。ですので、Zabbixで提供されているキーでプロセスの時間を取得できるものを調査しました。
proc_info[]キーがそれにあたり、第二引数にktime, utimeを指定することにより、それぞれカーネル時間、ユーザー時間を取得することができます。しかしながら、これらの合算値を取得するためのオプションは存在しません。
こういった場合、計算アイテムを作成し二つのアイテムの合算値を取得することが可能ですが、複数のアイテムは決して同時には取得しません。ですので、計算アイテムの値は正確ではありません。(多少の誤差を許容できるならば問題ないと思います。)
ソースコードを調査したところ、下記が処理の箇所となります。(2.0.14)
src/libs/zbxsysinfo/win32/proc.c :
180 static int GetProcessAttribute(HANDLE hProcess,int attr,int type,int count,double *lastValue)
181 {
...
188 switch(attr)
189 {
...
202 case 3: /* ktime */
203 case 4: /* utime */
204 GetProcessTimes(hProcess,&ftCreate,&ftExit,&ftKernel,&ftUser);
205 value = ConvertProcessTime(attr==3 ? &ftKernel : &ftUser);
206 break;
...
303 int PROC_INFO(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
304 {
...
311 const char *attrList[] = {"vmsize", "wkset", "pf", "ktime", "utime", "gdiobj", "userobj", "io_read_b", "io_read_op",
312 "io_write_b", "io_write_op", "io_other_b", "io_other_op", NULL},
...
360 for (i = 0; i < proc_cnt; i++)
361 {
362 if (NULL != (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE, procList[i])))
363 {
364 if (SUCCEED == zbx_get_processname(hProcess, baseName))
365 if (0 == stricmp(baseName, proc_name))
366 if (SYSINFO_RET_OK != (ret = GetProcessAttribute(hProcess, attr_id, type_id, counter++, &value)))
367 break;
368 CloseHandle(hProcess);
369 }
370 }
l.204にてカーネル時間とユーザー時間は一回の呼び出しで同時に取得できています。
ですので、これらの合算値は容易に取得できます。
結果として、ll.311-312 に新しく"cpu_time"というリストを追加し、l.180から始まるGetProcessAttribute()に対応する処理追加することで、"CPU 時間"と同等なものを取得することが可能となりました。
この機能追加はMIRACLE ZBXに追加されると思います。