◆やったこと
・監視対象サーバにて、jstatを用いてgcログを元に、Old領域の使用率を出力するスクリプトを作成
・スクリプトをcron設定で1分間隔で起動させる
・Old領域の使用率が90%を超えると、Zabbixのログ監視で検知する
◆条件
・監視対象サーバで下記が使えること
・Zabbix Agent
※監視対象サーバと監視サーバ間でZabbix Agentの通信が使えること
・jstatコマンド
・bcコマンド
◆環境
・OSはCentOS7、JavaはOpenJDK8(1.8)、監視サーバはZabbix3.0を利用。
◆作業
[監視対象サーバ]
必要なパッケージをインストールする。bcパッケージはヒープ領域の閾値計算にスクリプト内で利用。
# yum install bc
# yum install java-1.8.0-openjdk-devel
gcログのモニター用スクリプトを設置。
gc_monitor.sh
#!/bin/sh
##
############################################
# 変数
############################################
PID=`/bin/jps |grep Bootstrap |awk '{print $1}'`
#GCログ出力先
LOGFILE=/var/log/tool/jstat_gcutil.log
#Zabbix監視用のログ出力先
CHECK_LOGFILE=/var/log/tool/jstat_check.log
OUR=`tail -1 ${LOGFILE}|awk '{print $5}'`
TV_1=80 #NOTICEレベルの閾値(%)
TV_2=90 #WARNINGレベルの閾値(%)
############################################
# 処理
############################################
##調査用ログ出力
echo -e "`date` ¥¥n `jstat -gcutil -t ${PID}`" >> ${LOGFILE}
##Old領域使用率チェック
OU_CHECK=$?
if [[ ${OU_CHECK} = 0 ]] && [[ "$(echo "${OUR}< ${TV_1}" |/bin/bc )" -eq 1 ]] ;then
echo "`date +%Y%m%d_%H:%M:%S` Java HeapMemory(Old Area) Check OK" >> ${CHECK_LOGFILE}
elif [[ ${OU_CHECK} = 0 ]] && [[ "$(echo "${OUR}> ${TV_1}" |/bin/bc )" -eq 1 ]] && [[ "$(echo "${OUR}< ${TV_2}" |/bin/bc )" -eq 1 ]] ;then
echo "`date +%Y%m%d_%H:%M:%S` Java HeapMemory(Old Area) over ${TV_1}% NOTICE" >> ${CHECK_LOGFILE}
elif [[ ${OU_CHECK} = 0 ]] && [[ "$(echo "${OUR}> ${TV_2}" |/bin/bc )" -eq 1 ]] ;then
echo "`date +%Y%m%d_%H:%M:%S` Java HeapMemory(Old Area) over ${TV_2}% WARNING" >> ${CHECK_LOGFILE}
else
echo "`date +%Y%m%d_%H:%M:%S` Java HeapMemory(Old Area) Check Failed" >> ${CHECK_LOGFILE}
fi
exit
[監視サーバ]
Zabbix3.0にアイテム設定とトリガー設定を入れる。
トリガー設定 ※条件式の抜粋
下記の通り、正規表現で"WARNING"の文言があるとステータス=1となる。
あとは、アラート通知設定を入れればメールなどで通知可能。アラート通知設定は割愛。
トリガー設定
{ホスト名:log[/var/log/tools/jstat_check.log,,,,skip,].regexp(WARNING)}=1
以上となります。