监控Spring Boot 项目运行情况操作方法

 更新时间:2024年08月28日 10:52:12   作者:nihui123  
在实际开发中,经常会遇到想要获取到服务器应用的运行情况的场景,在微服务架构下对于每个应用运行情况的监控是保证系统高可用的关键,本文给大家介绍如何实现在Spring Boot的jar包中对系统的运行情况进行监控操作,感兴趣的朋友跟随小编一起看看吧

导语

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

下面就来介绍一下,如何实现在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);
        }
    }

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

到此这篇关于如何监控Spring Boot 项目运行情况的文章就介绍到这了,更多相关监控Spring Boot 项目运行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot使用PageHelper插件实现Mybatis分页效果

    SpringBoot使用PageHelper插件实现Mybatis分页效果

    这篇文章主要介绍了SpringBoot使用PageHelper插件实现Mybatis分页效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作有一定的参考借鉴价值,需要的朋友可以参考下
    2024-02-02
  • 深入解析Java的设计模式编程中单例模式的使用

    深入解析Java的设计模式编程中单例模式的使用

    这篇文章主要介绍了深入解析Java的设计模式编程中单例模式的使用,一般来说将单例模式分为饿汉式单例和懒汉式单例,需要的朋友可以参考下
    2016-02-02
  • Spring中的@ComponentScan注解详解

    Spring中的@ComponentScan注解详解

    这篇文章主要介绍了Spring中的@ComponentScan注解详解,ComponentScan做的事情就是告诉Spring从哪里找到bean,由你来定义哪些包需要被扫描,一旦你指定了,Spring将会在被指定的包及其下级包中寻找bean,需要的朋友可以参考下
    2024-01-01
  • Java LinkedHashSet集合的底层原理和TreeSet集合

    Java LinkedHashSet集合的底层原理和TreeSet集合

    LinkedHashSet保证元素有序且唯一,底层通过双链表实现,TreeSet元素不重复且可排序,底层使用红黑树实现排序,自定义类型排序可通过实现Comparable接口或提供Comparator来定义排序规则,适用于需要大量元素快速检索的场景
    2024-10-10
  • Spring Boot 开发环境热部署详细教程

    Spring Boot 开发环境热部署详细教程

    这篇文章主要介绍了Spring Boot 开发环境热部署,本文给大家介绍了Spring Boot 开发环境热部署的原理及快速配置方法,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 详解springMVC两种方式实现多文件上传及效率比较

    详解springMVC两种方式实现多文件上传及效率比较

    本篇文章介绍了springMVC两种方式实现多文件上传及效率比较。springMVC实现多文件上传有两种,一种是字节流的方式进行文件上传,另外一种是使用springMVC包装好的解析器进行上传,有兴趣的可以了解一下。
    2016-12-12
  • java局域网聊天小程序

    java局域网聊天小程序

    这篇文章主要为大家详细介绍了java局域网聊天小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Java中常用缓存Cache机制的实现

    Java中常用缓存Cache机制的实现

    这篇文章主要介绍了Java中常用缓存Cache机制的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 什么是Java布隆过滤器?如何使用你知道吗

    什么是Java布隆过滤器?如何使用你知道吗

    这篇文章主要为大家详细介绍了Java布隆过滤器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Spring Boot获取微信用户信息的超简单方法

    Spring Boot获取微信用户信息的超简单方法

    这篇文章主要给大家介绍了关于Spring Boot获取微信用户信息的超简单方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09

最新评论