由于2.x和1.x的监控不一样,此处先讲1.x
pom.xml
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-actuator</artifactId> 4 </dependency>
显示信息
10-15 15:57:11.548 INFO 11388 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2019-10-15 15:57:11.548 INFO 11388 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.29 2019-10-15 15:57:11.657 INFO 11388 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2019-10-15 15:57:11.657 INFO 11388 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1027 ms 2019-10-15 15:57:11.970 INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 2019-10-15 15:57:11.970 INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'metricsFilter' to: [/*] 2019-10-15 15:57:11.970 INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2019-10-15 15:57:11.970 INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2019-10-15 15:57:11.970 INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2019-10-15 15:57:11.985 INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2019-10-15 15:57:11.985 INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'webRequestLoggingFilter' to: [/*] 2019-10-15 15:57:11.985 INFO 11388 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'applicationContextIdFilter' to: [/*] 2019-10-15 15:57:12.251 INFO 11388 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6b1274d2: startup date [Tue Oct 15 15:57:10 CST 2019]; root of context hierarchy 2019-10-15 15:57:12.298 INFO 11388 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2019-10-15 15:57:12.298 INFO 11388 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2019-10-15 15:57:12.329 INFO 11388 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2019-10-15 15:57:12.329 INFO 11388 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2019-10-15 15:57:12.360 INFO 11388 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2019-10-15 15:57:12.563 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/health || /health.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint.invoke(javax.servlet.http.HttpServletRequest,java.security.Principal) 2019-10-15 15:57:12.574 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/auditevents || /auditevents.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public org.springframework.http.ResponseEntity<?> org.springframework.boot.actuate.endpoint.mvc.AuditEventsMvcEndpoint.findByPrincipalAndAfterAndType(java.lang.String,java.util.Date,java.lang.String) 2019-10-15 15:57:12.574 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/dump || /dump.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/heapdump || /heapdump.json],methods=[GET],produces=[application/octet-stream]}" onto public void org.springframework.boot.actuate.endpoint.mvc.HeapdumpMvcEndpoint.invoke(boolean,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.io.IOException,javax.servlet.ServletException 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/trace || /trace.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/loggers/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.LoggersMvcEndpoint.get(java.lang.String) 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/loggers/{name:.*}],methods=[POST],consumes=[application/vnd.spring-boot.actuator.v1+json || application/json],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.LoggersMvcEndpoint.set(java.lang.String,java.util.Map<java.lang.String, java.lang.String>) 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/loggers || /loggers.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/beans || /beans.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/autoconfig || /autoconfig.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/metrics/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint.value(java.lang.String) 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/metrics || /metrics.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/mappings || /mappings.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/configprops || /configprops.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/info || /info.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/env/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint.value(java.lang.String) 2019-10-15 15:57:12.575 INFO 11388 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/env || /env.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
在配置文件application.properties中加入
management.security.enabled=false info.app.id=hello info.app=world #可以随意配置info开头的信息
下面进行各个节点测试
http://localhost:8080/health { "status": "UP", "diskSpace": { "status": "UP", "total": 322541973504, "free": 218166931456, "threshold": 10485760 } }
http://localhost:8080/info {"app":"world","app.id":"hello"} http://localhost:8080/dump { "threadName": "DestroyJavaVM", "threadId": 40, "blockedTime": -1, "blockedCount": 0, "waitedTime": -1, "waitedCount": 0, "lockName": null, "lockOwnerId": -1, "lockOwnerName": null, "inNative": false, "suspended": false, "threadState": "RUNNABLE", "stackTrace": [], "lockedMonitors": [], "lockedSynchronizers": [], "lockInfo": null }, { "threadName": "http-nio-8080-AsyncTimeout", "threadId": 38, "blockedTime": -1, "blockedCount": 0, "waitedTime": -1, "waitedCount": 653, "lockName": null, "lockOwnerId": -1, "lockOwnerName": null, "inNative": false, "suspended": false, "threadState": "TIMED_WAITING", "stackTrace": [ { "methodName": "sleep", "fileName": "Thread.java", "lineNumber": -2, "className": "java.lang.Thread", "nativeMethod": true }, { "methodName": "run", "fileName": "AbstractProtocol.java", "lineNumber": 1133, "className": "org.apache.coyote.AbstractProtocol$AsyncTimeout", "nativeMethod": false }, { "methodName": "run", "fileName": "Thread.java", "lineNumber": 745, "className": "java.lang.Thread", "nativeMethod": false } ],
http://localhost:8080/env { "profiles": [], "server.ports": { "local.server.port": 8080 }, "commandLineArgs": { "spring.output.ansi.enabled": "always" }, "servletContextInitParams": {}, "systemProperties": { ..... }
http://localhost:8080/beans { "context": "application", "parent": null, "beans": [ { "bean": "actuatorApplication", "aliases": [], "scope": "singleton", "type": "com.example.demo.ActuatorApplication$$EnhancerBySpringCGLIB$$90808ed2", "resource": "null", "dependencies": [] }, { "bean": "org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory", "aliases": [], "scope": "singleton", "type": "org.springframework.core.type.classreading.CachingMetadataReaderFactory", "resource": "null", "dependencies": [] }, { "bean": "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration", "aliases": [], "scope": "singleton", "type": "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration$$EnhancerBySpringCGLIB$$15f9df49", "resource": "null", "dependencies": [] },
http://localhost:8080/health { "status": "UP", "diskSpace": { "status": "UP", "total": 322541973504, "free": 218146656256, "threshold": 10485760 } }
http://localhost:8080/metrics { "mem": 277267, "mem.free": 168703, "processors": 4, "instance.uptime": 785901, "uptime": 789830, "systemload.average": -1, "heap.committed": 235520, "heap.init": 262144, "heap.used": 66816, "heap": 3702784, "nonheap.committed": 42816, "nonheap.init": 2496, "nonheap.used": 41748, "nonheap": 0, "threads.peak": 36, "threads.daemon": 26, "threads.totalStarted": 42, "threads": 28, "classes": 6055, "classes.loaded": 6055, "classes.unloaded": 0, "gc.ps_scavenge.count": 5, "gc.ps_scavenge.time": 49, "gc.ps_marksweep.count": 1, "gc.ps_marksweep.time": 38, "httpsessions.max": -1, "httpsessions.active": 0, "gauge.response.beans": 12, "gauge.response.env": 8, "gauge.response.dump": 58, "gauge.response.health": 24, "gauge.response.star-star.favicon.ico": 25, "counter.status.200.beans": 2, "counter.status.200.star-star.favicon.ico": 1, "counter.status.200.health": 1, "counter.status.200.dump": 1, "counter.status.200.env": 2 }
当加入git.properties
git.branch=master git.commit.id=xjkd33s git.commit.time=2017-12-12 12:12:56
http://localhost:8080/info { "app": "world", "app.id": "hello", "git": { "commit": { "time": "2017-12-12 12:12:56", "id": "xjkd33s" }, "branch": "master" } }
检查健康监控的时候,测试如下
加入redis的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
配置(测试用,随便填的地址)
spring.redis.host=118.24.44.169
http://localhost:8080/health ##会查出redis的信息 { "status": "DOWN", "diskSpace": { "status": "UP", "total": 322541973504, "free": 218147446784, "threshold": 10485760 }, "redis": { "status": "DOWN", "error": "org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool" } }
二 定制断点信息
-
定制断点一般通过endpoints+端点名+属性名来设置。
-
修改端口id(endpoints.beans.id=mybean)
修改结果:http://localhost:8080/mybean 要这样才能登陆
-
修改端口id(endpoints.beans.path=/bean)
修改结果:http://localhost:8080/bean 要这样才能登陆
-
endpoints.beans.enabled=false
修改结果:http://localhost:8080/bean 无法登陆
-
endpoints.enabled=false
修改结果:所有的监控都无法登陆
-
endpoints.beans.enabled=true
修改结果:http://localhost:8080/bean 只有这个能登陆
-
management.context-path=/manage
修改结果:访问要加路径/manage
-
management.port=8181
修改结果:访问的端口改成8181
-
三 自定义健康状态指示器
-
编写一个指示器 实现 HealthIndicator 接口
-
指示器的名字 xxxxHealthIndicator
-
加入容器中
package com.example.demo; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; @Component public class MyAppHealthIndicator implements HealthIndicator { @Override public Health health() { //自定义的检查方法 //Health.up().build()代表健康 return Health.down().withDetail("msg","服务异常").build(); } }
测试结果:
http://localhost:8080/manage/health { "status": "DOWN", "myApp": { "status": "DOWN", "msg": "服务异常" }, "diskSpace": { "status": "UP", "total": 322541973504, "free": 218143944704, "threshold": 10485760 }, "redis": { "status": "DOWN", "error": "org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool" } }