監(jiān)控Spring Boot 項(xiàng)目運(yùn)行情況操作方法
導(dǎo)語
在實(shí)際開發(fā)中,經(jīng)常會(huì)遇到想要獲取到服務(wù)器應(yīng)用的運(yùn)行情況的場(chǎng)景。在微服務(wù)架構(gòu)下對(duì)于每個(gè)應(yīng)用運(yùn)行情況的監(jiān)控是保證系統(tǒng)高可用的關(guān)鍵。
下面就來介紹一下,如何實(shí)現(xiàn)在Spring Boot的jar包中對(duì)系統(tǒng)的運(yùn)行情況進(jìn)行監(jiān)控操作。
添加依賴
首先需要在項(xiàng)目的POM文件中引入如下的依賴
<!-- 獲取系統(tǒng)信息 -->
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>${oshi.version}</version>
</dependency>
<oshi.version>5.7.4</oshi.version>獲取信息
接下來就是定義需要獲取的系統(tǒng)信息內(nèi)容有哪些
- CPU
- 內(nèi)存
- JVM
- 系統(tǒng)
- 系統(tǒng)文件目錄
CPU
對(duì)于CPU主要關(guān)注的如下一些參數(shù)
/**
* 核心數(shù)
*/
private int cpuNum;
/**
* CPU總的使用率
*/
private double total;
/**
* CPU系統(tǒng)使用率
*/
private double sys;
/**
* CPU用戶使用率
*/
private double used;
/**
* CPU當(dāng)前等待率
*/
private double wait;
/**
* CPU當(dāng)前空閑率
*/
private double free;JVM
/**
* 當(dāng)前JVM占用的內(nèi)存總數(shù)(M)
*/
private double total;
/**
* JVM最大可用內(nèi)存總數(shù)(M)
*/
private double max;
/**
* JVM空閑內(nèi)存(M)
*/
private double free;
/**
* JDK版本
*/
private String version;
/**
* JDK路徑
*/
private String home;內(nèi)存
/**
* 內(nèi)存總量
*/
private double total;
/**
* 已用內(nèi)存
*/
private double used;
/**
* 剩余內(nèi)存
*/
private double free;系統(tǒng)情況
/**
* 服務(wù)器名稱
*/
private String computerName;
/**
* 服務(wù)器Ip
*/
private String computerIp;
/**
* 項(xiàng)目路徑
*/
private String userDir;
/**
* 操作系統(tǒng)
*/
private String osName;
/**
* 系統(tǒng)架構(gòu)
*/
private String osArch;文件資源
/**
* 盤符路徑
*/
private String dirName;
/**
* 盤符類型
*/
private String sysTypeName;
/**
* 文件類型
*/
private String typeName;
/**
* 總大小
*/
private String total;
/**
* 剩余大小
*/
private String free;
/**
* 已經(jīng)使用量
*/
private String used;
/**
* 資源的使用率
*/
private double usage;這些都是對(duì)于系統(tǒng)應(yīng)用的基礎(chǔ)性的監(jiān)測(cè),在實(shí)際使用的時(shí)候還需要對(duì)有些信息進(jìn)行深入的挖掘,在使用的過程中,在對(duì)需求量較小的情況下,這是一種比較可行的方式。但是這些內(nèi)容都是來自實(shí)例內(nèi)部的回報(bào),并不能解決實(shí)例宕機(jī),或者網(wǎng)絡(luò)中斷等場(chǎng)景中出現(xiàn)的問題。所以,只能是用來監(jiān)控在實(shí)例正常運(yùn)行的狀態(tài)下的一些信息。
是如何獲取到這些信息的
CPU
/**
* 設(shè)置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);
}內(nèi)存信息
/**
* 設(shè)置內(nèi)存信息
*/
private void setMemInfo(GlobalMemory memory)
{
mem.setTotal(memory.getTotal());
mem.setUsed(memory.getTotal() - memory.getAvailable());
mem.setFree(memory.getAvailable());
}服務(wù)器信息
/**
* 設(shè)置服務(wù)器信息
*/
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信息
/**
* 設(shè)置Java虛擬機(jī)
*/
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"));
}磁盤信息
/**
* 設(shè)置磁盤信息
*/
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);
}
}有了這些信息之后,就可以對(duì)實(shí)例的運(yùn)行情況進(jìn)行實(shí)時(shí)的監(jiān)控,當(dāng)實(shí)例出現(xiàn)問題的時(shí)候,這些數(shù)據(jù)就不會(huì)出現(xiàn),所以說,在一般的使用場(chǎng)景下這種方式還是比較有用的。如果可以對(duì)這些信息進(jìn)行采集分析,對(duì)了解系統(tǒng)整體運(yùn)行穩(wěn)定性有一定的幫助。
到此這篇關(guān)于如何監(jiān)控Spring Boot 項(xiàng)目運(yùn)行情況的文章就介紹到這了,更多相關(guān)監(jiān)控Spring Boot 項(xiàng)目運(yùn)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用PageHelper插件實(shí)現(xiàn)Mybatis分頁效果
這篇文章主要介紹了SpringBoot使用PageHelper插件實(shí)現(xiàn)Mybatis分頁效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-02-02
深入解析Java的設(shè)計(jì)模式編程中單例模式的使用
這篇文章主要介紹了深入解析Java的設(shè)計(jì)模式編程中單例模式的使用,一般來說將單例模式分為餓漢式單例和懶漢式單例,需要的朋友可以參考下2016-02-02
Java LinkedHashSet集合的底層原理和TreeSet集合
LinkedHashSet保證元素有序且唯一,底層通過雙鏈表實(shí)現(xiàn),TreeSet元素不重復(fù)且可排序,底層使用紅黑樹實(shí)現(xiàn)排序,自定義類型排序可通過實(shí)現(xiàn)Comparable接口或提供Comparator來定義排序規(guī)則,適用于需要大量元素快速檢索的場(chǎng)景2024-10-10
Spring Boot 開發(fā)環(huán)境熱部署詳細(xì)教程
這篇文章主要介紹了Spring Boot 開發(fā)環(huán)境熱部署,本文給大家介紹了Spring Boot 開發(fā)環(huán)境熱部署的原理及快速配置方法,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
詳解springMVC兩種方式實(shí)現(xiàn)多文件上傳及效率比較
本篇文章介紹了springMVC兩種方式實(shí)現(xiàn)多文件上傳及效率比較。springMVC實(shí)現(xiàn)多文件上傳有兩種,一種是字節(jié)流的方式進(jìn)行文件上傳,另外一種是使用springMVC包裝好的解析器進(jìn)行上傳,有興趣的可以了解一下。2016-12-12
Java中常用緩存Cache機(jī)制的實(shí)現(xiàn)
這篇文章主要介紹了Java中常用緩存Cache機(jī)制的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Spring Boot獲取微信用戶信息的超簡(jiǎn)單方法
這篇文章主要給大家介紹了關(guān)于Spring Boot獲取微信用戶信息的超簡(jiǎn)單方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

