Spring Boot Actuator监控端点小结

 2016-12-24
 Spring Boot

被围观 720 次

在Spring Boot的众多Starter POMs中有一个特殊的模块,它不同于其他模块那样大多用于开发业务功能或是连接一些其他外部资源。它完全是一个用于暴露自身信息的模块,所以很明显,它的主要作用是用于监控与管理,它就是:spring-boot-starter-actuator

spring-boot-starter-actuator模块的实现对于实施微服务的中小团队来说,可以有效地减少监控系统在采集应用指标时的开发量。当然,它也并不是万能的,有时候我们也需要对其做一些简单的扩展来帮助我们实现自身系统个性化的监控需求。下面,在本文中,我们将详解的介绍一些关于spring-boot-starter-actuator模块的内容,包括它的原生提供的端点以及一些常用的扩展和配置方式。

初识Actuator

下面,我们可以通过对快速入门中实现的Spring Boot应用增加spring-boot-starter-actuator模块功能,来对它有一个直观的认识。

在现有的Spring Boot应用中引入该模块非常简单,只需要在pom.xmldependencies节点中,新增spring-boot-starter-actuator的依赖即可,具体如下:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

通过增加该依赖之后,重新启动应用。此时,我们可以在控制台中看到如下图所示的输出:

上图显示了一批端点定义,这些端点并非我们自己在程序中创建,而是由spring-boot-starter-actuator模块根据应用依赖和配置自动创建出来的监控和管理端点。通过这些端点,我们可以实时的获取应用的各项监控指标,比如:访问/health端点,我们可以获得如下返回的应用健康信息:

{"status": "UP","diskSpace": {"status": "UP","total": 491270434816,"free": 383870214144,"threshold": 10485760}
}

原生端点

通过在快速入门示例中添加spring-boot-starter-actuator模块,我们已经对它有了一个初步的认识。接下来,我们详细介绍一下spring-boot-starter-actuator模块中已经实现的一些原生端点。如果根据端点的作用来说,我们可以原生端点分为三大类:

  • 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
  • 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP请求统计等。
  • 操作控制类:提供了对应用的关闭等操作类功能。

下面我们来详细了解一下这三类端点都分别可以为我们提供怎么样的有用信息和强大功能,以及我们如何去扩展和配置它们。

应用配置类

由于Spring Boot为了改善传统Spring应用繁杂的配置内容,采用了包扫描和自动化配置的机制来加载原本集中于xml文件中的各项内容。虽然这样的做法,让我们的代码变得非常简洁,但是整个应用的实例创建和依赖关系等信息都被离散到了各个配置类的注解上,这使得我们分析整个应用中资源和实例的各种关系变得非常的困难。而这类端点就可以帮助我们轻松的获取一系列关于Spring 应用配置内容的详细报告,比如:自动化配置的报告、Bean创建的报告、环境属性的报告等。

  • /autoconfig:该端点用来获取应用的自动化配置报告,其中包括所有自动化配置的候选项。同时还列出了每个候选项自动化配置的各个先决条件是否满足。所以,该端点可以帮助我们方便的找到一些自动化配置为什么没有生效的具体原因。该报告内容将自动化配置内容分为两部分:

    • positiveMatches中返回的是条件匹配成功的自动化配置
    • negativeMatches中返回的是条件匹配不成功的自动化配置
      {"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"}],...}
      }

