系统监控异常告警2.0版本

背景:

在1.0(https://blog.csdn.net/xdmxmf0/article/details/156645896?spm=1001.2014.3001.5501)的基础上,增加对springboot微服务的GC监控。前期登录服务器发现进程还在,查看日志也在正常输出,但是,但是,nacos服务注册页面却发现不了。于是一看gclog目录下,发现竟然有.hprof文件。

和1.0的区别:

1、1.0是不需要进行改造的,只要创建相关目录,拿走即用。

2、2.0是有条件的

1、配置了GC相关的参数,尤其是GC后的.hprof,文件位置,尽量都放在一个目录下。

2、脚本内容需要加入.hprof的目录。

触发条件:

.hprof文件通常在以下三种情况下生成:

1. 内存溢出自动生成(最常见)

这是你的脚本主要监控的场景。

  • 时机:当 Java 应用程序的内存(堆内存)耗尽,无法再分配新对象,并且抛出java.lang.OutOfMemoryError: Java heap space时。
  • 前提条件:你的 SpringBoot 启动参数中必须包含了以下配置:
    • -XX:+HeapDumpOnOutOfMemoryError(告诉 JVM:当 OOM 时,生成堆转储文件)
    • -XX:HeapDumpPath=/data/mdm2.0/deploy/logs/gclog/(告诉 JVM:文件存到哪里,如果不指定路径,默认存在项目根目录下,文件名通常是java_pid<pid>.hprof
  • 文件特征:此时生成的文件瞬间大小会很大(接近配置的-Xmx大小),生成过程可能会导致应用“假死”几秒到几十秒。
2. 触发 Full GC 后生成(如果配置了相关参数)

有些系统为了排查内存泄漏,会在发生长时间 Full GC 时 dump 内存。

  • 时机:当系统发生一次耗时较长的 Full GC(旧年代 GC)。
  • 前提条件:启动参数中配置了-XX:+DumpHeapAtFullGC
  • 注意:这个参数比较少见,容易产生大量 dump 文件撑爆磁盘,通常不建议在生产开启,除非有极强的排查需求。
3. 人工手动生成(运维排查期间)
  • 时机:运维人员发现系统 CPU 飙高、响应变慢,怀疑内存泄漏,但还没到 OOM 崩溃的程度。
  • 操作方式
    1. 使用jps找到 Java 进程 ID。
    2. 使用命令jmap -dump:format=b,file=service.hprof <pid>
    3. 或者在 Arthas 等工具中使用heapdump命令。
  • 特征:这种文件名通常是自定义的(如manual_dump_2023.hprof),不一定是-dump.hprof格式。

思路:

  1. 在满足上述条件的情况下,监控gc目录下的.hprof。
  2. 如有新生成的,则进行名称处理,进行邮件告警。
  3. 给这个文件打标记,防止多次邮件告警通知。
  4. 监控日志,写入到日志文件,便于后期分析记录,审计等。

开干:

创建可执行文件 system_monitor2.0.sh

#!/bin/bash # 系统监控告警脚本 # 检测CPU、内存、磁盘使用率,以及*分钟内登录失败次数,超过阈值时发送邮件告警 # 2.0加入监控服务是否GC,若GC则邮件告警 # 配置参数 CPU_THRESHOLD=85 # CPU使用率阈值(%) MEM_THRESHOLD=80 # 内存使用率阈值(%) DISK_THRESHOLD=80 # 磁盘使用率阈值(%) LOGIN_FAIL_THRESHOLD=5 # 登录失败次数阈值 TIME_WINDOW=5 # 时间窗口(分钟) EMAIL="*****@qq.com" # 告警接收邮箱 SUBJECT="系统资源告警 - $(hostname)" LOG_FILE="/data/dt/script/monitor/$(hostname)_$(date +%Y%m%d)_sys.out" #2.0 GC监控的参数 LOG_DIR="/data/deploy/logs/gclog" # 记录已处理文件的标记目录,防止重复发送邮件 PROCESSED_FLAG_DIR="/tmp/gc_monitor_processed" # 同时输出到屏幕和日志 log() { local msg="[$(date '+%Y-%m-%d %H:%M:%S')]$1" echo "$msg" | tee -a "$LOG_FILE" } send_email() { printf "%s\n" "$2" | /usr/bin/mail -s "$1" "$EMAIL" log "[邮件发送] $1" } check_cpu() { echo "--- CPU 检查 ---" | tee -a "$LOG_FILE" local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print 100 -$8}' | cut -d'.' -f1) log "当前 CPU 使用率: ${cpu_usage}% (阈值:${CPU_THRESHOLD}%)" if [[ "$cpu_usage" =~ ^[0-9]+$ ]] && [ "$cpu_usage" -gt "$CPU_THRESHOLD" ]; then local msg="警告: CPU使用率为 ${cpu_usage}%,超过阈值${CPU_THRESHOLD}%,请及时关注并处理!" send_email "$SUBJECT" "$msg" else log "状态: 正常" fi } check_memory() { echo "--- 内存 检查 ---" | tee -a "$LOG_FILE" # 计算内存使用率 local mem_usage=$(free | awk '/Mem:/ {printf "%d", ($3/$2)*100}') log "当前 内存 使用率: ${mem_usage}% (阈值:${MEM_THRESHOLD}%)" if [ "$mem_usage" -gt "$MEM_THRESHOLD" ]; then local msg="警告: 内存使用率为 ${mem_usage}%,超过阈值${MEM_THRESHOLD}%,请及时关注并处理!" send_email "$SUBJECT" "$msg" else log "状态: 正常" fi } check_disk() { echo "--- 磁盘 检查 ---" | tee -a "$LOG_FILE" local alert_triggered=0 # 使用进程替换 while read output; do local usep=$(echo "$output" | awk '{print $1}' | cut -d'%' -f1) local partition=$(echo "$output" | awk '{print $2}') if [[ "$usep" =~ ^[0-9]+$ ]]; then log "分区 $partition 使用率:${usep}%" if [ "$usep" -ge "$DISK_THRESHOLD" ]; then local msg="警告: 磁盘分区 $partition 使用率为${usep}%,超过阈值 ${DISK_THRESHOLD}%,请及时关注并处理!" send_email "$SUBJECT" "$msg" alert_triggered=1 fi fi done < <(df -h | grep -vE '^Filesystem|tmpfs|cdrom|overlay' | awk '{ print $5 " "$1 }') if [ "$alert_triggered" -eq 0 ]; then log "状态: 所有分区正常" fi } check_login_failures() { echo "--- 安全 检查 (登录失败) ---" | tee -a "$LOG_FILE" local fail_count=0 start_time=$(date +%s -d "${TIME_WINDOW} minutes ago") if [ -f /var/log/secure ]; then fail_count=$(grep "Failed password" /var/log/secure 2>/dev/null | awk -v min="$start_time" '{ cmd = "date +%s -d \""$1" "$2" "$3"\""; cmd | getline log_ts; close(cmd); if (log_ts >= min) print; }' | wc -l) fi log "最近 ${TIME_WINDOW} 分钟内检测到登录失败次数:${fail_count} (阈值:${LOGIN_FAIL_THRESHOLD})" if [ "$fail_count" -ge "$LOGIN_FAIL_THRESHOLD" ]; then local msg="安全警告: 检测到登录失败 ${fail_count} 次,超过阈值${LOGIN_FAIL_THRESHOLD} 次" send_email "$SUBJECT" "$msg" else log "状态: 安全" fi } # 如果标记目录不存在,则创建 mkdir -p "$PROCESSED_FLAG_DIR" # 检查监控目录是否存在 if [ ! -d "$LOG_DIR" ]; then echo "监控目录不存: $LOG_DIR" exit 1 fi check_gc(){ echo "--- 服务GC 检查 ---" | tee -a "$LOG_FILE" # --- 初始化计数器,用于记录本次循环是否处理了新文件 --- local new_file_count=0 while read -r hprof_file; do filename=$(basename "$hprof_file") temp_name=${filename%.hprof} service_name=$(echo "$temp_name" | sed 's/-dump$//') flag_file="$PROCESSED_FLAG_DIR/${filename}.sent" if [ ! -f "$flag_file" ]; then # 发现新文件,计数器 +1 ((new_file_count++)) log "检测到新的 hprof 文件: ${hprof_file},正在发送邮件..." # 获取文件信息 file_size=$(du -sh "$hprof_file" | cut -f1) mod_time=$(stat -c %y "$hprof_file") # 构建邮件内容 (使用 local 变量,虽然在while里无所谓,但好习惯) local msg="检测到服务发生内存溢出(OOM)并生成了堆转储文件。 服务名称: ${service_name} 文件路径: ${hprof_file} 文件大小: ${file_size} 生成时间: ${mod_time} 请尽快登录服务器进行分析! " send_email "$SUBJECT" "$msg" if [ $? -eq 0 ]; then log "邮件发送成功。" touch "$flag_file" else log "邮件发送失败,请检查邮件服务配置。" fi fi # 注意这里结尾的写法:done < <(command) done < <(find "$LOG_DIR" -name "*.hprof" -type f) # --- 循环结束后的判断逻辑 --- if [ "$new_file_count" -eq 0 ]; then log "所有服务运行正常,未检测到新的堆转储文件。" fi } # ---------------- 主程序 ---------------- main() { echo " " | tee -a "$LOG_FILE" echo "========================================" | tee -a "$LOG_FILE" log "MDM2.0 $(hostname) 操作系统健康巡检报告" log "检查时间:$(date '+%Y-%m-%d %H:%M:%S')" log "当前IP: $(hostname -I | awk '{print $1}')" echo "========================================" | tee -a "$LOG_FILE" check_cpu echo " " | tee -a "$LOG_FILE" check_memory echo " " | tee -a "$LOG_FILE" check_disk echo " " | tee -a "$LOG_FILE" check_login_failures echo " " | tee -a "$LOG_FILE" check_gc echo " " | tee -a "$LOG_FILE" echo "========================================" | tee -a "$LOG_FILE" log "检查结束" echo "========================================" | tee -a "$LOG_FILE" } main

设置定时任务,略

查看执行结果

查看邮件告警

其他:

该脚本的可塑性较高,灵活配置,根据实际需要进行改造即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1164156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

趣味化训练革命:看韩宁波如何让技术难点变通关游戏

趣味化训练革命&#xff1a;看韩宁波如何让技术难点变通关游戏在西北羽毛球教育领域&#xff0c;韩宁波以其独创的"游戏化训练体系"掀起了一场教学革命。这位将省级单打亚军经验转化为教学智慧的教练&#xff0c;通过科技赋能与趣味设计&#xff0c;让高远球、杀球、…

从 “开题草稿” 到 “答辩 PPT”:一键打通的 paperzz 开题报告,承包你的论文启动全流程

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 开题报告https://www.paperzz.cc/proposal 当 “开题报告改到第 4 版还缺逻辑”“答辩 PPT 要熬夜凑框架” 成为本科生论文启动阶段的高频难题&#xff0c;一个能同时搞定 “开题文稿” 和 “答…

为什么业内人都说网络安全赚不了大钱却值得入行?真相只有一个!

【收藏】网络安全行业收入解析&#xff1a;零基础入门不难&#xff0c;月入过万不是梦 网络安全行业收入较高且入行门槛低&#xff0c;适合零基础小白。虽然顶级高薪不如部分程序员&#xff0c;但实现月入过万相对容易。行业就业方向灵活&#xff0c;无996和35岁危机。市场需求…

同一个操作,两种结果?Java短变量自增的秘密!

文章目录同一个操作&#xff0c;两种结果&#xff1f;Java短变量自增的秘密&#xff01;一、现象&#xff1a;同一个操作&#xff0c;为什么会有两种结果&#xff1f;二、原因分析&#xff1a;短变量类型与运算规则1. 自增操作的底层实现2. 短变量类型的溢出场景一&#xff1a;…

行云创新入围国家级工业软件赛事决赛:AI 赋能工业设计仿真再进阶

近日&#xff0c;行云创新凭借 “知识图谱 AI 智能体” 双轮驱动的工业智能设计、仿真技术方案&#xff0c;成功入围第五届工业软件创新应用大赛决赛—— 这场国家级 AI 赛事的入围&#xff0c;正是我们在工业领域 AI 技术实力的有力印证。作为聚焦工业研发场景的技术方案&…

充值代付服务:线上交易的核心引擎

B2B与B2C充值代付是互联网行业的核心服务&#xff0c;为企业与个人打通便捷线上支付通道&#xff0c;实现交易提效与降本。其运作流程简洁高效&#xff1a;用户提交支付指令后&#xff0c;系统自动完成资金划转&#xff0c;平台再发放虚拟货币、积分等权益&#xff0c;形成交易…

互联网大厂Java求职面试实战:Java核心技术与AI智能应用全解析

互联网大厂Java求职面试实战&#xff1a;Java核心技术与AI智能应用全解析 本文通过互联网大厂Java求职者谢飞机与严肃面试官的三轮面试对话&#xff0c;结合电商与智能客服等业务场景&#xff0c;涵盖Java核心技术栈、微服务、数据库、消息队列及AI应用&#xff0c;帮助读者系统…

Spring事件机制完全指南:解耦利器与实战

一、为什么需要事件机制&#xff1f; 在传统的业务开发中&#xff0c;我们经常会遇到这样的场景&#xff1a; // 传统方式&#xff1a;强耦合 Service public class OrderService {Autowiredprivate EmailService emailService;Autowiredprivate SmsService smsService;Autow…

地产AI营销榜单:不懂会被淘汰?看原圈科技如何破局

在众多地产AI营销解决方案中,原圈科技的全链路一体化系统被视为标杆。它通过整合从洞察、内容生成到销售转化的AI营销闭环,为房企解决获客及转化难题,在多个维度下表现突出,是实现智慧增长的首选。2026地产AI营销利器榜,你选对了吗?引言&#xff1a;欢迎来到2026,一个由AI主动…

水溶3D打印电子技术促进快速回收

3D打印电子器件可在水中溶解以实现快速回收 可通过水溶解的电子设备&#xff0c;可以使技术原型的创建和回收变得更加容易——它们甚至可能激发更具可持续性的商业设备。 蓝牙扬声器等电子设备现在可以用一种能在几小时内溶解于水的材料进行3D打印。这使得设计者能够快速创建原…

水溶3D打印电子技术促进快速回收

3D打印电子器件可在水中溶解以实现快速回收 可通过水溶解的电子设备&#xff0c;可以使技术原型的创建和回收变得更加容易——它们甚至可能激发更具可持续性的商业设备。 蓝牙扬声器等电子设备现在可以用一种能在几小时内溶解于水的材料进行3D打印。这使得设计者能够快速创建原…

【2026年精选毕业设计:智能校园事务助手(含论文+源码+PPT+开题报告+任务书+答辩讲解)】

2026年精选毕业设计&#xff1a;智能校园事务助手&#xff08;含论文源码PPT开题报告任务书答辩讲解&#xff09;&#x1f4a1; 毕业设计焦虑&#xff1f;别慌&#xff01; 本项目已打包 完整资料&#xff1a;✅ 源码 ✅ 论文&#xff08;WordPDF&#xff09; ✅ 答辩PPT ✅ 开…

ASTM D4169与ISTA 3A在 FDA注册如何选择:结合 ISO 11607 的分析

在医疗器械进入美国市场的过程中&#xff0c;包装运输验证是 FDA 审核的重要环节。企业常常会在 ASTM D4169 和 ISTA 3A系列 之间纠结&#xff1a;到底哪一个更适合作为注册资料的依据&#xff1f;如果再叠加 ISO 11607 的要求&#xff0c;选择会更明确。以下从法规背景、测试逻…

软件测试之测试用例的设计

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快1. 测试用例的概念软件测试人员向被测试系统提供的一组数据的集合&#xff0c;包括 测试环境、测试步骤、测试数据、预期结果2. 为什么在测试前要设计测试用例测试用…

一行隐藏文本即可劫持AI:无需点击、无需恶意软件,仅凭文字

一行隐藏文本即可劫持AI —— 无需点击&#xff0c;无需恶意软件&#xff0c;仅凭文字 英国国家网络安全中心警告&#xff0c;该弱点可能永远无法被完全消除——因为它与语言模型读取文本的方式紧密相连。 一名银行客户请ChatGPT查询其账户余额。该AI返回了其他十七名客户的账…

开源中国与小米Vela强强联合:国产操作系统生态迎来新突破

开源中国与小米Vela强强联合&#xff1a;国产操作系统生态迎来新突破 12月17日&#xff0c;在北京国家会议中心举行的"2025小米人车家全生态合作伙伴大会"上&#xff0c;国内开源领域领军企业开源中国获得小米公司颁发的"Xiaomi Vela生态合作伙伴"荣誉认证…

基于STM32的点菜机

第二章 硬件设计 2.1 设计原理 本系统首先是客户端&#xff0c;这也是本设计的设计重点。其次是服务端&#xff0c;用来作为连接客户端和后厨端的桥梁。最后是后厨端&#xff0c;用来接收菜品信息。服务员在手持点菜机上&#xff0c;也就是客户端上输入密码之后&#xff0c;进…

2026 AI营销榜单:原圈科技如何凭实力登顶,不懂就落后!

在2026年的AI营销竞赛中,原圈科技凭借其"智慧营销智能体"矩阵,在众多服务商中脱颖而出。其方案覆盖营销全链路,强调交付可量化的真实业务价值,并深度融合行业场景认知,为企业提供战略级增长支持。2026 AI营销荣誉榜&#xff1a;谁是斩获大奖的实力派&#xff1f;引言…

开源商城源码系统,一键管理多商户,可视化装修多端店铺

温馨提示&#xff1a;文末有资源获取方式对于中小企业和初创团队而言&#xff0c;时间与成本是决定项目成败的关键。我们为您带来一款集功能强大、部署迅速、成本可控于一体的电商源码系统&#xff0c;旨在帮助您绕开复杂的技术开发&#xff0c;以最快速度打造一个专业级、全渠…

WMS 智能仓储管理系统推荐,如何搭建数智化时代的敏捷仓储平台

在数智化浪潮席卷制造业的今天&#xff0c;企业对仓储系统的期待早已超越“存得下、找得到”的基础功能。面对“多品种、小批量、快交付”的新常态&#xff0c;如何快速构建一个敏捷、智能、可进化的仓储平台&#xff0c;已成为制造企业提升供应链韧性和响应速度的关键命题。市…