0%

SpringBoot官方文档翻译-SpringBoot-Actuator可用于生产的功能

Spring Boot 包含许多附加功能,可在您将应用程序投入生产时帮助您监视和 Management 应用程序。您可以选择使用 HTTP 端点或 JMX Management 和监视您的应用程序。审核,运行状况和 Metrics 收集也可以自动应用于您的应用程序。

启用生产就绪功能

spring-boot-actuator模块提供了 Spring Boot 生产就绪的所有功能。启用功能的最简单方法是将依赖项添加到spring-boot-starter-actuator‘Starter’。

Actuator定义

致动器是一个制造业术语,指用于移动或控制某物的机械装置。执行器可以从一个微小的变化产生大量的运动。

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

1
2
3
4
5
6
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>

对于 Gradle,使用以下声明:

1
2
3
dependencies {
compile("org.springframework.boot:spring-boot-starter-actuator")
}

Endpoints

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

每个端点可以是启用或禁用。这控制了是否创建了端点以及它的 bean 在应用程序上下文中是否存在。要远程访问,端点也必须是通过 JMX 或 HTTP 公开。大多数应用程序选择 HTTP,其中终结点的 ID 和前缀/actuatorMap 到 URL。例如,默认情况下,health端点 Map 到/actuator/health

可以使用以下与技术无关的端点:

ID Description 默认启用
auditevents 公开当前应用程序的审核事件信息。 Yes
beans 显示应用程序中所有 Spring Bean 的完整列表。 Yes
caches 公开可用的缓存。 Yes
conditions 显示在配置和自动配置类上评估的条件以及它们匹配或不匹配的原因。 Yes
configprops 显示所有@ConfigurationProperties的整理列表。 Yes
env 从 Spring 的ConfigurableEnvironment公开属性。 Yes
flyway 显示已应用的所有 Flyway 数据库迁移。 Yes
health 显示应用程序运行状况信息。 Yes
httptrace 显示 HTTP 跟踪信息(默认情况下,最近 100 个 HTTP 请求-响应交换)。 Yes
info 显示任意应用程序信息。 Yes
integrationgraph 显示 Spring Integration 图。 Yes
loggers 显示和修改应用程序中 Logger 的配置。 Yes
liquibase 显示已应用的所有 Liquibase 数据库迁移。 Yes
metrics 显示当前应用程序的“Metrics”信息。 Yes
mappings 显示所有@RequestMapping路径的整理列表。 Yes
scheduledtasks 显示应用程序中的计划任务。 Yes
sessions 允许从 Spring Session 支持的会话存储中检索和删除用户会话。使用 Spring Session 对反应式 Web 应用程序的支持时不可用。 Yes
shutdown 使应用程序正常关闭。 No
threaddump 执行线程转储。 Yes

如果您的应用程序是 Web 应用程序(Spring MVC,Spring WebFlux 或 Jersey),则可以使用以下附加端点:

ID Description 默认启用
heapdump 返回一个hprof堆转储文件。 Yes
jolokia 通过 HTTP 公开 JMX bean(当 Jolokia 在 Classpath 上时,不适用于 WebFlux)。 Yes
logfile 返回日志文件的内容(如果已设置logging.filelogging.path属性)。支持使用 HTTP RangeHeaders 来检索部分日志文件的内容。 Yes
prometheus 以 Prometheus 服务器可以抓取的格式公开 Metrics。 Yes

要了解有关 Actuator 端点及其请求和响应格式的更多信息,请参阅单独的 API 文档(HTMLPDF)。

启用端点

默认情况下,除shutdown之外的所有端点均处于启用状态。要配置端点的启用,请使用其management.endpoint.<id>.enabled属性。以下示例启用shutdown端点:

1
management.endpoint.shutdown.enabled=true

如果您宁愿选择启用端点启用而不是选择退出,请将management.endpoints.enabled-by-default属性设置为false并使用单个端点enabled属性选择重新加入。以下示例启用info端点并禁用所有其他端点:

1
2
management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true

Note

禁用的端点将从应用程序上下文中完全删除。如果您只想更改端点公开的技术,请改用包含和排除属性

暴露端点

由于端点可能包含敏感信息,因此应谨慎考虑何时公开它们。下表显示了内置端点的默认暴露:

ID JMX Web
auditevents Yes No
beans Yes No
caches Yes No
conditions Yes No
configprops Yes No
env Yes No
flyway Yes No
health Yes Yes
heapdump N/A No
httptrace Yes No
info Yes Yes
integrationgraph Yes No
jolokia N/A No
logfile N/A No
loggers Yes No
liquibase Yes No
metrics Yes No
mappings Yes No
prometheus N/A No
scheduledtasks Yes No
sessions Yes No
shutdown Yes No
threaddump Yes No

要更改公开哪些端点,请使用以下特定于技术的includeexclude属性:

Property Default
management.endpoints.jmx.exposure.exclude
management.endpoints.jmx.exposure.include *
management.endpoints.web.exposure.exclude
management.endpoints.web.exposure.include info, health

include属性列出了公开的端点的 ID。 exclude属性列出了不应公开的端点的 ID。 exclude属性优先于include属性。 includeexclude属性都可以使用端点 ID 列表进行配置。

例如,要停止通过 JMX 公开所有端点,而仅公开healthinfo端点,请使用以下属性:

1
management.endpoints.jmx.exposure.include=health,info

*可用于选择所有端点。例如,要通过 HTTP 公开除envbeans端点之外的所有内容,请使用以下属性:

1
2
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans

Note

*在 YAML 中具有特殊含义,因此,如果要包括(或排除)所有端点,请确保添加引号,如以下示例所示:

1
2
3
4
5
management:
endpoints:
web:
exposure:
include: "*"

Note

如果您的申请公开公开,我们强烈建议您也保护您的端点

Tip

如果要针对暴露端点的时间实施自己的策略,则可以注册EndpointFilter bean。

保护HTTP端点

您应该像对待其他任何敏感 URL 一样,小心保护 HTTP 端点的安全。如果存在 Spring Security,则默认情况下使用 Spring Security 的内容协商策略保护端点的安全。例如,如果您希望为 HTTP 端点配置自定义安全性,只允许具有特定角色的用户访问它们,Spring Boot 提供了一些方便的RequestMatcher对象,可以将它们与 Spring Security 结合使用。

典型的 Spring Security 配置可能类似于以下示例:

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()
.anyRequest().hasRole("ENDPOINT_ADMIN")
.and()
.httpBasic();
}

}

前面的示例使用EndpointRequest.toAnyEndpoint()将请求匹配到任何端点,然后确保所有角色都具有ENDPOINT_ADMIN角色。 EndpointRequest上还有其他几种匹配器方法。有关详细信息,请参见 API 文档(HTMLPDF)。

如果将应用程序部署在防火墙后面,则可能希望可以在不进行身份验证的情况下访问所有 Actuator 端点。您可以通过更改management.endpoints.web.exposure.include属性来做到这一点,如下所示:

application.properties.

1
management.endpoints.web.exposure.include=*

此外,如果存在 Spring Security,则需要添加自定义安全配置,该配置允许未经身份验证的端点访问,如以下示例所示:

1
2
3
4
5
6
7
8
9
10
@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()
.anyRequest().permitAll();
}

}

配置端点

端点自动缓存对不带任何参数的读取操作的响应。要配置端点缓存响应的时间,请使用其cache.time-to-live属性。以下示例将beans终结点的缓存的生存时间设置为 10 秒:

application.properties.

1
management.endpoint.beans.cache.time-to-live=10s

Note

前缀management.endpoint.<name>用于唯一标识正在配置的端点。

Note

发出经过身份验证的 HTTP 请求时,Principal被视为端点的 Importing,因此将不缓存响应。

用于ActuatorWeb端点的超媒体

添加了“发现页面”以及指向所有端点的链接。默认情况下,“发现页面”在/actuator上可用。

配置自定义 Management 上下文路径后,“发现页面”会自动从/actuator移到 Management 上下文的根目录。例如,如果 Management 上下文路径为/management,则可从/management访问发现页面。当 Management 上下文路径设置为/时,将禁用发现页面,以防止与其他 Map 发生冲突的可能性。

CORS支持

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

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

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

Tip

有关选项的完整列表,请参见CorsEndpointProperties

实现自定义端点

如果添加带有@EndpointComments 的@Bean,则带有@ReadOperation@WriteOperation@DeleteOperationComments 的任何方法都将通过 JMX 以及 Web 应用程序中的 HTTP 自动公开。可以使用 Jersey,Spring MVC 或 Spring WebFlux 通过 HTTP 公开端点。

您还可以使用@JmxEndpoint@WebEndpoint编写技术特定的端点。这些端点仅限于其各自的技术。例如,@WebEndpoint仅通过 HTTP 而不是 JMX 公开。

您可以使用@EndpointWebExtension@EndpointJmxExtension编写技术特定的扩展。这些 Comments 使您可以提供特定于技术的操作来扩展现有端点。

最后,如果您需要访问特定于 Web 框架的功能,则可以实现 Servlet 或 Spring @Controller@RestController端点,但代价是它们无法通过 JMX 或使用其他 Web 框架使用。

接收输入

端点上的操作通过其参数接收 Importing。通过网络公开时,这些参数的值取自 URL 的查询参数和 JSON 请求正文。通过 JMX 公开时,参数将 Map 到 MBean 操作的参数。默认情况下,参数是必需的。可以通过使用@org.springframework.lang.Nullable对其进行 Comments 来使它们成为可选的。

JSON 请求正文中的每个根属性都可以 Map 到端点的参数。考虑以下 JSON 请求正文:

1
2
3
4
{
"name": "test",
"counter": 42
}

这可用于调用采用String nameint counter参数的写操作。

Tip

由于端点与技术无关,因此只能在方法签名中指定简单类型。特别是,不支持使用定义namecounter属性的自定义类型声明单个参数。

Note

为了将 ImportingMap 到操作方法的参数,实现端点的 Java 代码应使用-parameters编译,而实现端点的 Kotlin 代码应使用-java-parameters编译。如果您使用的是 Spring Boot 的 Gradle 插件,或者您使用的是 Maven 和spring-boot-starter-parent,那么这将自动发生。

Importing类型转换

如有必要,传递给端点操作方法的参数会自动转换为所需的类型。在调用操作方法之前,使用ApplicationConversionService实例将通过 JMX 或 HTTP 请求接收的 Importing 转换为所需的类型。

自定义Web端点

使用 Jersey,Spring MVC 或 Spring WebFlux 通过 HTTP 自动公开@Endpoint@WebEndpoint@EndpointWebExtension上的操作。

Web端点请求预测

对于在暴露于 Web 的端点上的每个操作,都会自动生成一个请求谓词。

Path

谓词的路径由终结点的 ID 和暴露于 Web 的终结点的基本路径确定。默认基本路径为/actuator。例如,ID 为sessions的端点将使用/actuator/sessions作为其在谓词中的路径。

通过使用@SelectorComments 操作方法的一个或多个参数,可以进一步自定义路径。将这样的参数作为路径变量添加到路径谓词。当端点操作被调用时,变量的值被传递到操作方法中。

HTTP方法

谓词的 HTTP 方法由操作类型决定,如下表所示:

Operation HTTP method
@ReadOperation GET
@WriteOperation POST
@DeleteOperation DELETE

Consumes

对于使用请求正文的@WriteOperation(HTTP POST),谓词的消耗子句为application/vnd.spring-boot.actuator.v2+json, application/json。对于所有其他操作,消耗子句为空。

Produces

谓词的 Produces 子句可以由@DeleteOperation@ReadOperation@WriteOperation注解的produces属性确定。该属性是可选的。如果未使用,则会自动确定 produces 子句。

如果操作方法返回voidVoid,则 produces 子句为空。如果操作方法返回org.springframework.core.io.Resource,则 Produces 子句为application/octet-stream。对于所有其他操作,produces 子句为application/vnd.spring-boot.actuator.v2+json, application/json

Web端点响应状态

端点操作的默认响应状态取决于操作类型(读,写或删除)以及该操作返回的内容(如果有)。

@ReadOperation返回一个值,响应状态将为 200(确定)。如果未返回值,则响应状态将为 404(未找到)。

如果@WriteOperation@DeleteOperation返回值,则响应状态将为 200(确定)。如果未返回值,则响应状态将为 204(无内容)。

如果在没有必需参数或无法将参数转换为必需类型的参数的情况下调用操作,则不会调用该操作方法,并且响应状态将为 400(错误请求)。

Web端点范围请求

HTTP 范围请求可用于请求 HTTP 资源的一部分。使用 Spring MVC 或 Spring Web Flux 时,返回org.springframework.core.io.Resource的操作自动支持范围请求。

Note

使用 Jersey 时不支持范围请求。

Web端点安全

