// actuator依赖提供指标
org.springframework.boot
spring-boot-starter-actuator
2.6.3
// 将指标转换成prometheus可使用的格式
io.micrometer
micrometer-registry-prometheus
1.8.2
1、以下指标名称都为prometheus接收的指标名称
2、http://ip:port/actuator/prometheus 此为prometheus默认开放接口,输出prometheus格式
3、http://localhost:11130/actuator/metrics 此为actuator的指标接口,输出当前开放的指标
自动配置通过使用核心 Micrometer 类启用 JVM Metrics。JVM 指标以jvm.计量名称发布。
提供了以下 JVM 指标:
自动配置通过使用核心 Micrometer 类启用系统指标。
提供了以下系统指标:
自动配置公开应用程序启动时间指标:
自动配置公开 Logback 和 Log4J2 启用事件指标。
自动配置识别公开 ThreadPoolTaskExecutor 和ThreadPoolTaskScheduler beans执行。指标包含执行者的名称标记,该名称来自 bean 名称。
自动配置启用对 Spring MVC 控制器和功能处理程序处理的所有请求的检测。
可以通过management.metrics.web.server.request.metric-name属性来自定义指标开头。
@Timed注解可以标注在@Controller类和@RequestMapping方法上,如果你不想记录所有 Spring MVC 请求的指标,则可以设置management.metrics.web.server.request.autotime.enabled=false然后单独使用@Timed标注需要开放的请求
默认情况下,与 Spring MVC 相关的指标标记有以下信息:
| 标签 | 描述 |
|---|---|
| exception | 处理请求时引发的任何异常的简单类名。 |
| method | 请求的方法(例如,GET或POST) |
| outcome | 请求的结果,基于响应的状态代码。1xx 是信息性状态码 2xx 是成功状态码 3xx 是重定向状态码 4xx 是客户端异常状态码 5xx 是服务端异常状态码 |
| status | 响应的 HTTP 状态代码(例如,200或500) |
| uri | 参数替换之前的请求 URI 模板(例如,/api/person/{id}) |
如果要添加默认标签,请提供一个或多个@Bean实现WebMvcTagsContributor
如果要替换默认标签,请提供一个@Bean实现WebMvcTagsProvider
如果要处理所有请求,可以自定义过滤器,添加一个@Bean实现FilterRegistrationBean例如将4xx和5xx异常类型归为同一类
自动配置启用对 Spring WebFlux 控制器和功能处理程序处理的所有请求的检测。
可以通过management.metrics.web.server.request.metric-name属性来自定义指标开头。
@Timed注解可以标注在@Controller类和@RequestMapping方法上,如果你不想记录所有 Spring WebFlux 请求的指标,则可以设置management.metrics.web.server.request.autotime.enabled=false然后单独使用@Timed标注需要开放的请求
默认情况下,与 Spring WebFlux 相关的指标标记有以下信息:
| 标签 | 描述 |
|---|---|
| exception | 处理请求时引发的任何异常的简单类名。 |
| method | 请求的方法(例如,GET或POST) |
| outcome | 请求的结果,基于响应的状态代码。1xx 是信息性状态码 2xx 是成功状态码 3xx 是重定向状态码 4xx 是客户端异常状态码 5xx 是服务端异常状态码 |
| status | 响应的 HTTP 状态代码(例如,200或500) |
| uri | 参数替换之前的请求 URI 模板(例如,/api/person/{id}) |
如果要添加默认标签,请提供一个或多个@Bean实现WebFluxTagsContributor
如果要替换默认标签,请提供一个@Bean实现WebFluxTagsProvider
同 Spring MVC 和 Spring WebFlux类似
1、要让Spring Boot Actuator 管理RestTemplate和WebClient指标。必须使用自动配置的构建器构建实例,并注册为bean。(此方式需要将RestTemplate注册为Bean)
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
2、也可以构建时手动添加指标检测的定制器,即MetricsRestTemplateCustomizer和MetricsWebClientCustomizer。(此方式不需要将RestTemplate注册为Bean,并能对RestTemplate做定制化)
@Autowired
private MetricsRestTemplateCustomizer metricsRestTemplateCustomizer;
RestTemplate restTemplate = new RestTemplateBuilder()
.additionalCustomizers(metricsRestTemplateCustomizer)
.build();
可以通过设置management.metrics.web.client.request.metric-name属性来自定义名称
默认情况下,与HTTP Client相关的指标标记有以下信息:
| 标签 | 描述 |
|---|---|
| clientName | URI 的主要部分 |
| method | 请求的方法(例如,GET或POST) |
| outcome | 请求的结果,基于响应的状态代码。1xx 是信息性状态码 2xx 是成功状态码 3xx 是重定向状态码 4xx 是客户端异常状态码 5xx 是服务端异常状态码 |
| status | 响应的 HTTP 状态代码(例如,200或500)或IO异常(当存在IO情况时)。否则它是客户端异常。 |
| uri | 参数替换之前的请求 URI 模板(例如,/api/person/{id}) |
如果要自定义标签,需根据使用的客户端,提供一个@Bean实现RestTemplateExchangeTagsProvider 或者WebClientExchangeTagsProvider。底层使用RestTemplateExchangeTags和WebClientExchangeTags的静态函数设置标签内容。
示例:
@Autowired
private MeterRegistry meterRegistry;
// 此时会覆盖原来的标签
RestTemplateExchangeTagsProvider restTemplateExchangeTagsProvider = new RestTemplateExchangeTagsProvider() {
@Override
public Iterable getTags(String urlTemplate, HttpRequest request, ClientHttpResponse response) {
// 此为默认实现
// Tag uriTag = (StringUtils.hasText(urlTemplate) ? RestTemplateExchangeTags.uri(urlTemplate)
// : RestTemplateExchangeTags.uri(request));
// return Arrays.asList(RestTemplateExchangeTags.method(request), uriTag,
// RestTemplateExchangeTags.status(response), RestTemplateExchangeTags.clientName(request),
// RestTemplateExchangeTags.outcome(response));
// 指标key不能为中文。如果为中文,会转换成下划线。
return Arrays.asList(Tag.of("tag1", "指标值"), Tag.of("tag2", "指标值"));
}
};
RestTemplate restTemplate = new RestTemplateBuilder()
.additionalCustomizers(
new MetricsRestTemplateCustomizer( // 自定义指标模板
meterRegistry, // 指标注册器
restTemplateExchangeTagsProvider, // 自定义标签
"http_client_requests12", // 自定义指标名
new AutoTimeProperties())) // Timer指标是否开启,null为不开启。此时须开启,因为Http自动配置的指标都为Timer统计的,后续会讲到。
.build();
结果:

自动配置仅在启用时检测Tomcat 的MBeanRegistry是否启用。默认情况下,MBeanRegistry是禁用,但您可以通过设置server.tomcat.mbeanregistry.enabled=true启用它。
自动配置缓存在启动时检测所有可用实例的。
缓存的基本指标进行了标准化。此外,还提供了特定缓存的指标。
支持以下缓存库:
指标名称由缓存的名称和CacheManager从 bean 名称派生的名称进行生成。
只有在启动时配置的缓存才会绑定到注册表。
对于未在启动时定义的缓存,例如动态创建的缓存或在启动阶段后以编程方式创建的缓存,需要显式注册。可以使用 CacheMetricsRegistrar 这个Bean进行便捷注册。
示例:
@Bean //给容器注册一个Bean,返回缓存管理器,这里有redisTemplate容器,所以会自动注入
public CacheManager MyRedisCacheConfig(RedisTemplate redisTemplate) {
//1.创建RedisCacheWriter
/**
* 非锁方式:nonLockingRedisCacheWriter(RedisConnectionFactory connectionFactory);
* 有锁方式:lockingRedisCacheWriter(RedisConnectionFactory connectionFactory);
*/
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisTemplate.getConnectionFactory()));
//2.创建Jackson对象并传入需要序列化的对象
Jackson2JsonRedisSerializer结果:
本人自测无效场景:
初步判断是该功能更多的对@CacheConfig使用的缓存进行自动添加指标

自动配置启用 GraphQL 查询的检测。
本人暂未测试使用。可查看官网描述
自动配置启用数据源检测。
默认情况下,Spring Boot 为所有支持连接的数据源提供默认指标。如果不适配您喜欢的数据源,可通过添加DataSourcePoolMetadataProvider Bean。
此外,Hikari 的指标以hikaricp前缀公开。每个指标都由连接池的名称标记(您可以使用 spring.datasource.name 控制它)。
示例:默认支持
spring:
datasource:
url: jdbc:mysql://localhost:3306/mysql
password: root
username: root
driver-class-name: com.mysql.cj.jdbc.Driver
示例(Druid):默认不支持
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/mysql
password: root
username: root
driver-class-name: com.mysql.cj.jdbc.Driver
max-wait: 60000
max-active: 100
initial-size: 10
调整方式:注册DataSourcePoolMetadataProvider Bean
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.jdbc.DataSourceUnwrapper;
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
*
*
*
*
* @author LuoWenFeng
*/
@Configuration
public class DataSourceConfig {
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnClass({DruidDataSource.class})
static class DruidDataSourceMetadataProviderConfiguration {
DruidDataSourceMetadataProviderConfiguration() {
}
@Bean
DataSourcePoolMetadataProvider DruidDataSourceMetadataProvider() {
return (dataSource) -> {
DruidDataSource dbcpDataSource = DataSourceUnwrapper.unwrap(dataSource, DruidDataSource.class);
return dbcpDataSource != null ? new DruidDataSourcePoolMetadata(dbcpDataSource) : null;
};
}
}
}
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.jdbc.metadata.AbstractDataSourcePoolMetadata;
/**
*
*
*
*
* @author LuoWenFeng
*/
public class DruidDataSourcePoolMetadata extends AbstractDataSourcePoolMetadata {
/**
* Create an instance with the data source to use.
*
* @param dataSource the data source
*/
protected DruidDataSourcePoolMetadata(DruidDataSource dataSource) {
super(dataSource);
}
@Override
public Integer getActive() {
try {
return getDataSource().getActiveCount();
} catch (Exception ex) {
return null;
}
}
@Override
public Integer getIdle() {
try {
return (int) getDataSource().getConnectCount();
} catch (Exception ex) {
return null;
}
}
@Override
public Integer getMax() {
return getDataSource().getMaxIdle();
}
@Override
public Integer getMin() {
return getDataSource().getMinIdle();
}
@Override
public String getValidationQuery() {
return getDataSource().getValidationQuery();
}
@Override
public Boolean getDefaultAutoCommit() {
return getDataSource().isDefaultAutoCommit();
}
}
本人暂未测试使用。可查看官网描述
自动配置启用 Spring Data Repository 方法调用的检测。
可以通过设置management.metrics.data.repository.metric-name属性来自定义名称。
@Timed注解可以标注在@Repository类和方法上,如果你不想记录所有 Repository 调用的指标,则可以设置management.metrics.data.repository.autotime.enabled=false然后单独使用@Timed标注需要开放的请求
默认情况下,与存储库调用相关的指标标记有以下信息:
| 标签 | 描述 |
|---|---|
| repository | Repository的简单类名。 |
| method | Repository被调用的方法的名称。 |
| state | 结果状态(SUCCESS、ERROR、CANCELED或RUNNING)。 |
| exception | 从调用中引发的任何异常的简单类名。 |
如果要替换默认标签,请提供一个@Bean实现RepositoryTagsProvider
自动配置会注册MongoMetricsCommandListener到自动配置的MongoClient。
默认情况下,每个指标都有以下标记信息:
| 标签 | 描述 |
|---|---|
| command | 发出的命令的名称。 |
| cluster_id | 命令发送到的集群的标识符。 |
| server_address | 命令发送到的服务器的地址。 |
| status | 命令的结果(SUCCESS或FAILED)。 |
如果要替换默认标签,请提供一个@Bean实现MongoCommandTagsProvider
如果要禁用自动配置的命令指标,可以设置management.metrics.mongo.command.enabled=false
自动配置会注册MongoMetricsConnectionPoolListener到自动配置的MongoClient。
默认情况下,每个指标都有以下标记信息:
| 标签 | 描述 |
|---|---|
| cluster_id | 连接池对应的集群的标识。 |
| server_address | 连接池对应的服务器地址。 |
如果要替换默认标签,请提供一个@Bean实现MongoConnectionPoolTagsProvider
如果要禁用自动配置的连接池指标,可以设置management.metrics.mongo.connectionpool.enabled=false
当server.ssl.enabled=rue时,Micrometer绑定JettySslHandshakeMetrics
本人暂未测试使用。可查看官网描述
自动配置会注册MicrometerCommandLatencyRecorder到自动配置的LettuceConnectionFactory