martin      99/02/16 07:05:41

  Modified:    src/support ab.c
  Log:
  Allow running ab with HTML output generation.
  
  Submitted by: David N. Welton <[EMAIL PROTECTED]>
  Reviewed by: Martin Kraemer
  
  Revision  Changes    Path
  1.19      +110 -11   apache-1.3/src/support/ab.c
  
  Index: ab.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/support/ab.c,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- ab.c      1999/01/04 04:13:13     1.18
  +++ ab.c      1999/02/16 15:05:38     1.19
  @@ -80,6 +80,7 @@
   **    - Enhanced by Dean Gaudet <[EMAIL PROTECTED]>, November 1997
   **    - Cleaned up by Ralf S. Engelschall <[EMAIL PROTECTED]>, March 1998 
   **    - POST and verbosity by Kurt Sussman <[EMAIL PROTECTED]>, August 1998 
  +**    - HTML table output added by David N. Welton <[EMAIL PROTECTED]>, 
January 1999
   **
   */
   
  @@ -95,7 +96,7 @@
    *   only an issue for loopback usage
    */
   
  -#define VERSION "1.2"
  +#define VERSION "1.3"
   
   /*  -------------------------------------------------------------------- */
   
  @@ -174,7 +175,8 @@
   int postlen = 0;                /* length of data to be POSTed */
   char content_type[1024];        /* content type to put in POST header */
   int port = 80;                  /* port number */
  -
  +int use_html = 0;            /* use html in the report */
  + 
   int doclen = 0;                 /* the length the document should be */
   int totalread = 0;              /* total number of bytes read */
   int totalbread = 0;             /* totoal amount of entity body read */
  @@ -338,9 +340,88 @@
   }
   
   /* --------------------------------------------------------- */
  +
  +/* calculate and output results in HTML  */ 
  +
  +static void output_html_results(void)
  +{
  +    int timetaken;
  +
  +    gettimeofday(&endtime, 0);
  +    timetaken = timedif(endtime, start);
  +
  +    printf("\n\n<table>\n");
  +    printf("<tr><th>Server Software:</th>    <td>%s</td></tr>\n", 
servername);
  +    printf("<tr><th>Server Hostname:</th>    <td>%s</td></tr>\n", hostname);
  +    printf("<tr><th>Server Port:</th>                <td>%d</td></tr>\n", 
port);
  +    printf("<tr><th></th><td></td></tr>\n");
  +    printf("<tr><th>Document Path:</th>              <td>%s</td></tr>\n", 
path);
  +    printf("<tr><th>Document Length:</th>    <td>%d bytes</td></tr>\n", 
doclen);
  +    printf("<tr><th></th><td></td></tr>\n");
  +    printf("<tr><th>Concurrency Level:</th>  <td>%d</td></tr>\n", 
concurrency);
  +    printf("<tr><th>Time taken for tests:</th>       <td>%d.%03d 
seconds</td></tr>\n",
  +           timetaken / 1000, timetaken % 1000);
  +    printf("<tr><th>Complete requests:</th>  <td>%d</td></tr>\n", done);
  +    printf("<tr><th>Failed requests:</th>    <td>%d</td></tr>\n", bad);
  +    if (bad)
  +        printf("<tr><td colspan=3>   (Connect: %d, Length: %d, Exceptions: 
%d)</td></tr>\n",
  +               err_conn, err_length, err_except);
  +    if (err_response)
  +        printf("<tr><th>Non-2xx responses:</th>      <td>%d</td></tr>\n", 
err_response);
  +    if (keepalive)
  +        printf("<tr><th>Keep-Alive requests:</th>    <td>%d</td></tr>\n", 
doneka);
  +    printf("<tr><th>Total transferred:</th>  <td>%d bytes</td></tr>\n", 
totalread);
  +    if (posting)
  +        printf("<tr><th>Total POSTed:</th>   <td>%d</td></tr>\n", 
totalposted);
  +    printf("<tr><th>HTML transferred:</th>   <td>%d bytes</td></tr>\n", 
totalbread);
   
  -/* start asynchronous non-blocking connection */
  +    /* avoid divide by zero */
  +    if (timetaken) {
  +        printf("<tr><th>Requests per second:</th>    <td>%.2f</td></tr>\n", 
1000 * (float) (done) / timetaken);
  +        printf("<tr><th>Transfer rate:</th>  <td>%.2f kb/s 
received</td></tr>\n", (float) (totalread) / timetaken);
  +        if (posting) {
  +            printf("<tr><td></td>    <td>%.2f kb/s sent</td></tr>\n", 
  +                         (float)(totalposted)/timetaken);
  +            printf("<tr><td></td>    <td>%.2f kb/s total</td></tr>\n", 
  +                 (float)(totalread + totalposted)/timetaken);
  +        }
  +    }
  +    printf("</table>\n");
   
  +    {
  +        /* work out connection times */
  +        int i;
  +        int totalcon = 0, total = 0;
  +        int mincon = 9999999, mintot = 999999;
  +        int maxcon = 0, maxtot = 0;
  +
  +        for (i = 0; i < requests; i++) {
  +            struct data s = stats[i];
  +         mincon = ap_min(mincon, s.ctime);
  +         mintot = ap_min(mintot, s.time);
  +         maxcon = ap_max(maxcon, s.ctime);
  +         maxtot = ap_max(maxtot, s.time);
  +            totalcon += s.ctime;
  +            total += s.time;
  +        }
  +     printf("<table>\n");
  +        printf("<tr><th colspan=4>Connnection Times (ms)</th></tr>\n");
  +        printf("<tr><th></th> <th>min</th>   <th>avg</th>   
<th>max</th></tr>\n");
  +        printf("<tr><th>Connect:</th>    <td>%5d</td> <td>%5d</td> 
<td>%5d</td></tr>\n", 
  +            mincon, totalcon / requests, maxcon);
  +        printf("<tr><th>Processing:</th> <td>%5d</td> <td>%5d</td> 
<td>%5d</td></tr>\n", 
  +            mintot - mincon, (total/requests) - (totalcon/requests),
  +            maxtot - maxcon);
  +        printf("<tr><th>Total:</th> <td>%5d</td> <td>%5d</td> 
<td>%5d</td></tr>\n", 
  +            mintot, total / requests, maxtot);
  +     printf("</table>\n");
  +    }
  +}
  +
  +/* --------------------------------------------------------- */
  +
  +/* start asnchronous non-blocking connection */
  +
   static void start_connect(struct connection *c)
   {
       c->read = 0;
  @@ -575,8 +656,11 @@
       fd_set sel_read, sel_except, sel_write;
       int i;
   
  -    printf("Benchmarking %s (be patient)...", hostname);
  -    fflush(stdout);
  +    if (!use_html)
  +    {
  +     printf("Benchmarking %s (be patient)...", hostname);
  +     fflush(stdout);
  +    }
   
       {
           /* get server information */
  @@ -678,7 +762,10 @@
                   write_request(&con[i]);
           }
       }
  -    output_results();
  +    if (use_html)
  +     output_html_results();
  +    else
  +     output_results();
   }
   
   /* ------------------------------------------------------- */
  @@ -686,10 +773,19 @@
   /* display copyright information */
   static void copyright(void) 
   {
  -    printf("This is ApacheBench, Version %s\n", VERSION);
  -    printf("Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, 
http://www.zeustech.net/\n";);
  -    printf("Copyright (c) 1998-1999 The Apache Group, 
http://www.apache.org/\n";);
  -    printf("\n");
  +    if (!use_html)
  +    {
  +     printf("This is ApacheBench, Version %s\n", VERSION);
  +     printf("Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, 
http://www.zeustech.net/\n";);
  +     printf("Copyright (c) 1998-1999 The Apache Group, 
http://www.apache.org/\n";);
  +     printf("\n");
  +    } else {
  +     printf("<p>\n");
  +     printf(" This is ApacheBench, Version %s<br>\n", VERSION);
  +     printf(" Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, 
http://www.zeustech.net/<br>\n");
  +     printf(" Copyright (c) 1998-1999 The Apache Group, 
http://www.apache.org/<br>\n");
  +     printf("</p>\n<p>\n");
  +    }
   }
   
   /* display usage information */
  @@ -777,7 +873,7 @@
   {
       int c, r;
       optind = 1;
  -    while ((c = getopt(argc, argv, "n:c:t:T:p:v:kVh")) > 0) {
  +    while ((c = getopt(argc, argv, "n:c:t:T:p:v:kVhw")) > 0) {
           switch (c) {
           case 'n':
               requests = atoi(optarg);
  @@ -813,6 +909,9 @@
               copyright();
               exit(0);
               break;
  +     case 'w':
  +         use_html = 1;
  +         break;
           case 'h':
               usage(argv[0]);
               break;
  
  
  

Reply via email to