Web 终结点或特定于 Web 的终结点扩展上的操作可以接收当前的java.security.Principalorg.springframework.boot.actuate.endpoint.SecurityContext作为方法参数。前者通常与@Nullable结合使用,以为经过身份验证和未经身份验证的用户提供不同的行为。后者通常用于使用其isUserInRole(String)方法执行授权检查。

Servlet端点

通过实现带有@ServletEndpointComments 的类(也可以实现Supplier<EndpointServlet>),可以将Servlet公开为端点。 Servlet 端点提供了与 Servlet 容器的更深层集成,但以可移植性为代价。它们旨在用于将现有的Servlet公开为端点。对于新端点,应尽可能使用@Endpoint@WebEndpoint注解。

控制器端点

@ControllerEndpoint@RestControllerEndpoint可用于实现仅由 Spring MVC 或 Spring WebFlux 公开的端点。使用 Spring MVC 和 Spring WebFlux 的标准 Comments(例如@RequestMapping@GetMapping)Map 方法,并将端点的 ID 用作路径的前缀。控制器端点提供了与 Spring Web 框架的更深层集成,但以可移植性为代价。尽可能使用@Endpoint@WebEndpoint注解。

健康信息

您可以使用运行状况信息来检查正在运行的应用程序的状态。监视软件通常使用它在生产系统出现故障时向某人发出警报。 health端点公开的信息取决于management.endpoint.health.show-details属性,该属性可以配置以下值之一:

Name Description
never 详细信息永远不会显示。
when-authorized 详细信息仅显示给授权用户。可以使用management.endpoint.health.roles配置授权角色。
always 向所有用户显示详细信息。

默认值为never。当用户担任一个或多个端点的角色时,该用户被视为已授权。如果端点没有配置的角色(默认值),则所有通过身份验证的用户均被视为已授权。可以使用management.endpoint.health.roles属性配置角色。

Note

如果您已保护应用程序安全并希望使用always,则安全配置必须允许经过身份验证的用户和未经身份验证的用户都可以访问运行状况端点。

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

Tip

HealthIndicatorRegistry可用于在运行时注册和注销运行状况指示器。

自动配置的健康HealthIndicators

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

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

Tip

您可以通过设置management.health.defaults.enabled属性来全部禁用它们。

编写自定义健康HealthIndicators

要提供自定义健康信息,您可以注册实现HealthIndicator接口的 Spring bean。您需要提供health()方法的实现并返回Health响应。 Health响应应包含状态,并且可以选择包含要显示的其他详细信息。以下代码显示了示例HealthIndicator实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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,请将以下属性添加到您的应用程序属性中:

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

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

1
management.health.status.http-mapping.FATAL=503

Tip

如果需要更多控制,则可以定义自己的HealthStatusHttpMapper bean。

下表显示了内置状态的默认状态 Map:

Status Mapping
DOWN SERVICE_UNAVAILABLE (503)
OUT_OF_SERVICE SERVICE_UNAVAILABLE (503)
UP 默认情况下没有 Map,因此 http 状态为 200
UNKNOWN 默认情况下没有 Map,因此 http 状态为 200

Reactive健康指示器

对于响应式应用程序,例如使用 Spring WebFlux 的应用程序,ReactiveHealthIndicator提供了非阻塞 Contract 以获取应用程序的运行状况。与传统HealthIndicator相似,健康信息是从ReactiveHealthIndicatorRegistry的内容中收集的(默认情况下,在ApplicationContext中定义的所有HealthIndicatorReactiveHealthIndicator实例。常规HealthIndicator不会根据反应式 API 进行检查,都是在弹性调度程序上执行的。

Tip

在响应式应用程序中,ReactiveHealthIndicatorRegistry可用于在运行时注册和注销运行状况指示器。

要从反应式 API 提供自定义健康信息,您可以注册实现ReactiveHealthIndicator接口的 Spring bean。以下代码显示了一个示例ReactiveHealthIndicator实现:

1
2
3
4
5
6
7
8
9
10
@Component
public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {

@Override
public Mono<Health> health() {
return doHealthCheck() //perform some specific health check that returns a Mono<Health>
.onErrorResume(ex -> Mono.just(new Health.Builder().down(ex).build())));
}

}

Tip

要自动处理错误,请考虑从AbstractReactiveHealthIndicator扩展。

自动配置的ReactiveHealthIndicators

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

Name Description
CassandraReactiveHealthIndicator 检查 Cassandra 数据库是否已启动。
CouchbaseReactiveHealthIndicator 检查 Couchbase 群集是否已启动。
MongoReactiveHealthIndicator 检查 Mongo 数据库是否已启动。
RedisReactiveHealthIndicator 检查 Redis 服务器是否启动。

Tip

如有必要,可用无功指示器代替常规指示器。另外,任何未明确处理的HealthIndicator都会自动包装。

健康组

有时,将运行状况指标组织到可用于不同目的的组中是有用的。

若要创建运行状况指示符组,可以使用management.end .health.group。属性,并指定要包含或排除的运行状况指示器id列表。例如,要创建一个只包含数据库指示器的组,您可以定义以下内容:

1
management.endpoint.health.group.custom.include=db

你可以点击localhost:8080/actuator/health/custom查看结果。

默认情况下,组将继承与系统运行状况相同的StatusAggregator和HttpCodeStatusMapper设置,但是,也可以按组定义这些设置。如果需要,也可以覆盖显示细节和角色属性:

1
2
3
4
5
management.endpoint.health.group.custom.show-details=when-authorized
management.endpoint.health.group.custom.roles=admin
management.endpoint.health.group.custom.status.order=fatal,up
management.endpoint.health.group.custom.status.http-mapping.fatal=500
management.endpoint.health.group.custom.status.http-mapping.out-of-service=500

如果需要注册自定义StatusAggregator或HttpCodeStatusMapper bean以便与组一起使用,则可以使用@Qualifier(“groupname”)。

Kubernetes探头

应用信息

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

自动配置的信息贡献者

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

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

Tip

通过设置management.info.defaults.enabled属性,可以全部禁用它们。

自定义应用程序信息

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

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

Tip

除了对这些值进行硬编码,您还可以在构建时扩展信息属性

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

1
2
3
info.app.encoding[emailprotected]@
info.app.java.source[emailprotected]@
info.app.java.target[emailprotected]@

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属性,如下所示:

1
management.info.git.mode=full

生成信息

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

Tip

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

编写自定义信息提供者

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

下面的示例使用单个值贡献一个example条目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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端点,则应该看到包含以下附加条目的响应:

