47. Endpoints

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

端点公开的方式取决于您选择的技术类型。大多数应用程序选择 HTTP 监视,其中端点的 IDMap 到 URL。例如,默认情况下,health端点将 Map 到/health

下列技术不可知的端点可用:

IDDescriptionSensitive Default
actuator为其他端点提供基于超媒体的“发现页面”。要求 Spring HATEOAS 位于 Classpath 上。true
auditevents公开当前应用程序的审核事件信息。true
autoconfig显示自动配置报告,该报告显示所有自动配置候选者以及应用它们“被”或“未被”的原因。true
beans显示应用程序中所有 Spring Bean 的完整列表。true
configprops显示所有@ConfigurationProperties的整理列表。true
dump执行线程转储。true
env从 Spring 的ConfigurableEnvironment公开属性。true
flyway显示已应用的所有 Flyway 数据库迁移。true
health显示应用程序的运行状况信息(在应用程序安全的情况下,通过未经身份验证的连接访问时为简单的“状态”,而在经过身份验证时则为完整的消息详细信息)。false
info显示任意应用程序信息。false
loggers显示和修改应用程序中 Logger 的配置。true
liquibase显示已应用的所有 Liquibase 数据库迁移。true
metrics显示当前应用程序的“Metrics”信息。true
mappings显示所有@RequestMapping路径的整理列表。true
shutdown允许正常关闭应用程序(默认情况下未启用)。true
trace显示跟踪信息(默认情况下,最近的 100 个 HTTP 请求)。true

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

IDDescriptionSensitive Default
docs显示 Actuator 端点的文档,包括示例请求和响应。要求spring-boot-actuator-docs在 Classpath 上。false
heapdump返回 GZip 压缩的hprof堆转储文件。true
jolokia通过 HTTP 公开 JMX bean(当 Jolokia 在 Classpath 上时)。true
logfile返回日志文件的内容(如果已设置logging.filelogging.path属性)。支持使用 HTTP RangeHeaders 来检索部分日志文件的内容。true

Note

根据公开端点的方式,sensitive属性可用作安全提示。例如,通过 HTTP 访问敏感端点时,它们将需要用户名/密码(如果未启用 Web 安全,则将其禁用)。

47.1 自定义端点

可以使用 Spring 属性自定义端点。您可以更改端点是否为enabled,端点是否为sensitive甚至是id

例如,这是一个application.properties,它更改beans端点的敏感度和 id 并启用shutdown

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

Note

前缀“ endpoints . name”用于唯一标识正在配置的端点。

默认情况下,除shutdown之外的所有端点均处于启用状态。如果您希望专门启用“启用”端点,则可以使用endpoints.enabled属性。例如,以下将禁用* 以外的所有端点info

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

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

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

47.2ActuatorMVC 端点的超媒体

如果endpoints.hypermedia.enabled设置为trueSpring HATEOAS在 Classpath 上(例如,通过spring-boot-starter-hateoas或如果使用Spring Data REST),则来自 Actuator 的 HTTP 端点将通过超媒体链接进行增强,并添加一个“发现页面”,其中包含指向所有端点。默认情况下,“发现页面”在/actuator上可用。它作为端点实现,允许使用属性来配置其路径(endpoints.actuator.path)以及是否启用它(endpoints.actuator.enabled)。

配置了自定义 Management 上下文路径后,“发现页面”将自动从/actuator移到 Management 上下文的根目录。例如,如果 Management 上下文路径为/management,则可以从/management访问发现页面。

如果HAL Browser通过其 webjar(org.webjars:hal-browser)或spring-data-rest-hal-browser在 Classpath 中,则还将提供 HAL 浏览器形式的 HTML“发现页面”。

47.3 CORS 支持

跨域资源共享(CORS)是W3C specification,它使您可以灵活地指定授权哪种跨域请求。可以将 Actuator 的 MVC 端点配置为支持此类方案。

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

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

Tip

检查EndpointCorsProperties以获取完整的选项列表。

47.4 添加自定义端点

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

Tip

如果您将其作为库功能执行,请考虑在键org.springframework.boot.actuate.autoconfigure.ManagementContextConfiguration下向/META-INF/spring.factories添加带有@ManagementContextConfigurationComments 的配置类。如果这样做,则如果用户要求使用单独的 Management 端口或地址,则该终结点将与所有其他 MVC 终结点一起移至子上下文。如果要向 Management 端点添加静态资源(例如),则以这种方式声明的配置可以为WebConfigurerAdapter

