root/trunk/apache22/scripts/ap-stat

Revision 4, 2.5 kB (checked in by jesus, 2 years ago)

scripts used in the ApacheCon? 2008 presentation

  • Property svn:executable set to *
Line 
1 #!/bin/sh
2
3 TIME=5
4 GROUP="uri"
5 ONLYTYPE=""
6 CNTS='trunc(@ctcnt, 20); printf("\nCounts by URI\n"); printa(@ctcnt);'
7 SCALLS='trunc(@ctsys, 20); printf("\nSyscalls by URI\n"); printa(@ctsys);'
8 TIMES='trunc(@cttime, 20); printf("\nService time by URI\n"); printa(@cttime);'
9 BYTES='trunc(@ctbytes, 20); printf("\nBytes by URI\n"); printa(@ctbytes);'
10 TRACKSCALLS='syscall:::entry/self->rptr/{self->ncalls++;}'
11 DESTRUCTIVE=''
12
13 set -- `getopt P:wg:i:C:cstb $*`
14 if [ $? != 0 ]
15 then
16   echo "$0 [-C onlytype] [-g <uri|content_type>] [-i sec] < -c | -s | -t | -b > [-P ppid]"
17   exit 2
18 fi
19 for i in $*
20 do
21   case $i in
22     -C)  ONLYTYPE=$2; shift 2;;
23     -g)  GROUP=$2; shift 2;;
24     -i)  TIME=$2; shift 2;;
25     -c)  SCRIPT=$CNTS; shift;;
26     -s)  SCRIPT=$SCALLS; shift;;
27     -t)  SCRIPT=$TIMES; shift;;
28     -b)  SCRIPT=$BYTES; shift;;
29     -w)  DESTRUCTIVE=-w; shift;;
30     -P)  PPID=$2; shift 2;;
31   esac
32 done
33
34 if [ -z "$PPID" ]; then
35   PPID=`ps -e -o pid,ppid,comm | awk '/http/{if($2 == 1) {print $1}}'`
36 fi
37 if [ "`echo $PPID | sed -e 's/[0-9]//g;'`" != ""  ]; then
38   echo "Multiple apaches to choose from (use -P):"
39   ps -e -o pid,ppid,comm,zone | awk '/http/{if($2 == 1) {print $1" "$3" in "$4}}'
40   exit
41 fi
42
43 dtrace $DESTRUCTIVE -q -n '
44 ap*::ap_read_request:read-request-entry
45 /!self->rptr && curpsinfo->pr_ppid == '$PPID'/
46 {
47   self->rptr = arg0;
48   self->ncalls = 0;
49   self->starttime = timestamp;
50 }
51 '$TRACKSCALLS'
52 ap*:::process-request-return
53 /self->rptr && arg0 == self->rptr/
54 {
55   self->r = self->rptr ? (request_rec *)copyin(self->rptr, sizeof(request_rec)) : NULL;
56   self->'$GROUP' = (self->r && self->r->'$GROUP') ?
57                          copyinstr((uintptr_t)self->r->'$GROUP') : "unknown";
58   self->content_type = (self->r && self->r->content_type) ?
59                          copyinstr((uintptr_t)self->r->content_type) : "unknown";
60 }
61 ap*:::process-request-return
62 /self->rptr && arg0 == self->rptr && strstr(self->content_type, "'$ONLYTYPE'") != NULL/
63 {
64   @ctsys[self->'$GROUP'] = avg(self->ncalls);
65   @cttime[self->'$GROUP'] = avg(((timestamp > self->starttime) ?
66                                        (timestamp - self->starttime) : 0)/1000000);
67   @ctcnt[self->'$GROUP'] = count();
68   @ctbytes[self->'$GROUP'] = sum(self->r->bytes_sent);
69   self->rptr = NULL;
70   self->'$GROUP' = NULL;
71   self->content_type = NULL;
72 }
73
74 tick-'$TIME'sec{
75   printf("");
76   '"$SCRIPT"'
77   trunc(@ctcnt,0);
78   clear(@ctcnt);
79   trunc(@ctsys,0);
80   clear(@ctsys);
81   trunc(@cttime,0);
82   clear(@cttime);
83   trunc(@ctbytes,0);
84   clear(@ctbytes);
85 }
86 '
Note: See TracBrowser for help on using the browser.