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 }

簡単にまとめ


ソースコード読んでみた結果、UNIX時間を使って計算していると解釈しました。。
間違っていたらご指摘いただけるとありがたいです。


今日はこんな所で。