2013年3月22日金曜日

DNSキャッシュサーバ(unbound)の統計情報をzabbixで管理


◆ 目的
オープンソースのDNSキャッシュサーバとして利用されている
unboundの統計情報をzabbixで描く。

dnsクライアントからzabbix_senderを使ってzabbixサーバへ結果を送りつける。
zabbixサーバ側の設定は終わっているものとする。



◆ 統計ツール
【グラフ描画ツール概要】
テンポラリファイルとしてキー名+値のファイルを自動作成する。
(/usr/local/dns/tmp/unbound.stats ファイル例)
total.num.queries 180983
total.num.cachehits 156961



time.now 1363833601.385187
time.up 10774139.658005



mem.total.sbrk=15507456
mem.cache.rrset=4878710



histogram.000000.000000.to.000000.000001 2877
histogram.000000.000001.to.000000.000002 0



num.query.type.A 144542
num.query.type.PTR 912




これをzabbix_senderでzabbixサーバへ送りつけるだけである。
ツール内抜粋。
awk '{print "- unbound."$1" "$2;}' $STATS | $SENDER -vv -s $HOST -z $SERVER -p $PORT -i - > $LOG 2>&1
上のファイルは$STAT変数に入る。


【事前準備】
下のようなファイルを手動で用意しておく。
unboundの統計結果には下記をキーとするクエリとアンサ結果が
現れてくるまでは出力はされない。
ただし、グラフを描く際は明示的に0として記録しておきたい。
そのために利用するファイルである(※1で利用する)。

# vi /usr/local/dns/conf/unbound_stats.cfg
num.query.type.A
num.query.type.PTR
num.query.type.DS
num.query.type.MX
num.query.type.NS
num.query.type.SOA
num.query.type.SRV
num.answer.rcode.NOERROR
num.answer.rcode.SERVFAIL
num.answer.rcode.NXDOMAIN


少しややこしいのでもう少し説明を加えておく。
unboundの統計結果として現れてきたキーをa, b, c, dとする。・・・①
unbound_stats.cfgファイルで明示的に記載するキーをc, d, eとする。・・・②
①と①と②を加算してひとつしかないものを明示的に指示する必要があるということである。

a + a     = 2
b + b     = 2
c + c + c = 3
d + d + d = 3
        e = 1 ⇒ 0 とする



そしてこれが統計情報をzabbixへ送りつけるツールである。

# vi /usr/local/dns/conf/stat.sh
#!/bin/bash
CMD="/usr/sbin/unbound-control"
CFG="/usr/local/dns/conf/unbound_stats.cfg"
LIST="/usr/local/dns/tmp/unbound.lst"
STATS="/usr/local/dns/tmp/unbound.stats"

HOST=`hostname`
SENDER="/usr/bin/zabbix_sender"
SERVERS="192.0.2.1 192.0.2.2"
PORT="10051"
LOG="/var/log/zabbix-sender.log"

cp $STATS $STATS.bak


# スレッド単位での統計値は除外し合計値だけを求める
$CMD stats_noreset | \
awk -F '=' '/^num/ || /^histogram/ || /^total/ || /^time/ || /^mem/ {print $1" "$2}' \
> $STATS

# ※1での説明のためである
awk '{print $1}' $STATS > $LIST
sort $LIST $LIST $CFG | uniq -c | awk '$1==1{print $2" 0";}' >> $STATS

for SERVER in $SERVERS
do
awk '{print "- unbound."$1" "$2;}' $STATS | $SENDER -vv -s $HOST -z $SERVER -p $PORT -i - > $LOG 2>&1
done

# chmod 755 /usr/local/dns/bin/stat.sh

# /usr/local/dns/bin/stat.sh