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

更新千分尺仪表会阻止调用线程吗?

刁星渊
2023-03-14

更新千分尺是否会阻止调用线程(例如执行I/O)?

我相信答案是“不,I/O发生在单独的指标收集线程中”,但想知道这种情况的例外情况,边缘情况,…

谢谢Tarik

共有1个答案

琴刚豪
2023-03-14

这取决于调用线程是什么意思。如果您指的是注册仪表的用户线程,答案是否定的,此时您馈送到仪表的方法甚至没有被调用。

如果您指的是将“运送”指标的线程,那将被阻止。这通常是一个单独的线程(因为大多数注册表都是基于推送的),但是在Prometheus(基于拉动)的情况下,仪表将阻塞Prometheusendpoint和为其提供服务的线程

因此,在千分尺中,您可以使用一个中间“状态”对象,而不是将阻塞方法注册到量规,您可以从单独的线程(阻塞)定期更新该对象,并从量规读取该对象(非阻塞),例如:

AtomicInteger currentValue = registry.gauge("test.gauge", new AtomicInteger(0));

您可以从另一个线程修改prestValue,请参阅文档

您可以对任意对象执行此操作,例如:

State state = registry.gauge("test.gauge", Collections.emptyList(), new State(), State::getValue);

在< code>getValue不阻塞的情况下,只为您提供最新的值,而在另一个线程上,您可以更新封装在< code>State对象中的值。

这里有几行显示您注册到仪表中的方法是阻塞的:

public class GaugeSample {
    public static void main(String[] args) throws InterruptedException {
        PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
        System.out.println("registering the gauge...");
        Gauge.builder("test.gauge", GaugeSample::getValue)
                .register(registry);

        System.out.println("scraping...");
        System.out.println(registry.scrape());
    }

    private static double getValue() {
        try {
            Thread.sleep(5_000);
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }

        return 42;
    }
}
 类似资料:
  • 我在Spring Boot 2应用程序中使用千分尺来跟踪对象的状态。在状态更改时,调用<code>statusArrival() 这是我当前的实现: 这工作得很好,但问题是当调用此方法时,所有仪表值都会更新。我只希望更新具有给定的仪表。 输入: 电流输出: 所有仪表均已更新。 期望输出: 只有带有给定product_id标签的仪表才会更新。 我如何才能做到这一点?

  • 我们计划使用CXF为Java客户机代码生成Java类。我已经读到CXF是线程安全的,请参阅CXF常见问题解答。 但我找不到的是,对同一soap服务的两个线程中的两个调用是同时执行的,还是一个线程将阻塞另一个线程? 所以我们有多个线程调用相同的皂服务实例,比如 我需要知道是否只有一个肥皂呼叫在同一时间执行,即一个呼叫阻止所有其他呼叫,直到它完成;或者是否所有呼叫都在同一时间通过。

  • 我对Spring很陌生,正在尝试将我的应用程序连接到麋鹿。该应用程序运行的是Spring boot 1.5.5,因此我使用的是微米遗产。我的pom看起来像这样: 每当我尝试启动我的应用程序时,我都会收到以下错误: 根本原因似乎是类io.micrometer.core.instrument.config.validate.Validated它似乎没有像它应该的那样出现在包中。对此有什么想法吗?

  • 是否有任何方法可以测量实用程序如何使用线程池?我已经浏览了代码,但还没有看到任何直接的选项。

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

  • 我想使用测微计来收集一个任务的持续时间度量,该任务从一个Java进程开始,在另一个Java过程结束(通过Kafka在它们之间进行通信)。 我想使用返回一个对象,然后将它与Kafka消息一起传递给第二个进程,然后使用来记录任务持续时间。但是不清楚对象是否可以序列化,以及一般来说这种方法是否有效。 有可能使上述方法奏效吗?怎么会?如果不是,实现既定目标的最简单方法是什么? 不确定这是否重要——我的运行