47.5 健康信息

健康信息可用于检查正在运行的应用程序的状态。监视软件通常使用它来警告生产系统出现故障的人。 health终结点公开的默认信息取决于如何访问它。对于安全应用程序中未经身份验证的连接,将返回简单的“状态”消息,对于经过身份验证的连接,还将显示其他详细信息(有关 HTTP 详细信息,请参阅第 48.7 节“ HTTP 运行状况端点格式和访问限制”)。

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

47.6 健康 Metrics 的安全性

HealthIndicators返回的信息本质上通常有些敏感。例如,您可能不想将数据库服务器的详细信息发布给全世界。因此,默认情况下,仅健康状态通过未经身份验证的 HTTP 连接公开。如果您希望始终获得完整的健康信息,可以将endpoints.health.sensitive设置为false

健康响应也被缓存以防止“拒绝服务”攻击。如果要更改默认的缓存时间 1000 毫秒,请使用endpoints.health.time-to-live属性。

47.6.1 自动配置的健康 Metrics

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

NameDescription
CassandraHealthIndicator检查 Cassandra 数据库是否已启动。
DiskSpaceHealthIndicator检查磁盘空间不足。
DataSourceHealthIndicator检查是否可以构建到DataSource的连接。
ElasticsearchHealthIndicator检查 Elasticsearch 集群是否已启动。
JmsHealthIndicator检查 JMS 代理是否启动。
MailHealthIndicator检查邮件服务器是否已启动。
MongoHealthIndicator检查 Mongo 数据库是否已启动。
RabbitHealthIndicator检查 Rabbit 服务器是否已启动。
RedisHealthIndicator检查 Redis 服务器是否启动。
SolrHealthIndicator检查 Solr 服务器是否已启动。

Tip

可以使用management.health.defaults.enabled属性将其全部禁用。

47.6.2 编写自定义健康 Metrics

要提供自定义健康信息,您可以注册实现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();
    }

}

Note

给定HealthIndicator的标识符是不带HealthIndicator后缀(如果存在)的 bean 的名称。在上面的示例中,健康信息将在名为my的条目中可用。

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

例如,假设在您的HealthIndicator实现中使用的是新的Status代码为FATAL。要配置严重性 Sequences,请在应用程序属性中添加以下内容:

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

响应中的 HTTP 状态代码反映了总体健康状态(例如UPMap 到 200,OUT_OF_SERVICEDOWNMap 到 503)。如果通过 HTTP 访问运行状况终结点,则可能还需要向HealthMvcEndpoint注册自定义状态 Map。例如,以下 MapFATAL到 503(服务不可用):

endpoints.health.mapping.FATAL=503

内置状态的默认状态 Map 为:

StatusMapping
DOWNSERVICE_UNAVAILABLE (503)
OUT_OF_SERVICESERVICE_UNAVAILABLE (503)
UP默认情况下没有 Map,因此 http 状态为 200
UNKNOWN默认情况下没有 Map,因此 http 状态为 200

47.7 申请信息

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

47.7.1 自动配置的信息贡献者

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

NameDescription
EnvironmentInfoContributor公开info键下的Environment键。
GitInfoContributor如果git.properties文件可用,则公开 git 信息。
BuildInfoContributor如果META-INF/build-info.properties文件可用,则公开构建信息。

Tip

可以使用management.info.defaults.enabled属性将其全部禁用。

47.7.2 自定义应用程序信息信息

您可以通过设置info.* Spring 属性来自定义info终结点公开的数据。 info 键下的所有Environment属性将自动显示。例如,您可以将以下内容添加到application.properties

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

Tip

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

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

info.app.encoding[emailprotected]@
info.app.java.source[emailprotected]@
info.app.java.target[emailprotected]@

47.7.3 Git 提交信息

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

Tip

如果git.properties文件在 Classpath 的根目录中可用,则会自动配置GitProperties bean。有关更多详细信息,请参见生成 git 信息

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

management.info.git.mode=full

47.7.4 生成信息

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

Tip

Maven 和 Gradle 插件都可以生成该文件,有关更多详细信息,请参见生成构建信息

47.7.5 编写自定义 InfoContributor

要提供自定义应用程序信息,您可以注册实现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"
    }
}