2018年5月9日 星期三
10:15
背景
背景很简单,就是我们之前为某管理员做了消息队列监控,于是乎,这锅我们就背定了。新的系统有消息队列,也让我们监控。
需求
- 监控新系统的消息队列情况;
- 友情给了我们前任大神的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有管理界面,登录后采集指定名称
的队列信息,很通用的配置。
那么我们就需要:
- ActiveMQ的地址,处于安全考虑,最好能够只对127.0.0.1开放;
- ActiveMQ的账户,原配置使用的是admin;
如果ActiveMQ的Web界面没有配置,那么还得协助配置,头大。
但是通常,往往有多个队列,所以这里用discover
会比较方便些。
计划返回discover接口返回数据如下:
{
"data" : [
{"{#ACTIVEMQ_QNAME}": "TaskName1"},
{"{#ACTIVEMQ_QNAME}": "TaskName2"}
]
}
信息处理
- ActiveMQ有xml格式的数据输出,直接使用;
- 输出数据需要去除空行,
grep -v ^$
就行; - 将字段合并为一行,方便处理,表达式是
's/">\n//g;s/"\n[ ]+/" /g'
; - 没了。
解决方案
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 $@
其他
吐吐槽,作为一个系统管理人员,连监控的值从哪里取到的,怎么计算的都不清楚,也真是无语了。
网友评论