美文网首页
ActiveMQ状态监控

ActiveMQ状态监控

作者: 不正经运维 | 来源:发表于2018-05-28 15:58 被阅读261次

    2018年5月9日 星期三

    10:15

    背景

    背景很简单,就是我们之前为某管理员做了消息队列监控,于是乎,这锅我们就背定了。新的系统有消息队列,也让我们监控。

    需求

    1. 监控新系统的消息队列情况;
    2. 友情给了我们前任大神的Zabbix配置(已离职);
    # Zabbix监控ActiveMQ配置
    UserParameter=activemq.pending, curl -s -utest:test http://host:port/admin/queues.jsp | grep -A 5 "${QUEUENAME}</a></td>"|awk -F '<' '{print $2}'|sed 's/td>//g'|grep '^[0-9]'|head -1
    UserParameter=activemq.dequeued, curl -s -utest:test http://host:port/admin/queues.jsp | grep -A 5 "${QUEUENAME}</a></td>"|awk -F '<' '{print $2}'|sed 's/td>//g'|grep '^[0-9]'|head -3|tail -1
    UserParameter=activemq.dequeued2, curl -s -utest:test http://host:port/admin/queues.jsp | grep -A 5 "${QUEUENAME}</a></td>"|awk -F '<' '{print $2}'|sed 's/td>//g'|grep '^[0-9]'|tail -1
    UserParameter=activemq.pending2, curl -s -utest:test http://host:port/admin/queues.jsp | grep -A 5 "${QUEUENAME}</a></td>"|awk -F '<' '{print $2}'|sed 's/td>//g'|grep '^[0-9]'|tail -4|head -1
    

    分析

    从脚本上来看很简单,路径可以远程直接登录进去,ActiveMQ有管理界面,登录后采集指定名称的队列信息,很通用的配置。

    那么我们就需要:

    1. ActiveMQ的地址,处于安全考虑,最好能够只对127.0.0.1开放;
    2. ActiveMQ的账户,原配置使用的是admin;

    如果ActiveMQ的Web界面没有配置,那么还得协助配置,头大。

    但是通常,往往有多个队列,所以这里用discover会比较方便些。

    计划返回discover接口返回数据如下:

    {
        "data" : [
            {"{#ACTIVEMQ_QNAME}": "TaskName1"},
            {"{#ACTIVEMQ_QNAME}": "TaskName2"}
        ]
    }
    

    信息处理

    1. ActiveMQ有xml格式的数据输出,直接使用;
    2. 输出数据需要去除空行,grep -v ^$就行;
    3. 将字段合并为一行,方便处理,表达式是's/">\n//g;s/"\n[ ]+/" /g'
    4. 没了。

    解决方案

    ActiveMQ配置

    开启ActiveMQ的管理界面,并增加新账户aaa(名称随意);

    使用说明

    本地ActiveMQ,自动发现

    zabbix_agentd的配置中增加如下参数:

    UserParameter=activemq_discover[*], /usr/local/zabbixagent/scripts/activemq_queue.sh -s $1 -p $2 -t $3
    UserParameter=activemq_info[*], /usr/local/zabbixagent/scripts/activemq_queue.sh -s $1 -p $2 -t $3 -m info -q $4 -f $3
    

    支持参数

    activemq_info支持参数如下:

    • 管理界面中的所有字段;

    自动发现及检测脚本

    本来是分开的,后来决定合并了。
    脚本信息如下:

    #!/bin/bash
    #
    # -------------------- Copyright --------------------
    # FileName: activemq_queue.sh
    # Description: Discovery Queues of ActiveMQ from Admin Panel.
    # Version: 1.1
    # Date: 2018/05/09
    # Author: Rex Kang
    # Email: rex.kang@qq.com
    # -------------------- History --------------------
    # 2018/05/09: First version
    # 2018/05/14: Add parameters proc
    # 2018/05/15: Add info get proc
    # -------------------- End --------------------
    
    
    fdiscover() {
        json="{'data': ["
        json_body=''
    
        queues=`curl -s -u${WEB_AUTH} ${WEB_URL} 2>/dev/null | grep -v ^$ | grep "name" | awk -F'"' '{ print $2 }' `
        $DEBUG && echo -e "CURL:\t\tcurl -s -u${WEB_AUTH} ${WEB_URL}"
        queue_length=`echo "$queues" | wc -l | awk '{print $1}'`
    
        $DEBUG && echo -e "QUEUE_LENGTH:\t${queue_length}"
    
        if [ $queue_length -ge 1 ]; then
            for queue in ${queues};
            do
                $DEBUG && echo "Queues: ${queue}"
                json_body=${json_body}"{'{#${MACRO_VARNAME}}': '${queue}'},"
            done
        fi
     
        [ -n "${json_body}" ] && json_body=${json_body%?}
        $DEBUG && echo -e "\n"
        echo $json${json_body}"]}"
        return 0
    }
    
    
    finfo() {
        value=0
        queue_info=`curl -s -u${WEB_AUTH} ${WEB_URL} 2>/dev/null | \
                grep -v ^$ | \
                sed ':begin;/queue name/,/\/>/{N;s/">\n[ ]*<stats /" /g;N;s/"\n[ ]*/" /g;b begin};' | \
                grep ${QUEUES} | sed 's/"//g; s/<queue//g; s/\/>//g'`
        $DEBUG && echo -e "Queue ${QUEUES} info: \n ${queue_info}"
        if [ -n "${queue_info}" ]; then
            value=`echo "${queue_info}" | sed "s/ /\n/g;" | grep $FIELD | awk -F'=' '{print $2}'` 
        fi
        echo ${value}
    
        return 0
    }
    
    
    usage() {
        echo -e "usage:\t$1 [-dh ][-s ip:port] [-p path]"
        echo -e "\t [-u user:pass] [-m discover|info] [-q queue]"
        echo -e "\t [-f field]"
        echo -e "\nDiscover mode parameters:"
        echo -e "-s ip:port\t\tIP and port"
        echo -e "-p server_path\t\tDefault is '/admin/xml/queues.jsp'"
        echo -e "-u user:pass\t\tThe user and pass"
        echo -e "[-m discover]\t\tDefault mode is discover"
        echo -e "[-q queue]\t\tDisplay specified queue"
    
        echo -e "\nInfo mode parameters:"
        echo -e "-s ip:port\t\tIP and port"
        echo -e "-p server_path\t\tDefault is '/admin/xml/queues.jsp'"
        echo -e "-u user:pass\t\tThe user and pass"
        echo -e "-m info\t\t\tGet info of the queue"
        echo -e "-q queue\t\tGet info of specified queue"
        echo -e "-f field\t\tGet info of specified field"
        return 0
    }
    
    main () {
        DISCOVER=true
        DEBUG=false
    
        MACRO_VARNAME="ACTIVEMQ_QNAME"
    
        WEB_SERVER=""
        WEB_PATH="/admin/xml/queues.jsp"
    
        WEB_AUTH=""
    
        # parameters
    
        while getopts "f:m:p:q:s:u:dh" OPT; do
            case $OPT in
                f)
                    FIELD="$OPTARG"
                    ;;
                m)
                    [ $OPTARG = "info" ] && DISCOVER=false
                    ;;
                p)
                    WEB_PATH="$OPTARG"
                    ;;
                q)
                    QUEUES="$OPTARG"
                    ;;
                s)
                    WEB_SERVER="$OPTARG"
                    ;;
                u)
                    WEB_AUTH="$OPTARG"
                    ;;
                d)
                    DEBUG=true
                    ;;
                h)
                    usage $0
                    exit 0
                    ;;
                ?)
                    usage $0
                    exit 1
                    ;;
            esac
        done
    
    
        WEB_URL="http://${WEB_SERVER}${WEB_PATH}"
    
    
        VAR_OK=false
    
        if $DEBUG; then
            echo -e "WEB_SERVER: \t$WEB_SERVER"
            echo -e "WEB_PATH: \t$WEB_PATH"
            echo -e "WEB_AUTH: \t$WEB_AUTH"
            echo -e "WEB_URL: \t$WEB_URL"
            echo -e "DISCOVER: \t$DISCOVER"
            echo -e "QUEUES: \t\t$QUEUES"
            echo -e "FIELD: \t\t$FIELD"
            echo -e "VAR_OK: \t$VAR_OK"
        fi
        # basic info check
        if [ -n "$WEB_SERVER" ] && [ -n "$WEB_PATH" ] && [ -n "$WEB_AUTH" ]; then
            if $DISCOVER; then
                fdiscover
            elif [ -n "$QUEUES" ] && [ -n "$FIELD" ]; then
                finfo
            else
                echo "$0 missing parameters!"
                usage
                exit 1
            fi
        else
            echo "$0 missing parameters!"
            usage
            exit 1
        fi 
    }
    
    
    main $@
    

    其他

    吐吐槽,作为一个系统管理人员,连监控的值从哪里取到的,怎么计算的都不清楚,也真是无语了。

    相关文章

      网友评论

          本文标题:ActiveMQ状态监控

          本文链接:https://www.haomeiwen.com/subject/hkegjftx.html