From: Rainer Jung Date: Tue, 7 Aug 2018 10:48:05 +0000 (+0000) Subject: mod_status: Add cumulated response duration time X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2a7d17c766f2e13e1e1326f5060e2f838a39335f;p=apache mod_status: Add cumulated response duration time in milliseconds. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1837590 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 4946e859e7..56a3bcc592 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.1 + *) mod_status: Add cumulated response duration time in milliseconds. + [Rainer Jung] + *) mod_status: Complete the data shown for async MPMs in "auto" mode. Added number of processes, number of stopping processes and number of busy and idle workers. [Rainer Jung] diff --git a/include/ap_mmn.h b/include/ap_mmn.h index aea09879c5..e42f8ff891 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -589,6 +589,8 @@ * 20180720.2 (2.5.1-dev) Add optional function declaration for * ap_proxy_balancer_get_best_worker to mod_proxy.h. * 20180720.3 (2.5.1-dev) Add client64 to worker_share + * 20180720.4 (2.5.1-dev) Add new duration field to worker_score struct in + * scoreboard.h * */ @@ -597,7 +599,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20180720 #endif -#define MODULE_MAGIC_NUMBER_MINOR 3 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 4 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/include/scoreboard.h b/include/scoreboard.h index 42b04d1ee7..1a4bd7cb3e 100644 --- a/include/scoreboard.h +++ b/include/scoreboard.h @@ -117,6 +117,7 @@ struct worker_score { char vhost[32]; /* What virtual host is being accessed? */ char protocol[16]; /* What protocol is used on the connection? */ char client64[64]; + apr_time_t duration; }; typedef struct { diff --git a/modules/generators/mod_status.c b/modules/generators/mod_status.c index 490e9e8615..90cc7b0131 100644 --- a/modules/generators/mod_status.c +++ b/modules/generators/mod_status.c @@ -193,6 +193,8 @@ static int status_handler(request_rec *r) apr_off_t bytes, my_bytes, conn_bytes; apr_off_t bcount, kbcount; long req_time; + apr_time_t duration_global; + apr_time_t duration_slot; int short_report; int no_table_report; worker_score *ws_record; @@ -232,6 +234,7 @@ static int status_handler(request_rec *r) count = 0; bcount = 0; kbcount = 0; + duration_global = 0; short_report = 0; no_table_report = 0; @@ -374,6 +377,7 @@ static int status_handler(request_rec *r) count += lres; bcount += bytes; + duration_global += ws_record->duration; if (bcount >= KBYTE) { kbcount += (bcount >> 10); @@ -461,8 +465,9 @@ static int status_handler(request_rec *r) if (ap_extended_status) { if (short_report) { ap_rprintf(r, "Total Accesses: %lu\nTotal kBytes: %" - APR_OFF_T_FMT "\n", - count, kbcount); + APR_OFF_T_FMT "\nTotal Duration: %" + APR_TIME_T_FMT "\n", + count, kbcount, duration_global / 1000); #ifdef HAVE_TIMES /* Allow for OS/2 not having CPU stats */ @@ -482,14 +487,17 @@ static int status_handler(request_rec *r) ap_rprintf(r, "BytesPerSec: %g\n", KBYTE * (float) kbcount / (float) up_time); } - if (count > 0) + if (count > 0) { ap_rprintf(r, "BytesPerReq: %g\n", KBYTE * (float) kbcount / (float) count); + ap_rprintf(r, "DurationPerReq: %g\n", + (float) duration_global / (float) count / 1000.); + } } else { /* !short_report */ ap_rprintf(r, "
Total accesses: %lu - Total Traffic: ", count); format_kbyte_out(r, kbcount); - ap_rputs("
\n", r); + ap_rprintf(r, " - Total Duration: %" APR_TIME_T_FMT "\n", duration_global / 1000); #ifdef HAVE_TIMES /* Allow for OS/2 not having CPU stats */ @@ -507,13 +515,15 @@ static int status_handler(request_rec *r) format_byte_out(r, (unsigned long)(KBYTE * (float) kbcount / (float) up_time)); - ap_rputs("/second - ", r); + ap_rputs("/second", r); } if (count > 0) { + ap_rputs(" - ", r); format_byte_out(r, (unsigned long)(KBYTE * (float) kbcount / (float) count)); - ap_rputs("/request", r); + ap_rprintf(r, "/request - %g ms/request", + (float) duration_global / (float) count / 1000.); } ap_rputs("\n", r); @@ -691,7 +701,7 @@ static int status_handler(request_rec *r) #ifdef HAVE_TIMES "CPU\n" #endif - "SSReq" + "SSReqDur" "ConnChildSlot" "ClientProtocolVHost" "Request\n\n", r); @@ -723,6 +733,7 @@ static int status_handler(request_rec *r) bytes = ws_record->bytes_served; my_bytes = ws_record->my_bytes_served; conn_bytes = ws_record->conn_bytes; + duration_slot = ws_record->duration; if (ws_record->pid) { /* MPM sets per-worker pid and generation */ worker_pid = ws_record->pid; worker_generation = ws_record->generation; @@ -789,7 +800,7 @@ static int status_handler(request_rec *r) #ifdef HAVE_TIMES "u%g s%g cu%g cs%g" #endif - "\n %ld %ld (", + "\n %ld %ld %" APR_TIME_T_FMT "(", #ifdef HAVE_TIMES ws_record->times.tms_utime / tick, ws_record->times.tms_stime / tick, @@ -798,7 +809,8 @@ static int status_handler(request_rec *r) #endif (long)apr_time_sec(nowtime - ws_record->last_used), - (long) req_time); + (long) req_time, + duration_slot / 1000); format_byte_out(r, conn_bytes); ap_rputs("|", r); @@ -878,7 +890,7 @@ static int status_handler(request_rec *r) #ifdef HAVE_TIMES "%.2f" #endif - "%ld%ld", + "%ld%ld%" APR_TIME_T_FMT, #ifdef HAVE_TIMES (ws_record->times.tms_utime + ws_record->times.tms_stime + @@ -887,7 +899,8 @@ static int status_handler(request_rec *r) #endif (long)apr_time_sec(nowtime - ws_record->last_used), - (long)req_time); + (long)req_time, + duration_slot / 1000); ap_rprintf(r, "%-1.1f%-2.2f%-2.2f\n", (float)conn_bytes / KBYTE, (float) my_bytes / MBYTE, @@ -923,6 +936,7 @@ static int status_handler(request_rec *r) "SSSeconds since beginning of most recent request\n \ ReqMilliseconds required to process most recent request\n \ +DurSum of milliseconds required to process all requests\n \ ConnKilobytes transferred this connection\n \ ChildMegabytes transferred this child\n \ SlotTotal megabytes transferred this slot\n \ diff --git a/server/scoreboard.c b/server/scoreboard.c index 3e200a1a96..7cc9e11610 100644 --- a/server/scoreboard.c +++ b/server/scoreboard.c @@ -641,6 +641,9 @@ AP_DECLARE(void) ap_time_process_request(ap_sb_handle_t *sbh, int status) } else if (status == STOP_PREQUEST) { ws->stop_time = ws->last_used = apr_time_now(); + if (ap_extended_status) { + ws->duration += ws->stop_time - ws->start_time; + } } }