我正在尝试通过将Micrometer.io与Spring Boot 2.0.0.RELEASE结合使用来生成Prometheus指标。
当我尝试将List的大小显示为Gauge时,它一直显示NaN。 在文档中说:
严格引用要使用量规测量的状态对象是您的责任。
我尝试了一些不同的方法,但无法解决问题。这是我的一些试用代码。
import io.micrometer.core.instrument.*; import io.swagger.backend.model.Product; import io.swagger.backend.service.ProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @RestController @RequestMapping("metrics") public class ExampleController { private AtomicInteger atomicInteger = new AtomicInteger(); private ProductService productService; private final Gauge productGauge; @Autowired public HelloController(ProductService productService, MeterRegistry registry) { this.productService = productService; createGauge("product_gauge", productService.getProducts(), registry); } private void createGauge(String metricName, List<Product> products, MeterRegistry registry) { List<Product> products = productService.getProducts(); // #1 // this displays product_gauge as NaN AtomicInteger n = registry.gauge("product_gauge", new AtomicInteger(0)); n.set(1); n.set(2); // #2 // this also displays product_gauge as NaN Gauge .builder("product_gauge", products, List::size) .register(registry); // #3 // this displays also NaN testListReference = Arrays.asList(1, 2); Gauge .builder("random_gauge", testListReference, List::size) .register(registry); // #4 // this also displays NaN AtomicInteger currentHttpRequests = registry.gauge("current.http.requests", new AtomicInteger(0)); } @GetMapping(path = "/product/decrement") public Counter decrementAndGetProductCounter() { // decrement the gague by one } }
有没有人可以帮助解决这个问题?任何帮助,将不胜感激。
在所有情况下,您都必须对观察到的实例保持强烈的引用。当您的createGauge()方法退出时,所有函数堆栈分配的引用都可以进行垃圾回收。
createGauge()
为此#1,请atomicInteger像这样传递您的字段:registry.gauge("my_ai", atomicInteger);。然后根据需要增加/减少。每当千分尺需要查询时,只要找到参考,便会一直使用。
#1
atomicInteger
registry.gauge("my_ai", atomicInteger);
对于#2,请传递您的productService字段和lambda。基本上,每当查询量规时,它将使用提供的对象调用该lambda:registry.gauge("product_gauge", productService, productService -> productService.getProducts().size());
#2
productService
registry.gauge("product_gauge", productService, productService -> productService.getProducts().size());
(不保证语法错误。)