#! /bin/bash
export LANG=en_US.UTF-8

#WARNLIMIT=-1      #警告值 超过该值则认为是需要告警
#ERRORLIMIT=-1         #错误值 超过该值认为是错误

CURNUM=             #当前的性能参数
WranResultStr=      #最后形成的告警字符串
ErrorResultStr=     #最后形成的错误字符串
DataResultStr=      #性能呢个参数字符串

#连接数
CONN=-1
CONNMIN=-1
CONNMAX=-1
#CPU
CPU=-1
CPUMIN=-1
CPUMAX=-1
#内存
MEMORY=-1
MEMORYMIN=-1
MEMORYMAX=-1
#总缓存大小
TOTALCACHE=-1
TOTALCACHEMIN=-1
TOTALCACHEMAX=-1
#已使用缓存大小
USEDCACHE=-1
USEDCACHEMIN=-1
USEDCACHEMAX=-1
#SET次数
CMDSET=-1
CMDSETMIN=-1
CMDSETMAX=-1
#GET次数
CMDGET=-1
CMDGETMIN=-1
CMDGETMAX=-1
#未命中率
HIT=-1
HITMIN=-1
HITMAX=-1
CORENUM=1
PORT=
FLAGE=
FLAGEID=
#是否输出FLAGPID
FLAGEOPID=1
#是否输出RUNTIME
RUNTIME=1
#是否输出STARTTIME
STARTTIME=0
QUOTASTR=
quota=
StatStr=
function gotErr(){
    if [ "$1" -eq 2 ];then 
        result="{'cpname':'memcached',$DataResultStr}"
        result=`echo ${result//\'/\"}`
        echo $result
    elif [ "$1" -eq 3 ];then 
        echo "无法获取到指标,疑似组件故障,请确认并请检查监控脚本和运维平台配置"
    elif [ "$1" -eq 4 ];then
        echo "该组件进程为僵尸进程,请确认并请检查该组件状态"
        exit 3
    fi

    exit $1
}

function isAlive(){
    CORENUM=`cat /proc/cpuinfo |grep "physical id"|wc -l`
    FLAGEID=$(netstat -lnp | grep -w $PORT |grep tcp| grep '0.0.0.0'| awk '{print $NF}' | awk -F '/' '{print $1}'|head -n 1)
    if [[ "$FLAGEID" -eq 0 ]];then
        gotErr 3
    fi
    ZOMBIE=$(ps -A -ostat,pid | grep -e '^[Zz]' | grep $FLAGEID)
    if [[ "$ZOMBIE" != "" ]];then
       gotErr 4
    fi
    StatStr=$((echo "stats";sleep 0.5) | telnet 127.0.0.1 ${PORT} 2>/dev/null | grep "STAT $item\b")
}


#处理连接数
function getConnNum(){
    CURNUM=$( netstat -apn | grep $FLAGEID | grep ESTABLISHED | wc -l)
}

#ps aux 4是内存 累加4的值
function getMemory(){
    CURNUM=$(ps aux | grep $FLAGEID |awk 'BEGIN{sum=0}{sum+=$4}END{print sum}')
}

#ps aux 3是CPU 累加3的值
function getCPU(){
    CURNUM=$(ps aux | grep $FLAGEID |awk 'BEGIN{sum=0}{sum+=$3}END{print sum}')
    if [ "$CORENUM" -ne 0 ];then
       CURNUM=$(printf "%.2f" `echo "scale=2;$CURNUM/$CORENUM" | bc`)
    fi
}

#获取已使用的内存
function getUsedCache(){
    CURNUM=$(echo "$StatStr" | awk -F ' ' '{for(i=1;i<NF;++i){if(index($i,"version")==1)print $(i+1)}}'|awk -F ':' '{print $1}')
    CURNUM=$(echo "$CURNUM" | awk '{printf("%.2f\n",$1/1024/1024)}')
}

