httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jim Jagielski <...@hyperreal.com>
Subject cvs commit: apache/src http_main.c mod_status.c scoreboard.h
Date Tue, 07 May 1996 18:29:39 GMT
jim         96/05/07 11:29:38

  Modified:    src       http_main.c mod_status.c scoreboard.h
  Log:
  status module improvements + tables
  
  Revision  Changes    Path
  1.25      +11 -3     apache/src/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_main.c,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -C3 -r1.24 -r1.25
  *** http_main.c	1996/04/18 11:16:36	1.24
  --- http_main.c	1996/05/07 18:29:34	1.25
  ***************
  *** 672,677 ****
  --- 672,679 ----
    	 */
    	new_score_rec.my_access_count = 0L;
    	new_score_rec.my_bytes_served = 0L;
  + 	new_score_rec.conn_count = (unsigned short)0;
  + 	new_score_rec.conn_bytes = (unsigned short)0;
        }
        if (r) {
    	int slot_size;
  ***************
  *** 713,719 ****
    }
    
    #if defined(STATUS)
  ! void increment_counts (int child_num, request_rec *r)
    {
        long int bs=0;
        short_score new_score_rec=scoreboard_image[child_num];
  --- 715,721 ----
    }
    
    #if defined(STATUS)
  ! void increment_counts (int child_num, request_rec *r, int flag)
    {
        long int bs=0;
        short_score new_score_rec=scoreboard_image[child_num];
  ***************
  *** 721,730 ****
  --- 723,738 ----
        if (r->sent_bodyct)
            bgetopt(r->connection->client, BO_BYTECT, &bs);
    
  +     if (flag) {
  + 	new_score_rec.conn_count = (unsigned short)0;
  + 	new_score_rec.conn_bytes = (unsigned short)0;
  +     }
        new_score_rec.access_count ++;
        new_score_rec.my_access_count ++;
  +     new_score_rec.conn_count ++;
        new_score_rec.bytes_served += (unsigned long)bs;
        new_score_rec.my_bytes_served += (unsigned long)bs;
  +     new_score_rec.conn_bytes += (unsigned short)bs;
    
        times(&new_score_rec.times);
    
  ***************
  *** 1176,1182 ****
    	if (r) process_request (r); /* else premature EOF --- ignore */
    
    #if defined(STATUS)
  !         if (r) increment_counts(child_num,r);
    #endif
    	while (r && current_conn->keepalive) {
    	  bflush(conn_io);
  --- 1184,1190 ----
    	if (r) process_request (r); /* else premature EOF --- ignore */
    
    #if defined(STATUS)
  !         if (r) increment_counts(child_num,r,1);
    #endif
    	while (r && current_conn->keepalive) {
    	  bflush(conn_io);
  ***************
  *** 1187,1193 ****
    	  if (r) process_request (r);
    
    #if defined(STATUS)
  ! 	  if (r) increment_counts(child_num,r);
    #endif
    	}
    #if 0	
  --- 1195,1201 ----
    	  if (r) process_request (r);
    
    #if defined(STATUS)
  ! 	  if (r) increment_counts(child_num,r,0);
    #endif
    	}
    #if 0	
  
  
  
  1.15      +336 -143  apache/src/mod_status.c
  
  Index: mod_status.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/mod_status.c,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -C3 -r1.14 -r1.15
  *** mod_status.c	1996/04/17 00:30:58	1.14
  --- mod_status.c	1996/05/07 18:29:35	1.15
  ***************
  *** 61,66 ****
  --- 61,67 ----
     * GET /.status?refresh - Returns page with 1 second refresh
     * GET /.status?refresh=6 - Returns page with refresh every 6 seconds
     * GET /.status?auto - Returns page with data for automatic parsing
  +  * GET /.status?notable - Returns page with no table niceties
     *
     * Mark Cox, mark@ukweb.com, November 1995
     *
  ***************
  *** 72,77 ****
  --- 73,80 ----
     * 25.3.96  Show uptime better [Mark/Ben Laurie]
     * 29.3.96  Better HTML and explanation [Mark/Rob Hartill suggested]
     * 09.4.96  Added message for non-STATUS compiled version
  +  * 18.4.96  Added per child and per slot counters [Jim Jagielski]
  +  * 01.5.96  Table format, cleanup, even more spiffy data [Chuck Murcko/Jim J.]
     */
    
    #include "httpd.h"
  ***************
  *** 83,103 ****
    #include <time.h>
    #include "scoreboard.h"
    
    module status_module;
    
    /* Format the number of bytes nicely */
    
  ! void format_byte_out(request_rec *r,unsigned long bytes) {
        char ss[20];
    
  !     if (bytes<5196)
            sprintf(ss,"%dB",(int)bytes);
  !     else if (bytes<524288)
  ! 	sprintf(ss,"%.1fkB",(float)bytes/1024);
  !     else if (bytes<536870912)
  ! 	sprintf(ss,"%.1fMB",(float)bytes/1048576);
        else
  ! 	sprintf(ss,"%.1fGB",(float)bytes/1073741824);
        rputs(ss,r);
    }
    
  --- 86,113 ----
    #include <time.h>
    #include "scoreboard.h"
    
  + #define STATUS_MAXLINE		50
  + 
  + #define KBYTE			1024
  + #define	MBYTE			1048576L
  + #define	GBYTE			1073741824L
  + 
    module status_module;
    
    /* Format the number of bytes nicely */
    
  ! void format_byte_out(request_rec *r,unsigned long bytes)
  ! {
        char ss[20];
    
  !     if (bytes < (5 * KBYTE))
            sprintf(ss,"%dB",(int)bytes);
  !     else if (bytes < (MBYTE / 2))
  ! 	sprintf(ss,"%.1fkB",(float)bytes/KBYTE);
  !     else if (bytes < (GBYTE / 2))
  ! 	sprintf(ss,"%.1fMB",(float)bytes/MBYTE);
        else
  ! 	sprintf(ss,"%.1fGB",(float)bytes/GBYTE);
        rputs(ss,r);
    }
    
  ***************
  *** 116,135 ****
        s=buf;
        *s='\0';
        if(days)
  !       s+=sprintf(s," %ld day%s",days,days==1?"":"s");
        if(hrs)
  !       s+=sprintf(s," %ld hour%s",hrs,hrs==1?"":"s");
        if(mins)
  !       s+=sprintf(s," %ld minute%s",mins,mins==1?"":"s");
        if(secs)
  !       s+=sprintf(s," %ld second%s",secs,secs==1?"":"s");
        rputs(buf,r);
    }
    
    /* Main handler for x-httpd-status requests */
    
    int status_handler (request_rec *r)
    {
        time_t nowtime=time(NULL);
        time_t up_time;
        int i,res;
  --- 126,179 ----
        s=buf;
        *s='\0';
        if(days)
  !     {
  !       sprintf(s," %ld day%s",days,days==1?"":"s");
  !       s+=strlen(s);
  !     }
        if(hrs)
  !     {
  !       sprintf(s," %ld hour%s",hrs,hrs==1?"":"s");
  !       s+=strlen(s);
  !     }
        if(mins)
  !     {
  !       sprintf(s," %ld minute%s",mins,mins==1?"":"s");
  !       s+=strlen(s);
  !     }
        if(secs)
  !     {
  !       sprintf(s," %ld second%s",secs,secs==1?"":"s");
  !       s+=strlen(s);
  !     }
        rputs(buf,r);
    }
    
    /* Main handler for x-httpd-status requests */
    
  + /* ID values for command table */
  + 
  + #define STAT_OPT_END		-1
  + #define STAT_OPT_REFRESH	0
  + #define STAT_OPT_NOTABLE	1
  + #define STAT_OPT_AUTO		2
  + 
  + struct stat_opt
  + {
  +     int id;
  +     char *form_data_str;
  +     char *hdr_out_str;
  + };
  + 
    int status_handler (request_rec *r)
    {
  +     struct stat_opt options[] =        /* see #defines above */
  +     {
  + 	STAT_OPT_REFRESH, "refresh", "Refresh",
  +         STAT_OPT_NOTABLE, "notable", NULL,
  +         STAT_OPT_AUTO, "auto", NULL,
  + 	STAT_OPT_END, NULL, NULL
  +     };
  +     char *loc;
        time_t nowtime=time(NULL);
        time_t up_time;
        int i,res;
  ***************
  *** 139,152 ****
        unsigned long count=0;
        unsigned long lres,bytes;
        unsigned long my_lres,my_bytes;
        unsigned long bcount=0;
        float tick=sysconf(_SC_CLK_TCK);
  ! #endif
        int short_report=0;
        server_rec *server = r->server;
        short_score score_record;
        char status[]="???????";
        char buffer[200];
        clock_t tu,ts,tcu,tcs;
    
        tu=ts=tcu=tcs=0;
  --- 183,199 ----
        unsigned long count=0;
        unsigned long lres,bytes;
        unsigned long my_lres,my_bytes;
  +     unsigned short conn_lres,conn_bytes;
        unsigned long bcount=0;
        float tick=sysconf(_SC_CLK_TCK);
  ! #endif /* STATUS */
        int short_report=0;
  +     int no_table_report=0;
        server_rec *server = r->server;
        short_score score_record;
        char status[]="???????";
        char buffer[200];
  +     char stat_buffer[HARD_SERVER_MAX];
        clock_t tu,ts,tcu,tcs;
    
        tu=ts=tcu=tcs=0;
  ***************
  *** 160,273 ****
        if (r->method_number != M_GET) return NOT_IMPLEMENTED;
        r->content_type = "text/html";
    
  !     if (r->args) {
  !         if (!strncmp(r->args,"refresh",7))
  ! 	  if(r->args[7] == '=')
  ! 	    table_set(r->headers_out,"Refresh",r->args+8);
  ! 	  else
  ! 	    table_set(r->headers_out,"Refresh","1");
  !         else if (!strncmp(r->args,"auto",4)) {
  ! 	  r->content_type = "text/plain";
  ! 	  short_report=1;
  ! 	}
        }
        soft_timeout ("send status info", r);
        send_http_header(r);
    
        if (r->header_only) 
    	return 0;
    
  -     up_time=nowtime-restart_time;
  - 
  -     if (!short_report) {
  -         rputs("<html><head><title>Apache Status</title></head><body>",r);
  -         rputs("<h1>Apache Server Status</h1>\n\n",r);
  - 	rvputs(r,"Hostname: ",server->server_hostname,"<br>",NULL);
  - 	rvputs(r,"Current Time: ",asctime(localtime(&nowtime)),"<br>",NULL);
  - 	rvputs(r,"Restart Time: ",asctime(localtime(&restart_time)),"<br>",
  - 	       NULL);
  - 	rputs("Server up for: ",r);
  - 	show_time(r,up_time);
  - 	rputs("<p>",r);
  -     }
  - 
        sync_scoreboard_image();
  !     rputs("Scoreboard: ",r);
  !     if(!short_report)
  ! 	rputs("<PRE>",r);
  !     for (i = 0; i<HARD_SERVER_MAX; ++i) {
            score_record = get_scoreboard_info(i);
            res = score_record.status;
  ! 	rputc(status[res],r);
            if (res == SERVER_READY)
    	    ready++;
            else if (res == SERVER_BUSY_READ || res==SERVER_BUSY_WRITE || 
    		 res == SERVER_STARTING)
    	    busy++;
  - 	if(!short_report && i%25 == 24)
  - 	    rputs("\r\n",r);
  -     }
  -     if(!short_report) {
  - 	rputs("</PRE>",r);
  - 	rputs("Key: ",r);
  - 	rputs("\"<code>_</code>\" Waiting for Connection, ",r);
  - 	rputs("\"<code>S</code>\" Starting up, ",r);
  - 	rputs("\"<code>R</code>\" Reading Request, ",r);
  - 	rputs("\"<code>W</code>\" Sending Reply<p>",r);
  -     }
  -     if (short_report)
  -         sprintf(buffer,"\nBusyServers: %d\nIdleServers: %d\n",busy,ready);
  -     else 
  -         sprintf(buffer,"\n%d requests currently being processed,\n %d idle servers\n",busy,ready);
  -     rputs(buffer,r);
  - 
    #if defined(STATUS)
  -     if (!short_report)
  -       rputs("<hr><h2>Server Details</h2>",r);
  -     for (i = 0; i<HARD_SERVER_MAX; ++i) {
  -         score_record=get_scoreboard_info(i);
            lres = score_record.access_count;
  -         my_lres = score_record.my_access_count;
    	bytes= score_record.bytes_served;
  ! 	my_bytes= score_record.my_bytes_served;
  !         if (lres!=0 || (score_record.status != SERVER_READY && score_record.status
!= SERVER_DEAD)) {
  ! 	    if (!short_report) {
  ! 	        sprintf(buffer,"<b>Server %d</b> (%d): %lu|%lu [",
  ! 		 i,(int)score_record.pid,my_lres,lres);
  ! 		rputs(buffer,r);
  ! 
  ! 		switch (score_record.status) {
  ! 		case SERVER_READY:
  ! 		    rputs("Ready",r);
  ! 		    break;
  ! 		case SERVER_STARTING:
  ! 		    rputs("Starting",r);
  ! 		    break;
  ! 		case SERVER_BUSY_READ:
  ! 		    rputs("<b>Read</b>",r);
  ! 		    break;
  ! 		case SERVER_BUSY_WRITE:
  ! 		    rputs("<b>Write</b>",r);
  ! 		    break;
  ! 		case SERVER_DEAD:
  ! 		    rputs("Dead",r);
  ! 		    break;
  ! 		}
  ! 		sprintf(buffer,"] u%g s%g cu%g cs%g %s (",
  ! 			score_record.times.tms_utime/tick,
  ! 			score_record.times.tms_stime/tick,
  ! 			score_record.times.tms_cutime/tick,
  ! 			score_record.times.tms_cstime/tick,
  ! 			asctime(localtime(&score_record.last_used)));
  ! 		rputs(buffer,r);
  ! 		format_byte_out(r,my_bytes);
  ! 		rputs("|",r);
  ! 		format_byte_out(r,bytes);
  ! 		rputs(")",r);
  ! 		sprintf(buffer," <i>%s {%s}</i><br>", score_record.client,
  ! 			score_record.request);
  ! 		rputs(buffer,r);
  ! 	    }
    	    tu+=score_record.times.tms_utime;
    	    ts+=score_record.times.tms_stime;
    	    tcu+=score_record.times.tms_cutime;
  --- 207,268 ----
        if (r->method_number != M_GET) return NOT_IMPLEMENTED;
        r->content_type = "text/html";
    
  !     /*
  !      * Simple table-driven form data set parser that lets you alter the header
  !      */
  ! 
  !     if (r->args)
  !     {
  ! 	i = 0;
  !         while (options[i].id != STAT_OPT_END)
  !         {
  !             if ((loc = strstr(r->args,options[i].form_data_str)) != NULL)
  ! 	    {
  !                 switch (options[i].id)
  !                 {
  !                   case STAT_OPT_REFRESH:
  !                       if(*(loc + strlen(options[i].form_data_str)) == '=')
  !                           table_set(r->headers_out,options[i].hdr_out_str,
  ! 			    loc+strlen(options[i].hdr_out_str)+1);
  !                       else
  !                           table_set(r->headers_out,options[i].hdr_out_str,"1");
  !                       break;
  !                   case STAT_OPT_NOTABLE:
  !                       no_table_report = 1;
  !                       break;
  !                   case STAT_OPT_AUTO:
  !                       r->content_type = "text/plain";
  !                       short_report = 1;
  !                       break;
  !                 }
  ! 	    }
  ! 	    i++;
  !         }
        }
  + 
        soft_timeout ("send status info", r);
        send_http_header(r);
    
        if (r->header_only) 
    	return 0;
    
        sync_scoreboard_image();
  !     for (i = 0; i<HARD_SERVER_MAX; ++i)
  !     {
            score_record = get_scoreboard_info(i);
            res = score_record.status;
  ! 	stat_buffer[i] = status[res];
            if (res == SERVER_READY)
    	    ready++;
            else if (res == SERVER_BUSY_READ || res==SERVER_BUSY_WRITE || 
    		 res == SERVER_STARTING)
    	    busy++;
    #if defined(STATUS)
            lres = score_record.access_count;
    	bytes= score_record.bytes_served;
  !         if (lres!=0 || (score_record.status != SERVER_READY
  ! 	  && score_record.status != SERVER_DEAD))
  ! 	{
    	    tu+=score_record.times.tms_utime;
    	    ts+=score_record.times.tms_stime;
    	    tcu+=score_record.times.tms_cutime;
  ***************
  *** 275,353 ****
                count+=lres;
    	    bcount+=bytes;
    	}
        }
  !     if (short_report) {
            sprintf(buffer,"Total Accesses: %lu\nTotal Bytes: %lu\n",count,bcount);
    	rputs(buffer,r);
  !     } else {
  !         sprintf(buffer,"<p>Total accesses: %lu u%g s%g cu%g cs%g (",
  ! 		count,tu/tick,ts/tick,tcu/tick,tcs/tick);
  ! 	rputs(buffer,r);
  ! 	format_byte_out(r,bcount);
  ! 	rputs(")",r);
  !     }
  !     if (!short_report) {
  !         rputs("<hr><h2>Averages</h2>",r);
  ! 	if (up_time>0) {
  ! 	    sprintf(buffer,"%.3g request per second<br>\n",
  ! 		    (float)count/(float)up_time);
  ! 	    rputs(buffer,r);
  ! 	}
  ! 	if (up_time>0) {
  ! 	    format_byte_out(r,(float)bcount/(float)up_time);
  ! 	    rputs(" per second<br>\n",r);
  ! 	}
  ! 	if (count>0)  {
  ! 	    format_byte_out(r,(float)bcount/(float)count);
  ! 	    rputs(" per request<br>\n",r);
  ! 	}
    	if(ts || tu || tcu || tcs)
  ! 	    {
  ! 	    sprintf(buffer,"%.3g%% CPU load<br>\n",(tu+ts+tcu+tcs)/tick/up_time*100.);
    	    rputs(buffer,r);
  ! 	    }
  !     } else {
    	sprintf(buffer,"Uptime: %ld\n",(long)(up_time));
    	rputs(buffer,r);
  ! 	if (up_time>0) { 
    	    sprintf(buffer,"ReqPerSec: %g\n",
    		    (float)count/(float)up_time);
    	    rputs(buffer,r);
    	}
  ! 	if (up_time>0) {
    	    sprintf(buffer,"BytesPerSec: %g\n",
    		(float)bcount/(float)up_time);
    	    rputs(buffer,r);
    	}
  ! 	if (count>0) {
    	    sprintf(buffer,"BytesPerReq: %g\n",
    		(float)bcount/(float)count);
    	    rputs(buffer,r);
    	}
    	if(ts || tu || tcu || tcs)
  ! 	    {
  ! 	    sprintf(buffer,"CPULoad: %g\n",(tu+ts+tcu+tcs)/tick/up_time*100.);
    	    rputs(buffer,r);
  ! 	    }
        }
  ! #else
  !     rputs("<hr>To obtain a full report with current status information ",r);
  !     rputs("you need to recompile Apache adding the <code>-DSTATUS</code> ",r);
  !     rputs("directive on the <code>CFLAGS</code> line in the ",r);
  !     rputs("<code>Configuration</code> file.",r);
  ! #endif
        if (!short_report)
            rputs("</body></html>",r);
        return 0;
    }
    
  ! handler_rec status_handlers[] = {
    { STATUS_MAGIC_TYPE, status_handler },
    { "server-status", status_handler },
    { NULL }
    };
    
  ! module status_module = {
       STANDARD_MODULE_STUFF,
       NULL,			/* initializer */
       NULL,			/* dir config creater */
  --- 270,546 ----
                count+=lres;
    	    bcount+=bytes;
    	}
  + #endif /* STATUS */
        }
  ! 
  !     up_time=nowtime-restart_time;
  ! 
  !     if (!short_report)
  !     {
  !         rputs("<html><head><title>Apache Status</title></head><body>\n",r);
  !         rputs("<h1>Apache Server Status for ",r);
  ! 	rvputs(r,server->server_hostname,"</h1>\n\n",NULL);
  ! 	rvputs(r,"Current Time: ",asctime(localtime(&nowtime)),"<br>\n",NULL);
  ! 	rvputs(r,"Restart Time: ",asctime(localtime(&restart_time)),"<br>\n",
  ! 	       NULL);
  ! 	rputs("Server uptime: ",r);
  ! 	show_time(r,up_time);
  ! 	rputs("<br>\n",r);
  !     }
  ! 
  ! #if defined(STATUS)
  !     if (short_report)
  !     {
            sprintf(buffer,"Total Accesses: %lu\nTotal Bytes: %lu\n",count,bcount);
    	rputs(buffer,r);
  ! 
    	if(ts || tu || tcu || tcs)
  ! 	{
  ! 	    sprintf(buffer,"CPULoad: %g\n",(tu+ts+tcu+tcs)/tick/up_time*100.);
    	    rputs(buffer,r);
  ! 	}
  ! 
    	sprintf(buffer,"Uptime: %ld\n",(long)(up_time));
    	rputs(buffer,r);
  ! 	if (up_time>0)
  ! 	{ 
    	    sprintf(buffer,"ReqPerSec: %g\n",
    		    (float)count/(float)up_time);
    	    rputs(buffer,r);
    	}
  ! 
  ! 	if (up_time>0)
  ! 	{
    	    sprintf(buffer,"BytesPerSec: %g\n",
    		(float)bcount/(float)up_time);
    	    rputs(buffer,r);
    	}
  ! 
  ! 	if (count>0)
  ! 	{
    	    sprintf(buffer,"BytesPerReq: %g\n",
    		(float)bcount/(float)count);
    	    rputs(buffer,r);
    	}
  +     } else /* !short_report */
  +     {
  +         sprintf(buffer,"Total accesses: %lu - Total Traffic: ", count);
  + 	rputs(buffer,r);
  + 	format_byte_out(r,bcount);
  + 	rputs("<br>\n",r);
  +         sprintf(buffer,"CPU Usage: u%g s%g cu%g cs%g",
  + 		tu/tick,ts/tick,tcu/tick,tcs/tick);
  + 	rputs(buffer,r);
  + 
    	if(ts || tu || tcu || tcs)
  ! 	{
  ! 	    sprintf(buffer," - %.3g%% CPU load",
  ! 		(tu+ts+tcu+tcs)/tick/up_time*100.);
    	    rputs(buffer,r);
  ! 	}
  ! 
  ! 	rputs("<br>\n",r);
  ! 
  ! 	if (up_time>0)
  ! 	{
  ! 	    sprintf(buffer,"%.3g requests/sec - ",
  ! 		    (float)count/(float)up_time);
  ! 	    rputs(buffer,r);
  ! 	}
  ! 
  ! 	if (up_time>0)
  ! 	{
  ! 	    format_byte_out(r,(float)bcount/(float)up_time);
  ! 	    rputs("/second - ",r);
  ! 	}
  ! 
  ! 	if (count>0)
  ! 	{
  ! 	    format_byte_out(r,(float)bcount/(float)count);
  ! 	    rputs("/request",r);
  ! 	}
  ! 
  ! 	rputs("<p>\n",r);
  !     } /* short_report */
  ! #endif /* STATUS */
  ! 
  !     /* send the scoreboard 'table' out */
  ! 
  !     rputs("Scoreboard: \n",r);
  ! 
  !     if(!short_report)
  ! 	rputs("<PRE>",r);
  ! 
  !     rputs("\n",r);
  ! 
  !     for (i = 0; i<HARD_SERVER_MAX; ++i)
  !     {
  ! 	rputc(stat_buffer[i], r);
  ! 	if(i%STATUS_MAXLINE == (STATUS_MAXLINE - 1))
  ! 	    rputs("\n",r);
  !     }
  ! 
  !     if (short_report)
  !     {
  !         sprintf(buffer,"\nBusyServers: %d\nIdleServers: %d\n",busy,ready);
  !     }
  !     else 
  !     {
  ! 	rputs("</PRE>\n",r);
  ! 	rputs("Key: \n",r);
  ! 	rputs("\"<code>_</code>\" Waiting for Connection, \n",r);
  ! 	rputs("\"<code>S</code>\" Starting up, \n",r);
  ! 	rputs("\"<code>R</code>\" Reading Request, \n",r);
  ! 	rputs("\"<code>W</code>\" Sending Reply<p>\n",r);
  !         sprintf(buffer,"\n%d requests currently being processed, %d idle servers\n",busy,ready);
  ! 	rputs(buffer,r);
  !     }
  ! 
  ! #if defined(STATUS)
  !     if (!short_report)
  !     	if(no_table_report)
  !             rputs("<p><hr><h2>Server Details</h2>\n\n",r);
  ! 	else
  !             rputs("<p>\n\n<table border=0><tr><th>Srv<th>PID<th>Acc<th>M<th>CPU\n<th>SS<th>B0<th>B1<th>B2<th>Host<th>Request</tr>\n\n",r);
  ! 
  ! 
  !     for (i = 0; i<HARD_SERVER_MAX; ++i)
  !     {
  !         score_record=get_scoreboard_info(i);
  !         lres = score_record.access_count;
  !         my_lres = score_record.my_access_count;
  ! 	conn_lres = score_record.conn_count;
  ! 	bytes= score_record.bytes_served;
  ! 	my_bytes = score_record.my_bytes_served;
  ! 	conn_bytes = score_record.conn_bytes;
  !         if (lres!=0 || (score_record.status != SERVER_READY
  ! 		&& score_record.status != SERVER_DEAD))
  ! 	{
  ! 	    if (!short_report)
  ! 	    {
  ! 		if (no_table_report)
  ! 		{
  ! 	            sprintf(buffer,"<b>Server %d</b> (%d): %d|%lu|%lu [",
  ! 		     i,(int)score_record.pid,(int)conn_lres,my_lres,lres);
  ! 		    rputs(buffer,r);
  ! 
  ! 		    switch (score_record.status)
  ! 		    {
  ! 		        case SERVER_READY:
  ! 		            rputs("Ready",r);
  ! 		            break;
  ! 		        case SERVER_STARTING:
  ! 		            rputs("Starting",r);
  ! 		            break;
  ! 		        case SERVER_BUSY_READ:
  ! 		            rputs("<b>Read</b>",r);
  ! 		            break;
  ! 		        case SERVER_BUSY_WRITE:
  ! 		            rputs("<b>Write</b>",r);
  ! 		            break;
  ! 		        case SERVER_DEAD:
  ! 		            rputs("Dead",r);
  ! 		            break;
  ! 		    }
  ! 		    sprintf(buffer,"] u%g s%g cu%g cs%g\n %s (",
  ! 			    score_record.times.tms_utime/tick,
  ! 			    score_record.times.tms_stime/tick,
  ! 			    score_record.times.tms_cutime/tick,
  ! 			    score_record.times.tms_cstime/tick,
  ! 			    asctime(localtime(&score_record.last_used)));
  ! 		    rputs(buffer,r);
  ! 		    format_byte_out(r,(unsigned long)conn_bytes);
  ! 		    rputs("|",r);
  ! 		    format_byte_out(r,my_bytes);
  ! 		    rputs("|",r);
  ! 		    format_byte_out(r,bytes);
  ! 		    rputs(")\n",r);
  ! 		    sprintf(buffer," <i>%s {%s}</i><br>\n\n",
  ! 			score_record.client, score_record.request);
  ! 		    rputs(buffer,r);
  ! 		}
  ! 		else /* !no_table_report */
  ! 		{
  ! 	            sprintf(buffer,"<tr><td><b>%d</b><td>%d<td>%d/%lu/%lu",
  ! 		     i,(int)score_record.pid,(int)conn_lres,my_lres,lres);
  ! 		    rputs(buffer,r);
  ! 
  ! 		    switch (score_record.status)
  ! 		    {
  ! 		        case SERVER_READY:
  ! 		            rputs("<td>_",r);
  ! 		            break;
  ! 		        case SERVER_STARTING:
  ! 		            rputs("<td><b>S</b>",r);
  ! 		            break;
  ! 		        case SERVER_BUSY_READ:
  ! 		            rputs("<td><b>R</b>",r);
  ! 		            break;
  ! 		        case SERVER_BUSY_WRITE:
  ! 		            rputs("<td><b>W</b>",r);
  ! 		            break;
  ! 		        case SERVER_DEAD:
  ! 		            rputs("<td>.",r);
  ! 		            break;
  ! 		    }
  ! 		    sprintf(buffer,"\n<td>%.2f<td>%.0f",
  ! 			    (score_record.times.tms_utime +
  ! 			    score_record.times.tms_stime +
  ! 			    score_record.times.tms_cutime +
  ! 			    score_record.times.tms_cstime)/tick,
  ! 			    difftime(nowtime, score_record.last_used));
  ! 		    rputs(buffer,r);
  ! 		    sprintf(buffer,"<td>%-1.1f<td>%-2.2f<td>%-2.2f\n",
  ! 			(float)conn_bytes/KBYTE, (float)my_bytes/MBYTE,
  ! 			(float)bytes/MBYTE);
  ! 		    rputs(buffer,r);
  ! 		    sprintf(buffer,"<td>%s<td>%s</tr>\n\n",
  ! 			score_record.client, score_record.request);
  ! 		    rputs(buffer,r);
  ! 		}	/* no_table_report */
  ! 	    }		/* !short_report */
  ! 	}		/* if (<active child>) */
  !     }			/* for () */
  ! 
  !     if (!(short_report || no_table_report))
  !     {
  ! 	rputs("</table>\n \
  ! <ul>\n \
  !   <li>SRV = \"Server number\"\n \
  !   <li>PID = \"OS process ID\"\n \
  !   <li>Acc = \"Number of accesses this connection / this child / this slot\"\n \
  !   <li>M = \"Mode of operation\"\n \
  !   <li>CPU = \"CPU usage, number of seconds\"\n \
  !   <li>SS = \"Seconds since beginning of most recent request\"\n \
  !   <li>B0 = \"Kilobytes transferred this connection\"\n \
  !   <li>B1 = \"Megabytes transferred this child\"\n \
  !   <li>B2 = \"Total megabytes transferred this slot\"\n \
  ! </ul>\n",r);
        }
  ! 
  ! #else /* !defined(STATUS) */
  ! 
  !     rputs("<hr>To obtain a full report with current status information \n",r);
  !     rputs("you need to recompile Apache adding the <code>-DSTATUS</code> \n",r);
  !     rputs("directive on the <code>CFLAGS</code> line in the \n",r);
  !     rputs("<code>Configuration</code> file.\n",r);
  ! 
  ! #endif /* STATUS */
  ! 
        if (!short_report)
            rputs("</body></html>",r);
        return 0;
    }
    
  ! handler_rec status_handlers[] =
  ! {
    { STATUS_MAGIC_TYPE, status_handler },
    { "server-status", status_handler },
    { NULL }
    };
    
  ! module status_module =
  ! {
       STANDARD_MODULE_STUFF,
       NULL,			/* initializer */
       NULL,			/* dir config creater */
  
  
  
  1.9       +2 -0      apache/src/scoreboard.h
  
  Index: scoreboard.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/scoreboard.h,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -C3 -r1.8 -r1.9
  *** scoreboard.h	1996/04/09 08:18:37	1.8
  --- scoreboard.h	1996/05/07 18:29:35	1.9
  ***************
  *** 77,82 ****
  --- 77,84 ----
        unsigned long bytes_served;
        unsigned long my_access_count;
        unsigned long my_bytes_served;
  +     unsigned short conn_count;
  +     unsigned short conn_bytes;
        struct tms times;
        time_t last_used;
        char client[32];	/* Keep 'em small... */
  
  
  

Mime
View raw message