springboot服务监控脚本1.0

背景:

        系统刚上线,需要监控各网格服务的运行状态,仅靠人工监控,费事费力,费成本。但还要满足系统需求,还需要满足领导的要求。于是乎,开干~

实现思路:

        编写脚本,加入定时任务,配置服务异常邮件告警,最好结合SpringBoot 多应用管理脚本实现,这篇文章使用。当然也可自行改造。

        监控内容:

        1. 检查期望的服务列表是否运行。
        2. 显示运行服务的详细状态(服务名、PID、运行状态、运行时长、CPU使用率、物理内存、线程数 )。
        3. 对停止的服务进行告警。
        4. 支持邮件和企业微信两种告警方式(脚本里配置)。

开干上脚本:

都是热乎的,刚用,小伙伴们估计看到了,有2.0版本,晚会上:

java_health_checker1.0.sh

#!/bin/bash

# ==============================================================================
# Java服务状态监控脚本 (健康检查与告警完整版)
# 功能:
#   1. 检查期望的服务列表是否运行。
#   2. 显示运行服务的详细状态。
#   3. 对停止的服务进行告警。
#   4. 支持邮件和企业微信两种告警方式。
# ==============================================================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# ==============================================================================
# 配置区域:请在这里修改配置
# ==============================================================================

# --- 期望监控的服务列表 ---
# 格式: "服务名:端口号"
EXPECTED_SERVICES=(
    "model:8286"
    "esb:8285"
    *****服务自定义(根据实际情况修改)
)

# --- 邮件告警设置 (方案一) ---
EMAIL_ENABLED=false                                   # true:启用, false:禁用
EMAIL_TO="*****@dtestcom"                      # 接收告警的邮箱
EMAIL_SUBJECT="[******] Java服务健康检查报告"        # 邮件主题

# --- 企业微信告警设置 (方案二) ---
WECHAT_ENABLED=false                                   # true:启用, false:禁用
# 请替换为您自己的企业微信机器人Webhook地址
WECHAT_WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY_HERE"

# ==============================================================================

# 打印标题
echo -e "${BLUE}============================================${NC}"
echo -e "${BLUE}  ****** $(hostname) Java服务健康巡检报告${NC}"
echo -e "${BLUE}     $(date '+%Y-%m-%d %H:%M:%S')${NC}"
echo -e "${BLUE}    当前IP:$(hostname -I | awk '{print $1}')${NC}"
echo -e "${BLUE}============================================${NC}"

# 创建一个关联数组,用于存储正在运行的服务信息
declare -A running_services

# --- 1. 扫描并收集所有正在运行的Java服务信息 ---
echo -e "${GREEN}🔍 正在扫描当前运行的Java服务...${NC}"
echo ""

# 使用pgrep获取所有Java进程的PID
java_pids=$(pgrep -f java)

if [ -n "$java_pids" ]; then
    for pid in $java_pids; do
        # 获取完整命令行
        full_cmd=$(ps -p $pid -o cmd=)
        if [[ "$full_cmd" != *"java"* ]]; then
            continue
        fi

        # 提取服务名和端口
        service_name=$(echo "$full_cmd" | grep -oP 'SW_AGENT_NAME=\K[^ ]+' | head -1)
        if [ -z "$service_name" ]; then
            service_name=$(echo "$full_cmd" | grep -oP '\-jar\s+\K[^\.]+' | head -1)
        fi
        #port=$(echo "$full_cmd" | grep -oP 'server\.port=\K\d+' | head -1)
        port=$(echo "$full_cmd" | grep -oP 'D?server\.port=\K\d+' | head -1)

        # 如果服务名和端口都有效,存入数组
        if [ -n "$service_name" ] && [ -n "$port" ]; then
            running_services["${service_name}:${port}"]="$pid"
        fi
    done
fi

# --- 2. 检查期望的服务状态 ---
echo -e "${BLUE}📋 开始检查期望的服务状态...${NC}"
echo ""

down_services_count=0
down_services_list=""

