【Zabbix】jstatでjavaヒープ領域(heap memory)を監視することになった


◆やったこと
・監視対象サーバにて、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

以上となります。