在普罗米修斯中显示任意@Timed指标

时间:2020-10-30 17:20:40

标签: prometheus spring-boot-actuator micrometer

我正在尝试将时间指标添加到我的Spring-boot Web应用程序中。现在,该应用程序使用千分尺,普罗米修斯和弹簧引导执行器。

我可以通过http:// localhost:8080 / actuator / prometheus连接到我的应用,并查看默认指标的列表,例如:

# HELP jvm_gc_memory_allocated_bytes_total Incremented for an increase in the size of the young generation memory pool after one GC to before the next
# TYPE jvm_gc_memory_allocated_bytes_total counter
jvm_gc_memory_allocated_bytes_total{application="my app",} 0.0
# HELP jvm_classes_loaded_classes The number of classes that are currently loaded in the Java virtual machine
# TYPE jvm_classes_loaded_classes gauge
jvm_classes_loaded_classes{application="my app",} 7581.0
...

太棒了!

但是现在我想将计时指标附加到我的一个控制器的方法上。我希望它就像在类中添加@Timed注释一样简单:

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import io.micrometer.core.annotation.Timed;

@RestController
@Timed
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @GetMapping("/greeting")
    public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
        doWork();
        return buildResponse(name);
    }

    private void doWork() {
        try {
            Thread.sleep((long) (1000 * Math.random()));
        } catch (InterruptedException e) {
        }
    }

    private Greeting buildResponse(String name) {
        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
}

但是,这似乎并未向http:// localhost:8080 / actuator / prometheus端点添加任何指标。

为了使端点报告GreetingController类,尤其是doWorkbuildResponse方法的计时指标,我需要采取什么步骤?

-更新-

我设法获得了想要的结果,但是比我期望的花费了更多的工作,我希望有一种更简单的方法。我将Timer对象显式添加到要测量的每个方法中,如下所示:

import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @Autowired
    MeterRegistry meterRegistry;

    @GetMapping("/greeting")
    public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
        doWork();
        return buildResponse(name);
    }

    private void doWork() {
        Timer timer = meterRegistry.timer(this.getClass().getSimpleName() + ".doWork");
        timer.record(() -> {
            try {
                Thread.sleep((long) (1000 * Math.random()));
            } catch (InterruptedException e) {
            }
        });
    }

    private Greeting buildResponse(String name) {
        AtomicReference<Greeting> response = new AtomicReference<>();

        Timer timer = meterRegistry.timer(this.getClass().getSimpleName() + ".buildResponse");
        timer.record(() -> {
            response.set(new Greeting(counter.incrementAndGet(), String.format(template, name)));
        });

        return response.get();
    }
}

但是至少这能使我得到我一直在寻找的结果:

# HELP GreetingController_buildResponse_seconds  
# TYPE GreetingController_buildResponse_seconds summary
GreetingController_buildResponse_seconds_count{application="my app",} 10.0
GreetingController_buildResponse_seconds_sum{application="my app",} 0.001531409
# HELP GreetingController_buildResponse_seconds_max  
# TYPE GreetingController_buildResponse_seconds_max gauge
GreetingController_buildResponse_seconds_max{application="my app",} 2.52253E-4
# HELP GreetingController_doWork_seconds_max  
# TYPE GreetingController_doWork_seconds_max gauge
GreetingController_doWork_seconds_max{application="my app",} 0.941169892
# HELP GreetingController_doWork_seconds  
# TYPE GreetingController_doWork_seconds summary
GreetingController_doWork_seconds_count{application="my app",} 10.0
GreetingController_doWork_seconds_sum{application="my app",} 4.767700907

有没有更清洁的方法?

2 个答案:

答案 0 :(得分:1)

在配置类中将TimedAspect注册为bean:

@Bean
public TimedAspect timedAspect(MeterRegistry meterRegistry) {
    return new TimedAspect(meterRegistry);
}

答案 1 :(得分:-1)

@Timed("问候") 必须附加标签