diff options
Diffstat (limited to 'src/pmview/front-ends/webpingvis')
-rw-r--r-- | src/pmview/front-ends/webpingvis | 372 |
1 files changed, 372 insertions, 0 deletions
diff --git a/src/pmview/front-ends/webpingvis b/src/pmview/front-ends/webpingvis new file mode 100644 index 0000000..a08aa81 --- /dev/null +++ b/src/pmview/front-ends/webpingvis @@ -0,0 +1,372 @@ +#! /bin/sh +# Copyright (c) 1995-2001 Silicon Graphics, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# + +tmp=/tmp/$$ +trap "rm -f $tmp.*; exit" 0 1 2 3 15 +rm -f $tmp.* + +. $PCP_DIR/etc/pcp.env +. $PCP_SHARE_DIR/lib/pmview-args + +_usage() +{ + echo >$tmp.msg 'Usage: '$prog' [options] + +options: + -i show URL names + -m max maximum expected total ping response time (milliseconds) + -V verbose/diagnostic output + +pmview(1) options:' + + _pmview_usage >> $tmp.msg + echo >> $tmp.msg + echo 'Default title is: SGI PCP: Web PING Performance for Host' >> $tmp.msg + echo ' + The "max" parameter (used with -m) should be set to the maximum + expected ping response time for all URLs being monitored. The default + is 1000 milliseconds. This governs the height of the bar showing total + response time (at the far right of the scene). All bars showing + response times use "max" for height normalization.' >> $tmp.msg + _pmview_info -f $tmp.msg +} + +#--- build WM_COMMAND X(1) property for restart after login/logout --- +# +echo -n "pmview Version 2.1 \"$prog\"" > $tmp.pmview +for arg +do + echo -n " \"$arg\"" >> $tmp.pmview +done +echo >> $tmp.pmview + +# --- LOCAL FUNCTIONS : START ------------------------------------------------ +_sort_host_indom() +{ + sed <$1 \ + -e 's/instance\[\([0-9][0-9]*\)]:/\1/' \ + | $PCP_AWK_PROG ' +BEGIN { state = 0 } +/^samples:/ { state = 1; next } +state == 0 { next } +/^full label/ { label[$4] = $NF; next } +NF == 0 { state = 2; next } +state == 2 { for (i=1; i<=NF; i++) { + if (label[i-1] == "") + label[i-1] = $i + } + state = 3 + next + } +state == 3 { for (i=1; i<=NF; i++) + size[i-1] = $i + } +END { for (i in label) { + print label[i],size[i] + } + }' \ + | sort +1n -2 +0 -1 >$tmp.tmp + mv $tmp.tmp $1 +} + +_sort_arch_indom() +{ +metric=webping.perurl.kbytes +indom=`pminfo -d -a $arch $metric \ +| sed -n -e '/InDom:/{ +s/.*InDom: // +s/ .*//p +}'` + +if [ "X$indom" = XPM_INDOM_NULL ] +then + _pmview_error "$prog: $metric is singular" + #NOTREACHED +elif [ -z "$indom" ] +then + _pmview_error "$prog: cannot determine InDom for $metric" + #NOTREACHED +fi + +pmdumplog -z -i $arch 2>&1 \ +| $PCP_AWK_PROG ' +/^InDom: '$indom'$/ { state=1; next } +/^InDom: / { state=0; next } +state == 1 && /^[^ ]/ { print }' \ +| while read stamp junk +do + pminfo -f -a $arch -z -O "@$stamp" -f $metric +done \ +| sed -n \ + -e '/ value /{ +s/"] value// +s/.*"//p +}' \ +| sort -u >$tmp.known + +pmdumplog -z -i $arch 2>&1 \ +| $PCP_AWK_PROG ' +/^InDom: '$indom'$/ { state=1; next } +/^InDom: / { state=0; next } +state == 1 && /^[ ]/ { print }' \ +| sed -n \ + -e '/ or /{ +s/.* or "// +s/".*//p +}' \ +| sort -u \ +| join -a1 - $tmp.known \ +| sort +2n -3 +1 -2 \ +| $PCP_AWK_PROG ' +NF==1 { printf("%s ?\n",$0); next } + { print }' > $1 +} +# --- LOCAL FUNCTIONS : END -------------------------------------------------- + +verbose=false +max=1000 +showInst=false + +_pmview_args "$@" + +if [ -n "$otherArgs" ] +then + while getopts "?im:v:V" c $otherArgs + do + case $c + in + i) + showInst=true + ;; + m) + max=$OPTARG + # and now the obscure +ve integer checking bit + # ...note the creative use of unary - to prevent leading signs + if [ "X-$max" != "X`expr 0 + -$max 2>/dev/null`" ] + then + _pmview_error "$prog: -m must have a positive integral argument" + #NOTREACHED + fi + ;; + v) + if [ $OPTARG = "1" ] + then + _pmview_warning "$prog: pmview version 1 no longer supported, using version 2" + elif [ $OPTARG != "2" ] + then + _pmview_error "$prog: only version 2 supported for -v" + # NOTREACHED + fi + ;; + V) + verbose=true + ;; + '?') + _usage + exit 1 + ;; + esac + done +fi +[ -z "$titleArg" ] && titleArg="SGI PCP: Web PING Performance for Host $host" + + +# check that webping metrics are available from metrics source +# +if pminfo $msource $namespace webping 2>&1 \ + | grep 'webping: Unknown metric name' >/dev/null +then + _pmview_error "$prog: webping metrics not defined in the name space" + #NOTREACHED +fi +# +# do a second check to make sure that we have webping.perurl metrics +# +if pminfo -f $msource $namespace webping.perurl.kbytes 2>&1 \ + | grep 'inst .* value' >/dev/null +then + : +else + if [ "X$arch" != "X" ] + then + _pmview_error "$prog: webping.perurl metrics not available from $arch" + #NOTREACHED + else + _pmview_error "$prog: webping.perurl metrics not available from $host" + #NOTREACHED + fi +fi + + +# if metrics source is an archive, and find out name of host +# get the instance domain and sort it +# +if [ "X$arch" != X ] +then + _sort_arch_indom $tmp.int + host=`pmdumplog -l $arch | $PCP_AWK_PROG '/^Performance/ {print $5}' | sed -e 's/,//g'` + [ "X$host" = X ] && host="unknown host" + host="$host (Archive $arch)" +else + pmval -h $host -s 1 webping.perurl.kbytes >$tmp.int + _sort_host_indom $tmp.int +fi + + +urlcount=`wc -l <$tmp.int | sed -e 's/ *//g'` +bytesmax=`tail -1 $tmp.int | $PCP_AWK_PROG '{print $2}'` + +if [ $urlcount -eq 0 ] +then + if [ "X$arch" != "X" ] + then + _pmview_error "$prog: there were no URLs monitored in archive \"$arch\"" + #NOTREACHED + else + _pmview_error "$prog: there are no URLs monitored on host \"$host\"" + #NOTREACHED + fi +fi + + +url_list=`$PCP_AWK_PROG <$tmp.int ' +NR>1 { printf "," } + { printf $1 } +END { print "" }'` + +url_list_sp=`$PCP_AWK_PROG <$tmp.int ' +NR>1 { printf " " } +/^GET_.*/ { printf "\"GET %s\"",substr($1,5) } +/^HEAD_.*/ { printf "\"HEAD %s\"",substr($1,6) } +/^POST_.*/ { printf "\"POST %s\"",substr($1,6) } +END { print "" }'` + + +# +# strings for base plane labels +# +basestr_size="URL size in kbytes\nNormalized to $bytesmax kbytes" +basestr_urltime="Time to fetch the URL\nNormalized to $max seconds" +basestr_tottime="Time to fetch all URLs\nNormalized to $max seconds" +basestr_err="Webing errors by error type\nNormalized to 1" + + +#--- config file has already been created ; continue writing to it --- +# + +cat << end-of-file >> $tmp.pmview +# +# $prog +# +# Largest URL = $bytesmax Kbytes +# Maximum fetch time = $max seconds +# +# URLs = $url_list_sp +# +end-of-file + + +# +# the real config starts here +# pmview Version 2.1 +# +cat <<end-of-file >> $tmp.pmview + +_scale 1.2 + +_colorList url_colors ( + rgbi:1.0/0.5/0.0 + rgbi:0.9/0.9/0.0 + rgbi:0.0/0.9/0.9 + rgbi:0.9/0.0/0.9 +) + +_grid _hide ( + + _bar 0 0 east _col ( + _metrics ( + webping.perurl.kbytes[$url_list] $bytesmax + ) + _metriclabels ( Size ) + _baseLabel "$basestr_size" +end-of-file + +if $showInst +then + cat <<end-of-file >>$tmp.pmview + _instlabels _towards ( $url_list_sp ) +end-of-file +fi + +cat <<end-of-file >>$tmp.pmview + _colorList ( rgbi:0.0/0.9/0.0 ) + ) + + _bar 0 2 ne _col _groupbyinst ( + _metrics ( + webping.perurl.time.total[$url_list] $max + webping.perurl.time.body[$url_list] $max + webping.perurl.time.head[$url_list] $max + webping.perurl.time.connect[$url_list] $max + ) + _metriclabels ( Total Body Head Connect ) + _baseLabel "$basestr_urltime" + _colorList url_colors + ) + + _bar 0 4 east _row _groupbyrow ( + _metrics ( + webping.errors.sockerr 1 + webping.errors.httperr 1 + webping.errors.htmlerr 1 + webping.errors.othererr 1 + ) + _instlabels ( Errors ) + _baseLabel "$basestr_err" + _colorList ( red1 red1 red1 red1 ) + ) + +end-of-file + +# +# Only show row totals if there is more than one URL being monitored +# +if [ $urlcount -gt 1 ] +then + totoff=`expr $urlcount + 1` + cat <<end-of-file >> $tmp.pmview + _bar 2 2 north _col _groupbycol ( + _metrics ( + webping.time.total $max + webping.time.body $max + webping.time.head $max + webping.time.connect $max + ) + _colorList url_colors + _baseLabel "$basestr_tottime" + ) +end-of-file + +fi + +cat <<end-of-file >> $tmp.pmview +) +end-of-file + +$verbose && cat $tmp.pmview + +#eval pmview <$tmp.pmview $args -title "'$titleArg'" -xrm "'*iconName: $prog'" -geometry 560x515 +eval pmview <$tmp.pmview $args -title "'$titleArg'" -xrm "'*iconName: $prog'" + +exit |