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

makegraphs: cpu temperature range is 0..100 C
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Nov 22 10:43:15 2012 +0100 (2012-11-22)
parents d2d8931bb183
children 3d98f09d077b
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
slaxemulator@288 8 rrdgraph="/home/slitaz/www/tank/images/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 \
pascal@339 26 DS:celsius:GAUGE:600:0:100000 \
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 %"
pascal@334 167 # BUG workaround: swap readsect and writesect :-/
slaxemulator@12 168 rrdtool graph "$rrdgraph/disk-$period.png" --start -1$period \
slaxemulator@12 169 $rrdgraphargs -t "disk access per $period $info" \
slaxemulator@12 170 --logarithmic --lower-limit 1 -v "Sectors/second" --units=si \
slaxemulator@12 171 DEF:read=$rrdlog/disk.rrd:readsect:AVERAGE \
slaxemulator@12 172 DEF:write=$rrdlog/disk.rrd:writesect:AVERAGE \
slaxemulator@12 173 DEF:req=$rrdlog/iodisk.rrd:req:AVERAGE \
slaxemulator@12 174 DEF:done=$rrdlog/iodisk.rrd:done:AVERAGE \
slaxemulator@12 175 DEF:err=$rrdlog/iodisk.rrd:err:AVERAGE \
slaxemulator@12 176 "CDEF:readpct=100,read,$maxdisk,/,*" \
slaxemulator@12 177 "CDEF:writepct=100,write,$maxdisk,/,*" \
slaxemulator@12 178 "CDEF:errpct=100,err,req,/,*" \
slaxemulator@12 179 "CDEF:donepct=100,done,req,/,*" \
slaxemulator@12 180 "CDEF:errrate=err,done,/" \
pascal@334 181 'AREA:readpct#0000FF:sectors written from disk' \
slaxemulator@12 182 "COMMENT:I/O error rate $rate" \
pascal@334 183 'STACK:writepct#00FF00:sectors read to disk' \
slaxemulator@12 184 'LINE2:donepct#FFFF00:% I/O complete' \
slaxemulator@12 185 'LINE2:errpct#FF0000:% I/O error\j'
slaxemulator@12 186 else
slaxemulator@12 187 rrdtool graph "$rrdgraph/disk-$period.png" --start -1$period \
slaxemulator@12 188 $rrdgraphargs -t "disk access per $period $info" \
slaxemulator@12 189 --logarithmic --lower-limit 1 -v "Sectors/second" --units=si \
slaxemulator@12 190 DEF:read=$rrdlog/disk.rrd:readsect:AVERAGE \
slaxemulator@12 191 DEF:write=$rrdlog/disk.rrd:writesect:AVERAGE \
slaxemulator@12 192 "CDEF:readpct=100,read,$maxdisk,/,*" \
slaxemulator@12 193 "CDEF:writepct=100,write,$maxdisk,/,*" \
pascal@334 194 'AREA:readpct#0000FF:sectors written from disk' \
pascal@334 195 'STACK:writepct#00FF00:sectors read to disk'
slaxemulator@12 196 fi
slaxemulator@12 197 }
slaxemulator@12 198
slaxemulator@12 199 updatediskdata() {
slaxemulator@12 200 dev=$1
slaxemulator@12 201 [ -e "$rrdlog/disk.rrd" ] ||
slaxemulator@12 202 rrdtool create "$rrdlog/disk.rrd" --step=300 \
slaxemulator@12 203 DS:readsect:COUNTER:600:0:5000000000 \
slaxemulator@12 204 DS:writesect:COUNTER:600:0:5000000000 \
slaxemulator@12 205 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@12 206 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@12 207 [ -e "$rrdlog/iodisk.rrd" ] ||
slaxemulator@12 208 rrdtool create "$rrdlog/iodisk.rrd" --step=300 \
slaxemulator@12 209 DS:done:GAUGE:600:0:U DS:err:GAUGE:600:0:U \
slaxemulator@12 210 DS:req:GAUGE:600:0:U \
slaxemulator@12 211 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@12 212 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@12 213
slaxemulator@12 214 while read major minor name readreq readsect writereq writesect misc; do
slaxemulator@12 215 [ $major = $(( 0x$(stat -c %t $dev) )) ] || continue
slaxemulator@12 216 [ $minor = $(( 0x$(stat -c %T $dev) )) ] || continue
slaxemulator@12 217 rrdtool update "$rrdlog/disk.rrd" -t readsect:writesect \
slaxemulator@12 218 N:$readsect:$writesect
slaxemulator@12 219 done < /proc/diskstats
slaxemulator@12 220 disk=${dev:0:8}
slaxemulator@12 221 dir=/sys/block/${disk#/dev/}/device
slaxemulator@12 222 done=$(printf "%d\n" $(cat $dir/iodone_cnt 2> /dev/null) )
slaxemulator@12 223 err=$(printf "%d\n" $(cat $dir/ioerr_cnt 2> /dev/null) )
slaxemulator@12 224 req=$(printf "%d\n" $(cat $dir/iorequest_cnt 2> /dev/null) )
slaxemulator@12 225 rrdtool update "$rrdlog/iodisk.rrd" -t done:err:req N:$done:$err:$req
slaxemulator@12 226 }
slaxemulator@12 227
slaxemulator@12 228 updateifgraph() {
slaxemulator@12 229 interface=$1
slaxemulator@12 230 period=$2
slaxemulator@12 231 rrdtool graph "$rrdgraph/$interface-$period.png" --start -1$period \
slaxemulator@12 232 $rrdgraphargs -t "traffic on $interface graph per $period" \
slaxemulator@12 233 --logarithmic -A -v "Bytes/second" --units=si \
slaxemulator@12 234 DEF:incoming=$rrdlog/$interface.rrd:incoming:AVERAGE \
slaxemulator@12 235 DEF:outgoing=$rrdlog/$interface.rrd:outgoing:AVERAGE \
slaxemulator@12 236 'AREA:incoming#00FF00:incoming traffic' \
pankso@40 237 'GPRINT:incoming:MAX:max input%8.3lf %sBps' \
slaxemulator@12 238 'GPRINT:outgoing:MAX:max output%8.3lf %sBps' \
slaxemulator@12 239 'LINE1:outgoing#0000FF:outgoing traffic\j'
slaxemulator@12 240 }
slaxemulator@12 241
slaxemulator@12 242 netframes() {
slaxemulator@12 243 ifconfig $1 | grep "$2 packets" | sed -re "s/.*$3:([0-9]+).*/\1/g"
slaxemulator@12 244 }
slaxemulator@12 245
slaxemulator@12 246 netstats() {
slaxemulator@12 247 ifconfig $1 | grep bytes | sed -re "s/.*$2 bytes:([0-9]+).*/\1/g"
slaxemulator@12 248 }
slaxemulator@12 249
slaxemulator@12 250 updateifdata() {
slaxemulator@12 251 interface=$1
slaxemulator@12 252 [ -e "$rrdlog/$interface.rrd" ] ||
slaxemulator@12 253 rrdtool create "$rrdlog/$interface.rrd" --step=300 \
slaxemulator@12 254 DS:incoming:COUNTER:600:0:U \
slaxemulator@12 255 DS:outgoing:COUNTER:600:0:U \
slaxemulator@12 256 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@12 257 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@12 258 [ -e "$rrdlog/packets-$interface.rrd" ] ||
slaxemulator@12 259 rrdtool create "$rrdlog/packets-$interface.rrd" --step=300 \
slaxemulator@12 260 DS:in:COUNTER:600:0:U DS:out:COUNTER:600:0:U \
slaxemulator@12 261 DS:inerr:COUNTER:600:0:U DS:outerr:COUNTER:600:0:U \
slaxemulator@12 262 DS:indrop:COUNTER:600:0:U DS:outdrop:COUNTER:600:0:U \
slaxemulator@12 263 DS:inov:COUNTER:600:0:U DS:outov:COUNTER:600:0:U \
slaxemulator@12 264 DS:frame:COUNTER:600:0:U DS:carrier:COUNTER:600:0:U \
slaxemulator@12 265 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@12 266 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@12 267 rx=$(netstats $interface RX)
slaxemulator@12 268 tx=$(netstats $interface TX)
slaxemulator@12 269 rrdtool update "$rrdlog/$interface.rrd" -t incoming:outgoing \
slaxemulator@12 270 N:${rx:-U}:${tx:-U}
slaxemulator@12 271 rx=$(netframes $interface RX packets)
slaxemulator@12 272 tx=$(netframes $interface TX packets)
slaxemulator@12 273 rxerr=$(netframes $interface RX errors)
slaxemulator@12 274 txerr=$(netframes $interface TX errors)
slaxemulator@12 275 rxdrop=$(netframes $interface RX dropped)
slaxemulator@12 276 txdrop=$(netframes $interface TX dropped)
slaxemulator@12 277 rxov=$(netframes $interface RX overruns)
slaxemulator@12 278 txov=$(netframes $interface TX overruns)
slaxemulator@12 279 frame=$(netframes $interface RX frame)
slaxemulator@12 280 carrier=$(netframes $interface TX carrier)
slaxemulator@12 281 rrdtool update "$rrdlog/packets-$interface.rrd" \
slaxemulator@12 282 -t in:out:inerr:outerr:indrop:outdrop:inov:outov:frame:carrier \
slaxemulator@12 283 N:${rx:-U}:${tx:-U}:${rxerr:-U}:${txerr:-U}:${rxdrop:-U}:${txdrop:-U}:${rxov:-U}:${txov:-U}:${frame:-U}:${carrier:-U}
slaxemulator@12 284 }
slaxemulator@12 285
slaxemulator@12 286 getdisk()
slaxemulator@12 287 {
slaxemulator@12 288 local d
slaxemulator@12 289 local i
slaxemulator@12 290 d=$(stat -c %04D $1)
slaxemulator@12 291 for i in /dev/* ; do
slaxemulator@12 292 [ $(stat -c "%02t%02T" $i) == $d ] || continue
slaxemulator@12 293 echo $i
pascal@286 294 return
slaxemulator@12 295 done
pascal@286 296 df $1 | sed '$!d;s/ .*$//'
slaxemulator@12 297 }
slaxemulator@12 298
slaxemulator@12 299 ###
slaxemulator@12 300 ### System graphs
slaxemulator@12 301 ###
slaxemulator@12 302
slaxemulator@12 303 updatecpudata
slaxemulator@12 304 updatecpugraph day
slaxemulator@12 305 updatecpugraph week
slaxemulator@12 306 updatecpugraph month
slaxemulator@12 307 updatecpugraph year
slaxemulator@12 308
slaxemulator@12 309 updatememdata
slaxemulator@12 310 updatememgraph day
slaxemulator@12 311 updatememgraph week
slaxemulator@12 312 updatememgraph month
slaxemulator@12 313 updatememgraph year
slaxemulator@12 314
slaxemulator@12 315 if [ -e /proc/diskstats ]; then
slaxemulator@12 316 disk=$(getdisk $0)
slaxemulator@12 317 updatediskdata $disk
slaxemulator@12 318 updatediskgraph day ${disk:0:8}
slaxemulator@12 319 updatediskgraph week ${disk:0:8}
slaxemulator@12 320 updatediskgraph month ${disk:0:8}
slaxemulator@12 321 updatediskgraph year ${disk:0:8}
slaxemulator@12 322 fi
slaxemulator@12 323
slaxemulator@12 324 iface=$(/sbin/route -n | awk '{ if (/^0.0.0.0/) print $8 }')
slaxemulator@12 325 updateifdata $iface
slaxemulator@12 326 updateifgraph $iface day
slaxemulator@12 327 updateifgraph $iface week
slaxemulator@12 328 updateifgraph $iface month
slaxemulator@12 329 updateifgraph $iface year