application.ymlorg.springframework.boot spring-boot-starter-webio.micrometer micrometer-coreio.micrometer micrometer-registry-prometheusruntime org.springframework.boot spring-boot-starter-actuatororg.springframework.cloud spring-cloud-dependencies2020.0.4 pom import org.springframework.boot spring-boot-dependencies2.5.6 pom import
spring:
application:
name: springboot-demo
management:
endpoints:
web:
exposure:
include: ["metrics","prometheus"]
base-path: /actuator
endpoint:
metrics:
enabled: true
prometheus:
enabled: true
metrics:
export:
prometheus:
enabled: true
tags:
#springboot2.1.0版本后添加tags标签,2.0版本需要使用java bean方式配置
application: ${spring.application.name}
如果是使用springboot 2.0.x版本,需要如下配置tags
@Bean MeterRegistryCustomizer开启P99等监控指标configurer( @Value("${spring.application.name}") String applicationName) { return (registry) -> registry.config().commonTags("application", applicationName); }
Configuration
public class PrometheusConfiguration {
@Bean
MeterRegistryCustomizer metricsCommonTags() {
return registry -> {
registry.config().meterFilter(
new MeterFilter() {
@Override
public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
if (id.getType() == Meter.Type.TIMER && id.getName().matches("^(http|dubbo){1}.*")) {
return DistributionStatisticConfig.builder()
.percentilesHistogram(true)
.percentiles(0.5, 0.90, 0.95, 0.99)
.sla(Duration.ofMillis(50).tonanos(),
Duration.ofMillis(100).tonanos(),
Duration.ofMillis(200).tonanos(),
Duration.ofSeconds(1).tonanos(),
Duration.ofSeconds(5).tonanos())
.minimumExpectedValue(Duration.ofMillis(1).tonanos())
.maximumExpectedValue(Duration.ofSeconds(5).tonanos())
.build()
.merge(config);
} return config;
}
});
};
}
如果使用的是dubbo,需要自定义dubbo拦截器实现rpc接口的请求耗时统计
@Slf4j
@Configuration
@Activate(group = {Constants.PROVIDER, Constants.CONSUMER}, order = 1)
public class DubboRequestTimeFilter implements Filter {
@Override
public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
try {
String serviceName = invoker.getInterface().getName();
String methodName = RpcUtils.getMethodName(invocation);
MeterRegistry meterRegistry = ServiceBean.getSpringContext().
getBean(MeterRegistry.class);
Timer timer = Timer.builder("dubbo.server.requests")
.description("dubbo请求耗时")
.tags("serviceName", serviceName, "methodName", methodName)
.register(meterRegistry);
AtomicReference result = new AtomicReference<>();
timer.record(() -> {
try {
result.set(invoker.invoke(invocation));
} catch (Exception e) {
log.error(e.getMessage(), e);
}
});
return result.get();
} catch (Exception e) {
throw e;
}
}
}
然后在在 resource的meta-INF/dubbo 文件夹下创建com.alibaba.dubbo.rpc.Filter,在此文件里配置拦截器,比如
dubboRequestTimeFilter=com.demo.DubboRequestTimeFilter
最后启动项目访问http://IP:PORT/actuator/prometheus就可以看到配置的指标信息了



