unbound_munin_ revision 1.1.1.2.6.1 1 1.1 christos #!/bin/sh
2 1.1 christos #
3 1.1 christos # plugin for munin to monitor usage of unbound servers.
4 1.1 christos # To install copy this to /usr/local/share/munin/plugins/unbound_munin_
5 1.1 christos # and use munin-node-configure (--suggest, --shell).
6 1.1 christos #
7 1.1 christos # (C) 2008 W.C.A. Wijngaards. BSD Licensed.
8 1.1 christos #
9 1.1 christos # To install; enable statistics and unbound-control in unbound.conf
10 1.1 christos # server: extended-statistics: yes
11 1.1 christos # statistics-cumulative: no
12 1.1 christos # statistics-interval: 0
13 1.1 christos # remote-control: control-enable: yes
14 1.1 christos # Run the command unbound-control-setup to generate the key files.
15 1.1 christos #
16 1.1 christos # Environment variables for this script
17 1.1 christos # unbound_conf - where the unbound.conf file is located.
18 1.1 christos # unbound_control - where to find unbound-control executable.
19 1.1 christos # spoof_warn - what level to warn about spoofing
20 1.1 christos # spoof_crit - what level to crit about spoofing
21 1.1 christos #
22 1.1 christos # You can set them in your munin/plugin-conf.d/plugins.conf file
23 1.1 christos # with:
24 1.1 christos # [unbound*]
25 1.1 christos # user root
26 1.1 christos # env.unbound_conf /usr/local/etc/unbound/unbound.conf
27 1.1 christos # env.unbound_control /usr/local/sbin/unbound-control
28 1.1 christos # env.spoof_warn 1000
29 1.1 christos # env.spoof_crit 100000
30 1.1 christos #
31 1.1 christos # This plugin can create different graphs depending on what name
32 1.1 christos # you link it as (with ln -s) into the plugins directory
33 1.1 christos # You can link it multiple times.
34 1.1 christos # If you are only a casual user, the _hits and _by_type are most interesting,
35 1.1 christos # possibly followed by _by_rcode.
36 1.1 christos #
37 1.1 christos # unbound_munin_hits - base volume, cache hits, unwanted traffic
38 1.1 christos # unbound_munin_queue - to monitor the internal requestlist
39 1.1 christos # unbound_munin_memory - memory usage
40 1.1 christos # unbound_munin_by_type - incoming queries by type
41 1.1 christos # unbound_munin_by_class - incoming queries by class
42 1.1 christos # unbound_munin_by_opcode - incoming queries by opcode
43 1.1 christos # unbound_munin_by_rcode - answers by rcode, validation status
44 1.1 christos # unbound_munin_by_flags - incoming queries by flags
45 1.1 christos # unbound_munin_histogram - histogram of query resolving times
46 1.1 christos #
47 1.1 christos # Magic markers - optional - used by installation scripts and
48 1.1 christos # munin-config: (originally contrib family but munin-node-configure ignores it)
49 1.1 christos #
50 1.1 christos #%# family=auto
51 1.1 christos #%# capabilities=autoconf suggest
52 1.1 christos
53 1.1 christos # POD documentation
54 1.1 christos : <<=cut
55 1.1 christos =head1 NAME
56 1.1 christos
57 1.1 christos unbound_munin_ - Munin plugin to monitor the Unbound DNS resolver.
58 1.1 christos
59 1.1 christos =head1 APPLICABLE SYSTEMS
60 1.1 christos
61 1.1 christos System with unbound daemon.
62 1.1 christos
63 1.1 christos =head1 CONFIGURATION
64 1.1 christos
65 1.1 christos [unbound*]
66 1.1 christos user root
67 1.1 christos env.unbound_conf /usr/local/etc/unbound/unbound.conf
68 1.1 christos env.unbound_control /usr/local/sbin/unbound-control
69 1.1 christos env.spoof_warn 1000
70 1.1 christos env.spoof_crit 100000
71 1.1 christos
72 1.1 christos Use the .env settings to override the defaults.
73 1.1 christos
74 1.1 christos =head1 USAGE
75 1.1 christos
76 1.1 christos Can be used to present different graphs. Use ln -s for that name in
77 1.1 christos the plugins directory to enable the graph.
78 1.1 christos unbound_munin_hits - base volume, cache hits, unwanted traffic
79 1.1 christos unbound_munin_queue - to monitor the internal requestlist
80 1.1 christos unbound_munin_memory - memory usage
81 1.1 christos unbound_munin_by_type - incoming queries by type
82 1.1 christos unbound_munin_by_class - incoming queries by class
83 1.1 christos unbound_munin_by_opcode - incoming queries by opcode
84 1.1 christos unbound_munin_by_rcode - answers by rcode, validation status
85 1.1 christos unbound_munin_by_flags - incoming queries by flags
86 1.1 christos unbound_munin_histogram - histogram of query resolving times
87 1.1 christos
88 1.1 christos =head1 AUTHOR
89 1.1 christos
90 1.1 christos Copyright 2008 W.C.A. Wijngaards
91 1.1 christos
92 1.1 christos =head1 LICENSE
93 1.1 christos
94 1.1 christos BSD
95 1.1 christos
96 1.1 christos =cut
97 1.1 christos
98 1.1.1.2.6.1 martin state="${MUNIN_PLUGSTATE}/unbound.state"
99 1.1.1.2.6.1 martin seentags="${MUNIN_PLUGSTATE}/unbound-seentags.state"
100 1.1 christos conf=${unbound_conf:-/usr/local/etc/unbound/unbound.conf}
101 1.1 christos ctrl=${unbound_control:-/usr/local/sbin/unbound-control}
102 1.1 christos warn=${spoof_warn:-1000}
103 1.1 christos crit=${spoof_crit:-100000}
104 1.1 christos lock=$state.lock
105 1.1 christos
106 1.1 christos # number of seconds between polling attempts.
107 1.1 christos # makes the statefile hang around for at least this many seconds,
108 1.1 christos # so that multiple links of this script can share the results.
109 1.1 christos lee=55
110 1.1 christos
111 1.1 christos # to keep things within 19 characters
112 1.1 christos ABBREV="-e s/total/t/ -e s/thread/t/ -e s/num/n/ -e s/query/q/ -e s/answer/a/ -e s/unwanted/u/ -e s/requestlist/ql/ -e s/type/t/ -e s/class/c/ -e s/opcode/o/ -e s/rcode/r/ -e s/edns/e/ -e s/mem/m/ -e s/cache/c/ -e s/mod/m/"
113 1.1 christos
114 1.1 christos # get value from $1 into return variable $value
115 1.1 christos get_value ( ) {
116 1.1 christos value="`grep '^'$1'=' $state | sed -e 's/^.*=//'`"
117 1.1 christos if test "$value"x = ""x; then
118 1.1 christos value="0"
119 1.1 christos fi
120 1.1 christos }
121 1.1 christos
122 1.1.1.2.6.1 martin # Update list of seen query types etc to seentags file. This is run while
123 1.1.1.2.6.1 martin # holding the lock, after the state file is updated.
124 1.1.1.2.6.1 martin update_seentags() {
125 1.1.1.2.6.1 martin tmplist="$(cat ${seentags} 2> /dev/null)
126 1.1.1.2.6.1 martin num.query.type.A
127 1.1.1.2.6.1 martin num.query.class.IN
128 1.1.1.2.6.1 martin num.query.opcode.QUERY
129 1.1.1.2.6.1 martin num.answer.rcode.NOERROR
130 1.1.1.2.6.1 martin "
131 1.1.1.2.6.1 martin (echo "${tmplist}"; grep ^num ${state} | sed -e 's/=.*//') | sort -u > ${seentags}
132 1.1.1.2.6.1 martin }
133 1.1.1.2.6.1 martin
134 1.1 christos # download the state from the unbound server.
135 1.1 christos get_state ( ) {
136 1.1 christos # obtain lock for fetching the state
137 1.1 christos # because there is a race condition in fetching and writing to file
138 1.1 christos
139 1.1.1.2.6.1 martin # see if the lock is stale, if so, take it
140 1.1 christos if test -f $lock ; then
141 1.1 christos pid="`cat $lock 2>&1`"
142 1.1 christos kill -0 "$pid" >/dev/null 2>&1
143 1.1 christos if test $? -ne 0 -a "$pid" != $$ ; then
144 1.1 christos echo $$ >$lock
145 1.1 christos fi
146 1.1 christos fi
147 1.1 christos
148 1.1 christos i=0
149 1.1 christos while test ! -f $lock || test "`cat $lock 2>&1`" != $$; do
150 1.1 christos while test -f $lock; do
151 1.1 christos # wait
152 1.1 christos i=`expr $i + 1`
153 1.1 christos if test $i -gt 1000; then
154 1.1 christos sleep 1;
155 1.1 christos fi
156 1.1 christos if test $i -gt 1500; then
157 1.1 christos echo "error locking $lock" "=" `cat $lock`
158 1.1 christos rm -f $lock
159 1.1 christos exit 1
160 1.1 christos fi
161 1.1 christos done
162 1.1 christos # try to get it
163 1.1.1.2 christos if echo $$ >$lock ; then : ; else break; fi
164 1.1 christos done
165 1.1 christos # do not refetch if the file exists and only LEE seconds old
166 1.1 christos if test -f $state; then
167 1.1 christos now=`date +%s`
168 1.1 christos get_value "time.now"
169 1.1 christos value="`echo $value | sed -e 's/\..*$//'`"
170 1.1 christos if test $now -lt `expr $value + $lee`; then
171 1.1 christos rm -f $lock
172 1.1 christos return
173 1.1 christos fi
174 1.1 christos fi
175 1.1 christos $ctrl -c $conf stats > $state
176 1.1 christos if test $? -ne 0; then
177 1.1 christos echo "error retrieving data from unbound server"
178 1.1 christos rm -f $lock
179 1.1 christos exit 1
180 1.1 christos fi
181 1.1.1.2.6.1 martin update_seentags
182 1.1 christos rm -f $lock
183 1.1 christos }
184 1.1 christos
185 1.1 christos if test "$1" = "autoconf" ; then
186 1.1 christos if test ! -f $conf; then
187 1.1 christos echo no "($conf does not exist)"
188 1.1.1.2.6.1 martin exit 0
189 1.1 christos fi
190 1.1 christos if test ! -d `dirname $state`; then
191 1.1 christos echo no "(`dirname $state` directory does not exist)"
192 1.1.1.2.6.1 martin exit 0
193 1.1 christos fi
194 1.1 christos echo yes
195 1.1 christos exit 0
196 1.1 christos fi
197 1.1 christos
198 1.1 christos if test "$1" = "suggest" ; then
199 1.1 christos echo "hits"
200 1.1 christos echo "queue"
201 1.1 christos echo "memory"
202 1.1 christos echo "by_type"
203 1.1 christos echo "by_class"
204 1.1 christos echo "by_opcode"
205 1.1 christos echo "by_rcode"
206 1.1 christos echo "by_flags"
207 1.1 christos echo "histogram"
208 1.1 christos exit 0
209 1.1 christos fi
210 1.1 christos
211 1.1 christos # determine my type, by name
212 1.1 christos id=`echo $0 | sed -e 's/^.*unbound_munin_//'`
213 1.1 christos if test "$id"x = ""x; then
214 1.1 christos # some default to keep people sane.
215 1.1 christos id="hits"
216 1.1 christos fi
217 1.1 christos
218 1.1 christos # if $1 exists in statefile, config is echoed with label $2
219 1.1 christos exist_config ( ) {
220 1.1 christos mn=`echo $1 | sed $ABBREV | tr . _`
221 1.1 christos if grep '^'$1'=' $state >/dev/null 2>&1; then
222 1.1 christos echo "$mn.label $2"
223 1.1 christos echo "$mn.min 0"
224 1.1 christos echo "$mn.type ABSOLUTE"
225 1.1 christos fi
226 1.1 christos }
227 1.1 christos
228 1.1 christos # print label and min 0 for a name $1 in unbound format
229 1.1 christos p_config ( ) {
230 1.1 christos mn=`echo $1 | sed $ABBREV | tr . _`
231 1.1 christos echo $mn.label "$2"
232 1.1 christos echo $mn.min 0
233 1.1 christos echo $mn.type $3
234 1.1 christos }
235 1.1 christos
236 1.1 christos if test "$1" = "config" ; then
237 1.1 christos if test ! -f $state; then
238 1.1 christos get_state
239 1.1 christos fi
240 1.1 christos case $id in
241 1.1 christos hits)
242 1.1 christos echo "graph_title Unbound DNS traffic and cache hits"
243 1.1 christos echo "graph_args --base 1000 -l 0"
244 1.1 christos echo "graph_vlabel queries / \${graph_period}"
245 1.1 christos echo "graph_scale no"
246 1.1.1.2.6.1 martin echo "graph_category dns"
247 1.1 christos for x in `grep "^thread[0-9][0-9]*\.num\.queries=" $state |
248 1.1 christos sed -e 's/=.*//'`; do
249 1.1 christos exist_config $x "queries handled by `basename $x .num.queries`"
250 1.1 christos done
251 1.1 christos p_config "total.num.queries" "total queries from clients" "ABSOLUTE"
252 1.1 christos p_config "total.num.cachehits" "cache hits" "ABSOLUTE"
253 1.1 christos p_config "total.num.prefetch" "cache prefetch" "ABSOLUTE"
254 1.1 christos p_config "num.query.tcp" "TCP queries" "ABSOLUTE"
255 1.1 christos p_config "num.query.tcpout" "TCP out queries" "ABSOLUTE"
256 1.1.1.2.6.1 martin p_config "num.query.udpout" "UDP out queries" "ABSOLUTE"
257 1.1.1.2.6.1 martin p_config "num.query.tls" "TLS queries" "ABSOLUTE"
258 1.1.1.2.6.1 martin p_config "num.query.tls.resume" "TLS resumes" "ABSOLUTE"
259 1.1 christos p_config "num.query.ipv6" "IPv6 queries" "ABSOLUTE"
260 1.1 christos p_config "unwanted.queries" "queries that failed acl" "ABSOLUTE"
261 1.1 christos p_config "unwanted.replies" "unwanted or unsolicited replies" "ABSOLUTE"
262 1.1 christos echo "u_replies.warning $warn"
263 1.1 christos echo "u_replies.critical $crit"
264 1.1 christos echo "graph_info DNS queries to the recursive resolver. The unwanted replies could be innocent duplicate packets, late replies, or spoof threats."
265 1.1 christos ;;
266 1.1 christos queue)
267 1.1 christos echo "graph_title Unbound requestlist size"
268 1.1 christos echo "graph_args --base 1000 -l 0"
269 1.1 christos echo "graph_vlabel number of queries"
270 1.1 christos echo "graph_scale no"
271 1.1.1.2.6.1 martin echo "graph_category dns"
272 1.1 christos p_config "total.requestlist.avg" "Average size of queue on insert" "GAUGE"
273 1.1 christos p_config "total.requestlist.max" "Max size of queue (in 5 min)" "GAUGE"
274 1.1 christos p_config "total.requestlist.overwritten" "Number of queries replaced by new ones" "GAUGE"
275 1.1 christos p_config "total.requestlist.exceeded" "Number of queries dropped due to lack of space" "GAUGE"
276 1.1 christos echo "graph_info The queries that did not hit the cache and need recursion service take up space in the requestlist. If there are too many queries, first queries get overwritten, and at last resort dropped."
277 1.1 christos ;;
278 1.1 christos memory)
279 1.1 christos echo "graph_title Unbound memory usage"
280 1.1 christos echo "graph_args --base 1024 -l 0"
281 1.1 christos echo "graph_vlabel memory used in bytes"
282 1.1.1.2.6.1 martin echo "graph_category dns"
283 1.1 christos p_config "mem.cache.rrset" "RRset cache memory" "GAUGE"
284 1.1 christos p_config "mem.cache.message" "Message cache memory" "GAUGE"
285 1.1 christos p_config "mem.mod.iterator" "Iterator module memory" "GAUGE"
286 1.1 christos p_config "mem.mod.validator" "Validator module and key cache memory" "GAUGE"
287 1.1 christos p_config "msg.cache.count" "msg cache count" "GAUGE"
288 1.1 christos p_config "rrset.cache.count" "rrset cache count" "GAUGE"
289 1.1 christos p_config "infra.cache.count" "infra cache count" "GAUGE"
290 1.1 christos p_config "key.cache.count" "key cache count" "GAUGE"
291 1.1 christos echo "graph_info The memory used by unbound."
292 1.1 christos ;;
293 1.1 christos by_type)
294 1.1 christos echo "graph_title Unbound DNS queries by type"
295 1.1 christos echo "graph_args --base 1000 -l 0"
296 1.1 christos echo "graph_vlabel queries / \${graph_period}"
297 1.1 christos echo "graph_scale no"
298 1.1.1.2.6.1 martin echo "graph_category dns"
299 1.1.1.2.6.1 martin for nm in `grep "^num.query.type" $seentags`; do
300 1.1 christos tp=`echo $nm | sed -e s/num.query.type.//`
301 1.1 christos p_config "$nm" "$tp" "ABSOLUTE"
302 1.1 christos done
303 1.1 christos echo "graph_info queries by DNS RR type queried for"
304 1.1 christos ;;
305 1.1 christos by_class)
306 1.1 christos echo "graph_title Unbound DNS queries by class"
307 1.1 christos echo "graph_args --base 1000 -l 0"
308 1.1 christos echo "graph_vlabel queries / \${graph_period}"
309 1.1 christos echo "graph_scale no"
310 1.1.1.2.6.1 martin echo "graph_category dns"
311 1.1.1.2.6.1 martin for nm in `grep "^num.query.class" $seentags`; do
312 1.1 christos tp=`echo $nm | sed -e s/num.query.class.//`
313 1.1 christos p_config "$nm" "$tp" "ABSOLUTE"
314 1.1 christos done
315 1.1 christos echo "graph_info queries by DNS RR class queried for."
316 1.1 christos ;;
317 1.1 christos by_opcode)
318 1.1 christos echo "graph_title Unbound DNS queries by opcode"
319 1.1 christos echo "graph_args --base 1000 -l 0"
320 1.1 christos echo "graph_vlabel queries / \${graph_period}"
321 1.1 christos echo "graph_scale no"
322 1.1.1.2.6.1 martin echo "graph_category dns"
323 1.1.1.2.6.1 martin for nm in `grep "^num.query.opcode" $seentags`; do
324 1.1 christos tp=`echo $nm | sed -e s/num.query.opcode.//`
325 1.1 christos p_config "$nm" "$tp" "ABSOLUTE"
326 1.1 christos done
327 1.1 christos echo "graph_info queries by opcode in the query packet."
328 1.1 christos ;;
329 1.1 christos by_rcode)
330 1.1 christos echo "graph_title Unbound DNS answers by return code"
331 1.1 christos echo "graph_args --base 1000 -l 0"
332 1.1 christos echo "graph_vlabel answer packets / \${graph_period}"
333 1.1 christos echo "graph_scale no"
334 1.1.1.2.6.1 martin echo "graph_category dns"
335 1.1.1.2.6.1 martin for nm in `grep "^num.answer.rcode" $seentags`; do
336 1.1 christos tp=`echo $nm | sed -e s/num.answer.rcode.//`
337 1.1 christos p_config "$nm" "$tp" "ABSOLUTE"
338 1.1 christos done
339 1.1 christos p_config "num.answer.secure" "answer secure" "ABSOLUTE"
340 1.1 christos p_config "num.answer.bogus" "answer bogus" "ABSOLUTE"
341 1.1 christos p_config "num.rrset.bogus" "num rrsets marked bogus" "ABSOLUTE"
342 1.1 christos echo "graph_info answers sorted by return value. rrsets bogus is the number of rrsets marked bogus per \${graph_period} by the validator"
343 1.1 christos ;;
344 1.1 christos by_flags)
345 1.1 christos echo "graph_title Unbound DNS incoming queries by flags"
346 1.1 christos echo "graph_args --base 1000 -l 0"
347 1.1 christos echo "graph_vlabel queries / \${graph_period}"
348 1.1 christos echo "graph_scale no"
349 1.1.1.2.6.1 martin echo "graph_category dns"
350 1.1 christos p_config "num.query.flags.QR" "QR (query reply) flag" "ABSOLUTE"
351 1.1 christos p_config "num.query.flags.AA" "AA (auth answer) flag" "ABSOLUTE"
352 1.1 christos p_config "num.query.flags.TC" "TC (truncated) flag" "ABSOLUTE"
353 1.1 christos p_config "num.query.flags.RD" "RD (recursion desired) flag" "ABSOLUTE"
354 1.1 christos p_config "num.query.flags.RA" "RA (rec avail) flag" "ABSOLUTE"
355 1.1 christos p_config "num.query.flags.Z" "Z (zero) flag" "ABSOLUTE"
356 1.1 christos p_config "num.query.flags.AD" "AD (auth data) flag" "ABSOLUTE"
357 1.1 christos p_config "num.query.flags.CD" "CD (check disabled) flag" "ABSOLUTE"
358 1.1 christos p_config "num.query.edns.present" "EDNS OPT present" "ABSOLUTE"
359 1.1 christos p_config "num.query.edns.DO" "DO (DNSSEC OK) flag" "ABSOLUTE"
360 1.1 christos echo "graph_info This graphs plots the flags inside incoming queries. For example, if QR, AA, TC, RA, Z flags are set, the query can be rejected. RD, AD, CD and DO are legitimately set by some software."
361 1.1 christos ;;
362 1.1 christos histogram)
363 1.1 christos echo "graph_title Unbound DNS histogram of reply time"
364 1.1 christos echo "graph_args --base 1000 -l 0"
365 1.1 christos echo "graph_vlabel queries / \${graph_period}"
366 1.1 christos echo "graph_scale no"
367 1.1.1.2.6.1 martin echo "graph_category dns"
368 1.1 christos echo hcache.label "cache hits"
369 1.1 christos echo hcache.min 0
370 1.1 christos echo hcache.type ABSOLUTE
371 1.1 christos echo hcache.draw AREA
372 1.1 christos echo hcache.colour 999999
373 1.1 christos echo h64ms.label "0 msec - 66 msec"
374 1.1 christos echo h64ms.min 0
375 1.1 christos echo h64ms.type ABSOLUTE
376 1.1 christos echo h64ms.draw STACK
377 1.1 christos echo h64ms.colour 0000FF
378 1.1 christos echo h128ms.label "66 msec - 131 msec"
379 1.1 christos echo h128ms.min 0
380 1.1 christos echo h128ms.type ABSOLUTE
381 1.1 christos echo h128ms.colour 1F00DF
382 1.1 christos echo h128ms.draw STACK
383 1.1 christos echo h256ms.label "131 msec - 262 msec"
384 1.1 christos echo h256ms.min 0
385 1.1 christos echo h256ms.type ABSOLUTE
386 1.1 christos echo h256ms.draw STACK
387 1.1 christos echo h256ms.colour 3F00BF
388 1.1 christos echo h512ms.label "262 msec - 524 msec"
389 1.1 christos echo h512ms.min 0
390 1.1 christos echo h512ms.type ABSOLUTE
391 1.1 christos echo h512ms.draw STACK
392 1.1 christos echo h512ms.colour 5F009F
393 1.1 christos echo h1s.label "524 msec - 1 sec"
394 1.1 christos echo h1s.min 0
395 1.1 christos echo h1s.type ABSOLUTE
396 1.1 christos echo h1s.draw STACK
397 1.1 christos echo h1s.colour 7F007F
398 1.1 christos echo h2s.label "1 sec - 2 sec"
399 1.1 christos echo h2s.min 0
400 1.1 christos echo h2s.type ABSOLUTE
401 1.1 christos echo h2s.draw STACK
402 1.1 christos echo h2s.colour 9F005F
403 1.1 christos echo h4s.label "2 sec - 4 sec"
404 1.1 christos echo h4s.min 0
405 1.1 christos echo h4s.type ABSOLUTE
406 1.1 christos echo h4s.draw STACK
407 1.1 christos echo h4s.colour BF003F
408 1.1 christos echo h8s.label "4 sec - 8 sec"
409 1.1 christos echo h8s.min 0
410 1.1 christos echo h8s.type ABSOLUTE
411 1.1 christos echo h8s.draw STACK
412 1.1 christos echo h8s.colour DF001F
413 1.1 christos echo h16s.label "8 sec - ..."
414 1.1 christos echo h16s.min 0
415 1.1 christos echo h16s.type ABSOLUTE
416 1.1 christos echo h16s.draw STACK
417 1.1 christos echo h16s.colour FF0000
418 1.1 christos echo "graph_info Histogram of the reply times for queries."
419 1.1 christos ;;
420 1.1 christos esac
421 1.1 christos
422 1.1 christos exit 0
423 1.1 christos fi
424 1.1 christos
425 1.1 christos # do the stats itself
426 1.1 christos get_state
427 1.1 christos
428 1.1 christos # get the time elapsed
429 1.1 christos get_value "time.elapsed"
430 1.1 christos if test $value = 0 || test $value = "0.000000"; then
431 1.1 christos echo "error: time elapsed 0 or could not retrieve data"
432 1.1 christos exit 1
433 1.1 christos fi
434 1.1 christos elapsed="$value"
435 1.1 christos
436 1.1 christos # print value for $1
437 1.1 christos print_value ( ) {
438 1.1 christos mn=`echo $1 | sed $ABBREV | tr . _`
439 1.1 christos get_value $1
440 1.1 christos echo "$mn.value" $value
441 1.1 christos }
442 1.1 christos
443 1.1 christos # print value if line already found in $2
444 1.1 christos print_value_line ( ) {
445 1.1 christos mn=`echo $1 | sed $ABBREV | tr . _`
446 1.1 christos value="`echo $2 | sed -e 's/^.*=//'`"
447 1.1 christos echo "$mn.value" $value
448 1.1 christos }
449 1.1 christos
450 1.1 christos
451 1.1 christos case $id in
452 1.1 christos hits)
453 1.1 christos for x in `grep "^thread[0-9][0-9]*\.num\.queries=" $state |
454 1.1 christos sed -e 's/=.*//'` total.num.queries \
455 1.1 christos total.num.cachehits total.num.prefetch num.query.tcp \
456 1.1.1.2.6.1 martin num.query.tcpout num.query.udpout num.query.tls num.query.tls.resume \
457 1.1.1.2.6.1 martin num.query.ipv6 unwanted.queries \
458 1.1 christos unwanted.replies; do
459 1.1 christos if grep "^"$x"=" $state >/dev/null 2>&1; then
460 1.1 christos print_value $x
461 1.1 christos fi
462 1.1 christos done
463 1.1 christos ;;
464 1.1 christos queue)
465 1.1 christos for x in total.requestlist.avg total.requestlist.max \
466 1.1 christos total.requestlist.overwritten total.requestlist.exceeded; do
467 1.1 christos print_value $x
468 1.1 christos done
469 1.1 christos ;;
470 1.1 christos memory)
471 1.1 christos for x in mem.cache.rrset mem.cache.message mem.mod.iterator \
472 1.1 christos mem.mod.validator msg.cache.count rrset.cache.count \
473 1.1 christos infra.cache.count key.cache.count; do
474 1.1 christos print_value $x
475 1.1 christos done
476 1.1 christos ;;
477 1.1 christos by_type)
478 1.1.1.2.6.1 martin for nm in `grep "^num.query.type" $seentags`; do
479 1.1.1.2.6.1 martin print_value $nm
480 1.1 christos done
481 1.1 christos ;;
482 1.1 christos by_class)
483 1.1.1.2.6.1 martin for nm in `grep "^num.query.class" $seentags`; do
484 1.1.1.2.6.1 martin print_value $nm
485 1.1 christos done
486 1.1 christos ;;
487 1.1 christos by_opcode)
488 1.1.1.2.6.1 martin for nm in `grep "^num.query.opcode" $seentags`; do
489 1.1.1.2.6.1 martin print_value $nm
490 1.1 christos done
491 1.1 christos ;;
492 1.1 christos by_rcode)
493 1.1.1.2.6.1 martin for nm in `grep "^num.answer.rcode" $seentags`; do
494 1.1.1.2.6.1 martin print_value $nm
495 1.1 christos done
496 1.1 christos print_value "num.answer.secure"
497 1.1 christos print_value "num.answer.bogus"
498 1.1 christos print_value "num.rrset.bogus"
499 1.1 christos ;;
500 1.1 christos by_flags)
501 1.1 christos for x in num.query.flags.QR num.query.flags.AA num.query.flags.TC num.query.flags.RD num.query.flags.RA num.query.flags.Z num.query.flags.AD num.query.flags.CD num.query.edns.present num.query.edns.DO; do
502 1.1 christos print_value $x
503 1.1 christos done
504 1.1 christos ;;
505 1.1 christos histogram)
506 1.1 christos get_value total.num.cachehits
507 1.1 christos echo hcache.value $value
508 1.1 christos r=0
509 1.1 christos for x in histogram.000000.000000.to.000000.000001 \
510 1.1 christos histogram.000000.000001.to.000000.000002 \
511 1.1 christos histogram.000000.000002.to.000000.000004 \
512 1.1 christos histogram.000000.000004.to.000000.000008 \
513 1.1 christos histogram.000000.000008.to.000000.000016 \
514 1.1 christos histogram.000000.000016.to.000000.000032 \
515 1.1 christos histogram.000000.000032.to.000000.000064 \
516 1.1 christos histogram.000000.000064.to.000000.000128 \
517 1.1 christos histogram.000000.000128.to.000000.000256 \
518 1.1 christos histogram.000000.000256.to.000000.000512 \
519 1.1 christos histogram.000000.000512.to.000000.001024 \
520 1.1 christos histogram.000000.001024.to.000000.002048 \
521 1.1 christos histogram.000000.002048.to.000000.004096 \
522 1.1 christos histogram.000000.004096.to.000000.008192 \
523 1.1 christos histogram.000000.008192.to.000000.016384 \
524 1.1 christos histogram.000000.016384.to.000000.032768 \
525 1.1 christos histogram.000000.032768.to.000000.065536; do
526 1.1 christos get_value $x
527 1.1 christos r=`expr $r + $value`
528 1.1 christos done
529 1.1 christos echo h64ms.value $r
530 1.1 christos get_value histogram.000000.065536.to.000000.131072
531 1.1 christos echo h128ms.value $value
532 1.1 christos get_value histogram.000000.131072.to.000000.262144
533 1.1 christos echo h256ms.value $value
534 1.1 christos get_value histogram.000000.262144.to.000000.524288
535 1.1 christos echo h512ms.value $value
536 1.1 christos get_value histogram.000000.524288.to.000001.000000
537 1.1 christos echo h1s.value $value
538 1.1 christos get_value histogram.000001.000000.to.000002.000000
539 1.1 christos echo h2s.value $value
540 1.1 christos get_value histogram.000002.000000.to.000004.000000
541 1.1 christos echo h4s.value $value
542 1.1 christos get_value histogram.000004.000000.to.000008.000000
543 1.1 christos echo h8s.value $value
544 1.1 christos r=0
545 1.1 christos for x in histogram.000008.000000.to.000016.000000 \
546 1.1 christos histogram.000016.000000.to.000032.000000 \
547 1.1 christos histogram.000032.000000.to.000064.000000 \
548 1.1 christos histogram.000064.000000.to.000128.000000 \
549 1.1 christos histogram.000128.000000.to.000256.000000 \
550 1.1 christos histogram.000256.000000.to.000512.000000 \
551 1.1 christos histogram.000512.000000.to.001024.000000 \
552 1.1 christos histogram.001024.000000.to.002048.000000 \
553 1.1 christos histogram.002048.000000.to.004096.000000 \
554 1.1 christos histogram.004096.000000.to.008192.000000 \
555 1.1 christos histogram.008192.000000.to.016384.000000 \
556 1.1 christos histogram.016384.000000.to.032768.000000 \
557 1.1 christos histogram.032768.000000.to.065536.000000 \
558 1.1 christos histogram.065536.000000.to.131072.000000 \
559 1.1 christos histogram.131072.000000.to.262144.000000 \
560 1.1 christos histogram.262144.000000.to.524288.000000; do
561 1.1 christos get_value $x
562 1.1 christos r=`expr $r + $value`
563 1.1 christos done
564 1.1 christos echo h16s.value $r
565 1.1 christos ;;
566 1.1 christos esac
567