1#!/bin/sh 2 3# 4# Copyright (c) 2001-2010 Willem Dijkstra 5# All rights reserved. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 11# - Redistributions of source code must retain the above copyright 12# notice, this list of conditions and the following disclaimer. 13# - Redistributions in binary form must reproduce the above 14# copyright notice, this list of conditions and the following 15# disclaimer in the documentation and/or other materials provided 16# with the distribution. 17# 18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 26# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 28# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29# POSSIBILITY OF SUCH DAMAGE. 30 31# --- user configuration starts here 32INTERVAL=${INTERVAL:-5} 33# default RRA setup: 34# - 2 days of 5 second samples = 34560 x 5 second samples 35# - 14 days of 30 minutes samples = 672 x 360 x 5 second samples 36# - 50 days of 2 hour samples = 600 x 1440 x 5 second samples 37# - 600 days of 1 day samples = 600 x 17280 x 5 second samples 38RRA_SETUP=${RRA_SETUP:-" 39 RRA:AVERAGE:0.5:1:34560 40 RRA:AVERAGE:0.5:360:672 41 RRA:AVERAGE:0.5:1440:600 42 RRA:AVERAGE:0.5:17280:600 43 RRA:MAX:0.5:1:34560 44 RRA:MAX:0.5:360:672 45 RRA:MAX:0.5:1440:600 46 RRA:MAX:0.5:17280:600 47 RRA:MIN:0.5:1:34560 48 RRA:MIN:0.5:360:672 49 RRA:MIN:0.5:1440:600 50 RRA:MIN:0.5:17280:600"} 51# --- user configuration ends here 52create_rrd() { 53 file=$1 54 shift 55 $RRDTOOL create $file $RRD_ARGS $* $RRA_SETUP 56 if [ "$?" = "0" -a -f $file ]; then 57 echo "$file created" 58 else 59 echo "could not create $file" 60 fi 61} 62find_exec() { 63 alternatives=$1`echo :$PATH:$2: | sed "s@:@/$3:@g"` 64 echo $alternatives | tr ':' '\n' | ( 65 while read f; do 66 if [ -n "$f" -a -x "$f" ]; then 67 echo $f 68 return 69 fi 70 done) 71} 72# find rrdtool 73RRDTOOL=`find_exec "$RRDTOOL" /usr/local/bin rrdtool` 74if [ ! -x "$RRDTOOL" ]; then 75 echo "Cannot find rrdtool - add it to \$PATH or \$RRDTOOL" 76 exit 1; 77fi 78# get arguments 79select_interval="" 80for i 81do 82case $i in 83interval) 84 select_interval="yes" 85 ;; 86child) 87 child=1 88 ;; 89oneday) 90 config=$i 91# today only RRA setup: 92# - 1 day of 5 second samples = 17280 x 5 second samples 93 RRA_SETUP=" RRA:AVERAGE:0.5:1:17280 94 RRA:MAX:0.5:1:17280 95 RRA:MIN:0.5:1:17280" 96 if [ X"$child" = "X" ]; then 97 echo "RRDs will only contain a single day of data" 98 fi 99 ;; 100*) 101 if [ -n "$select_interval" ]; then 102 INTERVAL=$i 103 select_interval="" 104 else 105 args="$args $i" 106 fi 107 ;; 108esac 109done 110 111this=$0 112if [ X"$1$2$3$4$5$6$7$8$9" = "X" ]; then 113 cat <<EOF 114Create rrd files for symux. 115 116Usage: `basename $0` [oneday] [interval <seconds>] [all] \\ 117 <rrd files> 118 119Where: 120oneday = modify rrds to only contain one day of information 121seconds = modify rrds for non standard monitoring interval 122all = run symux -l to determine current configured rrd 123 files 124<rrd files> = files ending in rrd that follow symux naming 125 126If rrdtool or symux are not installed in default locations try 127setting \$PATH or \$RRDTOOL, \$SYMUX. 128 129EOF 130 exit 1; 131fi 132 133RRD_ARGS="--step=$INTERVAL --start=now-10" 134 135for i in $args 136do 137 138if [ -f $i ]; then 139 echo "$i exists - ignoring" 140 i="done" 141fi 142 143j=`basename $i` 144case $j in 145 146all) 147 SYMUX=`find_exec "$SYMUX" /usr/libexec:/usr/local/libexec:/usr/local/bin:/usr/local/sbin symux` 148 if [ ! -x "$SYMUX" ]; then 149 echo "Cannot find symux - add it to \$PATH or \$SYMUX" 150 exit 1; 151 fi 152 sh $this interval $INTERVAL child $config `$SYMUX -l` 153 ;; 154 155cpu[0-9]*.rrd) 156 # Build cpu file 157 create_rrd $i \ 158 DS:user:GAUGE:$INTERVAL:0:100 \ 159 DS:nice:GAUGE:$INTERVAL:0:100 \ 160 DS:system:GAUGE:$INTERVAL:0:100 \ 161 DS:interrupt:GAUGE:$INTERVAL:0:100 \ 162 DS:idle:GAUGE:$INTERVAL:0:100 163 ;; 164 165cpuiow[0-9]*.rrd) 166 # Build cpuiow file 167 create_rrd $i \ 168 DS:user:GAUGE:$INTERVAL:0:100 \ 169 DS:nice:GAUGE:$INTERVAL:0:100 \ 170 DS:system:GAUGE:$INTERVAL:0:100 \ 171 DS:interrupt:GAUGE:$INTERVAL:0:100 \ 172 DS:idle:GAUGE:$INTERVAL:0:100 \ 173 DS:iowait:GAUGE:$INTERVAL:0:100 174 ;; 175 176df_*.rrd) 177 # Build df file 178 create_rrd $i \ 179 DS:blocks:GAUGE:$INTERVAL:0:U \ 180 DS:bfree:GAUGE:$INTERVAL:0:U \ 181 DS:bavail:GAUGE:$INTERVAL:0:U \ 182 DS:files:GAUGE:$INTERVAL:0:U \ 183 DS:ffree:GAUGE:$INTERVAL:0:U \ 184 DS:syncwrites:COUNTER:$INTERVAL:U:U \ 185 DS:asyncwrites:COUNTER:$INTERVAL:U:U 186 ;; 187 188sensor_*.rrd) 189 # Build sensor file 190 create_rrd $i \ 191 DS:value:GAUGE:$INTERVAL:-U:U 192 ;; 193 194mem.rrd) 195 # Build memory file 196 create_rrd $i \ 197 DS:real_active:GAUGE:$INTERVAL:0:U \ 198 DS:real_total:GAUGE:$INTERVAL:0:U \ 199 DS:free:GAUGE:$INTERVAL:0:U \ 200 DS:swap_used:GAUGE:$INTERVAL:0:U \ 201 DS:swap_total:GAUGE:$INTERVAL:0:U 202 ;; 203 204if_*.rrd) 205 # Build interface files 206 create_rrd $i \ 207 DS:ipackets:COUNTER:$INTERVAL:U:U DS:opackets:COUNTER:$INTERVAL:U:U \ 208 DS:ibytes:COUNTER:$INTERVAL:U:U DS:obytes:COUNTER:$INTERVAL:U:U \ 209 DS:imcasts:COUNTER:$INTERVAL:U:U DS:omcasts:COUNTER:$INTERVAL:U:U \ 210 DS:ierrors:COUNTER:$INTERVAL:U:U DS:oerrors:COUNTER:$INTERVAL:U:U \ 211 DS:collisions:COUNTER:$INTERVAL:U:U DS:drops:COUNTER:$INTERVAL:U:U 212 ;; 213 214debug.rrd) 215 # Build debug file 216 create_rrd $i \ 217 DS:debug0:GAUGE:$INTERVAL:U:U DS:debug1:GAUGE:$INTERVAL:U:U \ 218 DS:debug2:GAUGE:$INTERVAL:U:U DS:debug3:GAUGE:$INTERVAL:U:U \ 219 DS:debug4:GAUGE:$INTERVAL:U:U DS:debug5:GAUGE:$INTERVAL:U:U \ 220 DS:debug6:GAUGE:$INTERVAL:U:U DS:debug7:GAUGE:$INTERVAL:U:U \ 221 DS:debug8:GAUGE:$INTERVAL:U:U DS:debug9:GAUGE:$INTERVAL:U:U \ 222 DS:debug10:GAUGE:$INTERVAL:U:U DS:debug11:GAUGE:$INTERVAL:U:U \ 223 DS:debug12:GAUGE:$INTERVAL:U:U DS:debug13:GAUGE:$INTERVAL:U:U \ 224 DS:debug14:GAUGE:$INTERVAL:U:U DS:debug15:GAUGE:$INTERVAL:U:U \ 225 DS:debug16:GAUGE:$INTERVAL:U:U DS:debug17:GAUGE:$INTERVAL:U:U \ 226 DS:debug18:GAUGE:$INTERVAL:U:U DS:debug19:GAUGE:$INTERVAL:U:U 227 ;; 228proc_*.rrd) 229 # Build proc file 230 create_rrd $i \ 231 DS:number:GAUGE:$INTERVAL:0:U DS:uticks:COUNTER:$INTERVAL:0:U \ 232 DS:sticks:COUNTER:$INTERVAL:0:U DS:iticks:COUNTER:$INTERVAL:0:U \ 233 DS:cpusec:GAUGE:$INTERVAL:0:U DS:cpupct:GAUGE:$INTERVAL:0:100 \ 234 DS:procsz:GAUGE:$INTERVAL:0:U DS:rsssz:GAUGE:$INTERVAL:0:U 235 ;; 236 237pf.rrd) 238 # Build pf file 239 create_rrd $i \ 240 DS:bytes_v4_in:DERIVE:$INTERVAL:0:U DS:bytes_v4_out:DERIVE:$INTERVAL:0:U \ 241 DS:bytes_v6_in:DERIVE:$INTERVAL:0:U DS:bytes_v6_out:DERIVE:$INTERVAL:0:U \ 242 DS:packets_v4_in_pass:DERIVE:$INTERVAL:0:U DS:packets_v4_in_drop:DERIVE:$INTERVAL:0:U \ 243 DS:packets_v4_out_pass:DERIVE:$INTERVAL:0:U DS:packets_v4_out_drop:DERIVE:$INTERVAL:0:U \ 244 DS:packets_v6_in_pass:DERIVE:$INTERVAL:0:U DS:packets_v6_in_drop:DERIVE:$INTERVAL:0:U \ 245 DS:packets_v6_out_pass:DERIVE:$INTERVAL:0:U DS:packets_v6_out_drop:DERIVE:$INTERVAL:0:U \ 246 DS:states_entries:GAUGE:$INTERVAL:0:U \ 247 DS:states_searches:DERIVE:$INTERVAL:0:U \ 248 DS:states_inserts:DERIVE:$INTERVAL:0:U \ 249 DS:states_removals:DERIVE:$INTERVAL:0:U \ 250 DS:counters_match:DERIVE:$INTERVAL:0:U \ 251 DS:counters_badoffset:DERIVE:$INTERVAL:0:U \ 252 DS:counters_fragment:DERIVE:$INTERVAL:0:U \ 253 DS:counters_short:DERIVE:$INTERVAL:0:U \ 254 DS:counters_normalize:DERIVE:$INTERVAL:0:U \ 255 DS:counters_memory:DERIVE:$INTERVAL:0:U 256 ;; 257 258pfq_*.rrd) 259 # Build pfq file 260 create_rrd $i \ 261 DS:sent_bytes:COUNTER:$INTERVAL:0:U \ 262 DS:sent_packets:COUNTER:$INTERVAL:0:U \ 263 DS:drop_bytes:COUNTER:$INTERVAL:0:U \ 264 DS:drop_packets:COUNTER:$INTERVAL:0:U 265 ;; 266 267mbuf.rrd) 268 # Build mbuf file 269 create_rrd $i \ 270 DS:totmbufs:GAUGE:$INTERVAL:0:U DS:mt_data:GAUGE:$INTERVAL:0:U \ 271 DS:mt_oobdata:GAUGE:$INTERVAL:0:U DS:mt_control:GAUGE:$INTERVAL:0:U \ 272 DS:mt_header:GAUGE:$INTERVAL:0:U DS:mt_ftable:GAUGE:$INTERVAL:0:U \ 273 DS:mt_soname:GAUGE:$INTERVAL:0:U DS:mt_soopts:GAUGE:$INTERVAL:0:U \ 274 DS:pgused:GAUGE:$INTERVAL:0:U DS:pgtotal:GAUGE:$INTERVAL:0:U \ 275 DS:totmem:GAUGE:$INTERVAL:0:U DS:totpct:GAUGE:$INTERVAL:0:100 \ 276 DS:m_drops:COUNTER:$INTERVAL:0:U DS:m_wait:COUNTER:$INTERVAL:0:U \ 277 DS:m_drain:COUNTER:$INTERVAL:0:U 278 ;; 279 280io_*.rrd) 281 # Build disk files 282 create_rrd $i \ 283 DS:rxfer:COUNTER:$INTERVAL:U:U \ 284 DS:wxfer:COUNTER:$INTERVAL:U:U \ 285 DS:seeks:COUNTER:$INTERVAL:U:U \ 286 DS:rbytes:COUNTER:$INTERVAL:U:U \ 287 DS:wbytes:COUNTER:$INTERVAL:U:U 288 ;; 289 290io1_*.rrd) 291 # Build disk files 292 create_rrd $i \ 293 DS:transfers:COUNTER:$INTERVAL:U:U \ 294 DS:seeks:COUNTER:$INTERVAL:U:U \ 295 DS:bytes:COUNTER:$INTERVAL:U:U 296 ;; 297 298smart_*.rrd) 299 # Build smart files 300 create_rrd $i \ 301 DS:read_error_rate:GAUGE:$INTERVAL:U:U \ 302 DS:realloc_sectors:GAUGE:$INTERVAL:U:U \ 303 DS:spin_retries:GAUGE:$INTERVAL:U:U \ 304 DS:air_flow_temp:GAUGE:$INTERVAL:U:U \ 305 DS:temperature:GAUGE:$INTERVAL:U:U \ 306 DS:realloc:GAUGE:$INTERVAL:U:U \ 307 DS:cur_pending:GAUGE:$INTERVAL:U:U \ 308 DS:uncorr:GAUGE:$INTERVAL:U:U \ 309 DS:sread_error_rate:GAUGE:$INTERVAL:U:U \ 310 DS:gsense_error_rate:GAUGE:$INTERVAL:U:U \ 311 DS:temperature2:GAUGE:$INTERVAL:U:U \ 312 DS:freefall:GAUGE:$INTERVAL:U:U 313 ;; 314 315load.rrd) 316 # Build load file 317 create_rrd $i \ 318 DS:load1:GAUGE:$INTERVAL:0:U \ 319 DS:load5:GAUGE:$INTERVAL:0:U \ 320 DS:load15:GAUGE:$INTERVAL:0:U 321 ;; 322 323flukso_*.rrd) 324 # Build the flukso file 325 create_rrd $i \ 326 DS:watts:GAUGE:$INTERVAL:0:U 327 ;; 328 329"done") 330 # ignore 331 ;; 332*) 333 # Default match 334 echo $i - cannot determine filetype from filename 335 ;; 336esac 337done 338