# 遍历期望的服务列表
for expected_service in "${EXPECTED_SERVICES[@]}"; do
    if [[ -n "${running_services[$expected_service]}" ]]; then
        # 服务正在运行
        pid=${running_services[$expected_service]}
        service_name=${expected_service%:*}
        
        # 获取运行时信息
        etime=$(ps -p $pid -o etime= | tr -d ' ')
        cpu_usage=$(ps -p $pid -o %cpu= | tr -d ' ')
        mem_rss=$(ps -p $pid -o rss= | tr -d ' ')
        threads=$(ps -p $pid -o nlwp= | tr -d ' ')
        mem_rss_mb=$(echo "$mem_rss" | awk '{printf "%.0f", $1/1024}')

        echo -e "${GREEN}✅ ${service_name} (PID: ${pid}) - 运行正常${NC}"
        printf "   %-10s: %s\n" "运行时长" "$etime"
        printf "   %-10s: %s%%\n" "CPU使用率" "$cpu_usage"
        printf "   %-10s: %s MB\n" "物理内存" "$mem_rss_mb"
        printf "   %-10s: %s\n" "线程数" "$threads"
        echo ""
    else
        # 服务停止或异常
        service_name=${expected_service%:*}
        echo -e "${RED}❌ ${service_name} - 服务停止或异常!${NC}"
        ((down_services_count++))
        down_services_list="${down_services_list} ${service_name}"
    fi
done

# --- 3. 最终报告与告警发送 ---
echo -e "${BLUE}============================================${NC}"
if [ "$down_services_count" -eq 0 ]; then
    echo -e "${GREEN}🎉 所有期望的服务都在正常运行!${NC}"
else
    echo -e "${RED}⚠️  发现 ${down_services_count} 个服务存在问题,请立即检查!${NC}"
    
    # --- 发送邮件告警 ---
    if [ "$EMAIL_ENABLED" = true ]; then
        echo -e "${YELLOW}📧 正在发送告警邮件到 $EMAIL_TO ...${NC}"
        
        email_body=$(cat <<EOF
服务器 $(hostname) 上的Java服务健康检查发现异常!

时间: $(date '+%Y-%m-%d %H:%M:%S')
异常服务数量: $down_services_count
异常服务列表:
$down_services_list

请登录服务器检查详细情况。\n
EOF
        )
        
        echo "$email_body" | mailx -s "$EMAIL_SUBJECT - [ALERT]" "$EMAIL_TO"
        
        if [ $? -eq 0 ]; then
            echo -e "${GREEN}✅ 告警邮件发送成功!${NC}"
        else
            echo -e "${RED}❌ 告警邮件发送失败!请检查邮件配置。${NC}"
        fi
    fi

    # --- 发送企业微信告警 ---
    if [ "$WECHAT_ENABLED" = true ]; then
        echo -e "${YELLOW}📱 正在发送企业微信告警...${NC}"
        
        # 构建JSON消息体
        message=$(cat <<EOF
{
    "msgtype": "markdown",
    "markdown": {
        "content": "<font color='warning'>【$(hostname)服务告警】</font>\n\n> 服务器: <code>prd1</code>\n> 时间: <code>$(date '+%Y-%m-%d %H:%M:%S')</code>\n> 异常服务数: <code>$down_services_count</code>\n> 异常列表: <code>${down_services_list//\\n/ }</code>\n\n请立即登录服务器检查!"
    }
}
EOF
        )
        
        # 发送HTTP请求
        curl -s -X POST "$WECHAT_WEBHOOK_URL" \
             -H "Content-Type: application/json" \
             -d "$message" > /dev/null 2>&1
        
        if [ $? -eq 0 ]; then
            echo -e "${GREEN}✅ 企业微信告警发送成功!${NC}"
        else
            echo -e "${RED}❌ 企业微信告警发送失败!请检查Webhook URL和网络。${NC}"
        fi
    fi
fi
echo -e "${BLUE}============================================${NC}"

# 如果有服务停止,脚本的退出码为1,便于告警系统识别
if [ "$down_services_count" -gt 0 ]; then
    exit 1
fi

效果展示:

其他功能:

        1、可配置邮件通知。

        2、使用crontab定时巡检。

因为时间有限,这些之前文章也提到过,可自行配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值