SpringBoot(33) – Actuator(1) – 端点

  • Post author:
  • Post category:其他


参考:

https://docs.spring.io/spring-boot/docs/1.5.18.RELEASE/reference/htmlsingle/#production-ready

Spring Boot包含许多其他功能,可帮助在应用程序投入生产时监视和管理它们。 可以选择使用HTTP端点、JMX甚至远程shell(SSH或Telnet)来管理和监视应用程序。 审核,运行状况和指标收集可以自动应用于应用程序。

Actuator HTTP端点仅适用于基于Spring MVC的应用程序。 特别的是,除非你启用Spring MVC,否则它不适用于Jersey。

1. 启用Actuator

spring-boot-actuator 模块提供Spring Boot的所有生产功能。 启用这些功能的最简单方法是添加一个spring-boot-starter-actuator的Starter。

Actuator的定义
Actuator是制造术语,指的是用于移动或控制某物的机械装置。 Actuator可以通过微小的变化产生大量的运动。

要将Actuator添加到基于Maven的项目,添加以下“Starter”依赖项:

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

2. 端点

Actuator端点允许监视应用程序并与之交互。 Spring Boot包含许多内置端点,也可以添加自己的端点。 例如,health 端点提供基本的应用程序健康信息。

暴露端点的方式取决于选择的技术类型。 大多数应用程序选择HTTP监视,其中端点的ID映射到URL。 例如,默认情况下,

health

端点将映射到

/health

可以使用以下技术不可知端点:

ID 描述 敏感端点


actuator

为其他端点提供基于超媒体的“发现页面”。 需要Spring HATEOAS在类路径上。

true


auditevents

公开当前应用程序的审核事件信息

true


autoconfig

显示自动配置报告,显示所有自动配置候选项以及它们被应用或未被应用的原因

true


beans

显示应用程序中所有Spring bean的完整列表

true


configprops

显示所有@ConfigurationProperties的整理列表

true


dump

执行线程转储

true


env

暴露Spring的ConfigurableEnvironment中的属性

true


flyway

显示已应用的任何Flyway数据库迁移

true


health

显示应用程序运行状况信息(当应用程序是安全的时,通过未经身份验证的连接访问时的简单“status”或经过身份验证时的完整消息详细信息)

false


info

显示任意应用信息

false


loggers

显示和修改应用程序中日志的配置

true


liquibase

显示已应用的任何Liquibase数据库迁移

true


metrics

显示当前应用程序的“metrics”信息

true


mappings

显示所有@RequestMapping路径的整理列表

true


shutdown

允许应用程序正常关闭(默认情况下不启用)

true


trace

显示跟踪信息(默认情况下为最新100个HTTP请求)

true

如果使用的是Spring MVC,还可以使用以下附加端点:

ID 描述 敏感端点


docs

显示Actuator端点的文档,包括示例请求和响应。 需要spring-boot-actuator-docs在类路径上

false


heapdump

返回GZip压缩的hprof堆转储文件

true


jolokia

通过HTTP暴露JMX bean(当Jolokia在类路径上时)

true


logfile

返回日志文件的内容(如果已设置logging.file或logging.path属性)。支持使用HTTP Range头来检索部分日志文件的内容

true

注:根据端点的暴露方式,sensitive(敏感)属性可用作安全提示。 例如,敏感端点在通过HTTP访问时需要用户名/密码(如果未启用Web安全,则只需禁用)。

2.1 自定义端点

可以使用Spring属性自定义端点。 如果端点已启用,则可以更改,如果它被认为是敏感的,甚至是其ID。

例如,这是一个application.properties,它可以更改

beans

端点的敏感度和id,还可以启用

shutdown

endpoints.beans.id=springbeans
endpoints.beans.sensitive=false
endpoints.shutdown.enabled=true

注:前缀

“endpoints + . + name”

用于唯一标识正在配置的端点。

默认情况下,可以启用除shutdown之外的所有端点。 如果希望“opt-in”端点启用,则可以使用endpoints.enabled属性。 例如,以下将禁用除info之外的所有端点:

endpoints.enabled=false
endpoints.info.enabled=true

同样,也可以选择全局设置所有端点的“sensitive”标志。 默认情况下,敏感标志取决于端点类型(请参见上表)。 例如,要将所有端点标记为敏感,info端点除外:

