Springboot actuator使用詳解
Springboot actuator是一個追蹤各種springboot應用狀態的健康檢查機制,使用需要新增一個pom
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在啟動springboot中,我們往往會看到這樣的一條日誌 Exposing 20 endpoint(s) beneath base path '/actuator'
這個20是每一個springboot應用程式的健康檢查點的個數,他是隨著你配置檔案中的配置而不同的。
由於本人配置的Server資訊如下
server: port: 8001 servlet: context-path: /api-u
所以當我們訪問actuator Web資訊的路徑如下
http://127.0.0.1:8001/api-u/actuator
這裡需要注意的是,如果我們配置了oauth 2的資源訪問許可權的時候,需要對該路徑放行
@EnableResourceServer @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true) public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.csrf().disable().exceptionHandling() .authenticationEntryPoint( (request,response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED)) .and().authorizeRequests().antMatchers(PermitAllUrl.permitAllUrl("/users-anon/**", "/sys/login","/actuator/**")).permitAll() //此處新增"/actuator/**"進行放行 .anyRequest().authenticated().and().httpBasic(); } @Override public void configure(ResourceServerSecurityConfigurer resource) throws Exception { //這裡把自定義異常加進去 resource.authenticationEntryPoint(new AuthExceptionEntryPoint()) .accessDeniedHandler(new CustomAccessDeniedHandler()); } @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } }
在配置檔案中做如下配置
management: endpoint: health: show-details: always
此時我們訪問http://127.0.0.1:8001/api-u/actuator的結果如下
{ "_links" : { "self" : { "href" : "http://127.0.0.1:8001/api-u/actuator" , "templated" : false }, "health" : { "href" : "http://127.0.0.1:8001/api-u/actuator/health" , "templated" : false }, "info" : { "href" : "http://127.0.0.1:8001/api-u/actuator/info" , "templated" : false } } }具體大家可以參考這個官網說明 https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/中的
https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/#production-ready-endpoints-enabling-endpoints以及 https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/#_auto_configured_healthindicators
其中的http://127.0.0.1:8001/api-u/actuator/health就是我們需要的健康檢查的具體資訊
{ "status" : "DOWN" , "details" : { "rabbit" : { "status" : "DOWN" , "details" : { "error" : "org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused (Connection refused)" } }, "diskSpace" : { "status" : "UP" , "details" : { "total" : 499963174912 , "free" : 435209195520 , "threshold" : 10485760 } }, "db" : { "status" : "UP" , "details" : { "database" : "MySQL" , "hello" : 1 } }, "refreshScope" : { "status" : "UP" }, "discoveryComposite" : { "status" : "UP" , "details" : { "discoveryClient" : { "status" : "UP" , "details" : { "services" : [ "register-center" , "user-center" ] } }, "eureka" : { "description" : "Remote status from Eureka server" , "status" : "UP" , "details" : { "applications" : { "REGISTER-CENTER" : 1 , "USER-CENTER" : 1 } } } } }, "configServer" : { "status" : "UNKNOWN" , "details" : { "error" : "no property sources located" } }, "hystrix" : { "status" : "UP" }, "redis" : { "status" : "UP" , "details" : { "version" : "3.2.12" } } } }這裡為該程序spring支援的各種服務的健康狀態,UP為線上,DOWN為下線狀態,UNKNOWN為不知道。
除了http://127.0.0.1:8001/api-u/actuator/health之外還有一個http://127.0.0.1:8001/api-u/actuator/info
這是一個描述資訊的說明,如果我們在配置檔案中做如下配置
info: app-name: user author: guanjian email: [email protected]
則可以在http://127.0.0.1:8001/api-u/actuator/info的返回資訊中看到
{ "app-name" : "user" , "author" : "guanjian" , "email" : "[email protected]" }但是我們在以上配置中可以看到的資訊很少,需要啟用所有的actuator端點,增加配置如下
management: endpoints: web: exposure: include: "*" endpoint: health: show-details: always
此時再次訪問http://127.0.0.1:8001/api-u/actuator的結果如下
{ "_links" : { "self" : { "href" : "http://127.0.0.1:8001/api-u/actuator" , "templated" : false }, "archaius" : { "href" : "http://127.0.0.1:8001/api-u/actuator/archaius" , "templated" : false }, "auditevents" : { "href" : "http://127.0.0.1:8001/api-u/actuator/auditevents" , "templated" : false }, "beans" : { "href" : "http://127.0.0.1:8001/api-u/actuator/beans" , "templated" : false }, "health" : { "href" : "http://127.0.0.1:8001/api-u/actuator/health" , "templated" : false }, "conditions" : { "href" : "http://127.0.0.1:8001/api-u/actuator/conditions" , "templated" : false }, "configprops" : { "href" : "http://127.0.0.1:8001/api-u/actuator/configprops" , "templated" : false }, "env" : { "href" : "http://127.0.0.1:8001/api-u/actuator/env" , "templated" : false }, "env-toMatch" : { "href" : "http://127.0.0.1:8001/api-u/actuator/env/{toMatch}" , "templated" : true }, "info" : { "href" : "http://127.0.0.1:8001/api-u/actuator/info" , "templated" : false }, "logfile" : { "href" : "http://127.0.0.1:8001/api-u/actuator/logfile" , "templated" : false }, "loggers-name" : { "href" : "http://127.0.0.1:8001/api-u/actuator/loggers/{name}" , "templated" : true }, "loggers" : { "href" : "http://127.0.0.1:8001/api-u/actuator/loggers" , "templated" : false }, "heapdump" : { "href" : "http://127.0.0.1:8001/api-u/actuator/heapdump" , "templated" : false }, "threaddump" : { "href" : "http://127.0.0.1:8001/api-u/actuator/threaddump" , "templated" : false }, "metrics-requiredMetricName" : { "href" : "http://127.0.0.1:8001/api-u/actuator/metrics/{requiredMetricName}" , "templated" : true }, "metrics" : { "href" : "http://127.0.0.1:8001/api-u/actuator/metrics" , "templated" : false }, "scheduledtasks" : { "href" : "http://127.0.0.1:8001/api-u/actuator/scheduledtasks" , "templated" : false }, "sessions-sessionId" : { "href" : "http://127.0.0.1:8001/api-u/actuator/sessions/{sessionId}" , "templated" : true }, "sessions" : { "href" : "http://127.0.0.1:8001/api-u/actuator/sessions" , "templated" : false }, "httptrace" : { "href" : "http://127.0.0.1:8001/api-u/actuator/httptrace" , "templated" : false }, "mappings" : { "href" : "http://127.0.0.1:8001/api-u/actuator/mappings" , "templated" : false }, "refresh" : { "href" : "http://127.0.0.1:8001/api-u/actuator/refresh" , "templated" : false }, "features" : { "href" : "http://127.0.0.1:8001/api-u/actuator/features" , "templated" : false }, "service-registry" : { "href" : "http://127.0.0.1:8001/api-u/actuator/service-registry" , "templated" : false } } }現在來挑幾個做一下說明 http://127.0.0.1:8001/api-u/actuator/configprops 檢視所有的配置資訊(當然密碼會隱藏) 片段
"spring.cloud.config-org.springframework.cloud.bootstrap.config.PropertySourceBootstrapProperties" : { "prefix" : "spring.cloud.config" , "properties" : { "overrideSystemProperties" : true , "overrideNone" : false , "allowOverride" : true } }, "configClientProperties" : { "prefix" : "spring.cloud.config" , "properties" : { "headers" : {}, "discovery" : { "enabled" : false , "serviceId" : "configserver" }, "profile" : "default" , "name" : "user-center" , "uri" : "http://localhost:8888" , "enabled" : true , "failFast" : false , "username" : "user" } },http://127.0.0.1:8001/api-u/actuator/metrics 檢視某些指標的具體數值,比如JVM,tomcat等等
{ "names" : [ "rabbitmq.acknowledged" , "rabbitmq.consumed" , "jvm.buffer.memory.used" , "jvm.memory.used" , "jvm.gc.memory.allocated" , "rabbitmq.connections" , "jvm.memory.committed" , "tomcat.global.request.max" , "tomcat.sessions.created" , "tomcat.sessions.expired" , "jvm.gc.max.data.size" , "logback.events" , "rabbitmq.published" , "system.cpu.count" , "jvm.memory.max" , "rabbitmq.rejected" , "jvm.buffer.total.capacity" , "jvm.buffer.count" , "process.files.max" , "jvm.threads.daemon" , "rabbitmq.channels" , "process.start.time" , "tomcat.global.error" , "tomcat.sessions.active.max" , "http.server.requests" , "tomcat.global.sent" , "jvm.gc.live.data.size" , "process.files.open" , "process.cpu.usage" , "tomcat.global.received" , "tomcat.servlet.request" , "jvm.gc.pause" , "process.uptime" , "tomcat.threads.config.max" , "system.load.average.1m" , "tomcat.cache.hit" , "tomcat.servlet.error" , "tomcat.threads.current" , "tomcat.servlet.request.max" , "tomcat.cache.access" , "tomcat.sessions.active.current" , "system.cpu.usage" , "jvm.threads.live" , "jvm.classes.loaded" , "jvm.classes.unloaded" , "tomcat.threads.busy" , "jvm.threads.peak" , "jvm.gc.memory.promoted" , "tomcat.sessions.rejected" , "tomcat.sessions.alive.max" , "tomcat.global.request" ] }比方說我們要檢視JVM的最大記憶體,訪問 http://127.0.0.1:8001/api-u/actuator/metrics/jvm.memory.max
{ "name" : "jvm.memory.max" , "measurements" : [ { "statistic" : "VALUE" , "value" : 5.587337215E9 } ], "availableTags" : [ { "tag" : "area" , "values" : [ "heap" , "nonheap" ] }, { "tag" : "id" , "values" : [ "Compressed Class Space" , "PS Survivor Space" , "PS Old Gen" , "Metaspace" , "PS Eden Space" , "Code Cache" ] } ] }http://127.0.0.1:8001/api-u/actuator/metrics/jvm.memory.used JVM已經使用的記憶體
{ "name" : "jvm.memory.used" , "measurements" : [ { "statistic" : "VALUE" , "value" : 9.31419992E8 } ], "availableTags" : [ { "tag" : "area" , "values" : [ "heap" , "nonheap" ] }, { "tag" : "id" , "values" : [ "Compressed Class Space" , "PS Old Gen" , "PS Survivor Space" , "Metaspace" , "PS Eden Space" , "Code Cache" ] } ] }http://127.0.0.1:8001/api-u/actuator/beans 檢視spring中注入的所有bean
部分片段
"spring.cloud.config-org.springframework.cloud.bootstrap.config.PropertySourceBootstrapProperties" : { "aliases" : [], "scope" : "singleton" , "type" : "org.springframework.cloud.bootstrap.config.PropertySourceBootstrapProperties" , "resource" : null , "dependencies" : [] }, "propertySourcesPlaceholderConfigurer" : { "aliases" : [], "scope" : "singleton" , "type" : "org.springframework.context.support.PropertySourcesPlaceholderConfigurer" , "resource" : "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration" , "dependencies" : [] }如果我們不想啟用所有的端點,只啟用部分端點,比如configprops,metrics,beans,health,info,配置如下
management: endpoints: web: exposure: include: "configprops,metrics,beans,health,info" endpoint: health: show-details: always
訪問http://127.0.0.1:8001/api-u/actuator結果如下
{ "_links" : { "self" : { "href" : "http://127.0.0.1:8001/api-u/actuator" , "templated" : false }, "beans" : { "href" : "http://127.0.0.1:8001/api-u/actuator/beans" , "templated" : false }, "health" : { "href" : "http://127.0.0.1:8001/api-u/actuator/health" , "templated" : false }, "configprops" : { "href" : "http://127.0.0.1:8001/api-u/actuator/configprops" , "templated" : false }, "info" : { "href" : "http://127.0.0.1:8001/api-u/actuator/info" , "templated" : false }, "metrics-requiredMetricName" : { "href" : "http://127.0.0.1:8001/api-u/actuator/metrics/{requiredMetricName}" , "templated" : true }, "metrics" : { "href" : "http://127.0.0.1:8001/api-u/actuator/metrics" , "templated" : false } }