前言
目前翻閱了網上的各種代碼集成Prometheus的demo,千篇一律,基本都是復制粘貼,均是1.x版本的springboot且代碼都是跑不通的。現根據開源依賴debug源碼,實踐出可用版本。
完整代碼地址 gitee-yonyong/my-prometheus
此代碼親測可用。
版本
io.micrometer 1.2.1
springboot 2.0.5.RELEASE
本代碼實現功能
1.Java接入Prometheus,提供JVM監控及自定義指標監控
2.實現自定義指標的接入功能
3.實現指標label動態賦值功能
代碼片段
build.gradle
compile "io.prometheus:simpleclient_hotspot:0.0.24"
compile "io.micrometer:micrometer-registry-prometheus:1.2.1"
compile "io.micrometer:micrometer-core:1.2.1"
注冊MeterRegistry
@Bean(value = "meterRegistryCustomizer")
MeterRegistryCustomizer<MeterRegistry> meterRegistryCustomizer() {
return meterRegistry -> meterRegistry.config()
.commonTags("application", "springboot-app");
}
MyMetrics 自定義指標
/**
* 計數器可以用於記錄只會增加不會減少的指標類型,比如記錄應用請求的總量(http_requests_total),
* cpu使用時間(process_cpu_seconds_total)等。 一般而言,Counter類型的metrics指標在命名中
* 我們使用_total結束。
*/
public static Counter requestCounter = Counter.build()
.name("io_namespace_http_requests_total")
.labelNames("path", "method", "code")
.help("Total requests.").register();
注冊自定義指標
@Component
public class InitPrometheus implements ApplicationListener<ContextRefreshedEvent> {
@Resource
PrometheusMeterRegistry meterRegistry;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
new MyMetrics();
CollectorRegistry prometheusRegistry = meterRegistry.getPrometheusRegistry();
prometheusRegistry.register(MyMetrics.requestCounter);
prometheusRegistry.register(MyMetrics.inprogressRequests);
prometheusRegistry.register(MyMetrics.requestLatencyHistogram);
prometheusRegistry.register(MyMetrics.requestLatency);
}
}
使用
配置攔截器
@Configuration
public class AppConfig extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new PrometheusMetricsInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
攔截器為指標賦值
public class PrometheusMetricsInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
String method = request.getMethod();
int status = response.getStatus();
MyMetrics.inprogressRequests.labels(requestURI,method).inc();
MyMetrics.histogramRequestTimer = MyMetrics.requestLatencyHistogram.labels(requestURI, method, String.valueOf(status)).startTimer();
MyMetrics.requestTimer = MyMetrics.requestLatency.labels(requestURI, method, String.valueOf(status)).startTimer();
return super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String requestURI = request.getRequestURI();
String method = request.getMethod();
int status = response.getStatus();
MyMetrics.requestCounter.labels(requestURI, method, String.valueOf(status)).inc();
MyMetrics.inprogressRequests.labels(requestURI,method).dec();
MyMetrics.histogramRequestTimer.observeDuration();
MyMetrics.requestTimer.observeDuration();
super.afterCompletion(request, response, handler, ex);
}
}
啟動項目,查看服務指標信息
http://localhost:8502/metrics/prometheus