endpoints.sensitive=true
endpoints.info.sensitive=false

2.2 用于actuator MVC端点的超媒体

如果endpoints.hypermedia.enabled设置为true并且Spring HATEOAS位于类路径上(例如,通过spring-boot-starter-hateoas或者如果使用的是Spring Data REST),那么来自Actuator的HTTP端点会通过超媒体链接得到增强,并添加了一个“discovery page”,其中包含指向所有端点的链接。默认情况下,“discovery page”在 /actuator 上可用。它作为端点实现,允许使用属性来配置其路径(endpoints.actuator.path)以及是否启用它(endpoints.actuator.enabled)。

配置自定义管理上下文路径后,“discovery page”将自动从 /actuator 移动到管理上下文的根目录。例如,如果管理上下文路径是 /management ,则可以从 /management 获取发现页面。

如果

HAL浏览器

(

https://github.com/mikekelly/hal-browser

)通过其webjar(org.webjars:hal-browser)位于类路径上,或者通过spring-data-rest-hal-browser,则还提供以HAL浏览器的形式出现HTML“discovery page”。

2.3 CORS支持

Cross-origin resource sharing(CORS)是一种W3C规范,允许以灵活的方式指定授权的跨域请求类型。可以将Actuator的MVC端点配置为支持此类方案。

默认情况下禁用CORS支持,仅在设置了 endpoints.cors.allowed-origins 属性后才启用CORS支持。以下配置允许来自example.com域的GET和POST调用:

endpoints.cors.allowed-origins=http://example.com
endpoints.cors.allowed-methods=GET,POST

查看EndpointCorsProperties类获取完整的选项列表。

2.4 添加自定义端点

如果添加类型为Endpoint的@Bean,它将自动通过JMX和HTTP公开(如果有可用的服务器)。可以通过创建MvcEndpoint类型的bean来进一步自定义HTTP端点。MvcEndpoint不是@Controller,但可以使用@RequestMapping(和@Managed*)来暴露资源。

注:如果将此作为库功能考虑,考虑将以@ManagementContextConfiguration注释的配置类添加到 /META-INF/spring.factories中,key为org.springframework.boot.actuate.autoconfigure.ManagementContextConfiguration。如果这样做,端点将移动到包含所有其他MVC端点的子上下文。如果想要将静态资源添加到管理端点,则以这种方式声明的配置可以是WebConfigurerAdapter。

2.5 Health信息

Health信息可用于检查正在运行的应用程序的状态。监控软件经常使用它来提醒某人生产系统是否出现故障。health端点暴露的默认信息取决于访问方式。对于安全应用程序中未经身份验证的连接,将返回简单的“status”消息,对于经过身份验证的连接,还会显示其他详细信息。

从ApplicationContext中定义的所有HealthIndicator bean收集Health信息。 Spring Boot包含许多自动配置的HealthIndicator,也可以自己编写。默认情况下,最终系统状态由HealthAggregator派生的,HealthAggregator根据有序的状态列表对每个HealthIndicator的状态进行排序。排序列表中的第一个状态用作整体运行状况。如果没有HealthIndicator返回HealthAggregator已知的状态,则使用UNKNOWN状态。

2.6 HealthIndicators的安全性

HealthIndicators返回的信息通常在某种程度上是敏感的。例如,可能不希望暴露数据库服务器的详细信息。因此,默认情况下,未经身份验证的HTTP连接仅暴露health status。如果希望始终公开完整的health信息,则可以将endpoints.health.sensitive设置为false。

health响应也会被缓存以防止“denial of service”攻击。如果要将默认缓存时间更改为1000ms,使用endpoints.health.time-to-live属性。

2.6.1 自动配置的HealthIndicators

Spring Boot会自动配置以下HealthIndicator:

Name Description



CassandraHealthIndicator

检查Cassandra数据库是否已启动。



DiskSpaceHealthIndicator

检查磁盘空间不足。



DataSourceHealthIndicator

检查是否可以获得与DataSource的连接。



ElasticsearchHealthIndicator

检查Elasticsearch集群是否已启动。



JmsHealthIndicator

检查JMS代理是否已启动。



MailHealthIndicator

检查邮件服务器是否已启动。



MongoHealthIndicator

检查Mongo数据库是否已启动。



RabbitHealthIndicator

检查Rabbit服务器是否已启动。



