diff --git a/plugins/check_http.c b/plugins/check_http.c index 433c28e..6a8a90a 100644 --- a/plugins/check_http.c +++ b/plugins/check_http.c @@ -84,6 +84,7 @@ int errcode; int invert_regex = 0; struct timeval tv; +struct timeval tv_temp; #define HTTP_URL "/" #define CRLF "\r\n" @@ -130,6 +131,11 @@ void redir (char *pos, char *status_line); int server_type_check(const char *type); int server_port_check(int ssl_flag); char *perfd_time (double microsec); +char *perfd_time_connect (double microsec); +char *perfd_time_ssl (double microsec); +char *perfd_time_firstbyte (double microsec); +char *perfd_time_headers (double microsec); +char *perfd_time_transfer (double microsec); char *perfd_size (int page_len); void print_help (void); void print_usage (void); @@ -790,15 +796,31 @@ check_http (void) char *pos; long microsec; double elapsed_time; + long microsec_connect; + double elapsed_time_connect; + long microsec_ssl; + double elapsed_time_ssl; + long microsec_firstbyte; + double elapsed_time_firstbyte; + long microsec_headers; + double elapsed_time_headers; + long microsec_transfer; + double elapsed_time_transfer; int page_len = 0; int result = STATE_OK; /* try to connect to the host at the given port number */ + gettimeofday (&tv_temp, NULL); if (my_tcp_connect (server_address, server_port, &sd) != STATE_OK) die (STATE_CRITICAL, _("HTTP CRITICAL - Unable to open TCP socket\n")); + microsec_connect = deltime (tv_temp); #ifdef HAVE_SSL + elapsed_time_connect = (double)microsec_connect / 1.0e6; if (use_ssl == TRUE) { + gettimeofday (&tv_temp, NULL); np_net_ssl_init_with_hostname(sd, (use_sni ? host_name : NULL)); + microsec_ssl = deltime (tv_temp); + elapsed_time_ssl = (double)microsec_ssl / 1.0e6; if (check_cert == TRUE) { result = np_net_ssl_check_cert(days_till_exp); np_net_ssl_cleanup(); @@ -867,11 +889,19 @@ check_http (void) } if (verbose) printf ("%s\n", buf); + gettimeofday (&tv_temp, NULL); my_send (buf, strlen (buf)); + microsec_headers = deltime (tv_temp); + elapsed_time_headers = (double)microsec_headers / 1.0e6; /* fetch the page */ full_page = strdup(""); + gettimeofday (&tv_temp, NULL); while ((i = my_recv (buffer, MAX_INPUT_BUFFER-1)) > 0) { + if ((i >= 1) && (elapsed_time_firstbyte <= 0.000001)) { + microsec_firstbyte = deltime (tv_temp); + elapsed_time_firstbyte = (double)microsec_firstbyte / 1.0e6; + } buffer[i] = '\0'; asprintf (&full_page_new, "%s%s", full_page, buffer); free (full_page); @@ -883,6 +913,8 @@ check_http (void) break; } } + microsec_transfer = deltime (tv_temp); + elapsed_time_transfer = (double)microsec_transfer / 1.0e6; if (i < 0 && errno != ECONNRESET) { #ifdef HAVE_SSL @@ -1085,10 +1117,16 @@ check_http (void) /* check elapsed time */ asprintf (&msg, - _("%s - %d bytes in %.3f second response time %s|%s %s"), + _("%s - %d bytes in %.3f second response time %s|%s %s %s %s %s %s %s"), msg, page_len, elapsed_time, (display_html ? "" : ""), - perfd_time (elapsed_time), perfd_size (page_len)); + perfd_time (elapsed_time), + perfd_size (page_len), + perfd_time_connect (elapsed_time_connect), + perfd_time_ssl (elapsed_time_ssl), + perfd_time_headers (elapsed_time_headers), + perfd_time_firstbyte (elapsed_time_firstbyte), + perfd_time_transfer (elapsed_time_transfer)); result = max_state_alt(get_status(elapsed_time, thlds), result); @@ -1277,7 +1315,30 @@ char *perfd_time (double elapsed_time) TRUE, 0, FALSE, 0); } +char *perfd_time_connect (double elapsed_time_connect) +{ + return fperfdata ("time_connect", elapsed_time_connect, "s", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0); +} +char *perfd_time_ssl (double elapsed_time_ssl) +{ + return fperfdata ("time_ssl", elapsed_time_ssl, "s", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0); +} + +char *perfd_time_headers (double elapsed_time_headers) +{ + return fperfdata ("time_headers", elapsed_time_headers, "s", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0); +} + +char *perfd_time_firstbyte (double elapsed_time_firstbyte) +{ + return fperfdata ("time_firstbyte", elapsed_time_firstbyte, "s", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0); +} + +char *perfd_time_transfer (double elapsed_time_transfer) +{ + return fperfdata ("time_transfer", elapsed_time_transfer, "s", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0); +} char *perfd_size (int page_len) {