本文是 Springboot 2.1.1.RELEASE 的中文翻译
Spring Boot 包含许多其他功能,可帮助你在将应用程序推送到生产环境时监控和管理应用程序
你可以选择使用 HTTP 端点或 JMX 来管理和监控应用程序
审计、健康和指标收集也可以自动应用于你的应用程序
spring-boot-actuator
模块提供了 Spring Boot 的所有生产就绪功能spring-boot-starter-actuator
starter 到依赖中。<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
通过 Actuator 端点,你可以监控应用程序并与之交互
Spring Boot 包含许多内置端点,也允许你添加自己的端点
例如,health
端点提供基本的应用程序健康信息
可以启用或禁用每个单独的端点。它控制是否在应用程序上下文(bean 容器)中创建端点
要远程访问,还必须通过JMX或HTTP公开端点
大多数应用程序选择HTTP,其中端点的ID以及/actuator
的前缀映射到URL
health
端点映射到/actuator/health
。想了解有关 Actuator 端点及其请求和响应格式的更多信息,请参阅单独的API文档(HTML或 PDF)
shutdown
之外的所有端点management.endpoint..enabled
属性management.endpoint.shutdown.enabled=true
# 只启用 info 端点
management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true
ID | JMX | Web |
---|---|---|
auditevents |
是 | 否 |
beans |
是 | 否 |
caches |
是 | 否 |
conditions |
是 | 否 |
configprops |
是 | 否 |
env |
是 | 否 |
flyway |
是 | 否 |
health |
是 | 是 |
heapdump |
N/A | 否 |
httptrace |
是 | 否 |
info |
是 | 是 |
integrationgraph |
是 | 否 |
jolokia |
N/A | 否 |
logfile |
N/A | 否 |
loggers |
是 | 否 |
liquibase |
是 | 否 |
metrics |
是 | 否 |
mappings |
是 | 否 |
prometheus |
N/A | 否 |
scheduledtasks |
是 | 否 |
sessions |
是 | 否 |
shutdown |
是 | 否 |
threaddump |
是 | 否 |
include
和 exclude
属性:属性 | 默认 |
---|---|
management.endpoints.jmx.exposure.exclude |
|
management.endpoints.jmx.exposure.include |
* |
management.endpoints.web.exposure.exclude |
|
management.endpoints.web.exposure.include |
info, health |
exclude
属性优先于 include
属性# 修改 jmx.include 默认值,使得 jmx 仅暴露 health,info 端点
management.endpoints.jmx.exposure.include=health,info
# 修改 web.include 默认值,并添加 exclude,使得 web 暴露除 env,beans 以外的所有端点
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans
注: 因为 * 在 yaml 文件中具有特殊含义,使用 * 号,必须加引号(’*’ 或 “*”)
如果你的应用程序是公开的,我们强烈建议你保护您的端点
如果您想在暴露端点时实施自己的策略,可以注册EndpointFilter
bean
RequestMatcher
对象,可以与 Spring Security 结合使用@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//EndpointRequest.toAnyEndpoint() 将请求与所有端点进行匹配,然后确保所有端点都具有 ENDPOINT_ADMIN 角色
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()
.anyRequest().hasRole("ENDPOINT_ADMIN")
.and()
.httpBasic();
}
}
EndpointRequest
上还提供了其他几种匹配器方法。有关详细信息,请参阅API文档(HTML或 PDF)
如果应用程序部署在有防火墙的环境,可以暴露所有的 web 端点 通过 2.2 中的 web.include 方式
且,如果存在 Spring Security,还需要添加自定义安全配置,以使得所有请求都能通过 security
@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秒
management.endpoint.beans.cache.time-to-live=10s
management.endpoint.
用于唯一标识配置的端点Principal
被视为端点的输入,因此不会缓存响应使用 host:ip/${base-path}
可以访问 发现页面
(返回所有暴露的端点信息)
使用 host:ip/${base-path}/xx
可以访问特定的端点信息
默认情况下 base-path=/actuator
注: 当 base-path = /
时(如果 management 端口和服务端口一样),将禁用 发现页面
以防止与其他映射发生冲突
# 可通过此配置更改默认 path
management.endpoints.web.base-path = /aa
跨源资源共享 (CORS)是一种W3C规范,允许您以灵活的方式指定授权的跨域请求类型
如果您使用Spring MVC或Spring WebFlux,可以配置Actuator的Web端点以支持此类方案
默认情况下禁用CORS支持,仅在设置了management.endpoints.web.cors.allowed-origins
属性后才启用CORS支持
# 允许来自example.com域的GET和POST 请求
management.endpoints.web.cors.allowed-origins=http://example.com
management.endpoints.web.cors.allowed-methods=GET,POST
如果您通过 @Bean 注解将 @Endpoint 注解的类配置到容器中
则该类中使用@ReadOperation
,@WriteOperation
或@DeleteOperation
注释的任何方法都会通过JMX自动公开
并且在Web应用程序中也会通过HTTP自动公开
可以使用Jersey,Spring MVC或Spring WebFlux通过HTTP公开端点
您还可以使用 @JmxEndpoint
或 @WebEndpoint
编写特定技术的端点
您些端点仅限于各自的技术。例如,@WebEndpoint
仅通过 HTTP 暴露,而不是 JMX
您可以使用@EndpointWebExtension
和@EndpointJmxExtension
编写特定于技术的扩展
通过这些注释,您可以提供特定于技术的操作来扩充现有端点
如果您使用的是特定的 Web 框架,完全可以通过 @Controller、@RestController 代替 @Endpoint 注解
但是这样的话,这些端点,就无法通过 JMX 或使用其他 Web 框架(@Endpoint 具有统一性)
端点上的操作通过其参数接收输入
通过Web公开时,这些参数取自于 请求 parameters 、JSON 格式的 body
通过JMX公开时,参数将映射到MBean操作的参数
默认情况下需要参数,可以通过使用@org.springframework.lang.Nullable
注释它们来使它们成为可选项
注: 由于端点与技术无关,因此只能在方法签名中指定简单类型。不支持自定义类型声明单个参数
To allow the input to be mapped to the operation method’s parameters, Java code implementing an endpoint should be compiled with -parameters
, and Kotlin code implementing an endpoint should be compiled with -java-parameters
.
This will happen automatically if you are using Spring Boot’s Gradle plugin or if you are using Maven and spring-boot-starter-parent
.
ApplicationConversionService
的实例转换为所需类型@Endpoint
,@WebEndpoint
或@EndpointWebExtension
上的操作将使用Jersey,Spring MVC或Spring WebFlux通过HTTP自动公开/actuator
。例如,ID为sessions
的端点将使用/actuator/sessions
作为 predicate 中的路径@Selector
注释操作方法的一个或多个参数来进一步定制路径操作 | HTTP 方法 |
---|---|
@ReadOperation |
GET |
@WriteOperation |
POST |
@DeleteOperation |
DELETE |
@WriteOperation
(HTTP POST
),predicate 的 consume 子句是 application/vnd.spring-boot.actuator.v2+json, application/json
谓词的produce子句可以由@DeleteOperation
,@ReadOperation
和@WriteOperation
注释的produces
属性确定
该属性是可选的。如果未使用,则自动确定produce子句
如果操作方法返回void
或Void
,则produce子句为空。如果操作方法返回org.springframework.core.io.Resource
,则produce子句为application/octet-stream
。对于所有其他操作,produce子句是application/vnd.spring-boot.actuator.v2+json, application/json
@ReadOperation
返回一个值,响应状态为 200(OK)。如果它未返回值,则响应状态将为 404(未找到)@WriteOperation
或 @DeleteOperation
返回值,则响应状态将为 200(OK)。如果它没有返回值,则响应状态将为 204(无内容)org.springframework.core.io.Resource
的操作会自动支持范围请求java.security.Principal
或 org.springframework.boot.actuate.endpoint.SecurityContext
作为方法参数@Nullable
结合使用,为经过身份验证和未经身份验证的用户提供不同的行为isUserInRole(String)
方法执行授权检查@ServletEndpoint
注解的类,Servlet
可以作为端点暴露,该类也实现了 Supplier
@Endpoint
和 @WebEndpoint
注解@ControllerEndpoint
和@RestControllerEndpoint
可用于实现仅由Spring MVC或Spring WebFlux公开的端点@RequestMapping
和@GetMapping
)映射方法,并将端点的ID用作路径的前缀@Endpoint
和@WebEndpoint
注释health
端点公开的信息取决于management.endpoint.health.show-details
属性,该属性可以使用以下值之一进行配置名称 | 描述 |
---|---|
never |
细节永远不会显示。 |
when-authorized |
详细信息仅向授权用户显示。可以使用management.endpoint.health.roles 配置授权角色。 |
always |
详细信息显示给所有用户。 |
默认值为never
。当用户处于一个或多个端点的角色时,将被视为已获得授权
如果端点没有配置角色(默认值),则认为所有经过身份验证的用户都已获得授权
可以使用management.endpoint.health.roles
属性配置角色
注: 如果你已保护应用程序并希望使用 always
,则安全配置必须允许所有用户(不管有没有经过身份验证)对健康端点的访问,参考 2.3
健康信息是从 HealthIndicatorRegistry
的内容中收集的(默认情况下,ApplicationContext
中定义的所有 HealthIndicator
实例)
Spring Boot 包含许多自动配置的 HealthIndicators
,你也可以自己编写
默认情况下,最终系统状态由 HealthAggregator
根据状态的有序列表对每个 HealthIndicator
的状态进行排序
排序列表中的第一个状态作为整体健康状态。如果没有 HealthIndicator
返回一个 HealthAggregator
已知的状态,则使用 UNKNOWN
状态
注: HealthIndicatorRegistry
可用于在运行时注册和注销健康指示器
HealthIndicator**
**management.health.defaults.enabled
属性来禁用所有名称 | 描述 |
---|---|
CassandraHealthIndicator |
检查Cassandra数据库是否已启动。 |
CouchbaseHealthIndicator |
检查Couchbase群集是否已启动。 |
DiskSpaceHealthIndicator |
检查磁盘空间不足。 |
DataSourceHealthIndicator |
检查是否可以获得与DataSource 的连接。 |
ElasticsearchHealthIndicator |
检查Elasticsearch集群是否已启动。 |
InfluxDbHealthIndicator |
检查InfluxDB服务器是否已启动。 |
JmsHealthIndicator |
检查JMS代理是否已启动。 |
MailHealthIndicator |
检查邮件服务器是否已启动。 |
MongoHealthIndicator |
检查Mongo数据库是否已启动。 |
Neo4jHealthIndicator |
检查Neo4j服务器是否已启动。 |
RabbitHealthIndicator |
检查Rabbit服务器是否已启动。 |
RedisHealthIndicator |
检查Redis服务器是否已启动。 |
SolrHealthIndicator |
检查Solr服务器是否已启动。 |
HealthIndicator
接口,根据自己的需要判断返回的状态是UP
还是DOWN
,功能简单HealthIndicator
的标识符是没有HealthIndicator
后缀的bean的名称(如果存在)my
的条目中可用@Component
public class MyHealthIndicator implements HealthIndicator {
private static final String VERSION = "v1.0.0";
@Override
public Health health() {
int code = check();
if (code != 0) {
Health.down().withDetail("code", code).withDetail("version", VERSION).build();
}
return Health.up().withDetail("code", code)
.withDetail("version", VERSION).up().build();
}
private int check() {
return 0;
}
}
状态 | 制图 |
---|---|
DOWN | SERVICE_UNAVAILABLE (503) |
OUT_OF_SERVICE | SERVICE_UNAVAILABLE (503) |
UP | No mapping by default, so http status is 200 |
UNKNOWN | No mapping by default, so http status is 200 |
HealthStatusHttpMapper
beanAbstractHealthIndicator
抽象类,重写doHealthCheck
方法,功能比第一种要强大一点点,默认的DataSourceHealthIndicator 、 RedisHealthIndicator 都是这种写法,内容回调中还做了异常的处理@Component("my2")
public class MyAbstractHealthIndicator extends AbstractHealthIndicator {
private static final String VERSION = "v1.0.0";
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
int code = check();
if (code != 0) {
builder.down().withDetail("code", code).withDetail("version", VERSION).build();
}
builder.withDetail("code", code)
.withDetail("version", VERSION).up().build();
}
private int check() {
return 0;
}
}
对于反应性应用程序,例如那些使用Spring WebFlux的应用程序,ReactiveHealthIndicator
提供了一个非阻塞的接口来获取应用程序运行状况
与传统的 HealthIndicator
类似,健康信息从 ReactiveHealthIndicatorRegistry
的内容中收集
默认情况下,ApplicationContext
中定义的所有 HealthIndicator
和 ReactiveHealthIndicator
实例
不检查反应API 的 Regular HealthIndicator
是在 elastic scheduler 上执行的
注: 在响应式应用程序中,ReactiveHealthIndicatorRegistry
可用于在运行时注册和取消注册运行状况指示器
@Component
public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {
@Override
public Mono<Health> health() {
return doHealthCheck() //perform some specific health check that returns a Mono
.onErrorResume(ex -> Mono.just(new Health.Builder().down(ex).build())));
}
}
AbstractReactiveHealthIndicator
扩展ReactiveHealthIndicators
名称 | 描述 |
---|---|
CassandraReactiveHealthIndicator |
检查Cassandra数据库是否已启动。 |
CouchbaseReactiveHealthIndicator |
检查Couchbase群集是否已启动。 |
MongoReactiveHealthIndicator |
检查Mongo数据库是否已启动。 |
RedisReactiveHealthIndicator |
检查Redis服务器是否已启动。 |
HealthIndicator
that is not handled explicitly is wrapped automatically应用程序信息公开了从ApplicationContext
中定义的所有 beans 收集的各种信息
Spring Boot包含一些自动配置的InfoContributor
beans,您可以自己编写
InfoContributor
beans:名称 | 描述 |
---|---|
EnvironmentInfoContributor |
在info 键下显示Environment 中的任意键。 |
GitInfoContributor |
如果git.properties 文件可用,则公开git信息。 |
BuildInfoContributor |
如果META-INF/build-info.properties 文件可用,则公开构建信息。 |
management.info.defaults.enabled
属性来禁用所有info.*
Spring属性来自定义info
端点公开的数据。info
键下的所有Environment
属性都会自动显示info.app.encoding=UTF-8
info.app.java.source=1.8
info.app.java.target=1.8
# 您可以在构建时扩展信息属性,而不是对这些值进行硬编码 。
# 假设您使用Maven,您可以按如下方式重写前面的示例:
[email protected]@
[email protected]@
[email protected]@
info
端点的另一个有用功能是它能够在构建项目时发布有关git
源代码存储库状态的信息GitProperties
bean可用,则会公开git.branch
,git.commit.id
和git.commit.time
属性git.properties
文件,则自动配置GitProperties
bean.有关更多详细信息,请参阅“ 生成git信息 ”# 如果要显示完整的git信息(即git.properties的完整内容),请使用management.info.git.mode属性
management.info.git.mode=full
BuildProperties
bean可用(如果类路径中有META-INF/build-info.properties
文件),info
端点也可以发布有关您的构建的信息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"));
}
}
id
作为URL路径,前缀为/actuator
。例如,health
暴露为/actuator/health
# 这样 /actuator/{id} 被更改为 /manage/{id}
management.endpoints.web.base-path=/manage
除非已将管理端口配置为使用其他HTTP端口公开端点,否则 management.endpoints.web.base-path
相对于server.servlet.context-path
如果配置了management.server.port
,则management.endpoints.web.base-path
相对于management.server.servlet.context-path
如果要将端点映射到其他路径,可以使用management.endpoints.web.path-mapping
属性
# 将 /actuator/health 映射到 /healthcheck,注,此时 发现页面不可用!
management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.health=healthcheck
management.server.port=8081
management.server.ssl.*
属性为管理服务器配置自己的SSL# 使用HTTPS时管理服务器通过HTTP可用
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
# 主服务器和管理服务器都可以使用SSL但具有不同的密钥库
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.server.address
属性来自定义管理端点可用的地址
如果您只想在内部或面向运行的网络上侦听或仅侦听来自localhost
的连接,这样做非常有用
注: 仅当端口与主服务器端口不同时,才能侦听不同的地址
# 不允许远程管理连接
management.server.port=8081
management.server.address=127.0.0.1
-1
management.server.port=-1
# 等同于
management.endpoints.web.exposure.exclude=*
org.springframework.boot
域下的JMX MBeanid
生成的。例如,health
端点公开为org.springframework.boot:type=Endpoint,name=Health
ApplicationContext
,您可能会发现名称发生冲突。要解决此问题,可以将spring.jmx.unique-names
属性设置为true
,以便MBean名称始终是唯一的spring.jmx.unique-names=true
management.endpoints.jmx.domain=com.example.myapp
# 如果您不想通过JMX公开端点
management.endpoints.jmx.exposure.exclude=*
<dependency>
<groupId>org.jolokiagroupId>
<artifactId>jolokia-coreartifactId>
dependency>
management.endpoints.web.exposure.include
属性添加jolokia
或*
来公开Jolokia端点/actuator/jolokia
来访问它management.endpoint.jolokia.config.debug=true
# 如果您使用Jolokia但不希望Spring Boot配置它
management.endpoint.jolokia.enabled=false
TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF、null(表示没有显式配置)
POST
是资源URI的部分实体,如以下示例所示:{"configuredLevel": "DEBUG"}
null
的值configuredLevel
Spring Boot Actuator为Micrometer提供依赖关系管理和自动配置
Micrometer是一个支持众多监控系统的应用程序指标外观,包括:
要了解有关Micrometer功能的更多信息,请参阅其 参考文档,特别是 概念部分
Spring Boot 自动配置了一个 Composite MeterRegistry
,并且将所有容器中的 MeterRegistry
添加到其中
在运行时,只需要 classpath 中有 micrometer-registry-{system}
依赖即可让 Spring Boot 配置该注册表
大部分注册表都有共同点,即使 Micrometer 注册实现位于 classpath 上,你也可以禁用特定的注册表。例如,要禁用 Datadog
management.metrics.export.datadog.enabled=false
Metrics
类的全局静态复合注册表中,除非你明确禁止:management.metrics.use-global-registry=false
MeterRegistryCustomizer
bean 以进一步配置注册表,例如通用标签:@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("region", "us-east-1");
}
@Bean
MeterRegistryCustomizer<GraphiteMeterRegistry> graphiteMetricsNamingConvention() {
return registry -> registry.config().namingConvention(MY_CUSTOM_CONVENTION);
}
MeterRegistry
并注册指标@Component
public class SampleBean {
private final Counter counter;
//SampleBean 相当于一个 Counter,通过此构造函数将其注册到 registry 中
public SampleBean(MeterRegistry registry) {
this.counter = registry.counter("received.messages");
}
public void handleMessage(String message) {
this.counter.increment();
// 处理消息实现
}
}
MeterBinder
实现),你可以通过配置或专用注解标记来控制。management.metrics.export.appoptics.api-token=YOUR_TOKEN
# 使用以下方式提供要使用的Atlas服务器的位置
management.metrics.export.atlas.uri=http://atlas.example.com:7101/api/v1/publish
# 要将指标导出到Datadog,必须提供您的API密钥
management.metrics.export.datadog.api-key=YOUR_KEY
# 您还可以更改度量标准发送到Datadog的时间间隔
management.metrics.export.datadog.step=30s
# 要将指标导出到 Dynatrace,必须提供您的API令牌,设备ID和URI
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的时间间隔
management.metrics.export.dynatrace.step=30s
# 可以使用以下属性提供要使用的Elastic服务器的位置
management.metrics.export.elastic.host=http://elastic.example.com:8086
# 可以使用以下命令提供要使用的Ganglia服务器主机和端口
management.metrics.export.ganglia.host=ganglia.example.com
management.metrics.export.ganglia.port=9649
# 可以使用以下命令提供要使用的Graphite服务器主机和端口
management.metrics.export.graphite.host=graphite.example.com
management.metrics.export.graphite.port=9004
HierarchicalNameMapper
,它管理维度计数器 id 如何映射到平面分层名称GraphiteMeterRegistry
并提供自己的 HierarchicalNameMapper
。除非你自己定义,否则使用自动配置的 GraphiteConfig
和 Clock
bean@Bean
public GraphiteMeterRegistry graphiteMeterRegistry(GraphiteConfig config, Clock clock) {
return new GraphiteMeterRegistry(config, clock, MY_HIERARCHICAL_MAPPER);
}
# 要将指标导出到 SaaS Humio,你必须提供 API 令牌
management.metrics.export.humio.api-token=YOUR_TOKEN
# 你还应配置一个或多个标记,以标识要推送指标的数据源
management.metrics.export.humio.tags.alpha=a
management.metrics.export.humio.tags.bravo=b
# 要指定 Influx 服务器的位置,可以使用
management.metrics.export.influx.uri=https://influx.example.com:8086
metrics
JMX 域# 可以使用以下方式提供要使用的域
management.metrics.export.jmx.domain=com.example.app.metrics
HierarchicalNameMapper
,它管理维度计数器 id 如何映射到平面分层名称。JmxMeterRegistry
并提供自己的 HierarchicalNameMapper
。除非你自己定义,否则使用自动配置的 JmxConfig
和 Clock
bean@Bean
public JmxMeterRegistry jmxMeterRegistry(JmxConfig config, Clock clock) {
return new JmxMeterRegistry(config, clock, MY_HIERARCHICAL_MAPPER);
}
# 可以使用以下方式提供 KairosDB 服务器的位置
management.metrics.export.kairos.uri=https://kairosdb.example.com:8080/api/v1/datapoints
# 要将指标导出到 New Relic,你必须提供 API 密钥和帐户 ID
management.metrics.export.newrelic.api-key=YOUR_KEY
management.metrics.export.newrelic.account-id=YOUR_ACCOUNT_ID
# 你还可以更改将度量发送到 New Relic 的间隔时间
management.metrics.export.newrelic.step=30s
Prometheus 会抓取或轮询各个应用实例以获取指标数据
Spring Boot 在 /actuator/prometheus
上提供 actuator 端点,以适当的格式呈现 Prometheus scrape
注: 默认情况下端点不可用,必须暴露,请参阅暴露端点以获取更多详细信息
以下是要添加到 prometheus.yml
的示例 scrape_config
scrape_configs:
- job_name: 'spring'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['HOST:PORT']
# 要将指标导出到 SignalFx,你必须提供访问令牌
management.metrics.export.signalfx.access-token=YOUR_ACCESS_TOKEN
# 你还可以更改将指标发送到 SignalFx 的间隔时间
management.metrics.export.signalfx.step=30s
# 只要你使用了任何其他可用的后端,内存后端就会自动禁用。你也可以显式禁用它
management.metrics.export.simple.enabled=false
StatsD 注册表将 UDP 上的指标推送到 StatsD 代理
默认情况下,metrics 将导出到本地的 StatsD 代理
# 可以使用以下方式提供要使用的StatsD代理主机和端口
management.metrics.export.statsd.host=statsd.example.com
management.metrics.export.statsd.port=9125
# 您还可以更改要使用的StatsD行协议(默认为Datadog)
management.metrics.export.statsd.flavor=etsy
# 如果您要将指标直接导出到Wavefront,则必须提供您的API令牌
management.metrics.export.wavefront.api-token=YOUR_API_TOKEN
# 你可以在环境中使用 Wavefront sidecar 或内部代理设置,将指标数据转发到 Wavefront API 主机
management.metrics.export.wavefront.uri=proxy://localhost:2878
# 你还可以更改将指标发送到 Wavefront 的间隔时间
management.metrics.export.wavefront.step=30s
proxy://HOST:PORT
格式management.metrics.web.server.auto-time-requests
为true
时,将对所有请求进行此检测false
时,您可以通过将@Timed
添加到请求处理方法来启用检测@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() { ... }
}
longTask = true
的方法为该方法启用长任务计时器。长任务计时器需要单独的指标名称,并且可以使用短任务计时器进行堆叠默认情况下,使用名称http.server.requests
生成指标
可以通过设置management.metrics.web.server.requests-metric-name
属性来自定义名称
默认情况下,Spring与MVC相关的指标标记有以下信息
标签 | 描述 |
---|---|
exception |
处理请求时抛出的任何异常的简单类名。 |
method |
请求的方法(例如,GET 或POST ) |
outcome |
根据响应的状态代码请求结果。1xx是INFORMATIONAL ,2xx是SUCCESS ,3xx是REDIRECTION ,4xx CLIENT_ERROR ,5xx是SERVER_ERROR |
status |
响应的HTTP状态代码(例如,200 或500 ) |
uri |
如果可能,在变量替换之前请求URI模板(例如,/api/person/{id} ) |
WebMvcTagsProvider
的@Bean
自动配置支持WebFlux控制器和功能处理程序处理的所有请求的检测
默认情况下,会生成名称为http.server.requests
的指标
您可以通过设置management.metrics.web.server.requests-metric-name
属性来自定义名称
默认情况下,与WebFlux相关的指标标记有以下信息
标签 | 描述 |
---|---|
exception |
处理请求时抛出的任何异常的简单类名。 |
method |
请求的方法(例如,GET 或POST ) |
outcome |
根据响应的状态代码请求结果。1xx是INFORMATIONAL ,2xx是SUCCESS ,3xx是REDIRECTION ,4xx CLIENT_ERROR ,5xx是SERVER_ERROR |
status |
响应的HTTP状态代码(例如,200 或500 ) |
uri |
如果可能,在变量替换之前请求URI模板(例如,/api/person/{id} ) |
WebFluxTagsProvider
的@Bean
management.metrics.web.server.auto-time-requests
为 true
时,将对所有请求进行该项检测false
时,你可以通过将 @Timed
添加到请求处理方法上来启用检测@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() { ... }
}
longTask = true
的方法上,为该方法启用长任务计时器。长任务计时器需要单独的度量名称,并且可以使用短任务计时器进行堆叠。默认情况下,使用名为 http.server.requests
生成度量指标
可以通过设置 management.metrics.web.server.requests-metric-name
属性来自定义名称。
默认情况下,Jersey 服务器指标使用以下标签标记
标签 | 描述 |
---|---|
exception |
处理请求时抛出的异常的简单类名。 |
method |
请求的方法(例如,GET 或 POST ) |
outcome |
根据响应状态码生成的请求结果。1xx 是 INFORMATIONAL ,2xx 是 SUCCESS ,3xx 是 REDIRECTION ,4xx 是 CLIENT_ERROR ,5xx 是 SERVER_ERROR |
status |
响应的 HTTP 状态码(例如,200 或 500 ) |
uri |
如果可能,在变量替换之前请求 URI 模板(例如,/api/person/{id} ) |
JerseyTagsProvider
的 @Bean
Spring Boot Actuator 管理 RestTemplate 和 WebClient 的指标记录
为此,你必须注入一个自动配置的 builder 并使用它来创建实例
RestTemplateBuilder
用于 RestTemplate
WebClient.Builder
用于 WebClient
也可以手动指定负责此指标记录的自定义程序,即 MetricsRestTemplateCustomizer
和 MetricsWebClientCustomizer
默认情况下,使用名为 http.client.requests
生成度量指标
可以通过设置 management.metrics.web.client.requests-metric-name
属性来自定义名称
默认情况下,已指标记录客户端生成的度量指标使用以下标签标记
method
,请求的方法(例如,GET
或 POST
)uri
,变量替换之前的请求 URI 模板(如果可能)(例如,/api/person/{id}
)status
,响应的 HTTP 状态码(例如,200
或 500
)clientName
,URI 的主机部分要根据你选择的客户端自定义标签,你可以提供一个实现了 RestTemplateExchangeTagsProvider
或 WebClientExchangeTagsProvider
的 @Bean
RestTemplateExchangeTags
和 WebClientExchangeTags
中有便捷的静态函数
自动配置允许在启动时使用前缀为cache
的度量标准检测所有可用的Cache
缓存检测针对一组基本指标进行了标准化。此外,还提供了特定于缓存的指标。
支持以下缓存库
度量标准由缓存的名称和从bean名称派生的CacheManager
的名称标记
注: 只有启动时可用的缓存才会绑定到注册表。对于在启动阶段之后即时或以编程方式创建的缓存,需要显式注册。CacheMetricsRegistrar
bean可用于简化此过程
jdbc
的度量标准启用所有可用DataSource
对象的检测jdbc
为前缀的名称DataSource
的名称标记DataSourcePoolMetadataProvider
beans。有关示例,请参阅DataSourcePoolMetadataProvidersConfiguration
hikaricp
前缀公开。每个度量标准都由池名称标记(可以使用spring.datasource.name
控制)hibernate
的度量标准启用统计信息的所有可用Hibernate EntityManagerFactory
实例的检测EntityManagerFactory
名称标记hibernate.generate_statistics
必须设置为true
。您可以在自动配置的EntityManagerFactory
上启用它spring.jpa.properties.hibernate.generate_statistics=true
rabbitmq
的度量标准启用所有可用RabbitMQ连接工厂的检测MeterRegistry
into your component, as shown in the following exampleclass Dictionary {
private final List<String> words = new CopyOnWriteArrayList<>();
//将 gaugeCollectionSize 注册的 registry 中
Dictionary(MeterRegistry registry) {
registry.gaugeCollectionSize("dictionary.size", Tags.empty(), this.words);
}
// …
}
MeterBinder
实现中MeterBinder
beans的指标都会自动绑定到所有 spring 管理的 MeterRegistry 上MeterFilter
bean 都将自动应用于 MeterRegistry.Config
//将 mytag.region 标记重命名为 mytag.area 以获取以 com.example 开头的所有 meter ID
@Bean
public MeterFilter renameRegionTagMeterFilter() {
return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
}
# 将region和stack标记添加到所有 meter,其值分别为us-east-1和prod
management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prod
MeterFilter
MeterFilter
bean 之外,还可以使用 properties 在 per-meter 基础上自定义。Per-meter 定义适用于以给定名称开头的所有 meter ID。例如,以下将禁用任何以 example.remote
开头的 ID 的 metermanagement.metrics.enable.example.remote=false
Property | 描述 |
---|---|
management.metrics.enable |
是否拒绝 meter 发布任何指标 |
management.metrics.distribution.percentiles-histogram |
是否发布一个适用于计算可聚合(跨维度)的百分比近似柱状图 |
management.metrics.distribution.minimum-expected-value , management.metrics.distribution.maximum-expected-value |
通过限制预期值的范围来发布较少的柱状图桶 |
management.metrics.distribution.percentiles |
top99 范围数组,存储的是一个范围的百分百 |
management.metrics.distribution.sla |
sla 范围数组,存储的是一个范围的上下界,可通过此数组计算 top99 |
percentiles-histogram
,percentiles
和sla
背后概念的更多详细信息,请参阅histogarm-distributionSpring Boot 提供了一个 metrics
端点,可以在诊断中用于检查应用程序收集的度量指标
默认情况下端点不可用,必须公开,请参阅公开端点以获取更多详细信息
访问 /actuator/metrics
会显示可用的 meter 名称列表
你可以查看某一个 meter 的信息,方法是将其名称作为选择器,例如,/actuator/metrics/jvm.memory.max
注: 你在此处使用的名称应与代码中使用的名称相匹配,而不是在命名约定规范化后的名称 —— 为了发送到监控系统。换句话说,如果 jvm.memory.max
由于 Prometheus 命名约定而显示为 jvm_memory_max
,则在审查度量指标端点中的 meter 时,应仍使用 jvm.memory.max
作为选择器
你还可以在 URL 的末尾添加任意数量的 tag=KEY:VALUE
查询参数,以便多维度获取 meter,例如 /actuator/metrics/jvm.memory.max?tag=area:nonheap
注: 报告的测量值是与 meter 名称和已应用的任何标签匹配的所有 meter 的统计数据的总和。因此,在上面的示例中,返回的 Value 统计信息是堆的 Code Cache,Compressed Class Space 和 Metaspace 区域的最大内存占用量的总和。如果你只想查看 Metaspace 的最大大小,可以添加一个额外的 tag=id:Metaspace
,即 /actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace
一旦 Spring Security 生效,Spring Boot Actuator 就拥有一个灵活的审计框架,它可以发布事件(默认情况下,authentication success
、failure
和 access denied
例外)。此功能对事件报告和基于身份验证失败实现一个锁定策略非常有用。要自定义发布的安全事件,你可以提供自己的 AbstractAuthenticationAuditListener
和 AbstractAuthorizationAuditListener
实现。
你还可以将审计服务用于自己的业务事件。为此,请将现有的 AuditEventRepository
注入自己的组件并直接使用它或使用 Spring ApplicationEventPublisher
(通过实现 ApplicationEventPublisherAware
)发布 AuditApplicationEvent
。
httptrace
端点来获取最近相关的 100 个请求响应信息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文件的侦听器,如以下示例所示org.springframework.context.ApplicationListener=\
org.springframework.boot.context.ApplicationPidFileWriter,\
org.springframework.boot.web.context.WebServerPortFileWriter
SpringApplication.addListeners(…)
方法并传递相应的Writer
对象来激活侦听器Writer
构造函数中自定义文件名和路径Spring Boot的执行器模块包括在部署到兼容的Cloud Foundry实例时激活的其他支持
/cloudfoundryapplication
路径为所有@Endpoint
beans提供了另一条安全路线
通过扩展支持,可以使用Spring Boot执行器信息扩充Cloud Foundry管理UI(例如可用于查看已部署应用程序的Web应用程序)。例如,应用程序状态页面可以包括完整的健康信息,而不是典型的“运行”或“停止”状态
注: 常规用户无法直接访问/cloudfoundryapplication
路径。为了使用端点,必须与请求一起传递有效的UAA令牌
/cloudfoundryapplication
端点,可以将以下设置添加到application.properties
文件中management.cloudfoundry.enabled=false
/cloudfoundryapplication
端点的安全验证会对各种Cloud Foundry服务进行SSL调用management.cloudfoundry.skip-ssl-validation=true
如果服务器的上下文路径已配置为/
以外的任何其他内容,则Cloud Foundry端点将不会在应用程序的根目录中可用
例如,如果server.servlet.context-path=/app
,Cloud Foundry端点将在/app/cloudfoundryapplication/*
处可用
如果您希望Cloud Foundry端点始终在/cloudfoundryapplication/*
处可用,则无论服务器的上下文路径如何,您都需要在应用程序中明确配置它
配置将根据使用的Web服务器而有所不同。对于Tomcat,可以添加以下配置
@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("/*");
};
}
SpringBoot 2.1.1.RELEASE 官方文档
spring-boot-actuator-api-2.1.1.RELEASE
SpringBoot 2.1.1.RELEASE 中文文档
SpringBoot 2.x 中文文档
自定义 HealthIndicators
Spring Boot Actuator: Production-ready Features