COLT_CMDB_RocketMQ.sh

#!/bin/bash
#IT_BEGIN
#IT_TYPE=1
#原型指标
#IT MIDWARE_ROCKETMQ_HOSTNAME|hostname
#IT MIDWARE_ROCKETMQ_IPADDRESS|ip
#新增指标安装路径 配置文件路径
#IT MIDWARE_ROCKETMQ_HOMEPATH|homepath
#IT MIDWARE_ROCKETMQ_CONFIGPATH|configpath
#IT MIDWARE_ROCKETMQ_NAMESRV_PORT|namesrv_port
#IT MIDWARE_ROCKETMQ_BROKER_PORT|broker_port
#IT MIDWARE_ROCKETMQ_VERSION|version
#IT MIDWARE_ROCKETMQ_CLUSTER_NAME|cluster_name
#IT MIDWARE_ROCKETMQ_BROKER_NAME|broker_name
#IT MIDWARE_ROCKETMQ_BROKER_ID|broker_id
#IT MIDWARE_ROCKETMQ_STORE_PATH|store_path
#IT MIDWARE_ROCKETMQ_COMMITLOG_SIZE|commitlog_size
#IT MIDWARE_ROCKETMQ_CONSUME_QUEUE_SIZE|consume_queue_size
#IT MIDWARE_ROCKETMQ_DISK_SPACE_WARN_THRESHOLD|disk_space_warn_threshold
#IT MIDWARE_ROCKETMQ_DISK_SPACE_CLEAN_THRESHOLD|disk_space_clean_threshold
#IT MIDWARE_ROCKETMQ_HA_MODE|ha_mode
#IT MIDWARE_ROCKETMQ_HA_ADDRESS|ha_address
#IT_END
shname=$(basename "$0")
ATTR="_X(g=$shname,p=cmdb,t=script,f=0)"

# 中文日志函数
log() {
    echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2
}

# 错误处理函数
error() {
    echo "[ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2
    exit 1
}

# 获取本地IP地址(增强兼容性)
get_local_ip() {
    local ip=""
    # 方法1:使用ip命令
    if command -v ip >/dev/null; then
        ip=$(ip -o -4 addr show scope global | awk '{print $4}' | cut -d'/' -f1 | head -1)
    # 方法2:使用ifconfig
    elif command -v ifconfig >/dev/null; then
        ip=$(ifconfig | grep -oP 'inet (addr:)?\K([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | head -1)
    # 方法3:使用hostname
    else
        ip=$(hostname -I | awk '{print $1}')
    fi
    echo "${ip:-}"
}

# 查找RocketMQ安装目录(完全重写)
find_rocketmq_home() {
    # 方法1:检查环境变量
    if [ -n "$ROCKETMQ_HOME" ] && [ -f "$ROCKETMQ_HOME/bin/mqadmin" ]; then
        echo "$ROCKETMQ_HOME"
        return
    fi

    # 方法2:检查常见安装路径
    local common_paths=(
        "/opt/rocketmq"
        "/usr/local/rocketmq" 
        "/app/rocketmq"
        "${HOME}/rocketmq"
        "/apps/rocketmq*"
    )
    
    for path in "${common_paths[@]}"; do
        # 处理通配符路径
        for expanded_path in $path; do
            if [ -f "$expanded_path/bin/mqadmin" ]; then
                echo "$expanded_path"
                return
            fi
        done
    done

    # 方法3:通过进程查找
    local java_proc=$(ps auxwww | grep -v grep | grep -E 'org.apache.rocketmq.namesrv.NamesrvStartup|org.apache.rocketmq.broker.BrokerStartup')
    if [ -n "$java_proc" ]; then
        # 从jar路径推断
        local jar_path=$(echo "$java_proc" | grep -oE '/[^ ]+\.jar' | head -1)
        if [ -n "$jar_path" ]; then
            local rocketmq_home=$(dirname "$(dirname "$jar_path")")
            [ -f "$rocketmq_home/bin/mqadmin" ] && {
                echo "$rocketmq_home"
                return
            }
        fi

        # 从类路径推断
        local classpath=$(echo "$java_proc" | grep -oE '(Djava.class.path=| -classpath | -cp )[^ ]+' | cut -d'=' -f2 | head -1)
        if [ -n "$classpath" ]; then
            local rocketmq_jar=$(echo "$classpath" | tr ':' '\n' | grep -E 'rocketmq-[a-z]+' | head -1)
            if [ -n "$rocketmq_jar" ]; then
                local rocketmq_home=$(dirname "$(dirname "$rocketmq_jar")")
                [ -f "$rocketmq_home/bin/mqadmin" ] && {
                    echo "$rocketmq_home"
                    return
                }
            fi
        fi
    fi

    # 方法4:通过which命令查找
    local mqadmin_path=$(which mqadmin 2>/dev/null)
    if [ -n "$mqadmin_path" ]; then
        local rocketmq_home=$(dirname "$(dirname "$mqadmin_path")")
        [ -f "$rocketmq_home/bin/mqadmin" ] && {
            echo "$rocketmq_home"
            return
        }
    fi

    # 方法5:智能文件搜索(限制范围)
    local search_paths=(
        "/opt"
        "/usr/local" 
        "/app"
        "${HOME}"
        "/apps"
    )
    
    for path in "${search_paths[@]}"; do
        [ ! -d "$path" ] && continue
        
        # 查找bin/mqadmin(限制搜索深度)
        local found=$(find "$path" -maxdepth 5 -type f -path "*/bin/mqadmin" 2>/dev/null | head -1)
        if [ -n "$found" ]; then
            local rocketmq_home=$(dirname "$(dirname "$found")")
            [ -f "$rocketmq_home/bin/mqadmin" ] && {
                echo "$rocketmq_home"
                return
            }
        fi
    done

    echo ""
}
# 获取RocketMQ版本(解决重复问题)
get_rocketmq_version() {
    local rocketmq_home="$1"
    [ -z "$rocketmq_home" ] && { echo "unknown"; return; }
    
    # 方法1:通过mqadmin命令获取(去重处理)
    local version=$("${rocketmq_home}/bin/mqadmin" version 2>/dev/null | 
                   grep -i "RocketMQ" | head -1 | 
                   awk '{print $NF}' | sort -u | head -1)
    
    # 方法2:通过jar包版本获取(备用方案)
    if [ -z "$version" ]; then
        version=$(find "${rocketmq_home}/lib" -name "rocketmq-*.jar" 2>/dev/null | 
                 head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' |
                 sort -u | head -1)
    fi
    
    echo "${version:-}"
}


# 解析RocketMQ配置文件(增强健壮性)
parse_rocketmq_config() {
    local config_file="$1"
    declare -A config
    [ -f "$config_file" ] || return 1

    # 设置默认值
    config=(
        [broker_port]="10911"
        [ha_port]="10912"
        [cluster_name]="DefaultCluster"
        [broker_name]="DefaultBroker"
        [broker_id]="0"
        [store_path]="/store"
        [commitlog_size]="1073741824"
        [consume_queue_size]="6000000"
        [disk_space_warn_threshold]="0.90"
        [disk_space_clean_threshold]="0.85"
        [ha_mode]="ASYNC_MASTER"
        [ha_address]=""
    )
    
    # 解析配置文件
    while IFS= read -r line; do
        # 清理注释和空格
        line=$(echo "$line" | sed 's/#.*//;s/^[[:space:]]*//;s/[[:space:]]*$//')
        [ -z "$line" ] && continue

        # 提取配置项(支持带引号和不带引号的值)
        case "$line" in
            brokerClusterName=*)
                config[cluster_name]=$(echo "${line#*=}" | tr -d '"'"'")
                ;;
            brokerName=*)
                config[broker_name]=$(echo "${line#*=}" | tr -d '"'"'")
                ;;
            brokerId=*)
                config[broker_id]=$(echo "${line#*=}" | tr -d '"'"'")
                ;;
            listenPort=*)
                config[broker_port]=$(echo "${line#*=}" | tr -d '"'"'")
                ;;
            storePathRootDir=*)
                config[store_path]=$(echo "${line#*=}" | tr -d '"'"'")
                ;;
            mapedFileSizeCommitLog=*)
                config[commitlog_size]=$(echo "${line#*=}" | tr -d '"'"'")
                ;;
            mapedFileSizeConsumeQueue=*)
                config[consume_queue_size]=$(echo "${line#*=}" | tr -d '"'"'")
                ;;
            diskSpaceWarningLevelRatio=*)
                config[disk_space_warn_threshold]=$(echo "${line#*=}" | tr -d '"'"'")
                ;;
            diskSpaceCleanForciblyRatio=*)
                config[disk_space_clean_threshold]=$(echo "${line#*=}" | tr -d '"'"'")
                ;;
            brokerRole=*)
                config[ha_mode]=$(echo "${line#*=}" | tr -d '"'"'")
                ;;
            haListenPort=*)
                config[ha_port]=$(echo "${line#*=}" | tr -d '"'"'")
                ;;
        esac
    done < "$config_file"

    # 计算HA地址
    if [ -n "${config[ha_port]}" ] && [ "$IP" != "" ]; then
        config[ha_address]="${IP}:${config[ha_port]}"
    fi

    echo "$(declare -p config | sed "s/^declare -A config='//;s/'$//")"
}

