You build it,You run it, 當咱們編寫的項目上線後,爲了能第一時間知曉該項目是否出現問題,經常對項目進行健康檢查及一些指標進行監控。
Spring Boot-Actuator 就是幫助咱們監控咱們的Spring Boot 項目的。spring
Spring Boot 最主要的特性就是AutoConfig(自動配置),而對於咱們這些使用者來講也就是各類starter,
Spring Boot-Actuator 也提供了starter,爲咱們自動配置,在使用上咱們只須要添加starter到咱們的依賴中,而後啓動項目便可。數據庫
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
Spring Boot-actuator,提供了許多有用的EndPoint,對Spring Boot應用提供各類監控,下面說一下我經常使用的EndPoint:dom
/health 應用的健康狀態
/configprops 獲取應用的配置信息,由於Spring Boot 可能發佈時是單獨的Jar包,配置文件可能包含其中, 當咱們須要檢查配置文件時能夠使用 ConfigpropsEndPoint 進行查看一些配置是否正確。
/trace 最近幾回的http請求信息ide
當咱們訪問 http://localhost:8088/health 時,能夠看到 HealthEndPoint 給咱們提供默認的監控結果,包含 磁盤檢測和數據庫檢測。spring-boot
{ "status": "UP", "diskSpace": { "status": "UP", "total": 398458875904, "free": 315106918400, "threshold": 10485760 }, "db": { "status": "UP", "database": "MySQL", "hello": 1 } }
其實看 Spring Boot-actuator 源碼,你會發現 HealthEndPoint 提供的信息不只限於此,org.springframework.boot.actuate.health 包下 你會發現 ElasticsearchHealthIndicator、RedisHealthIndicator、RabbitHealthIndicator 等
也就是 HealthEndPoint 也提供 ES, Redis 等組件的健康信息。ui
看源碼 其實 磁盤和數據庫健康信息就是 DiskSpaceHealthIndicator、DataSourceHealthIndicator 來實現的,當咱們對一些咱們自定義的組件進行監控時, 咱們也能夠實現個Indicator :spa
@Component public class User implements HealthIndicator { /** * user監控 訪問: http://localhost:8088/health * * @return 自定義Health監控 */ @Override public Health health() { return new Health.Builder().withDetail("usercount", 10) //自定義監控內容 .withDetail("userstatus", "up").up().build(); } }
這時咱們再次訪問: http://localhost:8088/health 這時返回的結果以下,包含了咱們自定義的 User 健康信息。code
{ "status": "UP", "user": { "status": "UP", "usercount": 10, "userstatus": "up" }, "diskSpace": { "status": "UP", "total": 398458875904, "free": 315097989120, "threshold": 10485760 }, "db": { "status": "UP", "database": "MySQL", "hello": 1 } }
其實除了擴展 HealthEndPoint 來添加一些健康檢查, 咱們也能夠自定定義一些EndPoint 來提供程序運行時一些信息的展現:get
@Configuration public class EndPointAutoConfig { @Bean public Endpoint<Map<String, Object>> customEndPoint() { return new SystemEndPoint(); } } @ConfigurationProperties(prefix="endpoints.customsystem") public class SystemEndPoint extends AbstractEndpoint<Map<String, Object>> { public SystemEndPoint(){ super("customsystem"); } @Override public Map<String, Object> invoke() { Map<String,Object> result= new HashMap<>(); Map<String, String> map = System.getenv(); result.put("username",map.get("USERNAME")); result.put("computername",map.get("COMPUTERNAME")); result.put("userdomain",map.get("USERDOMAIN")); return result; } }
訪問 http://localhost:8088/customsystem 來查看咱們自定義的EndPoint ,返回結果以下:源碼
{ "username": "xxx", "userdomain": "DESKTOP-6EAN1H4", "computername": "DESKTOP-6EAN1H4" }