前言

在使用SpringBoot时,没有用默认的Tomcat容器,而是用的Undertow容器。

在线上使用时,发现没有对容器的线程池做监控,无法判断容器当前线程的工作状态及发生问题时,不知道具体的原因。

索引,需要对Undertow的线程池、请求数、请求错误数做度量监控。

本文旨在记录一下如何把MetricRegistry转成MeterRegistry来使用,为什么要这么做?其实就是我们当前系统是使用的MetricRegistry进行度量输出,但在SpringBoot中,有些度量是使用的MeterRegistry来进行收集的,所以需要把MeterRegistry收集到的数据,通过MetricRegistry进行输出。

方案

直接上代码吧:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    @Bean
	public MetricRegistry dropwizardRegistry() {
		return new MetricRegistry();
	}

	@Bean
	public MeterRegistry consoleLoggingRegistry(MetricRegistry dropwizardRegistry) {
		DropwizardConfig consoleConfig = new DropwizardConfig() {

			@Override
			public String prefix() {
				return "console";
			}

			@Override
			public String get(String key) {
				return null;
			}

		};

		return new DropwizardMeterRegistry(consoleConfig, dropwizardRegistry, HierarchicalNameMapper.DEFAULT, Clock.SYSTEM) {
			@Override
			protected Double nullGaugeValue() {
				return null;
			}
		};
	}

这样,我们就得到了一个MeterRegistry,可以直接拿来用啦

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class MyComponent {
    private final MeterRegistry registry;

    public MyComponent(MeterRegistry registry) {
        this.registry = registry;
    }

    public void doSomeWork(String lowCardinalityInput) {
        registry.timer("my.metrics", "input", lowCardinalityInput).record(() -> {
            // do work
        });
    }
}

参考

https://micrometer.io/docs/guide/consoleReporter

https://frandorado.github.io/spring/2020/03/31/spring-actuator-undertow.html

https://github.com/micrometer-metrics/micrometer/issues/1227

https://github.com/undertow-io/undertow/blob/master/core/src/main/java/io/undertow/server/handlers/MetricsHandler.java#L117