如何将Micrometer集成到基于Spring构建的GeoServer获取默认监控指标
集成方案说明
Spring Boot的自动配置方案不能直接用于GeoServer,因为GeoServer基于Spring MVC框架开发,没有Spring Boot的AutoConfiguration自动装配能力,需要手动完成Micrometer的注册、指标绑定、端点暴露三个核心步骤,具体操作如下:
第一步:引入必要Maven依赖
在你的项目pom.xml中添加以下依赖,版本建议选择和你项目Spring版本兼容的Micrometer版本:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>对应兼容版本号</version> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>对应兼容版本号</version> </dependency> <!-- 用于绑定Spring MVC相关指标 --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-spring-integration</artifactId> <version>对应兼容版本号</version> </dependency>
第二步:注册全局Prometheus MeterRegistry Bean
创建Spring配置类,注册单例的PrometheusMeterRegistry,同时绑定所有默认通用指标,和Spring Boot默认提供的JVM、系统、日志类指标对齐:
import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; import io.micrometer.core.instrument.binder.jvm.JvmHeapPressureMetrics; import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; import io.micrometer.core.instrument.binder.logging.LogbackMetrics; import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics; import io.micrometer.core.instrument.binder.system.ProcessorMetrics; import io.micrometer.core.instrument.binder.system.UptimeMetrics; import io.micrometer.prometheus.PrometheusConfig; import io.micrometer.prometheus.PrometheusMeterRegistry; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MicrometerConfig { @Bean public PrometheusMeterRegistry prometheusMeterRegistry() { PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); // 绑定JVM默认指标 new JvmMemoryMetrics().bindTo(registry); new JvmGcMetrics().bindTo(registry); new JvmThreadMetrics().bindTo(registry); new JvmHeapPressureMetrics().bindTo(registry); // 绑定系统级指标 new ProcessorMetrics().bindTo(registry); new UptimeMetrics().bindTo(registry); new FileDescriptorMetrics().bindTo(registry); // 绑定日志统计指标 new LogbackMetrics().bindTo(registry); return registry; } }
第三步:配置Spring MVC请求指标统计(可选)
如果需要和Spring Boot默认对齐,收集HTTP请求耗时、状态码、请求路径维度的统计指标,添加Spring MVC拦截器:
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Timer; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class MetricsInterceptor implements HandlerInterceptor { private final ThreadLocal<Timer.Sample> sampleThreadLocal = new ThreadLocal<>(); private final MeterRegistry meterRegistry; public MetricsInterceptor(MeterRegistry meterRegistry) { this.meterRegistry = meterRegistry; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { sampleThreadLocal.set(Timer.start(meterRegistry)); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { Timer.Sample sample = sampleThreadLocal.get(); if (sample != null) { sample.stop(Timer.builder("http.server.requests") .tag("method", request.getMethod()) .tag("uri", request.getRequestURI()) .tag("status", String.valueOf(response.getStatus())) .register(meterRegistry)); sampleThreadLocal.remove(); } } }
再把拦截器注册到Spring MVC配置中:
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { private final MetricsInterceptor metricsInterceptor; public WebConfig(MetricsInterceptor metricsInterceptor) { this.metricsInterceptor = metricsInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(metricsInterceptor).addPathPatterns("/**"); } }
第四步:调整现有Prometheus端点代码
不要在Controller内实例化PrometheusMeterRegistry,直接注入全局的注册器Bean返回采集结果即可:
@RestController @RequestMapping(path = "/actuator/prometheus") public class MetricsEndpointController extends RestBaseController { private final PrometheusMeterRegistry prometheusRegistry; // 构造函数注入全局注册器 public MetricsEndpointController(PrometheusMeterRegistry prometheusRegistry) { this.prometheusRegistry = prometheusRegistry; } @GetMapping(produces = { MediaType.TEXT_PLAIN_VALUE }) public String prometheus() { return prometheusRegistry.scrape(); } }
如果需要扩展数据源连接池、GeoServer自身业务操作等其他指标,自行找到对应Micrometer的Binder实现绑定到全局注册器即可,最终效果和Spring Boot自动集成的默认指标完全一致。
内容的提问来源于stack exchange,提问作者vince
相关产品推荐
相关产品推荐

