当前位置: 首页 > 知识库问答 >
问题:

千分尺 - 普罗米修斯量规显示NaN

潘智刚
2023-03-14

我试图在Spring Boot 2.0.0 .版本中使用Micrometer.io生成普罗米修斯指标

当我试图将列表的大小公开为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
    }
}

有人能帮忙解决这个问题吗?任何帮助都将不胜感激。

共有3个答案

胥承
2023-03-14

我的测微计也有同样的问题。当我使用你的方法#1<code>meterRegistry时,io仪表。gauge(“myGauge”,新的AtomicDouble())。顺便说一下,我正在使用Scala。我注意到,在创建了大约50个仪表之后,新仪表显示NaN

相反,我使用了:

val atomicDouble = new AtomicDouble()
Gauge
  .builder("myGauge", atomicDouble, new AtomicDoubleToDoubleFunction)
  .strongReference(true)
  .register(meterRegistry)

class AtomicDoubleToDoubleFunction extends ToDoubleFunction[AtomicDouble] {
  override def applyAsDouble(value: AtomicDouble): Double = value.doubleValue()
}

这修复了< code>NaN问题,并且我的所有仪表都正确显示。我找到了<代码>。strong reference(true) https://www . codata . com/code/Java/classes/io . micrometer . core . instrument . gauge中的示例。

孟茂
2023-03-14
匿名用户

我无法使用@panser解决方案,因为我使用带标签的仪表。我的解决方案涉及创建<code>com.google.common.util.concurrent。AtomicDouble缓存,带有io.micrometer.core.instrument。将的键和值标记为映射键,如下所示:

    private static final Map<String, AtomicDouble> GAUGE_CACHE = new HashMap<>();

    public void handleGauge(String name, List<Tag> tags, double value) {
        String gaugeKey = this.gaugeKey(name, tags);
        if (!GAUGE_CACHE.containsKey(gaugeKey)) {
            GAUGE_CACHE.put(gaugeKey, new AtomicDouble());
        }
        Objects.requireNonNull(this.registry.gauge(name, tags, GAUGE_CACHE.get(gaugeKey))).set(value);
    }

    private String gaugeKey(String name, List<Tag> tags) {
        return name + ":" + tags.stream().map(tag -> tag.getKey() + tag.getValue()).collect(Collectors.joining(""));
    }

这很好地满足了我的需求,希望能帮助其他人。

全心思
2023-03-14

在所有情况下,您都必须持有对观察到的实例的强引用。当您的createGauge()方法退出时,所有函数栈分配的引用都符合垃圾回收机制的条件。

对于#1,像这样传递你的原子输入器字段:注册表.gauge(“my_ai”,原子Integer);。然后根据需要递增/递减。每当千分尺需要查询时,只要找到参考,它就会查询。

对于#2,传递您的productService字段和lambda。基本上,每当查询仪表时,它都会使用提供的对象调用该lambda:registry.gauge("product_gauge", productService, productService-

(不保证语法错误。)

 类似资料:
  • 响应于“/acturet/prometheus”的DistributionSummary可用的度量仅是度量的Sum、Max和Count。 我想显示在选定的时间量内API调用所用的平均时间。用于EX:API在过去5分钟内所用的平均时间。

  • 我可以在http://localhost:8080/hello/q/metrics看到这个指标。现在我想把这个度量标准推到普罗米修斯,但我还没有找到任何指南,说明如何在普罗米修斯注册/集成这些度量标准。理想情况下,我想把它们推到石墨上,但这不受支持。所以我想知道如何推动这些指标,这样我就可以在格拉法纳可视化它们。

  • 我有一个 rabbitmq 消息队列,许多其他服务在其上报告所谓的的状态更新。现在,在单独的服务(使用SpringBoot编写)上,我需要侦听这些更新并将其转换为Prometheus可擦除的endpoint。 所以我的计划是将传入的对象转换为并将它们注册到中。这是可行的,但只适用于某些点。我还没有弄清楚哪些是可见的,哪些不是,因为看起来这取决于它们在重新启动服务后进入的顺序。我还想不出任何模式,这

  • 我已经在一个千分尺计的方法中检测了我的代码,如下所示: 我还添加了一些其他指标。 其他指标显示在普罗米修斯endpoint上,但此指标指标不会。 我错过了什么?

  • 我正在将Spring Boot应用程序从Spring Boot 1(使用Prometheus Simpleclient)转换为Spring Boot 2(使用微米)。 我很难将我们在《春靴1》和《普罗米修斯》中的标签转换为千分尺的概念。例如(普罗米修斯): Micrometer的标签似乎与Prometheus的标签有些不同:所有的值都必须预先声明,不仅仅是键。 可以将普罗米修斯的标签与Spring

  • 对于和我们希望使用千分尺应用程序监控,因此包括: 并创建一个具有以下restendpoint的控制器: 因此,我们得到了endpoint,它只等待两秒钟,我们得到了endpoint,它返回了ITME的列表。 Bot请求工作。唯一的区别是,对于endpoint,我得到的是prometheus度量,而对于endpoint,我没有得到任何度量: 对于返回或仍不受支持的请求,是否必须配置其他内容才能使其工