通过Nagios监控weblogic服务
1.前言
???? 前段時間搭建了一套Nagios監控服務,心血來潮想自己寫一個腳本,拓展Nagios插件來監控公司的weblogic服務。
環境:weblogic10.3.3.0 、 CentOS6.5
1.首先介紹一些用命令行監控weblogic的方法
??? 對于Weblogic運行狀況的獲得,我們是通過命令行的方式實現的,通過調用Weblogic的weblogic.Admin類實現的。既然要調用類,就要把/home/weblogic/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.jar包配置導環境變量中。我通過修改原來配置JDK的環境變量中的CLASSPATH.編輯/etc/profile文件,
export CLASSPATH=.:/usr/java/jdk1.6.0_21/lib/dt.jar:/usr/java/jdk1.6.0_21/lib/tools.jar:/home/weblogic/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.jar
1.1 證實weblogic server 是否正常
返回結果:
1.2 查看weblogic server的版本
返回結果:
還有一種方法:java weblogic.version | grep -m 1 "."
weblogic.version | grep -m 1
1.3 獲得server的運行狀態
我的機器上的執行命令:
java weblogic.Admin -url t3://localhost:6088 -username weblogic1 -password weblogic1 GET -pretty -mbean "hb_circfnl_dom:Location=AdminServer,Name=AdminServer,Type=ServerRuntime"返回結果:
1.4獲得JDBC Pool運行狀態
$ java weblogic.Admin -url ${URL} -username ${USER_NAME} -password ${PASS_WORD} GET -pretty -mbean "${DOMAIN_NAME}:Location=${SERVER_NAME},Name=${POOL_NAME},ServerRuntime=${SERVER_NAME},Type=JDBCConnectionPoolRuntime"我的執行命令:
java weblogic.Admin -url t3://localhost:6088 -username weblogic1 -password weblogic1 GET -pretty -mbean "hb_circfnl_dom:Location=AdminServer,Name=circDataSource,ServerRuntime=AdminServer,Type=JDBCConnectionPoolRuntime"返回結果:
2.利用1.3和1.4的方法根據Nagios Plugin API規則編寫自己的shell實現腳本。。具體的shell腳本如下:
check_weblogic.sh
#! /bin/bash#check_weblogic.sh --jdbcpool url username password domainname servername poolname #check_weblogic.sh --server url username password domainname servername# -H host -p port -v "--type=<[jdbcpool|server]> --username username --password password --domain domainname --server servername [--pool poolname]"PROGNAME=`basename $0` PROGPATH=`echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,'` REVISION=`echo '$Revision: 1749 $' | sed -e 's/[^0-9.]//g'`. $PROGPATH/utils.shprint_usage() {echo "Usage:"echo " $PROGNAME -H host -p port -v --type [jdbcpool|server] --username username --password password --domain domainname --server servername [--pool poolname] " echo " $PROGNAME --help"echo " $PROGNAME --version" }print_help() {print_revision $PROGNAME $REVISIONecho ""print_usageecho ""echo "Check Weblogic status"echo "" }#parse weblogic parameters parse_wls_para() { # echo $@while [ -n "$1" ]docase "$1" in--type)#typeTYPE="$2"shift;;--username)USER_NAME="$2"shift;;--password)PASS_WORD="$2"shift;;--domain)DOMAIN_NAME="$2"shift;;--server)SERVER_NAME="$2"shift;;--pool)POOL_NAME="$2"shift;;*)print_usageexit $STATE_UNKNOWN;;esacshiftdone#echo "TYPE:"$TYPE#echo "USER_NAME:"$USER_NAME#echo "PASS_WORD:"$PASS_WORD#echo "DOMAIN_NAME:"$DOMAIN_NAME#echo "SERVER_NAME:"$SERVER_NAME#echO "POOL_NAME:"$POOL_NAME}# check weblogic server information check_wls_server() {local URL="t3://${HOST_NAME}:${SERVER_PORT}"local SERVER_INFO="${DOMAIN_NAME}:${SERVER_NAME}"#echo "java weblogic.Admin -url ${URL} -username ${USER_NAME} -password ${PASS_WORD} get -pretty"#echo "-mbean "${DOMAIN_NAME}:Location=${SERVER_NAME},Name=${SERVER_NAME},Type=${SERVER_TYPE}"" tmpfile=`mktemp -t nagios.XXXXXX`#echo "tmpfile"$tmpfilejava weblogic.Admin -url ${URL} -username ${USER_NAME} -password ${PASS_WORD} get -pretty \-mbean "${DOMAIN_NAME}:Location=${SERVER_NAME},Name=${SERVER_NAME},Type=${SERVER_TYPE}" \>${tmpfile} 2>&1#echo "java weblogic.Admin -url ${URL} -username ${USER_NAME} -password ${PASS_WORD} get -pretty # -mbean "${DOMAIN_NAME}:Location=${SERVER_NAME},Name=${SERVER_NAME},Type=${SERVER_TYPE}" " local N=`cat ${tmpfile} | grep ^"-" | wc -l`#echo "N:"$N if [ $N -lt 1 ] then#error#echo "tmpfile"$tmpfile#cat ${tmpfile}ERR_INFO=`cat ${tmpfile} | awk '{ printf $0 }'`#echo "ERR_INFO:"$ERR_INFOecho "CRITICAL - ${ERR_INFO}"rm -f $tmpfilereturn $STATE_CRITICAL fiif [ $N -ge 1 ] thenlocal HEALTH_STATE="" local RUN_STATE=""#HealthState Statewhile read NAME VALUEdo#PoolState WaitingForConnectionCurrentCount State#echo "NAME:${NAME} VALUE:${VALUE}"case "${NAME}" inHealthState:)HEALTH_STATE=${VALUE};;State:)RUN_STATE=${VALUE};;esacdone < ${tmpfile}rm -f $tmpfile#echo "HEALTH_STATE:${HEALTH_STATE}"#echo "RUN_STATE:${RUN_STATE}"local HEALTH_STATE_INFO=${HEALTH_STATE}echo ${HEALTH_STATE_INFO} | awk -F, '{ print $1 }' | awk -F: '{ print $2 }' | read HEALTH_STATE#echo "HEALTH_STATE:${HEALTH_STATE}"#HEALTH_OK HEALTH_WARN HEALTH_CRITICAL HEALTH_FAILEDif [[ "${RUN_STATE}" != "RUNNING" ]]thenecho "CRITICAL - ${SERVER_INFO} State is ${RUN_STATE}"return $STATE_CRITICAL ficase "${HEALTH_STATE}" inEALTH_OK);;HEALTH_WARN)echo "WARN - ${SERVER_INFO} HealthState is ${HEALTH_STATE_INFO}"return $STATE_WARNING ;;HEALTH_CRITICAL)echo "CRITICAL - ${SERVER_INFO} HealthState is ${HEALTH_STATE_INFO}"return $STATE_CRITICAL;;HEALTH_FAILED)echo "FAILED - ${SERVER_INFO} HealthState is ${HEALTH_STATE_INFO}"return $STATE_CRITICAL;;esacfiecho "OK - ${SERVER_INFO} State is ${RUN_STATE},HealthState is ${HEALTH_STATE_INFO}"return $STATE_OK}# check weblogic jdbc pool information check_wls_jdbcpool() {local URL="t3://${HOST_NAME}:${SERVER_PORT}"local POOL_INFO="${DOMAIN_NAME}:${SERVER_NAME}:${POOL_NAME}"tmpfile=`mktemp -t nagios.XXXXXX`java weblogic.Admin -url ${URL} -username ${USER_NAME} -password ${PASS_WORD} GET -pretty \-mbean "${DOMAIN_NAME}:Location=${SERVER_NAME},Name=${POOL_NAME},ServerRuntime=${SERVER_NAME},Type=${JDBC_TYPE}" \> ${tmpfile} 2>&1local N=`cat ${tmpfile} | grep ^"-" | wc -l`if [[ "$N" -lt "1" ]] then #errorERR_INFO=`cat ${tmpfile} | awk '{ printf $0 }'`echo "CRITICAL - ${ERR_INFO}"rm -f $tmpfilereturn $STATE_CRITICALfiif [[ "$N" -ge "1" ]] thenlocal POOL_STATE=""local WAIT_CNT=""local RUN_STATE=""while read NAME VALUEdo#PoolState WaitingForConnectionCurrentCount State#echo "NAME:${NAME} VALUE:${VALUE}"case "${NAME}" inPoolState:)POOL_STATE=${VALUE};;WaitingForConnectionCurrentCount:)WAIT_CNT=${VALUE};;State:)RUN_STATE=${VALUE};;esacdone < ${tmpfile}rm -f ${tmpfile}#echo "POOL_STATE:${POOL_STATE}"#echo "WAIT_CNT:${WAIT_CNT}"#echo "RUN_STATE:${RUN_STATE}"if [[ "${POOL_STATE}" != "true" ]]thenecho "CRITICAL - ${POOL_INFO} PoolState is ${POOL_STATE}"return $STATE_CRITICALfiif [[ "${RUN_STATE}" != "Running" ]]thenecho "CRITICAL - ${POOL_INFO} State is ${RUN_STATE}"return $STATE_CRITICALfiif [[ "${WAIT_CNT}" -gt "0" ]]thenecho "WARNING - ${POOL_INFO} WaitingForConnectionCurrentCount is ${WAIT_CNT}"return $STATE_WARNINGfi fiecho "OK - ${POOL_INFO} State is ${RUN_STATE},PoolState is ${POOL_STATE},WaitingForConnectionCurrentCount is ${WAIT_CNT}"return $STATE_OK }# do exit to delete tmpfile do_exit() {if [ -n "$tmpfile" ] && [ -f $tmpfile ]thenrm -f ${tmpfile}fi }if [ -z "$JAVA_HOME" ] thenecho "Please set JAVA_HOME!"exit $STATE_UNKNOWN fiif [ -z "$CLASSPATH" ] thenecho "Please set CLASSPATH!"exit $STATE_UNKNOWN else echo $CLASSPATH | grep -q "weblogic.jar" if [ $? -ne 0 ]thenecho "Please add weblogic.jar to CLASSPATH!"exit $STATE_UNKNOWNfi fiPATH=$JAVA_HOME/bin:$PATH export PATHJDBC_TYPE="JDBCConnectionPoolRuntime" SERVER_TYPE="ServerRuntime"cmd="$1"# Information options case "$cmd" in --help)print_helpexit $STATE_OK;; -h)print_helpexit $STATE_OK;; --version)print_revision $PROGNAME $REVISIONexit $STATE_OK;; -V)print_revision $PROGNAME $REVISIONexit $STATE_OK;; esac#set -- `getopt -q H:p:v: "$@"`#echo "$@"#parse input args while [ -n "$1" ] do # echo "\$1:"$1case "$1" in-H)#hostHOST_NAME="$2"shift;;-p)#portSERVER_PORT="$2"shift;;-v)WL_ARGS="$2"shift;;--)shiftbreak;;*)print_usage#exit $STATE_UNKNOWN;;esacshift done#echo "parse weblogic parameters" #parse weblogic parameters parse_wls_para $WL_ARGS #echo "end parse weblogic parameters"case "${TYPE}" in server)#serverCHK_INFO=`check_wls_server`EXIT_STATE=$?echo $CHK_INFOdo_exitexit $EXIT_STATE;; jdbcpool)#jdbc poolCHK_INFO=`check_wls_jdbcpool`EXIT_STATE=$?echo $CHK_INFOdo_exitexit $EXIT_STATE;; *)print_usageexit $STATE_UNKNOWN;; esac2.1將腳本上傳到Nagios軟件的libexec目錄下,并創建一個軟連接文件check_weblogic
使用的方法如下,
??? check_weblogic.sh -H host -p port -v '--type [jdbcpool|server] --username username --password password --domain domainname --server servername [--pool poolname]'
2.2編輯被監控主機的nrpe.cfg文件,增加如下內容,
#check weblogic [check_wls]command[check_wls_mydomain_myserver]=sudo su - weblogic -c "/usr/local/nagios/libexec/check_weblogic -H localhost -p 6088 -v '--type server --username weblogic1 --password weblogic1 --domain hb_circfnl_dom --server AdminServer'" ommand[check_wls_jdbcpool_mypool]=sudo su - weblogic -c "/usr/local/nagios/libexec/check_weblogic -H localhost -p 6088 -v '--type jdbcpool --username weblogic1 --password weblogic1 --domain hb_circfnl_dom --server AdminServer --pool circDataSource'"
編輯 ?/etc/sudoers文件
? ? ? ?#vim ?/etc/sudoers
? ? ? ? ? ? ?nagios ALL=(ALL) NOPASSWD:/usr/local/nagios/libexec/check_tablespace.sh
同時得注釋掉一下行,表示不需要控制終端
? ? ? ? ? ??#Defaults ? ?requiretty
否則會出現:NRPE: Unable to read output 錯誤
#########################################################################################
PS:這一步我搞了很久,不是提示Unable to read output 錯誤,就是提示:“Please set JAVA_HOME!”,事后分析具體原因寫在這,免得走彎路,前面是在root環境下執行的,但是監控主機是和nagios用戶交流的,所以必須在nagios運行命令,而監控的命令調用的是weblogic用戶的的方法,所以的切得切換到weblogic用戶下執行命令。本來想用sudo命令,發現不行,還得結合su命令。入下圖所示:
2.3編輯監控主機的/usr/local/nagios/etc/objects/services.cfg文件(該文件是自己新增的)并且被監控的這臺主機也應該在host.cfg中定義好,增加如下內容
define service{use local-servicehost_name weblogicservice_description Weblogic Servercheck_command check_nrpe!check_wls_mydomain_myserver} define service{use local-servicehost_name weblogicservice_description Weblogic JDBCPoolcheck_command check_nrpe!check_wls_jdbcpool_mypool}?3.檢查是否成功
3.1重啟被監控主機的nrpe
service xinetd restart
3.2重啟nagios服務
service nagios restart
3.3進入監控界面
?
?參考資料:
http://skymax.blog.51cto.com/365901/101603
http://blog.csdn.net/forest_hou/article/details/5468239
http://blog.itpub.net/228190/viewspace-586512/
?
?
?
???
轉載于:https://www.cnblogs.com/zydev/p/5092481.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的通过Nagios监控weblogic服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金士顿u盘专用格式化修复工具怎么用 金士
- 下一篇: 35个Java代码性能优化总结