RedisHealthIndicator

检查Redis服务器是否已启动。



SolrHealthIndicator

检查Solr服务器是否已启动。

注:可以使用management.health.defaults.enabled属性禁用它们。

2.6.2 编写自定义HealthIndicators

要提供自定义health信息,可以注册实现HealthIndicator接口的Spring bean。 需要提供health()方法的实现并返回Health响应。 Health响应应包括状态,并可选择包括要显示的其他详细信息。

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;

@Component
public class MyHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        int errorCode = check(); // perform some specific health check
        if (errorCode != 0) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }

}

注:给定HealthIndicator的标识符是没有HealthIndicator后缀的bean的名称(如果存在)。 在上面的示例中,health信息将在名为 my 的条目中提供。

除了Spring Boot的预定义 Status 类型之外,Health还可以返回表示新系统状态的自定义Status。 在这种情况下,还需要提供HealthAggregator接口的自定义实现,或者必须使用management.health.status.order配置属性配置默认实现。

例如,假设在一个HealthIndicator实现中使用了具有代码FATAL的新Status。 要配置严重性顺序,请将以下内容添加到应用程序属性中:

management.health.status.order=FATAL, DOWN, OUT_OF_SERVICE, UNKNOWN, UP

响应中的HTTP状态代码反映了整体健康状况(例如,UP映射到200,OUT_OF_SERVICE或DOWN到503)。 如果通过HTTP访问health端点,可能还希望使用HealthMvcEndpoint注册自定义状态映射。 例如,以下将FATAL映射到503(服务不可用):

endpoints.health.mapping.FATAL=503

内置状态的默认状态映射是:

Status Mapping

DOWN

SERVICE_UNAVAILABLE (503)

OUT_OF_SERVICE

SERVICE_UNAVAILABLE (503)

UP

默认无映射,http status是200

UNKNOWN

默认无映射,http status是200

2.7 应用程序信息

应用程序信息暴露从ApplicationContext中定义的所有InfoContributor bean收集的各种信息。 Spring Boot包含许多自动配置的InfoContributors,也可以自己编写。

2.7.1 自动配置的InfoContributors

适当时,Spring Boot会自动配置以下InfoContributors:

名称 描述



EnvironmentInfoContributor

在info键下暴露Environment中的任何键。



GitInfoContributor

如果git.properties文件可用,则暴露git信息。



BuildInfoContributor

如果META-INF/build-info.properties文件可用,则公开构建信息。

可以使用management.info.defaults.enabled属性禁用它们。

2.7.2 自定义应用程序info信息

可以通过设置 info.* 配置来自定义 info 端点暴露的数据。info键下的所有Environment属性都将自动公开。 例如,可以将以下内容添加到application.properties:

info.app.encoding=UTF-8
info.app.java.source=1.8
info.app.java.target=1.8

可以在构建时扩展信息属性,而不是对这些值进行硬编码。

假设正在使用Maven,可以按如下方式重写上面的示例:

info.app.encoding=@project.build.sourceEncoding@
info.app.java.source=@java.version@
info.app.java.target=@java.version@

2.7.3 Git提交信息

info端点的另一个有用功能是它能够在构建项目时发布有关git源代码仓库状态的信息。 如果GitProperties bean可用,则将公开git.branch,git.commit.id和git.commit.time属性。

注:如果git.properties文件在类路径的根目录中可用,则会自动配置GitProperties bean。

如果要显示完整的git信息(即git.properties的完整内容),请使用management.info.git.mode属性:

management.info.git.mode=full

2.7.4 构建信息

如果BuildProperties bean可用,info端点还可以发布有关构建的信息。 如果类路径中有META-INF / build-info.properties文件,则会发生这种情况。

注:Maven和Gradle插件都可以生成该文件。

2.7.5 编写自定义InfoContributors

要提供自定义应用程序信息,可以注册实现InfoContributor接口的Spring bean。

下面的示例提供了一个带有单个值的example条目:

import java.util.Collections;

import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;

@Component
public class ExampleInfoContributor implements InfoContributor {
    @Override
    public void contribute(Info.Builder builder) {
        builder.withDetail("example", Collections.singletonMap("key", "value"));
    }
}

如果点击info端点,应该看到包含以下附加条目的响应:

{
    "example": {
        "key" : "value"
    }
}