c_smrrds.sh 9.8 KB

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