1
2
3
4
5
{
"example": {
"key" : "value"
}
}

通过HTTP进行监视和管理

如果您正在开发 Web 应用程序,则 Spring Boot Actuator 会自动配置所有启用的端点以通过 HTTP 公开。默认约定是使用端点的id和前缀/actuator作为 URL 路径。例如,health被公开为/actuator/health。提示:Spring MVC,Spring WebFlux 和 Jersey 本身支持 Actuator。

自定义Management端点路径

有时,自定义 Management 端点的前缀很有用。例如,您的应用程序可能已经将/actuator用于其他用途。您可以使用management.endpoints.web.base-path属性来更改 Management 端点的前缀,如以下示例所示:

1
management.endpoints.web.base-path=/manage

前面的application.properties示例将端点从/actuator/{id}更改为/manage/{id}(例如/manage/info)。

Note

除非 Management 端口已配置为通过使用其他 HTTP 端口公开端点,否则management.endpoints.web.base-path是相对于server.servlet.context-path的。如果配置了management.server.port,则management.endpoints.web.base-path相对于management.server.servlet.context-path

如果要将端点 Map 到其他路径,可以使用management.endpoints.web.path-mapping属性。

以下示例将/actuator/health重新 Map 到/healthcheck

application.properties.

1
2
management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.health=healthcheck

自定义Management服务器端口

对于基于云的部署,使用默认的 HTTP 端口公开 Management 端点是明智的选择。但是,如果您的应用程序在自己的数据中心内运行,则您可能更喜欢使用其他 HTTP 端口公开端点。

您可以设置management.server.port属性来更改 HTTP 端口,如以下示例所示:

1
management.server.port=8081

配置特定于Management的SSL

当配置为使用自定义端口时,还可以通过使用各种management.server.ssl.*属性将 Management 服务器配置为其自己的 SSL。例如,这样做可以使 Management 服务器在主应用程序使用 HTTPS 时通过 HTTP 可用,如以下属性设置所示:

1
2
3
4
5
6
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:store.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=false

另外,主服务器和 Management 服务器都可以使用 SSL,但具有不同的密钥库,如下所示:

1
2
3
4
5
6
7
8
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=true
management.server.ssl.key-store=classpath:management.jks
management.server.ssl.key-password=secret

自定义Management服务器地址

您可以通过设置management.server.address属性来自定义 Management 端点可用的地址。如果您只想侦听内部或面向操作的网络,或者只侦听来自localhost的连接,则这样做很有用。

Note

仅当端口与主服务器端口不同时,您才能在其他地址上侦听。

以下示例application.properties不允许远程 Management 连接:

1
2
management.server.port=8081
management.server.address=127.0.0.1

禁用HTTP端点

如果您不想通过 HTTP 公开端点,则可以将 Management 端口设置为-1,如以下示例所示:

1
management.server.port=-1

也可以使用management.endpoints.web.exposure.exclude属性来实现,如以下示例所示:

1
management.endpoints.web.exposure.exclude=*

通过JMX进行监视和管理

Java Management 扩展(JMX)提供了监视和 Management 应用程序的标准机制。默认情况下,Spring Boot 在org.springframework.boot域下将 Management 端点公开为 JMX MBean。

自定义MBean名称

MBean 的名称通常是从端点的id生成的。例如,health端点公开为org.springframework.boot:type=Endpoint,name=Health

如果您的应用程序包含多个 Spring ApplicationContext,则您可能会发现名称冲突。要解决此问题,可以将spring.jmx.unique-names属性设置为true,以便 MBean 名称始终是唯一的。

您还可以自定义暴露端点的 JMX 域。以下设置显示了在application.properties中执行此操作的示例:

1
2
spring.jmx.unique-names=true
management.endpoints.jmx.domain=com.example.myapp

禁用JMX端点

如果不想通过 JMX 公开终结点,可以将management.endpoints.jmx.exposure.exclude属性设置为*,如以下示例所示:

1
management.endpoints.jmx.exposure.exclude=*

通过HTTP将Jolokia用于JMX

Jolokia 是一个 JMX-HTTP bridge,它提供了一种访问 JMX Bean 的替代方法。要使用 Jolokia,请包括对org.jolokia:jolokia-core的依赖。例如,使用 Maven,您将添加以下依赖项:

1
2
3
4
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>

然后,可以通过向management.endpoints.web.exposure.include属性添加jolokia*来暴露 Jolokia 端点。然后,可以通过在 Management HTTP 服务器上使用/actuator/jolokia来访问它。

自定义Jolokia

Jolokia 具有许多设置,这些设置通常是通过设置 servlet 参数进行配置的。通过 Spring Boot,您可以使用application.properties文件。为此,请在参数前面加上management.endpoint.jolokia.config.,如以下示例所示:

1
management.endpoint.jolokia.config.debug=true

禁用Jolokia

如果您使用 Jolokia 但不希望 Spring Boot 对其进行配置,则将management.endpoint.jolokia.enabled属性设置为false,如下所示:

1
management.endpoint.jolokia.enabled=false

Loggers

Spring Boot Actuator 可以在运行时查看和配置应用程序的日志级别。您可以查看整个列表,也可以查看单个 Logger 的配置,该配置由显式配置的记录级别以及由记录框架赋予它的有效记录级别组成。这些级别可以是以下之一:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • OFF
  • null

null表示没有显式配置。

配置Logger

要配置给定的 Logger,请为资源的 URI POST部分实体,如以下示例所示:

1
2
3
{
"configuredLevel": "DEBUG"
}

Tip

要“重置”Logger 的特定级别(并使用默认配置),可以将值null作为configuredLevel传递。

Metrics

Spring Boot Actuator 为Micrometer提供依赖关系 Management 和自动配置,Micrometer是一种应用程序 Metrics 外观,支持众多监视系统,包括:

Tip

要了解有关 Micrometer 功能的更多信息,请参阅其reference documentation,尤其是concepts section

使用Starter

Spring Boot 自动配置组合MeterRegistry,并为其在 Classpath 上找到的每个受支持的实现向组合添加注册表。在运行时 Classpath 中具有micrometer-registry-{system}的依赖关系足以让 Spring Boot 配置注册表。

大多数注册表具有共同的 Feature。例如,即使 Micrometer 注册表实现位于 Classpath 中,您也可以禁用特定的注册表。例如,要禁用 Datadog:

1
management.metrics.export.datadog.enabled=false

