当前位置: 首页 > news >正文

如何监控Spring Boot 项目运行情况?

导语 在实际开发中,经常会遇到想要获取到服务器应用的运行情况的场景。在微服务架构下对于每个应用运行情况的监控是保证系统高可用的关键。

文章目录

    • 添加依赖
    • 获取信息
      • CPU
      • JVM
      • 内存
      • 系统情况
      • 文件资源
    • 是如何获取到这些信息的
      • CPU
      • 内存信息
      • 服务器信息
      • JVM信息
      • 磁盘信息

  下面就来介绍一下,如何实现在Spring Boot的jar包中对系统的运行情况进行监控操作。

添加依赖

  首先需要在项目的POM文件中引入如下的依赖

<!-- 获取系统信息 --><dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>${oshi.version}</version></dependency><oshi.version>5.7.4</oshi.version>

获取信息

  接下来就是定义需要获取的系统信息内容有哪些

  • CPU
  • 内存
  • JVM
  • 系统
  • 系统文件目录

CPU

  对于CPU主要关注的如下一些参数

/*** 核心数*/private int cpuNum;/*** CPU总的使用率*/private double total;/*** CPU系统使用率*/private double sys;/*** CPU用户使用率*/private double used;/*** CPU当前等待率*/private double wait;/*** CPU当前空闲率*/private double free;

JVM

/*** 当前JVM占用的内存总数(M)*/private double total;/*** JVM最大可用内存总数(M)*/private double max;/*** JVM空闲内存(M)*/private double free;/*** JDK版本*/private String version;/*** JDK路径*/private String home;

内存

/*** 内存总量*/private double total;/*** 已用内存*/private double used;/*** 剩余内存*/private double free;

系统情况

/*** 服务器名称*/private String computerName;/*** 服务器Ip*/private String computerIp;/*** 项目路径*/private String userDir;/*** 操作系统*/private String osName;/*** 系统架构*/private String osArch;

文件资源

/*** 盘符路径*/private String dirName;/*** 盘符类型*/private String sysTypeName;/*** 文件类型*/private String typeName;/*** 总大小*/private String total;/*** 剩余大小*/private String free;/*** 已经使用量*/private String used;/*** 资源的使用率*/private double usage;

  这些都是对于系统应用的基础性的监测,在实际使用的时候还需要对有些信息进行深入的挖掘,在使用的过程中,在对需求量较小的情况下,这是一种比较可行的方式。但是这些内容都是来自实例内部的回报,并不能解决实例宕机,或者网络中断等场景中出现的问题。所以,只能是用来监控在实例正常运行的状态下的一些信息。

是如何获取到这些信息的

CPU

 /*** 设置CPU信息*/private void setCpuInfo(CentralProcessor processor){// CPU信息long[] prevTicks = processor.getSystemCpuLoadTicks();Util.sleep(OSHI_WAIT_SECOND);long[] ticks = processor.getSystemCpuLoadTicks();long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;cpu.setCpuNum(processor.getLogicalProcessorCount());cpu.setTotal(totalCpu);cpu.setSys(cSys);cpu.setUsed(user);cpu.setWait(iowait);cpu.setFree(idle);}

内存信息

/*** 设置内存信息*/private void setMemInfo(GlobalMemory memory){mem.setTotal(memory.getTotal());mem.setUsed(memory.getTotal() - memory.getAvailable());mem.setFree(memory.getAvailable());}

服务器信息

 /*** 设置服务器信息*/private void setSysInfo(){Properties props = System.getProperties();sys.setComputerName(IpUtils.getHostName());sys.setComputerIp(IpUtils.getHostIp());sys.setOsName(props.getProperty("os.name"));sys.setOsArch(props.getProperty("os.arch"));sys.setUserDir(props.getProperty("user.dir"));}

JVM信息

/*** 设置Java虚拟机*/private void setJvmInfo() throws UnknownHostException{Properties props = System.getProperties();jvm.setTotal(Runtime.getRuntime().totalMemory());jvm.setMax(Runtime.getRuntime().maxMemory());jvm.setFree(Runtime.getRuntime().freeMemory());jvm.setVersion(props.getProperty("java.version"));jvm.setHome(props.getProperty("java.home"));}

磁盘信息

/*** 设置磁盘信息*/private void setSysFiles(OperatingSystem os){FileSystem fileSystem = os.getFileSystem();List<OSFileStore> fsArray = fileSystem.getFileStores();for (OSFileStore fs : fsArray){long free = fs.getUsableSpace();long total = fs.getTotalSpace();long used = total - free;SysFile sysFile = new SysFile();sysFile.setDirName(fs.getMount());sysFile.setSysTypeName(fs.getType());sysFile.setTypeName(fs.getName());sysFile.setTotal(convertFileSize(total));sysFile.setFree(convertFileSize(free));sysFile.setUsed(convertFileSize(used));sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100));sysFiles.add(sysFile);}}

  有了这些信息之后,就可以对实例的运行情况进行实时的监控,当实例出现问题的时候,这些数据就不会出现,所以说,在一般的使用场景下这种方式还是比较有用的。如果可以对这些信息进行采集分析,对了解系统整体运行稳定性有一定的帮助。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Hive SQL 练习
  • 网络版本控制:协同进化的基石
  • 开学季有什么必买的好物?提升学习效率的好物来啦!学生党必看!
  • 从零开始带你玩转 AI 变现公开课
  • 【JVM】垃圾收集器与GC日志(一)
  • Top命令在linux中查看系统“任务管理”单词缩写解释
  • MySQL 模糊匹配邮件正文和主题,怎么写性能好
  • 年度精选热门骨传导耳机分享,让你分分钟避免踩雷的风险
  • 使用vueuse在组件内复用模板
  • Unity实现经验条动态自适应
  • 用Python实现时间序列模型实战——Day 3: 时间序列数据预处理
  • Windows 禁用tls 1.0 1.1
  • C语言的选择结构
  • 网络优化4|网络流问题|路径规划问题|车辆路径问题
  • 8月27日笔记
  • 11111111
  • CEF与代理
  • css系列之关于字体的事
  • ES6之路之模块详解
  • javascript 哈希表
  • JavaScript的使用你知道几种?(上)
  • Java多线程(4):使用线程池执行定时任务
  • Java深入 - 深入理解Java集合
  • node 版本过低
  • SpringBoot 实战 (三) | 配置文件详解
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 测试开发系类之接口自动化测试
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 搭建gitbook 和 访问权限认证
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 关于Java中分层中遇到的一些问题
  • 聊聊redis的数据结构的应用
  • 系统认识JavaScript正则表达式
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​第20课 在Android Native开发中加入新的C++类
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #Ubuntu(修改root信息)
  • (CPU/GPU)粒子继承贴图颜色发射
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (力扣)循环队列的实现与详解(C语言)
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (学习总结16)C++模版2
  • (一)Neo4j下载安装以及初次使用
  • (一)Thymeleaf用法——Thymeleaf简介
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器