ActiveMQ状态监控

2018-05-28  本文已影响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 $@

其他

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

上一篇 下一篇

猜你喜欢

热点阅读