Spring Boot 还会将任何自动配置的注册表添加到Metrics类的全局静态复合注册表中,除非您明确告知不要:

1
management.metrics.use-global-registry=false

您可以注册任意数量的MeterRegistryCustomizer bean 来进一步配置注册表,例如在向注册表注册任何计量器之前应用通用标签:

1
2
3
4
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("region", "us-east-1");
}

您可以通过更具体地了解通用类型,将自定义应用于特定的注册表实现:

1
2
3
4
@Bean
MeterRegistryCustomizer<GraphiteMeterRegistry> graphiteMetricsNamingConvention() {
return registry -> registry.config().namingConvention(MY_CUSTOM_CONVENTION);
}

完成该设置后,您可以在组件中注入MeterRegistry并注册 Metrics:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component
public class SampleBean {

private final Counter counter;

public SampleBean(MeterRegistry registry) {
this.counter = registry.counter("received.messages");
}

public void handleMessage(String message) {
this.counter.increment();
// handle message implementation
}

}

Spring Boot 也是配置内置仪器(即MeterBinder实现),您可以通过配置或专用 Comments 标记进行控制。

支持的监视系统

AppOptics

默认情况下,AppOptics 注册表会定期将 Metrics 推送到api.appoptics.com/v1/measurements。要将 Metrics 导出到 SaaS AppOptics,必须提供您的 API 令牌:

1
management.metrics.export.appoptics.api-token=YOUR_TOKEN

Atlas

默认情况下,度量标准导出到在本地计算机上运行的Atlas。可以使用以下方式提供要使用的Atlas server的位置:

1
management.metrics.export.atlas.uri=http://atlas.example.com:7101/api/v1/publish

Datadog

Datadog 注册表会定期将 Metrics 推送到datadoghq。要将 Metrics 导出到Datadog,必须提供您的 API 密钥:

1
management.metrics.export.datadog.api-key=YOUR_KEY

您还可以更改将度量标准发送到 Datadog 的时间间隔:

1
management.metrics.export.datadog.step=30s

Dynatrace

Dynatrace 注册表会定期将 Metrics 推送到配置的 URI。要将 Metrics 导出到Dynatrace,必须提供您的 API 令牌,设备 ID 和 URI:

1
2
3
management.metrics.export.dynatrace.api-token=YOUR_TOKEN
management.metrics.export.dynatrace.device-id=YOUR_DEVICE_ID
management.metrics.export.dynatrace.uri=YOUR_URI

您还可以更改将度量标准发送到 Dynatrace 的时间间隔:

1
management.metrics.export.dynatrace.step=30s

Elastic

默认情况下,度量标准导出到在本地计算机上运行的Elastic。可以使用以下属性提供要使用的 Elastic 服务器的位置:

1
management.metrics.export.elastic.host=http://elastic.example.com:8086

Ganglia

默认情况下,度量标准导出到在本地计算机上运行的Ganglia。可以使用以下方式提供要使用的Ganglia server主机和端口:

1
2
management.metrics.export.ganglia.host=ganglia.example.com
management.metrics.export.ganglia.port=9649

Graphite

默认情况下,度量标准导出到在本地计算机上运行的Graphite。可以使用以下方式提供要使用的Graphite server主机和端口:

1
2
management.metrics.export.graphite.host=graphite.example.com
management.metrics.export.graphite.port=9004

千分尺提供默认值HierarchicalNameMapper,该默认值HierarchicalNameMapper决定尺寸表 ID Map 到平面层次结构名称的方式。

Tip

要控制此行为,请定义您的GraphiteMeterRegistry并提供您自己的HierarchicalNameMapper。除非您定义自己的,否则将提供自动配置的GraphiteConfigClock bean:

1
2
3
4
@Bean
public GraphiteMeterRegistry graphiteMeterRegistry(GraphiteConfig config, Clock clock) {
return new GraphiteMeterRegistry(config, clock, MY_HIERARCHICAL_MAPPER);
}

Humio

默认情况下,Humio 注册表会定期将 Metrics 推送到cloud.humio.com。要将 Metrics 导出到 SaaS Humio,必须提供您的 API 令牌:

1
management.metrics.export.humio.api-token=YOUR_TOKEN

您还应该配置一个或多个标记以标识将度量标准推送到的数据源:

1
2
management.metrics.export.humio.tags.alpha=a
management.metrics.export.humio.tags.bravo=b

Influx

默认情况下,度量标准导出到在本地计算机上运行的Influx。可以使用以下方式提供要使用的Influx server的位置:

1
management.metrics.export.influx.uri=http://influx.example.com:8086

JMX

千分尺提供到JMX的层次结构 Map,主要是作为一种便宜且可移植的方式在本地查看 Metrics。默认情况下,Metrics 会导出到metrics JMX 域。可以使用以下方式提供要使用的域:

1
management.metrics.export.jmx.domain=com.example.app.metrics

千分尺提供默认值HierarchicalNameMapper,该默认值HierarchicalNameMapper决定尺寸表 ID Map 到平面层次结构名称的方式。

Tip

要控制此行为,请定义您的JmxMeterRegistry并提供您自己的HierarchicalNameMapper。除非您定义自己的,否则将提供自动配置的JmxConfigClock bean:

1
2
3
4
@Bean
public JmxMeterRegistry jmxMeterRegistry(JmxConfig config, Clock clock) {
return new JmxMeterRegistry(config, clock, MY_HIERARCHICAL_MAPPER);
}

KairosDB

默认情况下,度量标准导出到在本地计算机上运行的KairosDB。可以使用以下方式提供要使用的KairosDB server的位置:

1
management.metrics.export.kairos.uri=http://kairosdb.example.com:8080/api/v1/datapoints

NewRelic

新的 Relic 注册表会定期将 Metrics 推送到New Relic。要将 Metrics 导出到New Relic,必须提供您的 API 密钥和帐户 ID:

1
2
management.metrics.export.newrelic.api-key=YOUR_KEY
management.metrics.export.newrelic.account-id=YOUR_ACCOUNT_ID

您还可以更改将度量标准发送到 New Relic 的时间间隔:

1
management.metrics.export.newrelic.step=30s

Prometheus

Prometheus希望抓取或轮询单个应用程序实例以获取 Metrics。 Spring Boot 在/actuator/prometheus处提供了一个 Actuator 端点,以渲染具有适当格式的Prometheus scrape

Tip

该端点默认情况下不可用,必须公开,有关更多详细信息,请参见exposing endpoints

这是将scrape_config添加到prometheus.yml的示例:

