Nagiosのcheck_http.cを読んでみる
今日はNagios Pluginsの「check_http.c」のソースコードを読んでみる事にしました。
興味があったのは、応答時間をどうやって算出しているか、ということ。
# ./check_http -H www.google.co.jp HTTP OK: HTTP/1.1 200 OK - 10356 bytes in 0.198 second response time |time=0.197968s;;;0.000000 size=10356B;;;0
「check_http.c」を読んでみる
今回挑戦したのは「nagios-plugins-1.4.15.tar.gz」の
「plugins/check_http.c」「plugins/utils.c」です。
まずは「main( )」を
まずは「main( )」を読んでみます。
おぼろげながら、
- 最初に「gettimeofday( )」を使って現在の時間を取得している事
- 具体的な処理は「check_http( )」で行うようであること
を確認。
138 int 139 main (int argc, char **argv) 140 { 141 int result = STATE_UNKNOWN; ******** 略 ******** 167 gettimeofday (&tv, NULL); 168 169 result = check_http (); 170 return result; 171 }
「check_http( )」を読む
次に「check_http( )」の中で時間に関係しそうな所を探して行きます。
どうやら「deltime( )」という関数を呼び出して、時間を計算して、
文字列に変換しているようでした。
ここで時間の計算しているんですかね。
928 /* Save check time */ 929 microsec = deltime (tv); 930 elapsed_time = (double)microsec / 1.0e6;
このコードは結果を出力する部分ですね。
1095 /* check elapsed time */ 1096 asprintf (&msg, 1097 _("%s - %d bytes in %.3f second response time %s|%s %s"), 1098 msg, page_len, elapsed_time, 1099 (display_html ? "</A>" : ""), 1100 perfd_time (elapsed_time), perfd_size (page_len));
上で出て来た「perfd_time( )」の中身はこんな感じでした。
1284 char *perfd_time (double elapsed_time) 1285 { 1286 return fperfdata ("time", elapsed_time, "s", 1287 check_warning_time, warning_time, 1288 check_critical_time, critical_time, 1289 TRUE, 0, FALSE, 0); 1290 }
「utils.c」を読む
「deltime( )」「fperfdata( )」は何をやるんだろうと、探していると
「utils.c」の中に該当するコードが存在しました。
「deltime( )」を読む
「deltime( )」を読んでみると、
呼び出された時の時間から、引数の時間を引いているようです。
やはりここで時間を計算しているようです。
314 long 315 deltime (struct timeval tv) 316 { 317 struct timeval now; 318 gettimeofday (&now, NULL); 319 return (now.tv_sec - tv.tv_sec)*1000000 + now.tv_usec - tv.tv_usec; 320 }
fperfdata( )を読む
こちらは文字列に整形するコードのようです。
561 char *fperfdata (const char *label, 562 double val, 563 const char *uom, 564 int warnp, 565 double warn, 566 int critp, 567 double crit, 568 int minp, 569 double minv, 570 int maxp, 571 double maxv) 572 { 573 char *data = NULL; 574 575 if (strpbrk (label, "'= ")) 576 asprintf (&data, "'%s'=", label); 577 else 578 asprintf (&data, "%s=", label); 579 580 asprintf (&data, "%s%f", data, val); 581 asprintf (&data, "%s%s;", data, uom); 582 583 if (warnp) 584 asprintf (&data, "%s%f", data, warn); 585 586 asprintf (&data, "%s;", data); 587 588 if (critp) 589 asprintf (&data, "%s%f", data, crit); 590 591 asprintf (&data, "%s;", data); 592 593 if (minp) 594 asprintf (&data, "%s%f", data, minv); 595 596 if (maxp) { 597 asprintf (&data, "%s;", data); 598 asprintf (&data, "%s%f", data, maxv); 599 } 600 601 return data; 602 }