从如上示例中我们可以看到,每个自动化配置候选项中都有一系列的条件,比如上面没有成功匹配的HealthIndicatorAutoConfiguration.DataSourcesHealthIndicatorConfiguration配置,它的先决条件就是需要在工程中包含org.springframework.jdbc.core.JdbcTemplate类,由于我们没有引入相关的依赖,它就不会执行自动化配置内容。所以,当我们发现有一些期望的配置没有生效时,就可以通过该端点来查看没有生效的具体原因。

  • /beans:该端点用来获取应用上下文中创建的所有Bean。

    [{"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","scope": "singleton","type": "org.springframework.web.servlet.DispatcherServlet","resource": "class path resource [org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration$DispatcherServletConfiguration.class]","dependencies": []}]}
    ]

    如上示例中,我们可以看到在每个bean中都包含了下面这几个信息:

    • bean:Bean的名称
    • scope:Bean的作用域
    • type:Bean的Java类型
    • reource:class文件的具体路径
    • dependencies:依赖的Bean名称
  • /configprops:该端点用来获取应用中配置的属性信息报告。从下面该端点返回示例的片段中,我们看到返回了关于该短信的配置信息,prefix属性代表了属性的配置前缀,properties代表了各个属性的名称和值。所以,我们可以通过该报告来看到各个属性的配置路径,比如我们要关闭该端点,就可以通过使用endpoints.configprops.enabled=false来完成设置。

    {"configurationPropertiesReportEndpoint": {"prefix": "endpoints.configprops","properties": {"id": "configprops","sensitive": true,"enabled": true}},...
    }
  • /env:该端点与/configprops不同,它用来获取应用所有可用的环境属性报告。包括:环境变量、JVM属性、应用的配置配置、命令行中的参数。从下面该端点返回的示例片段中,我们可以看到它不仅返回了应用的配置属性,还返回了系统属性、环境变量等丰富的配置信息,其中也包括了应用还没有没有使用的配置。所以它可以帮助我们方便地看到当前应用可以加载的配置信息,并配合@ConfigurationProperties注解将它们引入到我们的应用程序中来进行使用。另外,为了配置属性的安全,对于一些类似密码等敏感信息,该端点都会进行隐私保护,但是我们需要让属性名中包含:password、secret、key这些关键词,这样该端点在返回它们的时候会使用*来替代实际的属性值。

    {"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 Files\\Java\\jdk1.8.0_91\\jre\\bin","java.vm.version": "25.91-b15","java.vm.vendor": "Oracle Corporation",...},"systemEnvironment": {"configsetroot": "C:\\WINDOWS\\ConfigSetRoot","RABBITMQ_BASE": "E:\\tools\\rabbitmq",...},"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应用时输出的日志信息类似,其中bean属性标识了该映射关系的请求处理器,method属性标识了该映射关系的具体处理类和处理函数。

    {"/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内容。我们可以在application.properties配置文件中通过info前缀来设置一些属性,比如下面这样:

    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
    }

    从上面的示例中,我们看到有这些重要的度量值:

    • 系统信息:包括处理器数量processors、运行时间uptimeinstance.uptime、系统平均负载systemload.average
    • mem.*:内存概要信息,包括分配给应用的总内存数量以及当前空闲的内存数量。这些信息来自java.lang.Runtime
    • heap.*:堆内存使用情况。这些信息来自java.lang.management.MemoryMXBean接口中getHeapMemoryUsage方法获取的java.lang.management.MemoryUsage
    • nonheap.*:非堆内存使用情况。这些信息来自java.lang.management.MemoryMXBean接口中getNonHeapMemoryUsage方法获取的java.lang.management.MemoryUsage
    • threads.*:线程使用情况,包括线程数、守护线程数(daemon)、线程峰值(peak)等,这些数据均来自java.lang.management.ThreadMXBean
    • classes.*:应用加载和卸载的类统计。这些数据均来自java.lang.management.ClassLoadingMXBean
    • gc.*:垃圾收集器的详细信息,包括垃圾回收次数gc.ps_scavenge.count、垃圾回收消耗时间gc.ps_scavenge.time、标记-清除算法的次数gc.ps_marksweep.count、标记-清除算法的消耗时间gc.ps_marksweep.time。这些数据均来自java.lang.management.GarbageCollectorMXBean
    • httpsessions.*:Tomcat容器的会话使用情况。包括最大会话数httpsessions.max和活跃会话数httpsessions.active。该度量指标信息仅在引入了嵌入式Tomcat作为应用容器的时候才会提供。
    • gauge.*:HTTP请求的性能指标之一,它主要用来反映一个绝对数值。比如上面示例中的gauge.response.hello: 5,它表示上一次hello请求的延迟时间为5毫秒。
    • counter.*:HTTP请求的性能指标之一,它主要作为计数器来使用,记录了增加量和减少量。如上示例中counter.status.200.hello: 11,它代表了hello请求返回200状态的次数为11。

    对于gauge.*counter.*的统计,这里有一个特殊的内容请求star-star,它代表了对静态资源的访问。这两类度量指标非常有用,我们不仅可以使用它默认的统计指标,还可以在程序中轻松的增加自定义统计值。只需要通过注入org.springframework.boot.actuate.metrics.CounterServiceorg.springframework.boot.actuate.metrics.GaugeService来实现自定义的统计指标信息。比如:我们可以像下面这样自定义实现对hello接口的访问次数统计。

    @RestController
    public class HelloController {@Autowiredprivate CounterService counterService;@RequestMapping("/hello")public String greet() {counterService.increment("didispace.hello.count");return "";}}

    /metrics端点可以提供应用运行状态的完整度量指标报告,这项功能非常的实用,但是对于监控系统中的各项监控功能,它们的监控内容、数据收集频率都有所不同,如果我们每次都通过全量获取报告的方式来收集,略显粗暴。所以,我们还可以通过/metrics/{name}接口来更细粒度的获取度量信息,比如我们可以通过访问/metrics/mem.free来获取当前可用内存数量。

  • /health:该端点在一开始的示例中我们已经使用过了,它用来获取应用的各类健康指标信息。在spring-boot-starter-actuator模块中自带实现了一些常用资源的健康指标检测器。这些检测器都通过HealthIndicator接口实现,并且会根据依赖关系的引入实现自动化装配,比如用于检测磁盘的DiskSpaceHealthIndicator、检测DataSource连接是否可用的DataSourceHealthIndicator等。有时候,我们可能还会用到一些Spring Boot的Starter POMs中还没有封装的产品来进行开发,比如:当使用RocketMQ作为消息代理时,由于没有自动化配置的检测器,所以我们需要自己来实现一个用来采集健康信息的检测器。比如,我们可以在Spring Boot的应用中,为org.springframework.boot.actuate.health.HealthIndicator接口实现一个对RocketMQ的检测器类:

    @Component
    public class RocketMQHealthIndicator implements HealthIndicator {@Overridepublic 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对象中,共有两项内容,一个是状态信息,除了该示例中的UPDOWN之外,还有UNKNOWNOUT_OF_SERVICE,可以根据需要来实现返回;还有一个详细信息,采用Map的方式存储,在这里通过withDetail函数,注入了一个Error Code信息,我们也可以填入一下其他信息,比如,检测对象的IP地址、端口等。重新启动应用,并访问/health接口,我们在返回的JSON字符串中,将会包含了如下信息:

    "rocketMQ": {"status": "UP"
    }
  • /dump:该端点用来暴露程序运行中的线程信息。它使用java.lang.management.ThreadMXBeandumpAllThreads方法来返回所有含有同步信息的活动线程详情。

  • /trace:该端点用来返回基本的HTTP跟踪信息。默认情况下,跟踪信息的存储采用org.springframework.boot.actuate.trace.InMemoryTraceRepository实现的内存方式,始终保留最近的100条请求记录。它记录的内容格式如下:

    [{"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进行安全校验等。

 本文由 程序猿DD-翟永超 创作,采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。

------------------------------------------------------------------------------------------------------------------------------ 
如您觉得文章不错,对您有所帮助,可以通过“支付宝”或“微信支付”请我喝咖啡。

Spring Boot Actuator监控端点小结相关推荐

  1. Spring Boot Actuator监控页面报错解决

    今天在访问Spring Boot Actuator监控页面的时候报错了,之前都没遇到这种情况,大概的意思就是无权限访问 <html><body><h1>Whitel ...

  2. (转)Spring Boot (十九):使用 Spring Boot Actuator 监控应用

    http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html 微服务的特点决定了功能模块的部署是分布式的,大部分功能 ...

  3. spring boot actuator监控详细介绍一(超级详细)

    spring boot actuator介绍 Spring Boot包含许多其他功能,可帮助您在将应用程序推送到生产环境时监视和管理应用程序. 您可以选择使用HTTP端点或JMX来管理和监视应用程序. ...

  4. 使⽤用 Spring Boot Actuator 监控应⽤

    1.美图 2.概述 微服务的特点决定了功能模块的部署是分布式的,⼤部分功能模块都是运行在不同的机器上,彼此通过服务调⽤进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现异常如何快速定位便成为 ...

  5. Spring Boot Actuator [监控与管理]

    1. 如何添加 2. actuator 的原生端点(API) 2.1 应用类配置 2.1.1 http://localhost:8080/actuator/conditions 2.1.2 http: ...

  6. SpringBoot 集成Spring Boot Actuator 监控管理

    spring-boot-starter-actuator功能简介 根据应用依赖和配置自动创建出来的监控和管理端点.通过这些端点,我们可以实时获取系统应用的各项监控指标. spring-boot-sta ...

  7. Spring Boot Actuator监控关闭

    可以使用如下属性:management.endpoints.enabled-by-default=false * 在YAML中有特殊的含义,所以如果想使用include或者exclude包含所有的端点 ...

  8. 如何将 Spring Boot Actuator 的指标信息输出到 InfluxDB 和 Prometheus

    来源:SpringForAll社区 Spring Boot Actuator是Spring Boot 2发布后修改最多的项目之一.它经过了主要的改进,旨在简化定制,并包括一些新功能,如支持其他Web技 ...

  9. 高级版的 jvisualvm :Spring Boot Admin 监控 Spring Boot 微服务项目

    前奏:先说一下 Java VisualVM Java VisualVM 是一个能够监控 JVM 的 jdk 自带的图形化工具: 在 $JAVA_HOME/bin 目录下,可直接运行它. 要想监控远程服 ...

  10. 黑白盒 时序Prometheus详解 ; 含 全链路Spring Boot Actuator - google dapper论文 -ELK 日志易 吹牛篇

    一 Prometheus配置文件详解 # 四个模块 配置文件指标说明 global: 全局配置(如果有内部单独设定,会覆盖这个参数) alerting: 告警插件定义.这里会设定alertmanage ...

最新文章

  1. php padright,[扩展推荐] PHP 字符串操作类 Twine
  2. pytorch笔记:VGG 16
  3. 我花 1 分钟写了一段爬虫,帮助小姐姐解放了双手
  4. check hierarchy时cadence ic5141崩溃退出
  5. 期货与期权(part10)--远期与期货合约的比较
  6. java面向对象高级分层实例_数据库操作类
  7. Ubuntu系统下Python虚拟环境构建详解
  8. c语言编写一个菜单系统_一招教你,轻松解决C语言编写一个正整数的所有因子!...
  9. 如何在CDH5.16.2中部署海豚调度器Apache Dolphin Scheduler 1.2.0
  10. 百度关键词点击ios_百度推广关键词点击价格高,如何处理?
  11. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案
  12. Javascript基础之Array数组API
  13. hdu - 4647 - Another Graph Game
  14. mysql 钩子_SetWindowsHookEx原理(如何使用钩子,使用钩子hook其他进程的函数)
  15. 【Tools系列】之Excel冻结窗格
  16. python检查https过期_Python实现HTTPS网站证书过期监控及更新
  17. APISpace 星座查询API
  18. 什么是java修饰符_java修饰符是什么?
  19. acwing280.陪审团 01背包
  20. 如何在WordPress侧边栏小部件中显示最新的Pinterest引脚

热门文章

  1. 用c语言编辑一个通讯录,c语言制作一个通讯录
  2. CPU的工作原理浅析
  3. miscrosoft visio 2003记
  4. 多元统计分析及R语言建模(第四版)--第二章多元数据的数学表达式及R使用课后习题
  5. win7仿win98电脑主题
  6. word批量替换交叉引用格式
  7. 数据库(员工信息表)
  8. web项目报404一直找不到图片(路径绝对正确)
  9. 自定义分页信息java_java-displaytag自定义分页
  10. 冯诺依曼元胞计算机,冯诺依曼元胞自动机