1
2
3
4
5
scrape_configs:
- job_name: 'spring'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['HOST:PORT']

SignalFx

SignalFx 注册表会定期将 Metrics 推送到SignalFx。要将 Metrics 导出到SignalFx,必须提供您的访问令牌:

1
management.metrics.export.signalfx.access-token=YOUR_ACCESS_TOKEN

您还可以更改将度量标准发送到 SignalFx 的时间间隔:

1
management.metrics.export.signalfx.step=30s

Simple(in-memory)

千分尺附带一个简单的内存后端,如果未配置其他注册表,该后端将自动用作后备。这使您可以查看metrics endpoint中收集了哪些 Metrics。

使用任何其他可用后端时,内存后端都会自行禁用。您还可以显式禁用它:

1
management.metrics.export.simple.enabled=false

StatsD

StatsD 注册表急切地通过 UDP 将度量标准推送到 StatsD 代理。默认情况下,Metrics 会导出到本地计算机上运行的StatsD代理。可以使用以下方式提供要使用的 StatsD 代理主机和端口:

1
2
management.metrics.export.statsd.host=statsd.example.com
management.metrics.export.statsd.port=9125

您还可以更改要使用的 StatsD 线路协议(默认为 Datadog):

1
management.metrics.export.statsd.flavor=etsy

Wavefront

Wavefront 注册表会定期将 Metrics 推送到Wavefront。如果您直接将 Metrics 导出到Wavefront,则必须提供您的 API 令牌:

1
management.metrics.export.wavefront.api-token=YOUR_API_TOKEN

或者,您可以使用在您的环境中设置的 Wavefront 辅助工具或内部代理,将 Metrics 数据转发到 Wavefront API 主机:

1
management.metrics.export.wavefront.uri=proxy://localhost:2878

Tip

如果将 Metrics 发布到 Wavefront 代理(如the documentation中所述),则主机必须为proxy://HOST:PORT格式。

您还可以更改将度量标准发送到 Wavefront 的时间间隔:

1
management.metrics.export.wavefront.step=30s

支持Metrics

如果适用,Spring Boot 将注册以下核心 Metrics:

  • JVM Metrics,报告以下方面的利用率:
  • 各种内存和缓冲池
    • 与垃圾收集有关的统计数据
    • Threads utilization
    • 加载/卸载的类数
  • CPU metrics
  • 文件 DescriptorsMetrics
  • KafkaConsumerMetrics
  • Log4j2 Metrics:记录每个级别记录到 Log4j2 的事件数
  • Logback Metrics:记录每个级别记录到 Logback 的事件数
  • 正常运行时间 Metrics:报告正常运行时间的量度和代表应用程序绝对启动时间的固定量度
  • Tomcat metrics
  • Spring Integration metrics

SpringMVCMetrics

通过自动配置,可以检测由 Spring MVC 处理的请求。当management.metrics.web.server.auto-time-requeststrue时,将对所有请求进行检测。或者,当设置为false时,可以通过将@Timed添加到请求处理方法来启用检测:

1
2
3
4
5
6
7
8
9
10
@RestController
@Timed (1)
public class MyController {

@GetMapping("/api/people")
@Timed(extraTags = { "region", "us-east-1" }) (2)
@Timed(value = "all.people", longTask = true) (3)
public List<Person> listPeople() { ... }

}
  • (1) 控制器类,用于对控制器中的每个请求处理程序启用计时。
  • (2) 一种启用单个端点的方法。如果您将它放在类中,则不必这样做,但是可以用于进一步为此特定端点自定义计时器。
  • (3) 具有longTask = true的方法为该方法启用长任务计时器。长任务计时器需要一个单独的度量标准名称,并且可以与短任务计时器堆叠在一起。

默认情况下,使用名称http.server.requests生成度量。可以通过设置management.metrics.web.server.requests-metric-name属性来自定义名称。

默认情况下,与 Spring MVC 相关的 Metrics 带有以下信息标记:

Tag Description
exception 处理请求时引发的任何异常的简单类名。
method 请求的方法(例如GETPOST)
outcome 请求的结果基于响应的状态码。 1xx 是INFORMATIONAL,2xx 是SUCCESS,3xx 是REDIRECTION,4xx CLIENT_ERROR,5xx 是SERVER_ERROR
status 响应的 HTTP 状态代码(例如200500)
uri 变量替换之前的请求 URI 模板(如果可能)(例如/api/person/{id})

要自定义标签,请提供实现WebMvcTagsProvider@Bean

SpringWebFluxMetrics

通过自动配置,可以检测 WebFlux 控制器和功能处理程序处理的所有请求。

默认情况下,使用名称http.server.requests生成度量。您可以通过设置management.metrics.web.server.requests-metric-name属性来自定义名称。

默认情况下,与 WebFlux 相关的度量标准标记有以下信息:

Tag Description
exception 处理请求时引发的任何异常的简单类名。
method 请求的方法(例如GETPOST)
outcome 请求的结果基于响应的状态码。 1xx 是INFORMATIONAL,2xx 是SUCCESS,3xx 是REDIRECTION,4xx CLIENT_ERROR,5xx 是SERVER_ERROR
status 响应的 HTTP 状态代码(例如200500)
uri 变量替换之前的请求 URI 模板(如果可能)(例如/api/person/{id})

要自定义标签,请提供实现WebFluxTagsProvider@Bean

Jersey服务器Metrics

通过自动配置,可以检测由 Jersey JAX-RS 实现处理的请求。当management.metrics.web.server.auto-time-requeststrue时,将对所有请求进行检测。或者,当设置为false时,可以通过将@Timed添加到请求处理方法来启用检测:

1
2
3
4
5
6
7
8
9
@Component
@Path("/api/people")
@Timed (1)
public class Endpoint {
@GET
@Timed(extraTags = { "region", "us-east-1" }) (2)
@Timed(value = "all.people", longTask = true) (3)
public List<Person> listPeople() { ... }
}
  • (1) 在资源类上,以对资源中的每个请求处理程序启用计时。
  • (2) 关于启用单个端点的方法。如果您将它放在类中,则不必这样做,但是可以用于进一步为此特定端点自定义计时器。
  • (3) 在具有longTask = true的方法上为该方法启用长任务计时器。长任务计时器需要一个单独的度量标准名称,并且可以与短任务计时器堆叠在一起。

默认情况下,使用名称http.server.requests生成度量。可以通过设置management.metrics.web.server.requests-metric-name属性来自定义名称。