# 主函数(添加更多错误检查)
main() {
    log "开始采集RocketMQ信息..."
    
    # 获取基础信息
    HOSTNAME=$(hostname)
    IP=$(get_local_ip)
    log "主机基本信息: $HOSTNAME, IP: $IP"
    
    # 查找RocketMQ安装目录
    ROCKETMQ_HOME=$(find_rocketmq_home)
    if [ -z "$ROCKETMQ_HOME" ]; then
        error "未找到RocketMQ安装目录,请检查:
1. RocketMQ是否已安装
2. 可设置ROCKETMQ_HOME环境变量指定路径
3. 确保mqadmin命令在PATH中"
    fi
    log "RocketMQ安装目录: $ROCKETMQ_HOME"
    
    # 检查mqadmin可执行权限
    if [ ! -x "$ROCKETMQ_HOME/bin/mqadmin" ]; then
        error "mqadmin没有执行权限,请检查: $ROCKETMQ_HOME/bin/mqadmin"
    fi
    
    # 获取版本信息
    #VERSION=$(get_rocketmq_version "$ROCKETMQ_HOME")
    #log "RocketMQ版本: ${VERSION:-未知}"
    VERSION=$(get_rocketmq_version "$ROCKETMQ_HOME" | sort -u | head -1)
    log "RocketMQ版本: ${VERSION:-}"
    # 查找配置文件
    BROKER_CONF=""
    for conf_file in "$ROCKETMQ_HOME"/conf/{broker-*.conf,broker.conf}; do
        [ -f "$conf_file" ] && BROKER_CONF="$conf_file" && break
    done
    
    if [ -z "$BROKER_CONF" ]; then
        error "未找到broker配置文件,请检查:
1. $ROCKETMQ_HOME/conf目录是否存在
2. 确保包含broker.conf或broker-*.conf文件"
    fi
    log "使用broker配置文件: $BROKER_CONF"
    
    # 解析配置文件
    if ! eval "$(parse_rocketmq_config "$BROKER_CONF")"; then
        error "解析broker配置文件失败,请检查:
1. 文件格式是否正确
2. 是否有读取权限"
    fi
    
    # 获取namesrv端口
    NAMESRV_PORT="9876"
    if [ -f "$ROCKETMQ_HOME/conf/namesrv.properties" ]; then
        NAMESRV_PORT=$(grep -E "^listenPort=" "$ROCKETMQ_HOME/conf/namesrv.properties" | cut -d'=' -f2)
        NAMESRV_PORT=${NAMESRV_PORT:-9876}
    fi
    log "NameServer端口: $NAMESRV_PORT"
    
    # 输出结果
    echo "COL_DETAIL_START:"
    echo "type[$ATTR]|+|RocketMQ"
    echo "hostname[$ATTR]|+|$HOSTNAME"
    echo "ip[$ATTR]|+|$IP"
    ##新增安装路径 配置文件路径输出
    echo "homepath[$ATTR]|+|$ROCKETMQ_HOME"
    echo "configpath[$ATTR]|+|$BROKER_CONF"
    echo "namesrv_port[$ATTR]|+|$NAMESRV_PORT"
    echo "broker_port[$ATTR]|+|${config[broker_port]}"
    echo "version[$ATTR]|+|$VERSION"
    echo "cluster_name[$ATTR]|+|${config[cluster_name]}"
    echo "broker_name[$ATTR]|+|${config[broker_name]}"
    echo "broker_id[$ATTR]|+|${config[broker_id]}"
    echo "store_path[$ATTR]|+|${config[store_path]}"
    echo "commitlog_size[$ATTR]|+|${config[commitlog_size]}"
    echo "consume_queue_size[$ATTR]|+|${config[consume_queue_size]}"
    echo "disk_space_warn_threshold[$ATTR]|+|${config[disk_space_warn_threshold]}"
    echo "disk_space_clean_threshold[$ATTR]|+|${config[disk_space_clean_threshold]}"
    echo "ha_mode[$ATTR]|+|${config[ha_mode]}"
    echo "ha_address[$ATTR]|+|${config[ha_address]}"
    echo "COL_DETAIL_END:"
    
    log "RocketMQ信息采集完成"
    exit 0
}

main

江西现场执行验证结果如下:

COLT_CMDB_RocketMQ.sh_第1张图片

你可能感兴趣的:(rocketmq)