spring boot應用監控和管理
Spring Boot 監控核心是 spring-boot-starter-actuator 依賴,增加依賴后, Spring Boot 會默認配置一些通用的監控,比如 jvm 監控、類加載、健康監控等。
對應用進行監控和管理,我們只需在pom.xml上面增加依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
如果是通過http方式,還需加上下面的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
一、監控端點的作用:
根據端點的作用,可以將端點分為三大類:
應用配置類:獲取應用程序中加載的應用配置,環境變量,自動化配置報告等與應用相關的信息。
度量指標類:獲取應用程序運行過程中用於監控的度量指標,比如內存信息,線程信息,http請求等。
操作控制類:提供了對應用的關閉等操作類功能。
1.應用配置類:
(1)/autoconfig:獲取應用的自動化配置使用情況,包含所有自動化配置的候選項。同時列出了每個候選項是否匹配成功以及沒有匹配成功的原因。positiveMatches返回的是匹配成功的自動化配置,negativeMatches返回的是匹配不成功的自動化配置。
(2)/configprops:獲取應用配置所有的配置屬性。prefix代表屬性前綴,properties表示屬性名稱和id等。
(3)/beans:獲取應用程序中創建的所有Bean。每個Bean包含bean、scope、type、resource、dependencies。
(4)/env:獲取應用的環境信息。包含環境變量、JVM屬性、應用配置屬性、參數、端口等。
(5)/mappings:返回所有控制器映射關系報告,包括業務接口和監控接口。
(6)/info:獲取應用自定義信息,默認為空。可自己在application.properties里面配置。
2.度量指標類:
(7)/metrics:返回當前各類重要指標信息,比如內存概要信息、堆內存信息、非堆內存信息、線程使用情況、應用加載和卸載的類統計、垃圾收集器詳細信息、tomcat容器使用情況、http請求性能指標等。
(8)/health:獲取應用的各類指標信息。也可以自己自定義Health監控。
(9)/dump:用來生成當前線程活動的快照。
(10)/trace:用來返回基本的http跟蹤信息。保留最近的100條http請求記錄。
3.操作控制類:
(11)/shutdown:它是直接關閉應用程序的端點,它與前面的端點不一樣,前面的端點都是默認啟用的,而它需要通過屬性來配置開啟操作。可以在application.properties中配置開啟:
endpoints.shutdown.enabled=true
4.(--------)
(12)/heapdump:springmvc的端點,用來返回Gzip壓縮hprof堆轉儲文件(以hprof.gz結尾)
(13)/loggers:能夠查看所有包類的日志級別,並且能夠對其進行修改。
(14)/actuator:所有endpoints的列表,即應用監控的接口列表。
(15)/auditevents:公開當前應用程序的審核事件信息。
***:其中/shutdown是post請求,其他都是get請求。
***:如果對日志級別進行修改,需要post請求,並且需要傳送JSON(application/json)的數據格式。對其進行測試,發現如果是通過springboot主程序入口main啟動程序,能夠動態修改logback日志級別;如果是在linux下打包運行后,動態修改日志級別無效。
二、監控端點的管理
1.如果上面的監控端點都不能訪問,可能是你的管理端口經常被防火牆保護,不對外暴露也就不需要保護管理端點。這時候你需要在application.properties里加上:
management.security.enabled=false
也可以單個設置,比如endpoints.mappings.sensitive=false,關閉/mappings的安全限制。
2.自定義端點訪問路徑和訪問端口
默認情況下,監控的接口端口和業務的端口一致。比如
server.context-path=/student,server.port=20000
那么這時候我們訪問/info監控接口的url是:http://xxx.xxx.xxx.xxx:20000/student/info。如果剛好你在業務接口里面也有一個/info接口,訪問路徑剛好就是跟http://xxx.xxx.xxx.xxx:20000/student/info一樣,那么得到的信息是監控端點info的信息,這個業務接口無效。如果想讓它有效呢?那你可以禁用info監控端點,但是如果info這個端點需要返回一些信息不能禁用,而你的業務info接口別的程序已經調用了,你也不想更改,那怎么才能讓它有效呢?這時候我們可以通過在application.properties中進行以下設置:
management.context-path=/manage
management.port=20001
那么此時你的/info監控端點的訪問路徑變成了什么樣的呢?那它應該是這樣的:
http://xxx.xxx.xxx.xxx:20001/manage/info
這時候你的業務接口就有效了,它的訪問路徑還是上面所說的那個。改變端點的訪問的端口,也是出於安全性的考慮。
3.禁用單個端點
endpoints.info.enabled=false 禁用/info端點
4.開啟所需端點
endpoints.enabled=false 禁用所有端點
endpoints.info.enabled=true 開啟所需/info端點
5.修改端點id
endpoints.info.id=myinfo
原來訪問url是http://xxx.xxx.xxx.xxx:20000/student/info,那修改之后變成http://xxx.xxx.xxx.xxx:20000/student/myinfo
在上面第2點想要使業務接口/info有效,也可以采用這種方式,更改監控端口的id。
6.關閉http端點
management.port=-1