默认情况下,Jersey 服务器 Metrics 带有以下信息:

Tag Description
exception 处理请求时引发的任何异常的简单类名。
method 请求的方法(例如GETPOST)
outcome 请求的结果基于响应的状态码。 1xx 是INFORMATIONAL,2xx 是SUCCESS,3xx 是REDIRECTION,4xx CLIENT_ERROR,5xx 是SERVER_ERROR
status 响应的 HTTP 状态代码(例如200500)
uri 变量替换之前的请求 URI 模板(如果可能)(例如/api/person/{id})

要自定义标签,请提供实现JerseyTagsProvider@Bean

HTTPClient端Metrics

Spring Boot Actuator ManagementRestTemplateWebClient的工具。为此,您必须注入自动配置的构建器并使用它来创建实例:

  • RestTemplateBuilder RestTemplate
  • WebClient.Builder WebClient

也可以手动应用负责此工具的定制程序,即MetricsRestTemplateCustomizerMetricsWebClientCustomizer

默认情况下,使用名称http.client.requests生成度量。可以通过设置management.metrics.web.client.requests-metric-name属性来自定义名称。

默认情况下,由检测的 Client 端生成的度量标准标记有以下信息:

  • method,即请求的方法(例如GETPOST)。
  • uri,变量替换之前的请求 URI 模板(如果可能的话,例如/api/person/{id})。
  • status,即响应的 HTTP 状态代码(例如200500)。
  • clientName,即 URI 的主机部分。

要自定义标签,并根据您选择的 Client 端,可以提供实现RestTemplateExchangeTagsProviderWebClientExchangeTagsProvider@BeanRestTemplateExchangeTagsWebClientExchangeTags中有便捷的静态函数。

缓存Metrics

通过自动配置,可以在启动时使用前缀cache的度量来检测所有可用的Cache。高速缓存检测针对一组基本 Metrics 进行了标准化。还提供其他特定于缓存的 Metrics。

支持以下缓存库:

  • Caffeine
  • EhCache 2
  • Hazelcast
  • 任何兼容的 JCache(JSR-107)实现

用高速缓存的名称和从 Bean 名称派生的CacheManager的名称来标记度量标准。

Note

只有启动时可用的缓存才绑定到注册表。对于在启动阶段后即时或以编程方式创建的缓存,需要显式注册。提供CacheMetricsRegistrar bean 可以简化该过程。

数据源Metrics

通过自动配置,可以使用名为jdbc的度量标准检测所有可用的DataSource对象。数据源检测产生的量规表示池中当前 Active,最大允许和最小允许的连接。这些仪表中的每个都有一个以jdbc为前缀的名称。

度量标准还标有根据 Bean 名称计算出的DataSource的名称。

Tip

默认情况下,Spring Boot 为所有支持的数据源提供元数据。如果不支持立即使用您喜欢的数据源,则可以添加其他DataSourcePoolMetadataProvider bean。有关示例,请参见DataSourcePoolMetadataProvidersConfiguration

此外,特定于 Hikari 的 Metrics 以hikaricp前缀公开。每个度量标准都由池的名称标记(可以使用spring.datasource.name进行控制)。

HibernateMetrics

通过自动配置,可以检测所有可用名为hibernate的 Metrics 启用了统计信息的 Hibernate EntityManagerFactory实例。

度量标准还标有从 Bean 名称派生的EntityManagerFactory的名称。

要启用统计信息,必须将标准 JPA 属性hibernate.generate_statistics设置为true。您可以在自动配置的EntityManagerFactory上启用它,如以下示例所示:

1
spring.jpa.properties.hibernate.generate_statistics=true

RabbitMQ指标

自动配置将启用所有名为rabbitmq的度量的可用 RabbitMQ 连接工厂的检测。

注册自定义Metrics

要注册自定义 Metrics,请在组件中注入MeterRegistry,如以下示例所示:

1
2
3
4
5
6
7
8
9
10
11
class Dictionary {

private final List<String> words = new CopyOnWriteArrayList<>();

Dictionary(MeterRegistry registry) {
registry.gaugeCollectionSize("dictionary.size", Tags.empty(), this.words);
}

// …

}

如果发现您在组件或应用程序中反复测试了一套 Metrics,则可以将此套件封装在MeterBinder实现中。默认情况下,所有MeterBinder bean 的度量将自动绑定到 Spring Management 的MeterRegistry

自定义单个Metrics

如果您需要对特定的Meter实例应用自定义设置,则可以使用io.micrometer.core.instrument.config.MeterFilter界面。默认情况下,所有MeterFilter bean 将自动应用于千分尺MeterRegistry.Config

例如,如果要将所有以com.example开头的仪表 ID 的mytag.region标签重命名为mytag.area,则可以执行以下操作:

1
2
3
4
@Bean
public MeterFilter renameRegionTagMeterFilter() {
return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
}

常用标签

通用标签通常用于在操作环境(如主机,实例,区域,堆栈等)上进行维度深入分析。通用标签适用于所有仪表,可以按以下示例所示进行配置:

1
2
management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prod

上面的示例将regionstack标签添加到所有仪表,其值分别为us-east-1prod

Note

如果使用 Graphite,则常用标签的 Sequences 很重要。由于使用这种方法不能保证通用标签的 Sequences,因此建议 Graphite 用户定义自定义MeterFilter

每米属性

除了MeterFilter bean 外,还可以使用属性在每米基础上应用有限的一组自定义设置。每表定制适用于以给定名称开头的所有所有表 ID。例如,以下将禁用所有 ID 以example.remote开头的仪表

1
management.metrics.enable.example.remote=false

以下属性允许按米自定义:

表 57.1. 每米自定义

Property Description
management.metrics.enable 是否拒绝仪表发出任何 Metrics。
management.metrics.distribution.percentiles-histogram 是否发布适合计算可凝集(跨维度)百分位数逼近的直方图。
management.metrics.distribution.minimum-expected-value , management.metrics.distribution.maximum-expected-value 通过限制期望值的范围来发布较少的直方图桶。
management.metrics.distribution.percentiles 发布在应用程序中计算的百分位值
management.metrics.distribution.sla 发布包含您的 SLA 定义的存储区的累积直方图。

有关percentiles-histogrampercentilessla后面的概念的更多详细信息,请参阅千分尺文档的“直方图和百分位数”部分

Metrics端点

Spring Boot 提供了一个metrics端点,可用于诊断检查应用程序收集的 Metrics。该端点默认情况下不可用,必须公开,有关更多详细信息,请参见exposing endpoints

导航到/actuator/metrics将显示可用仪表名称的列表。您可以通过提供特定名称作为 selectors 来深入查看有关特定仪表的信息,例如/actuator/metrics/jvm.memory.max

Tip

您在此处使用的名称应与代码中使用的名称相匹配,而不是已针对其出厂的监视系统进行了命名约定标准化后的名称。换句话说,如果jvm.memory.max由于其蛇形命名约定而在 Prometheus 中显示为jvm_memory_max,则在metrics端点中检查电表时,仍应使用jvm.memory.max作为 selectors。

您还可以在网址末尾添加任意数量的tag=KEY:VALUE查询参数,以在维度上更深入地了解电表,例如/actuator/metrics/jvm.memory.max?tag=area:nonheap

Tip

报告的测量值是与仪表名称和已应用的所有标签相匹配的所有仪表的统计信息的。因此,在上面的示例中,返回的“值”统计量是堆的“代码缓存”,“压缩类空间”和“元空间”区域的最大内存占用量的总和。如果您只想查看“ Metaspace”的最大大小,则可以添加一个额外的tag=id:Metaspace,即/actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace

Auditing

一旦运行了 Spring Security,Spring Boot Actuator 将具有一个灵活的审核框架,该框架可以发布事件(默认情况下,“身份验证成功”,“失败”和“访问被拒绝”异常)。此功能对于基于身份验证失败的报告和实施锁定策略非常有用。要自定义已发布的安全事件,可以提供自己的AbstractAuthenticationAuditListenerAbstractAuthorizationAuditListener实现。

您也可以将审核服务用于自己的业务事件。为此,可以将现有的AuditEventRepository注入到您自己的组件中,然后直接使用它,或者通过 Spring ApplicationEventPublisher发布AuditApplicationEvent(通过实现ApplicationEventPublisherAware)。

HTTP跟踪

将为所有 HTTP 请求自动启用跟踪。您可以查看httptrace端点,并获取有关最近 100 次请求-响应交换的基本信息。

自定义HTTP跟踪

要自定义每个跟踪中包含的项目,请使用management.trace.http.include配置属性。要进行高级自定义,请考虑注册自己的HttpExchangeTracer实现。

默认情况下,使用InMemoryHttpTraceRepository来存储最近 100 次请求-响应交换的跟踪。如果需要扩展容量,则可以定义自己的InMemoryHttpTraceRepository bean 实例。您还可以创建自己的替代HttpTraceRepository实现。

进程监视

spring-boot模块中,您可以找到两个类来创建通常对过程监视有用的文件:

  • ApplicationPidFileWriter创建一个包含应用程序 PID 的文件(默认情况下,在应用程序目录中,文件名为application.pid)。
  • WebServerPortFileWriter创建一个(或多个)文件,其中包含正在运行的 Web 服务器的端口(默认情况下,在应用程序目录中,文件名为application.port)。

默认情况下,不会激活这些编写器,但是您可以启用:

扩展配置

META-INF/spring.factories文件中,可以激活写入 PID 文件的侦听器,如以下示例所示:

1
2
3
org.springframework.context.ApplicationListener=\
org.springframework.boot.context.ApplicationPidFileWriter,\
org.springframework.boot.web.context.WebServerPortFileWriter

编程配置

您还可以通过调用SpringApplication.addListeners(…)方法并传递适当的Writer对象来激活侦听器。此方法还允许您自定义Writer构造函数中的文件名和路径。

云计算支持

Spring Boot 的 Actuator 模块包括额外的支持,当您将其部署到兼容的 Cloud Foundry 实例时就会激活。 /cloudfoundryapplication路径提供了通往所有@Endpoint bean 的备用安全路由。

扩展支持使 Cloud Foundry Management UI(例如可用于查看已部署的应用程序的 Web 应用程序)增加了 Spring Boot Actuator 信息。例如,应用程序状态页面可能包含完整的运行状况信息,而不是典型的“正在运行”或“已停止”状态。

Note

普通用户无法直接访问/cloudfoundryapplication路径。为了使用端点,必须将有效的 UAA 令牌与请求一起传递。

禁用扩展的CloudFoundryActuator支持

如果要完全禁用/cloudfoundryapplication端点,则可以将以下设置添加到application.properties文件中:

application.properties.

1
management.cloudfoundry.enabled=false

云计算自签名证书

默认情况下,对/cloudfoundryapplication个端点的安全性验证会对各种 Cloud Foundry 服务进行 SSL 调用。如果您的 Cloud Foundry UAA 或 Cloud Controller 服务使用自签名证书,则需要设置以下属性:

application.properties.

1
management.cloudfoundry.skip-ssl-validation=true

自定义上下文路径

如果服务器的上下文路径已配置为/以外的其他值,则 Cloud Foundry 端点在应用程序的根目录将不可用。例如,如果server.servlet.context-path=/app,Cloud Foundry 端点将在/app/cloudfoundryapplication/*可用。

如果您希望 Cloud Foundry 端点始终在/cloudfoundryapplication/*可用,而与服务器的上下文路径无关,则需要在应用程序中进行显式配置。配置将根据所使用的 Web 服务器而有所不同。对于 Tomcat,可以添加以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@Bean
public TomcatServletWebServerFactory servletWebServerFactory() {
return new TomcatServletWebServerFactory() {

@Override
protected void prepareContext(Host host,
ServletContextInitializer[] initializers) {
super.prepareContext(host, initializers);
StandardContext child = new StandardContext();
child.addLifecycleListener(new Tomcat.FixContextListener());
child.setPath("/cloudfoundryapplication");
ServletContainerInitializer initializer = getServletContextInitializer(
getContextPath());
child.addServletContainerInitializer(initializer, Collections.emptySet());
child.setCrossContext(true);
host.addChild(child);
}

};
}

private ServletContainerInitializer getServletContextInitializer(String contextPath) {
return (c, context) -> {
Servlet servlet = new GenericServlet() {

@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
ServletContext context = req.getServletContext()
.getContext(contextPath);
context.getRequestDispatcher("/cloudfoundryapplication").forward(req,
res);
}

};
context.addServlet("cloudfoundry", servlet).addMapping("/*");
};
}

接下来要读什么

如果要探索本章中讨论的一些概念,可以看看 Actuatorsample applications。您可能还想阅读有关Graphite之类的图形工具的信息。

否则,您可以 continue 阅读‘deployment options’或 continue 阅读有关 Spring Boot 构建工具插件的一些深入信息。