You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:45:00