Spring Boot Actuator监控端点小结
在Spring Boot的众多Starter POMs中有一个特殊的模块,它不同于其他模块那样大多用于开发业务功能或是连接一些其他外部资源。它完全是一个用于暴露自身信息的模块,所以很明显,它的主要作用是用于监控与管理,它就是:
初识Actuator 下面,我们可以通过对快速入门中实现的Spring Boot应用增加 在现有的Spring Boot应用中引入该模块非常简单,只需要在 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 通过增加该依赖之后,重新启动应用。此时,我们可以在控制台中看到如下图所示的输出: 上图显示了一批端点定义,这些端点并非我们自己在程序中创建,而是由 { "status": "UP","diskSpace": { "status": "UP","total": 491270434816,"free": 383870214144,"threshold": 10485760 } } 原生端点 通过在快速入门示例中添加
下面我们来详细了解一下这三类端点都分别可以为我们提供怎么样的有用信息和强大功能,以及我们如何去扩展和配置它们。 应用配置类 由于Spring Boot为了改善传统Spring应用繁杂的配置内容,采用了包扫描和自动化配置的机制来加载原本集中于xml文件中的各项内容。虽然这样的做法,让我们的代码变得非常简洁,但是整个应用的实例创建和依赖关系等信息都被离散到了各个配置类的注解上,这使得我们分析整个应用中资源和实例的各种关系变得非常的困难。而这类端点就可以帮助我们轻松的获取一系列关于Spring 应用配置内容的详细报告,比如:自动化配置的报告、Bean创建的报告、环境属性的报告等。
{ "positiveMatches": { // 条件匹配成功的 "EndpointWebMvcAutoConfiguration": [ { "condition": "OnClassCondition","message": "@ConditionalOnClass classes found: javax.servlet.Servlet,org.springframework.web.servlet.DispatcherServlet" },{ "condition": "OnWebApplicationCondition","message": "found web application StandardServletEnvironment" } ],... },"negativeMatches": { // 条件不匹配成功的 "HealthIndicatorAutoConfiguration.DataSourcesHealthIndicatorConfiguration": [ { "condition": "OnClassCondition","message": "required @ConditionalOnClass classes not found: org.springframework.jdbc.core.JdbcTemplate" } ],... } } 从如上示例中我们可以看到,每个自动化配置候选项中都有一系列的条件,比如上面没有成功匹配的Health
[ { "context": "hello:dev:8881","parent": null,"beans": [ { "bean": "org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration$DispatcherServletConfiguration","scope": "singleton","type": "org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration$DispatcherServletConfiguration$$EnhancerBySpringCGLIB$$3440282b","resource": "null","dependencies": [ "serverProperties","spring.mvc.CONFIGURATION_PROPERTIES","multipartConfigElement" ] },{ "bean": "dispatcherServlet","type": "org.springframework.web.servlet.DispatcherServlet","resource": "class path resource [org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration$DispatcherServletConfiguration.class]","dependencies": [] } ] } ] 如上示例中,我们可以看到在每个bean中都包含了下面这几个信息:
/configprops:该端点用来获取应用中配置的属性信息报告。从下面该端点返回示例的片段中,我们看到返回了关于该短信的配置信息,prefix属性代表了属性的配置前缀, { "configurationPropertiesReportEndpoint": { "prefix": "endpoints.configprops","properties": { "id": "configprops","sensitive": true,"enabled": true } },... } /env:该端点与 { "profiles": [ "dev" ],"server.ports": { "local.server.port": 8881 },"servletContextInitParams": { },"systemProperties": { "idea.version": "2016.1.3","java.runtime.name": "Java(TM) SE Runtime Environment","sun.boot.library.path": "C:Program FilesJavajdk1.8.0_91jrebin","java.vm.version": "25.91-b15","java.vm.vendor": "Oracle Corporation","systemEnvironment": { "configsetroot": "C:WINDOWSConfigSetRoot","RABBITMQ_BASE": "E:toolsrabbitmq","applicationConfig: [classpath:/application-dev.properties]": { "server.port": "8881" },"applicationConfig: [classpath:/application.properties]": { "server.port": "8885","spring.profiles.active": "dev","info.app.name": "spring-boot-hello","info.app.version": "v1.0.0","spring.application.name": "hello" } } /mappings:该端点用来返回所有Spring MVC的控制器映射关系报告。从下面的示例片段中,我们可以看该报告的信息与我们在启用Spring MVC的Web应用时输出的日志信息类似,其中 { "/webjars/**": { "bean": "resourceHandlerMapping" },"/**": { "bean": "resourceHandlerMapping" },"/**/favicon.ico": { "bean": "faviconHandlerMapping" },"{[/hello]}": { "bean": "requestMappingHandlerMapping","method": "public java.lang.String com.didispace.web.HelloController.index()" },"{[/mappings || /mappings.json],methods=[GET],produces=[application/json]}": { "bean": "endpointHandlerMapping","method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()" },... } /info:该端点用来返回一些应用自定义的信息。默认情况下,该端点只会返回一个空的json内容。我们可以在 info.app.name=spring-boot-hello info.app.version=v1.0.0 再访问/info端点,我们可以得到下面的返回报告,其中就包含了上面我们在应用自定义的两个参数。 { "app": { "name": "spring-boot-hello","version": "v1.0.0" } } 度量指标类 上面我们所介绍的应用配置类端点所提供的信息报告在应用启动的时候都已经基本确定了其返回内容,可以说是一个静态报告。而度量指标类端点提供的报告内容则是动态变化的,这些端点提供了应用程序在运行过程中的一些快照信息,比如:内存使用情况、HTTP请求统计、外部资源指标等。这些端点对于我们构建微服务架构中的监控系统非常有帮助,由于Spring Boot应用自身实现了这些端点,所以我们可以很方便地利用它们来收集我们想要的信息,以制定出各种自动化策略。下面,我们就来分别看看这些强大的端点功能。 /metrics:该端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息等。 { "mem": 541305,"mem.free": 317864,"processors": 8,"instance.uptime": 33376471,"uptime": 33385352,"systemload.average": -1,"heap.committed": 476672,"heap.init": 262144,"heap.used": 158807,"heap": 3701248,"nonheap.committed": 65856,"nonheap.init": 2496,"nonheap.used": 64633,"nonheap": 0,"threads.peak": 22,"threads.daemon": 20,"threads.totalStarted": 26,"threads": 22,"classes": 7669,"classes.loaded": 7669,"classes.unloaded": 0,"gc.ps_scavenge.count": 7,"gc.ps_scavenge.time": 118,"gc.ps_marksweep.count": 2,"gc.ps_marksweep.time": 234,"httpsessions.max": -1,"httpsessions.active": 0,"gauge.response.beans": 55,"gauge.response.env": 10,"gauge.response.hello": 5,"gauge.response.metrics": 4,"gauge.response.configprops": 153,"gauge.response.star-star": 5,"counter.status.200.beans": 1,"counter.status.200.metrics": 3,"counter.status.200.configprops": 1,"counter.status.404.star-star": 2,"counter.status.200.hello": 11,"counter.status.200.env": 1 } 从上面的示例中,我们看到有这些重要的度量值:
对于 @RestController public class HelloController { @Autowired private CounterService counterService; @RequestMapping("/hello") public String greet() { counterService.increment("didispace.hello.count"); return ""; } } /metrics端点可以提供应用运行状态的完整度量指标报告,这项功能非常的实用,但是对于监控系统中的各项监控功能,它们的监控内容、数据收集频率都有所不同,如果我们每次都通过全量获取报告的方式来收集,略显粗暴。所以,我们还可以通过/metrics/{name}接口来更细粒度的获取度量信息,比如我们可以通过访问/metrics/mem.free来获取当前可用内存数量。 /health:该端点在一开始的示例中我们已经使用过了,它用来获取应用的各类健康指标信息。在spring-boot-starter-actuator模块中自带实现了一些常用资源的健康指标检测器。这些检测器都通过 @Component public class RocketMQHealthIndicator implements HealthIndicator { @Override public Health health() { int errorCode = check(); if (errorCode != 0) { return Health.down().withDetail("Error Code",errorCode).build(); } return Health.up().build(); } private int check() { // 对监控对象的检测操作 } } 通过重写health()函数来实现健康检查,返回的Heath对象中,共有两项内容,一个是状态信息,除了该示例中的UP与DOWN之外,还有UNKNOWN和OUT_OF_SERVICE,可以根据需要来实现返回;还有一个详细信息,采用Map的方式存储,在这里通过withDetail函数,注入了一个Error Code信息,我们也可以填入一下其他信息,比如,检测对象的IP地址、端口等。重新启动应用,并访问/health接口,我们在返回的JSON字符串中,将会包含了如下信息: "rocketMQ": { "status": "UP" } /dump:该端点用来暴露程序运行中的线程信息。它使用 /trace:该端点用来返回基本的HTTP跟踪信息。默认情况下,跟踪信息的存储采用 [ { "timestamp": 1482570022463,"info": { "method": "GET","path": "/metrics/mem","headers": { "request": { "host": "localhost:8881","connection": "keep-alive","cache-control": "no-cache","user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/53.0.2785.143 Safari/537.36","postman-token": "9817ea4d-ad9d-b2fc-7685-9dff1a1bc193","accept": "*/*","accept-encoding": "gzip,deflate,sdch","accept-language": "zh-CN,zh;q=0.8" },"response": { "X-Application-Context": "hello:dev:8881","Content-Type": "application/json;charset=UTF-8","Transfer-Encoding": "chunked","Date": "Sat,24 Dec 2016 09:00:22 GMT","status": "200" } } } },... ] 操作控制类 仔细的读者可能会发现,我们在“初识Actuator”时运行示例的控制台中输出的所有监控端点,已经在介绍应用配置类端点和度量指标类端点时都讲解完了。那么还有哪些是操作控制类端点呢?实际上,由于之前介绍的所有端点都是用来反映应用自身的属性或是运行中的状态,相对于操作控制类端点没有那么敏感,所以他们默认都是启用的。而操作控制类端点拥有更强大的控制能力,如果要使用它们的话,需要通过属性来配置开启。 在原生端点中,只提供了一个用来关闭应用的端点:/shutdown。我们可以通过如下配置开启它: endpoints.shutdown.enabled=true 在配置了上述属性之后,只需要访问该应用的/shutdown端点就能实现关闭该应用的远程操作。由于开放关闭应用的操作本身是一件非常危险的事,所以真正在线上使用的时候,我们需要对其加入一定的保护机制,比如:定制Actuator的端点路径、整合Spring Security进行安全校验等。 以上所述是小编给大家介绍的Spring Boot Actuator监控端点小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持! 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |