1.引入相关依赖及配置
springboot为1.x 谨慎升级prometheus版本,可能会不兼容
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.12.RELEASE</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-spring-legacy</artifactId>
<version>1.0.3</version>
<exclusions>
<exclusion>
<artifactId>micrometer-core</artifactId>
<groupId>io.micrometer</groupId>
</exclusion>
</exclusions>
</dependency>
springboot为2.x,可使用该版本或更高版本
springboot1.x application.properties 配置
# actuator暴露接口使用的端口
management.port = 19080
# actuator暴露接口的前缀
management.context-path = /actuator
# 是否暴露metric指标
management.metrics.export.prometheus.enabled=true
# actuator是否需要安全保证
management.security.enabled = false
# actuator的metrics接口是否需要安全保证
endpoints.metrics.sensitive = false
# actuator的metrics接口是否开启
endpoints.metrics.enabled=true
# actuator的health接口是否需要安全保证
endpoints.health.sensitive=false
# actuator的health接口是否开启
endpoints.health.enabled=true
springboot为2.x,推荐改用以下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
springboot2.x application.properties 配置
management.server.port=19080
management.endpoints.enabled-by-default=true
management.endpoint.metrics.enabled=true
management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/actuator
management.endpoint.health.show-details=always
management.endpoint.prometheus.enabled=true
management.metrics.tags.application=${spring.application.name}
management.metrics.export.prometheus.enabled=true
封装工具类
// package
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.search.Search;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author wangzhen
* @date 2020-07-07
*/
public class MetricCollector {
private static ConcurrentHashMap<String, AtomicLong> ref = new ConcurrentHashMap<>();
private static Search find(String name) {
return Metrics.globalRegistry.find(name);
}
public static Counter incrCounter(String name, String description, String... tags) {
Counter counter = find(name).counter();
if (!Optional.ofNullable(counter).isPresent()) {
counter = Counter.builder(name)
.tags(tags)
.description(description)
.register(Metrics.globalRegistry);
}
counter.increment();
return counter;
}
public static Gauge incrGauge(String name, String description, String... tags) {
Gauge gauge = find(name).gauge();
if (Optional.ofNullable(gauge).isPresent()) {
double value = gauge.value();
Double var = value + 1D;
MetricCollector.ref.compute(name, (k, v) -> {
if (v == null) {
MetricCollector.ref.put(k, new AtomicLong(1));
} else {
v.set(var.longValue());
}
return v;
});
} else {
AtomicLong ref = new AtomicLong(1);
gauge = Gauge.builder(name, ref, AtomicLong::doubleValue)
.tags(tags)
.description(description)
.register(Metrics.globalRegistry);
MetricCollector.ref.put(name, ref);
}
return gauge;
}
}
demo:
import io.micrometer.core.annotation.Timed;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Gauge;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author wangzhen
* @date 2020-07-07
*/
@RestController
@RequestMapping("/app/v1/prime/tester")
public class AppTester {
@PostMapping("/test")
public Object test() {
// name 建议以total结尾
Counter counter = MetricCollector.incrCounter("counter_total", "counter_description", "key", "vv");
return counter.count();
}
@RequestMapping("/test1")
@Timed(value = "method_timer", extraTags = {"timer_key", "timer_value"}, description = "timed_description")
public Object test1() throws InterruptedException {
Thread.sleep(5000);
return "ok";
}
@RequestMapping("/test2")
public Object test2() {
Gauge gauge = MetricCollector.incrGauge("gauge_name", "gauge_description", "key2", "vv2");
return gauge.value();
}
}
通过调用相应接口后,访问 http://localhost:19080/actuator/prometheus/
即可看到注册的指标详情。
测试截图: