dns lookupにかかった時間を記録・監視する


顧客のdnsサーバの調子が悪い様子。それを監視し、自分たちの判断材料にするために利用

単発script

$ cat /path/to/dnsspeed.sh
#!/bin/bash
# dns lookup speedを計測する
# 
# $ bash this.sh ドメイン dnsサーバ
# $ bash this.sh example.com 8.8.8.8
#
# @param (string)[domain]      e.g. example.com *required
# @param (string)<dns server>  e.g. 8.8.8.8     default: none
# 
# @return (int)                成功したら msec の値が返る

if [[ -z $1 ]]; then
  echo "dns解決を試すドメインが引数で来ていません。必須です。"
  exit 2
else 
  DOMAIN=$1
fi

if [[ -z $2 ]]; then
  DNSSERVER=
else 
  # dig @8.8.8.8 example.com の形にする
  DNSSERVER=@$2
fi

if MYTIME=$((time dig $DNSSERVER $DOMAIN +trace) 2>&1 ) ; then
    # 成功したらかかった時間をmsecで返す(timeコマンドから取り出し)
    echo $MYTIME | sed -e "s/.*real//" | sed -e "s/user.*//" | sed -e "s/[ms\.]//g"
    exit 0
else
    # timeout/failは0が返る
    echo 0
    exit 1
fi

zabbix UserParameter

$ cat dnsspeed.conf
################################################################
# dns lookup speed measuring tool
################################################################
# 
# dig コマンドを使ってdns lookup にかかった時間を計測
# 結果がmsecで帰ります。timeoutなら0。

# How to use
# Item:
#  type:Zabbix agent
#  dnsspeed[domain,<dns server>]
#  dnsspeed[example.com]
#  dnsspeed[example.com,8.8.8.8]
#
#  @param dns lookup したいdomain
#  @param dns lookup に使いたいdns server
#  @return かかった時間, timeout/failの場合は0

UserParameter=dnsspeed[*],[ -z "$1" ] && echo "Please specity a target domain." || bash /path/to/dnsspeed.sh $1 $2

zabbix trigger

3分dns解決できなければ鳴らす
0=失敗なので0を検知する

{dnsspeed[example.com].avg(3m)}=0 

で、青いラインのdns serverが揺れてることがわかったという話。