slitaz-forge annotate tank/web/lib/makegraphs @ rev 286

tank: fix graphs
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Apr 16 15:53:54 2012 +0200 (2012-04-16)
parents be92986c20ed
children 602839559efc
rev   line source
slaxemulator@12 1 #!/bin/sh
pankso@241 2 #*/5 * * * * /home/slitaz/www/tank/lib/makegraphs >/dev/null
slaxemulator@12 3
slaxemulator@12 4 # RRD database directory
pankso@241 5 rrdlog="/home/slitaz/www/tank/log/rrd"
slaxemulator@12 6
slaxemulator@12 7 # Images directory
pankso@241 8 rrdgraph="/home/slitaz/www/tank/imgages/rrd"
slaxemulator@12 9
slaxemulator@12 10 # Colors
slaxemulator@12 11 rrdcolors="--color SHADEA#FFFFFF --color SHADEB#FFFFFF --color BACK#FFFFFF"
slaxemulator@12 12 rrdgraphargs="-aPNG -i -z --alt-y-grid -w 600 -h 100 -r $rrdcolors"
slaxemulator@12 13
slaxemulator@12 14 [ -d $rrdlog ] || mkdir -p $rrdlog
slaxemulator@12 15 [ -d $rrdgraph ] || mkdir -p $rrdgraph
slaxemulator@12 16
slaxemulator@12 17 updatecpudata() {
slaxemulator@12 18 [ -e "$rrdlog/cpu.rrd" ] || rrdtool create $rrdlog/cpu.rrd --step=300 \
slaxemulator@12 19 DS:user:COUNTER:600:0:500000000 \
pankso@40 20 DS:nice:COUNTER:600:0:500000000 \
slaxemulator@12 21 DS:system:COUNTER:600:0:500000000 \
slaxemulator@12 22 DS:idle:COUNTER:600:0:500000000 \
pankso@40 23 DS:iowait:COUNTER:600:0:500000000 \
pankso@40 24 DS:irq:COUNTER:600:0:500000000 \
pankso@40 25 DS:softirq:COUNTER:600:0:500000000 \
pankso@40 26 DS:celsius:GAUGE:600:0:50000 \
slaxemulator@12 27 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@12 28 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
pankso@40 29 grep '^cpu' /proc/stat | while read cpu user nice system idle iowait irq softirq misc; do
pankso@40 30 celsius=$(find /sys | grep /temp._input | xargs cat | \
pankso@40 31 awk '{ if ($0 > max) max=$0 } END { print max/1 }')
pankso@40 32 rrdtool update $rrdlog/cpu.rrd \
pankso@40 33 -t celsius:nice:user:system:idle:iowait:irq:softirq \
pankso@40 34 N:$celsius:$nice:$user:$system:$idle:$iowait:$irq:$softirq
slaxemulator@12 35 break
slaxemulator@12 36 done
slaxemulator@12 37 }
slaxemulator@12 38
slaxemulator@12 39 updatecpugraph() {
slaxemulator@12 40 period=$1
slaxemulator@12 41 info="$(grep '^model name' /proc/cpuinfo | cut -d: -f2 \
slaxemulator@12 42 | sed 's/ * / /g' | awk '
slaxemulator@12 43 { s=$0 ; n++ }
slaxemulator@12 44 END { if (n > 1) printf " %dx",n; print s }')"
slaxemulator@12 45 rrdtool graph "$rrdgraph/cpu-$period.png" --start -1$period \
slaxemulator@12 46 $rrdgraphargs -l 0 -u 100 -t "cpu usage per $period [$info ]" \
slaxemulator@12 47 DEF:user=$rrdlog/cpu.rrd:user:AVERAGE \
slaxemulator@12 48 DEF:system=$rrdlog/cpu.rrd:system:AVERAGE \
slaxemulator@12 49 DEF:idle=$rrdlog/cpu.rrd:idle:AVERAGE \
pankso@40 50 DEF:nice=$rrdlog/cpu.rrd:nice:AVERAGE \
pankso@40 51 DEF:celsius=$rrdlog/cpu.rrd:celsius:AVERAGE \
pankso@40 52 'CDEF:total=user,system,idle,nice,+,+,+' \
slaxemulator@12 53 'CDEF:userpct=100,user,total,/,*' \
slaxemulator@12 54 'CDEF:systempct=100,system,total,/,*' \
slaxemulator@12 55 'CDEF:idlepct=100,idle,total,/,*' \
pankso@40 56 'CDEF:nicepct=100,nice,total,/,*' \
pankso@40 57 'CDEF:temp=celsius,1000,/' \
slaxemulator@12 58 'AREA:userpct#0000FF:user cpu usage' \
pankso@40 59 'STACK:nicepct#C0C0FF:nice cpu usage' \
slaxemulator@12 60 'STACK:systempct#FF0000:system cpu usage' \
pankso@40 61 'STACK:idlepct#00FF00:idle cpu usage' \
pankso@40 62 'LINE1:temp#000000:temperature\g' \
pankso@40 63 'GPRINT:temp:MAX:max %2.0lfC\j'
slaxemulator@12 64 }
slaxemulator@12 65
slaxemulator@12 66 updatememgraph() {
slaxemulator@12 67 period=$1
slaxemulator@12 68 info="$(free | awk '\
slaxemulator@12 69 { \
slaxemulator@12 70 if (/Mem:/) { \
slaxemulator@12 71 if ($2 < 10000) printf "%d KB",$2; \
slaxemulator@12 72 else if ($2 < 10000000) printf "%d MB",$2/1024; \
slaxemulator@12 73 else printf "%d GB",$2/1024/1024; \
slaxemulator@12 74 } \
slaxemulator@12 75 }')"
slaxemulator@12 76 info2="$(free | awk '\
slaxemulator@12 77 { \
slaxemulator@12 78 if (/Swap:/) { \
slaxemulator@12 79 if ($2 < 10000) printf "%d KB",$2; \
slaxemulator@12 80 else if ($2 < 10000000) printf "%d MB",$2/1024; \
slaxemulator@12 81 else printf "%d GB",$2/1024/1024; \
slaxemulator@12 82 } \
slaxemulator@12 83 }')"
slaxemulator@12 84 rrdtool graph "$rrdgraph/memory-$period.png" --start -1$period \
slaxemulator@12 85 $rrdgraphargs -l 0 -u 100 \
slaxemulator@12 86 -t "memory usage per $period [ $info + $info2 swap ]" \
slaxemulator@12 87 DEF:used=$rrdlog/mem.rrd:memused:AVERAGE \
slaxemulator@12 88 DEF:free=$rrdlog/mem.rrd:memfree:AVERAGE \
slaxemulator@12 89 DEF:shared=$rrdlog/mem.rrd:memshared:AVERAGE \
slaxemulator@12 90 DEF:buffer=$rrdlog/mem.rrd:membuffers:AVERAGE \
slaxemulator@12 91 DEF:cache=$rrdlog/mem.rrd:memcache:AVERAGE \
slaxemulator@12 92 DEF:swused=$rrdlog/mem.rrd:swapused:AVERAGE \
slaxemulator@12 93 DEF:swfree=$rrdlog/mem.rrd:swapfree:AVERAGE \
slaxemulator@12 94 'CDEF:total=used,free,+' \
slaxemulator@12 95 'CDEF:used2=used,buffer,cache,shared,+,+,-' \
slaxemulator@12 96 'CDEF:usedpct=100,used2,total,/,*' \
slaxemulator@12 97 'CDEF:sharedpct=100,shared,total,/,*' \
slaxemulator@12 98 'CDEF:bufferpct=100,buffer,total,/,*' \
slaxemulator@12 99 'CDEF:cachepct=100,cache,total,/,*' \
slaxemulator@12 100 'CDEF:freepct=100,free,total,/,*' \
slaxemulator@12 101 'CDEF:swtotal=swused,swfree,+' \
slaxemulator@12 102 'CDEF:swusedpct=100,swused,swtotal,/,*' \
slaxemulator@12 103 'AREA:usedpct#0000FF:used memory' \
slaxemulator@12 104 'STACK:sharedpct#FF7F00:shared memory' \
slaxemulator@12 105 'STACK:bufferpct#FF00FF:buffered memory' \
slaxemulator@12 106 'STACK:cachepct#FFFF00:cached memory' \
slaxemulator@12 107 'STACK:freepct#00FF00:free memory' \
slaxemulator@12 108 'LINE2:swusedpct#FF0000:used swap\j'
slaxemulator@12 109 }
slaxemulator@12 110
slaxemulator@12 111 updatememdata () {
slaxemulator@12 112 [ -e "$rrdlog/mem.rrd" ] ||
slaxemulator@12 113 rrdtool create "$rrdlog/mem.rrd" --step=300 \
slaxemulator@12 114 DS:memused:ABSOLUTE:600:0:5000000000 \
slaxemulator@12 115 DS:memfree:ABSOLUTE:600:0:5000000000 \
slaxemulator@12 116 DS:memshared:ABSOLUTE:600:0:5000000000 \
slaxemulator@12 117 DS:membuffers:ABSOLUTE:600:0:5000000000 \
slaxemulator@12 118 DS:memcache:ABSOLUTE:600:0:5000000000 \
slaxemulator@12 119 DS:swapused:ABSOLUTE:600:0:5000000000 \
slaxemulator@12 120 DS:swapfree:ABSOLUTE:600:0:5000000000 \
slaxemulator@12 121 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@12 122 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@12 123
slaxemulator@12 124 while read tag count unit; do
slaxemulator@12 125 case "$tag" in
pankso@40 126 MemTotal:) memtotal=$count;;
pankso@40 127 MemFree:) memfree=$count
slaxemulator@12 128 memused=$(($memtotal - $memfree))
slaxemulator@12 129 memshared=0;;
pankso@40 130 MemShared:) memshared=$count;;
pankso@40 131 Buffers:) membuffers=$count;;
pankso@40 132 Cached:) memcache=$count;;
pankso@40 133 SwapTotal:) swaptotal=$count;;
pankso@40 134 SwapFree:) swapfree=$count
slaxemulator@12 135 swapused=$(( $swaptotal - $swapfree));;
slaxemulator@12 136 esac
slaxemulator@12 137 done < /proc/meminfo
slaxemulator@12 138
slaxemulator@12 139 rrdtool update "$rrdlog/mem.rrd" \
slaxemulator@12 140 -t memused:memfree:memshared:membuffers:memcache:swapused:swapfree \
slaxemulator@12 141 "N:$memused:$memfree:$memshared:$membuffers:$memcache:$swapused:$swapfree"
slaxemulator@12 142 }
slaxemulator@12 143
slaxemulator@12 144 getmax() {
slaxemulator@12 145 rrdtool fetch $rrdlog/$1.rrd AVERAGE | awk '\
slaxemulator@12 146 BEGIN {max=0} \
slaxemulator@12 147 /^[0-9]/ { \
slaxemulator@12 148 if ($2 != "nan" && $2 > max) max=$2; \
slaxemulator@12 149 if ($3 != "nan" && $3 > max) max=$3; \
slaxemulator@12 150 } \
slaxemulator@12 151 END { print max }' | sed 's/,/./'
slaxemulator@12 152 }
slaxemulator@12 153
slaxemulator@12 154 updatediskgraph() {
slaxemulator@12 155 period=$1
slaxemulator@12 156 [ "$period" == "day" ] && maxdisk="$(getmax disk)"
slaxemulator@12 157 info=""
slaxemulator@12 158 [ -r $2 ] &&
slaxemulator@12 159 info="[ $(fdisk -l 2> /dev/null | grep "^Disk $2:" | \
slaxemulator@12 160 sed "s|Disk $2: \(.*\), .*|\1|") ]"
slaxemulator@12 161 if [ -e /sys/block/${2#/dev/}/device/iodone_cnt ]; then
slaxemulator@12 162 err=$(printf "%d\n" $(cat /sys/block/${2#/dev/}/device/ioerr_cnt) )
slaxemulator@12 163 done=$(printf "%d\n" $(cat /sys/block/${2#/dev/}/device/iodone_cnt) )
slaxemulator@12 164 rate=$(echo | awk "BEGIN { printf \"%.0e\\n\",$err/$done }")
slaxemulator@12 165 [ $err -eq 0 ] && rate="0"
slaxemulator@12 166 # --right-axis-label "I/O state %"
slaxemulator@12 167 rrdtool graph "$rrdgraph/disk-$period.png" --start -1$period \
slaxemulator@12 168 $rrdgraphargs -t "disk access per $period $info" \
slaxemulator@12 169 --logarithmic --lower-limit 1 -v "Sectors/second" --units=si \
slaxemulator@12 170 DEF:read=$rrdlog/disk.rrd:readsect:AVERAGE \
slaxemulator@12 171 DEF:write=$rrdlog/disk.rrd:writesect:AVERAGE \
slaxemulator@12 172 DEF:req=$rrdlog/iodisk.rrd:req:AVERAGE \
slaxemulator@12 173 DEF:done=$rrdlog/iodisk.rrd:done:AVERAGE \
slaxemulator@12 174 DEF:err=$rrdlog/iodisk.rrd:err:AVERAGE \
slaxemulator@12 175 "CDEF:readpct=100,read,$maxdisk,/,*" \
slaxemulator@12 176 "CDEF:writepct=100,write,$maxdisk,/,*" \
slaxemulator@12 177 "CDEF:errpct=100,err,req,/,*" \
slaxemulator@12 178 "CDEF:donepct=100,done,req,/,*" \
slaxemulator@12 179 "CDEF:errrate=err,done,/" \
slaxemulator@12 180 'AREA:readpct#0000FF:sectors read from disk' \
slaxemulator@12 181 "COMMENT:I/O error rate $rate" \
slaxemulator@12 182 'STACK:writepct#00FF00:sectors written to disk' \
slaxemulator@12 183 'LINE2:donepct#FFFF00:% I/O complete' \
slaxemulator@12 184 'LINE2:errpct#FF0000:% I/O error\j'
slaxemulator@12 185 else
slaxemulator@12 186 rrdtool graph "$rrdgraph/disk-$period.png" --start -1$period \
slaxemulator@12 187 $rrdgraphargs -t "disk access per $period $info" \
slaxemulator@12 188 --logarithmic --lower-limit 1 -v "Sectors/second" --units=si \
slaxemulator@12 189 DEF:read=$rrdlog/disk.rrd:readsect:AVERAGE \
slaxemulator@12 190 DEF:write=$rrdlog/disk.rrd:writesect:AVERAGE \
slaxemulator@12 191 "CDEF:readpct=100,read,$maxdisk,/,*" \
slaxemulator@12 192 "CDEF:writepct=100,write,$maxdisk,/,*" \
slaxemulator@12 193 'AREA:readpct#0000FF:sectors read from disk' \
slaxemulator@12 194 'STACK:writepct#00FF00:sectors written to disk'
slaxemulator@12 195 fi
slaxemulator@12 196 }
slaxemulator@12 197
slaxemulator@12 198 updatediskdata() {
slaxemulator@12 199 dev=$1
slaxemulator@12 200 [ -e "$rrdlog/disk.rrd" ] ||
slaxemulator@12 201 rrdtool create "$rrdlog/disk.rrd" --step=300 \
slaxemulator@12 202 DS:readsect:COUNTER:600:0:5000000000 \
slaxemulator@12 203 DS:writesect:COUNTER:600:0:5000000000 \
slaxemulator@12 204 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@12 205 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@12 206 [ -e "$rrdlog/iodisk.rrd" ] ||
slaxemulator@12 207 rrdtool create "$rrdlog/iodisk.rrd" --step=300 \
slaxemulator@12 208 DS:done:GAUGE:600:0:U DS:err:GAUGE:600:0:U \
slaxemulator@12 209 DS:req:GAUGE:600:0:U \
slaxemulator@12 210 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@12 211 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@12 212
slaxemulator@12 213 while read major minor name readreq readsect writereq writesect misc; do
slaxemulator@12 214 [ $major = $(( 0x$(stat -c %t $dev) )) ] || continue
slaxemulator@12 215 [ $minor = $(( 0x$(stat -c %T $dev) )) ] || continue
slaxemulator@12 216 rrdtool update "$rrdlog/disk.rrd" -t readsect:writesect \
slaxemulator@12 217 N:$readsect:$writesect
slaxemulator@12 218 done < /proc/diskstats
slaxemulator@12 219 disk=${dev:0:8}
slaxemulator@12 220 dir=/sys/block/${disk#/dev/}/device
slaxemulator@12 221 done=$(printf "%d\n" $(cat $dir/iodone_cnt 2> /dev/null) )
slaxemulator@12 222 err=$(printf "%d\n" $(cat $dir/ioerr_cnt 2> /dev/null) )
slaxemulator@12 223 req=$(printf "%d\n" $(cat $dir/iorequest_cnt 2> /dev/null) )
slaxemulator@12 224 rrdtool update "$rrdlog/iodisk.rrd" -t done:err:req N:$done:$err:$req
slaxemulator@12 225 }
slaxemulator@12 226
slaxemulator@12 227 updateifgraph() {
slaxemulator@12 228 interface=$1
slaxemulator@12 229 period=$2
slaxemulator@12 230 rrdtool graph "$rrdgraph/$interface-$period.png" --start -1$period \
slaxemulator@12 231 $rrdgraphargs -t "traffic on $interface graph per $period" \
slaxemulator@12 232 --logarithmic -A -v "Bytes/second" --units=si \
slaxemulator@12 233 DEF:incoming=$rrdlog/$interface.rrd:incoming:AVERAGE \
slaxemulator@12 234 DEF:outgoing=$rrdlog/$interface.rrd:outgoing:AVERAGE \
slaxemulator@12 235 'AREA:incoming#00FF00:incoming traffic' \
pankso@40 236 'GPRINT:incoming:MAX:max input%8.3lf %sBps' \
slaxemulator@12 237 'GPRINT:outgoing:MAX:max output%8.3lf %sBps' \
slaxemulator@12 238 'LINE1:outgoing#0000FF:outgoing traffic\j'
slaxemulator@12 239 }
slaxemulator@12 240
slaxemulator@12 241 netframes() {
slaxemulator@12 242 ifconfig $1 | grep "$2 packets" | sed -re "s/.*$3:([0-9]+).*/\1/g"
slaxemulator@12 243 }
slaxemulator@12 244
slaxemulator@12 245 netstats() {
slaxemulator@12 246 ifconfig $1 | grep bytes | sed -re "s/.*$2 bytes:([0-9]+).*/\1/g"
slaxemulator@12 247 }
slaxemulator@12 248
slaxemulator@12 249 updateifdata() {
slaxemulator@12 250 interface=$1
slaxemulator@12 251 [ -e "$rrdlog/$interface.rrd" ] ||
slaxemulator@12 252 rrdtool create "$rrdlog/$interface.rrd" --step=300 \
slaxemulator@12 253 DS:incoming:COUNTER:600:0:U \
slaxemulator@12 254 DS:outgoing:COUNTER:600:0:U \
slaxemulator@12 255 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@12 256 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@12 257 [ -e "$rrdlog/packets-$interface.rrd" ] ||
slaxemulator@12 258 rrdtool create "$rrdlog/packets-$interface.rrd" --step=300 \
slaxemulator@12 259 DS:in:COUNTER:600:0:U DS:out:COUNTER:600:0:U \
slaxemulator@12 260 DS:inerr:COUNTER:600:0:U DS:outerr:COUNTER:600:0:U \
slaxemulator@12 261 DS:indrop:COUNTER:600:0:U DS:outdrop:COUNTER:600:0:U \
slaxemulator@12 262 DS:inov:COUNTER:600:0:U DS:outov:COUNTER:600:0:U \
slaxemulator@12 263 DS:frame:COUNTER:600:0:U DS:carrier:COUNTER:600:0:U \
slaxemulator@12 264 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@12 265 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@12 266 rx=$(netstats $interface RX)
slaxemulator@12 267 tx=$(netstats $interface TX)
slaxemulator@12 268 rrdtool update "$rrdlog/$interface.rrd" -t incoming:outgoing \
slaxemulator@12 269 N:${rx:-U}:${tx:-U}
slaxemulator@12 270 rx=$(netframes $interface RX packets)
slaxemulator@12 271 tx=$(netframes $interface TX packets)
slaxemulator@12 272 rxerr=$(netframes $interface RX errors)
slaxemulator@12 273 txerr=$(netframes $interface TX errors)
slaxemulator@12 274 rxdrop=$(netframes $interface RX dropped)
slaxemulator@12 275 txdrop=$(netframes $interface TX dropped)
slaxemulator@12 276 rxov=$(netframes $interface RX overruns)
slaxemulator@12 277 txov=$(netframes $interface TX overruns)
slaxemulator@12 278 frame=$(netframes $interface RX frame)
slaxemulator@12 279 carrier=$(netframes $interface TX carrier)
slaxemulator@12 280 rrdtool update "$rrdlog/packets-$interface.rrd" \
slaxemulator@12 281 -t in:out:inerr:outerr:indrop:outdrop:inov:outov:frame:carrier \
slaxemulator@12 282 N:${rx:-U}:${tx:-U}:${rxerr:-U}:${txerr:-U}:${rxdrop:-U}:${txdrop:-U}:${rxov:-U}:${txov:-U}:${frame:-U}:${carrier:-U}
slaxemulator@12 283 }
slaxemulator@12 284
slaxemulator@12 285 getdisk()
slaxemulator@12 286 {
slaxemulator@12 287 local d
slaxemulator@12 288 local i
slaxemulator@12 289 d=$(stat -c %04D $1)
slaxemulator@12 290 for i in /dev/* ; do
slaxemulator@12 291 [ $(stat -c "%02t%02T" $i) == $d ] || continue
slaxemulator@12 292 echo $i
pascal@286 293 return
slaxemulator@12 294 done
pascal@286 295 df $1 | sed '$!d;s/ .*$//'
slaxemulator@12 296 }
slaxemulator@12 297
slaxemulator@12 298 ###
slaxemulator@12 299 ### System graphs
slaxemulator@12 300 ###
slaxemulator@12 301
slaxemulator@12 302 updatecpudata
slaxemulator@12 303 updatecpugraph day
slaxemulator@12 304 updatecpugraph week
slaxemulator@12 305 updatecpugraph month
slaxemulator@12 306 updatecpugraph year
slaxemulator@12 307
slaxemulator@12 308 updatememdata
slaxemulator@12 309 updatememgraph day
slaxemulator@12 310 updatememgraph week
slaxemulator@12 311 updatememgraph month
slaxemulator@12 312 updatememgraph year
slaxemulator@12 313
slaxemulator@12 314 if [ -e /proc/diskstats ]; then
slaxemulator@12 315 disk=$(getdisk $0)
slaxemulator@12 316 updatediskdata $disk
slaxemulator@12 317 updatediskgraph day ${disk:0:8}
slaxemulator@12 318 updatediskgraph week ${disk:0:8}
slaxemulator@12 319 updatediskgraph month ${disk:0:8}
slaxemulator@12 320 updatediskgraph year ${disk:0:8}
slaxemulator@12 321 fi
slaxemulator@12 322
slaxemulator@12 323 iface=$(/sbin/route -n | awk '{ if (/^0.0.0.0/) print $8 }')
slaxemulator@12 324 updateifdata $iface
slaxemulator@12 325 updateifgraph $iface day
slaxemulator@12 326 updateifgraph $iface week
slaxemulator@12 327 updateifgraph $iface month
slaxemulator@12 328 updateifgraph $iface year