| 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("[H[2J"); |
|---|
| 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 |
' |
|---|