#获取服务器分配给memcache的内存
function getTotalCache(){
    CURNUM=$(echo "$StatStr" | awk -F ' ' '{for(i=1;i<NF;++i){if(index($i,"limit_maxbytes")==1)print $(i+1)}}'|awk -F ':' '{print $1}')
    CURNUM=$(echo "$CURNUM" | awk '{printf("%.2f\n",$1/1024/1024)}')
}

#set次数
function getCmdSet(){
    CURNUM=$(echo "$StatStr" | awk -F ' ' '{for(i=1;i<NF;++i){if(index($i,"cmd_set")==1)print $(i+1)}}'|awk -F ':' '{print $1}')
}

#get次数
function getCmdGet(){
    CURNUM=$(echo "$StatStr" | awk -F ' ' '{for(i=1;i<NF;++i){if(index($i,"cmd_get")==1)print $(i+1)}}'|awk -F ':' '{print $1}')
}

#未命中率
function getHits(){
    cmd_get=$(echo "$StatStr" | awk -F ' ' '{for(i=1;i<NF;++i){if(index($i,"cmd_get")==1)print $(i+1)}}'|awk -F ':' '{print $1}')
    get_hits=$(echo "$StatStr" | awk -F ' ' '{for(i=1;i<NF;++i){if(index($i,"get_hits")==1)print $(i+1)}}'|awk -F ':' '{print $1}')
    if [[ "${cmd_get}" -eq 0 ]];then
        CURNUM=0
    else
      CURNUM=$(echo "100-$get_hits*100/$cmd_get"|bc)
    fi 
}

#ps -eo pid,etime 是查询进程运行时间
function getRuntime(){
    CURNUM=$(ps -eo pid,etime | grep $FLAGEID |awk '{if($1=='$FLAGEID') print $2}')
}

#ps -eo pid,lstart是查询进程的开始时间
function getStarttime(){
    CURNUM=$(ps -eo pid,lstart | grep $FLAGEID |awk '{if($1=='$FLAGEID') print $2 ,$3 ,$4 ,$5 ,$6}')
}


#依据传入的参数值来判断我们要监控的服务是什么
#然后通过各个函数获取到具体的值
#值之间的
function analysisStat(){


        getConnNum
        parseFileds "CONN" 

        getCPU
        parseFileds "CPU"

        getMemory
        parseFileds "MEMORY" 

        getTotalCache
        parseFileds "TOTALCACHE" 

        getUsedCache
        parseFileds "USEDCACHE" 

        getCmdSet
        parseFileds "CMDSET" 

        getCmdGet
        parseFileds "CMDGET"

        getHits
        parseFileds "HIT" 

        CURNUM=$FLAGEID
        parseTimeFileds "FLAGEPID"

        getRuntime
        parseTimeFileds "RUNTIME" 

        getStarttime
        parseTimeFileds "STARTTIME" 

}
function parseTimeFileds(){
    if [[ "$DataResultStr" != "" ]];then
        DataResultStr=$DataResultStr","
    fi
    DataResultStr="$DataResultStr'$1':'$CURNUM'"
}
#CURNUM            当前值
#WARNLIMIT         告警的上限
#ERRORLIMIT    异常的上限
#判断以上三个值并拼接结果字符串
function parseFileds(){
    if [[ "$DataResultStr" != "" ]];then
        DataResultStr=$DataResultStr","
    fi
    DataResultStr="$DataResultStr'$1':'$CURNUM'"
}

#分析结果 给出给出状态
function analysisResult(){
        gotErr 2
}

#输出错误信息并且退出程序
function showHelp(){
    if [ "$1" != "" ];then
        echo "请输入$1"
    fi
    echo "check_memcached.sh 可以监听本地的memcached的状态 参数如下"
    echo "check_memcached.sh [ -p <str>]"
    echo "-p 表示Memcache服务器的端口"
    exit 1
}

while getopts "u:p:b:f:hP:" arg
do
    case $arg in
        h)
            showHelp
            ;;
        p)
            PORT=$OPTARG
            ;;          
        ?) 
            showHelp
            ;;
    esac
done

if [[ "$PORT" == "" ]];then
    showHelp "特征项"
fi


#插件正题部分 
#确定存活的
#启动
#分析

isAlive
analysisStat
analysisResult

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code