专栏首页程序猿DDSpring Boot Actuator监控端点小结

Spring Boot Actuator监控端点小结

初识Actuator

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

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

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

在现有的Spring Boot应用中引入该模块非常简单,只需要在`pom.xml`的`dependencies`节点中,新增`spring-boot-starter-actuator`的依赖即可。我们不需要编写任何代码,直接启动应用,就可以看到控制台中输出了这些端点:

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

原生端点

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

- 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。

- 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP请求统计等。

- 操作控制类:提供了对应用的关闭等操作类功能。

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

应用配置类

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

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

`positiveMatches`中返回的是条件匹配成功的自动化配置,`negativeMatches`中返回的是条件匹配不成功的自动化配置。

- /beans:该端点用来获取应用上下文中创建的所有Bean。在每个bean中都包含了下面这几个信息:

- bean:Bean的名称

- scope:Bean的作用域

- type:Bean的Java类型

- reource:class文件的具体路径

- dependencies:依赖的Bean名称

- /configprops:该端点用来获取应用中配置的属性信息报告。在返回的配置信息中,`prefix`属性代表了属性的配置前缀,`properties`代表了各个属性的名称和值。

- /env:该端点与`/configprops`不同,它用来获取应用所有可用的环境属性报告。包括:环境变量、JVM属性、应用的配置配置、命令行中的参数。它可以帮助我们方便地看到当前应用可以加载的配置信息,并配合`@ConfigurationProperties`注解将它们引入到我们的应用程序中来进行使用。另外,为了配置属性的安全,对于一些类似密码等敏感信息,该端点都会进行隐私保护,但是我们需要让属性名中包含:password、secret、key这些关键词,这样该端点在返回它们的时候会使用`*`来替代实际的属性值。

- /mappings:该端点用来返回所有Spring MVC的控制器映射关系报告。该报告的信息与我们在启用Spring MVC的Web应用时输出的日志信息类似,其中`bean`属性标识了该映射关系的请求处理器,`method`属性标识了该映射关系的具体处理类和处理函数。

- /info:该端点用来返回一些应用自定义的信息。默认情况下,它只会返回一个空的json内容。我们可以在`application.properties`配置文件中通过`info`前缀来设置一些属性。

度量指标类

上面我们所介绍的应用配置类端点所提供的信息报告在应用启动的时候都已经基本确定了其返回内容,可以说是一个静态报告。而度量指标类端点提供的报告内容则是动态变化的,这些端点提供了应用程序在运行过程中的一些快照信息,比如:内存使用情况、HTTP请求统计、外部资源指标等。这些端点对于我们构建微服务架构中的监控系统非常有帮助,由于Spring Boot应用自身实现了这些端点,所以我们可以很方便地利用它们来收集我们想要的信息,以制定出各种自动化策略。下面,我们就来分别看看这些强大的端点功能。

- /metrics:该端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息等。它主要报下下面这些重要度量信息:

- 系统信息:包括处理器数量`processors`、运行时间`uptime`和`instance.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。

- /health:该端点在一开始的示例中我们已经使用过了,它用来获取应用的各类健康指标信息。在`spring-boot-starter-actuator`模块中自带实现了一些常用资源的健康指标检测器。这些检测器都通过`HealthIndicator`接口实现,并且会根据依赖关系的引入实现自动化装配,比如用于检测磁盘的`DiskSpaceHealthIndicator`、检测DataSource连接是否可用的`DataSourceHealthIndicator`等。

- /dump:该端点用来暴露程序运行中的线程信息。它使用`java.lang.management.ThreadMXBean`的`dumpAllThreads`方法来返回所有含有同步信息的活动线程详情。

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

操作控制类

仔细的读者可能会发现,我们在“初识Actuator”时运行示例的控制台中输出的所有监控端点,已经在介绍应用配置类端点和度量指标类端点时都讲解完了。那么还有哪些是操作控制类端点呢?实际上,由于之前介绍的所有端点都是用来反映应用自身的属性或是运行中的状态,相对于操作控制类端点没有那么敏感,所以他们默认都是启用的。而操作控制类端点拥有更强大的控制能力,如果要使用它们的话,需要通过属性来配置开启。

在原生端点中,只提供了一个用来关闭应用的端点:`/shutdown`。我们可以通过如下配置`endpoints.shutdown.enabled=true`开启它:

在配置了上述属性之后,只需要访问该应用的`/shutdown`端点就能实现关闭该应用的远程操作。由于开放关闭应用的操作本身是一件非常危险的事,所以真正在线上使用的时候,我们需要对其加入一定的保护机制,比如:定制Actuator的端点路径、整合Spring Security进行安全校验等。

本文分享自微信公众号 - 程序猿DD(didispace)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-12-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spring-boot 速成(3) actuator

    actuator 通过暴露一系列的endpoints可以让开发者快速了解spring boot的各项运行指标,比如:线程数,jvm剩余内存等一系列参数。 启用方...

    菩提树下的杨过
  • spring cloud 学习(8) - sleuth & zipkin 调用链跟踪

    业务复杂的微服务架构中,往往服务之间的调用关系比较难梳理,一次http请求中,可能涉及到多个服务的调用(eg: service A -> service B -...

    菩提树下的杨过
  • dubbox升级spring到4.x及添加log4j2支持

    今天花了点时间,把dubbox依赖的spring从3.x升级成最新版的4.x了,其它一些依赖的组件也顺带升级了,同时dubbo支持的第三方日志组件居然没有log...

    菩提树下的杨过
  • redis 学习笔记(7)-cluster 客户端(jedis)代码示例

    上节学习了cluster的搭建及redis-cli终端下如何操作,但是更常用的场景是在程序代码里对cluster读写,这需要redis-client对clust...

    菩提树下的杨过
  • spring-boot 速成(2) devtools之热部署及LiveReload

    JRebel热部署插件相信很多人都知道,但是这是一款商业插件,spring-boot框架也提供了类似的功能,即:devtools,关键是免费的! 使用方法如下:...

    菩提树下的杨过
  • mybatis: 利用多数据源实现分库存储

    之前写过一篇mybatis 使用经验小结 提到过多数据源的处理方式,虽然简单但是姿势不太优雅,今天介绍一些更美观的办法: spring中有一个AbstractR...

    菩提树下的杨过
  • spring-boot 速成(2) devtools之热部署及LiveReload

    JRebel热部署插件相信很多人都知道,但是这是一款商业插件,spring-boot框架也提供了类似的功能,即:devtools,关键是免费的! 使用方法如下:...

    菩提树下的杨过
  • spring cloud 学习(2) - eureka server注册中心高可用及安全认证

    接上节继续,注册中心单点肯定是不牢靠的,可以参考下面的方案做成注册中心集群: ? 弄成3个节点,每个节点向其它节点注册,这样只要集群中有一个节点正常工作即可。为...

    菩提树下的杨过
  • spring-boot 速成(12) - 如何注入多个redis StringRedisTemplate

    默认情况下,spring-boot的redis自动配置,只能注册一个StringRedisTemplate实例,如果希望注入多个,比如:1个读写database...

    菩提树下的杨过
  • spring集成kafka

    一、添加依赖项 compile 'org.springframework.kafka:spring-kafka:1.2.2.RELEASE' 二、发消息(生产者...

    菩提树下的杨过

扫码关注云+社区

领取腾讯云代金券