監(jiān)控Spring Boot 項目運行情況操作方法
導語
在實際開發(fā)中,經(jīng)常會遇到想要獲取到服務(wù)器應(yīng)用的運行情況的場景。在微服務(wù)架構(gòu)下對于每個應(yīng)用運行情況的監(jiān)控是保證系統(tǒng)高可用的關(guān)鍵。
下面就來介紹一下,如何實現(xiàn)在Spring Boot的jar包中對系統(tǒng)的運行情況進行監(jiān)控操作。
添加依賴
首先需要在項目的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
對于CPU主要關(guān)注的如下一些參數(shù)
/** * 核心數(shù) */ private int cpuNum; /** * CPU總的使用率 */ private double total; /** * CPU系統(tǒng)使用率 */ private double sys; /** * CPU用戶使用率 */ private double used; /** * CPU當前等待率 */ private double wait; /** * CPU當前空閑率 */ private double free;
JVM
/** * 當前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; /** * 項目路徑 */ 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;
這些都是對于系統(tǒng)應(yīng)用的基礎(chǔ)性的監(jiān)測,在實際使用的時候還需要對有些信息進行深入的挖掘,在使用的過程中,在對需求量較小的情況下,這是一種比較可行的方式。但是這些內(nèi)容都是來自實例內(nèi)部的回報,并不能解決實例宕機,或者網(wǎng)絡(luò)中斷等場景中出現(xiàn)的問題。所以,只能是用來監(jiā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虛擬機 */ 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); } }
有了這些信息之后,就可以對實例的運行情況進行實時的監(jiān)控,當實例出現(xiàn)問題的時候,這些數(shù)據(jù)就不會出現(xiàn),所以說,在一般的使用場景下這種方式還是比較有用的。如果可以對這些信息進行采集分析,對了解系統(tǒng)整體運行穩(wěn)定性有一定的幫助。
到此這篇關(guān)于如何監(jiān)控Spring Boot 項目運行情況的文章就介紹到這了,更多相關(guān)監(jiān)控Spring Boot 項目運行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 參數(shù)校驗的具體實現(xiàn)方式
這篇文章主要介紹了Spring Boot 參數(shù)校驗的具體實現(xiàn)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06Java class文件格式之常量池_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Java class文件格式之常量池的相關(guān)資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06Java Swing JComboBox下拉列表框的示例代碼
這篇文章主要介紹了Java Swing JComboBox下拉列表框的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12