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

千分尺中的计数器Thread安全吗

尹弘壮
2023-03-14

我试图发布我的应用程序正在处理的事件数量。这是我在接收端的代码:

public void process(List<String> batch) {
    logger.info ("Processing batch of size " + batch.size())
    metrics.incrementCounter(MetricsType.CONSUMER_TOTAL_PROCESSED, batch.size)
}

类指标是:

public class Metrics {
    private static final Map<MetricsType, Counter> COUNTER_MAP = new ConcurrentHashMap<>();

    public Metrics(
        @Autowired MeterRegistry meterRegistry
    ) {
        COUNTER_MAP.put(
            MetricsType.CONSUMER_TOTAL_PROCESSED,
            Counter.builder("CONSUMER_TOTAL_PROCESSED").register(meterRegistry)
        );

        COUNTER_MAP.put(
            MetricsType.CONSUMER_DUPLICATE_PROCESSED,
            Counter.builder("CONSUMER_DUPLICATE_PROCESSED").register(meterRegistry)
        );
    }

    public void increment(MetricsType metricsType, int size) {
        COUNTER_MAP.get(metricsType).increment(size);
    }
}

enum < code > metric type 包含所有类型的计数器。

进程方法随时由 16 个线程调用。我面临的问题是打印计数的记录器,而grafana中报告的总计数相差甚远。

我必须在每次递增计数器时进行同步吗?

编辑 - 我所说的计数是关闭的,如果有两个大小为200的日志,那么grafana应该报告总计数器400。我通过采取2小时的时间范围来验证这一点,我从日志中提取所有大小并添加它们。

如果您无意中发现这两个源之间存在差异,请检查Grafana中的最大数据点数量,这就是我认为计数器可能不是线程安全的实际问题。

共有2个答案

万承志
2023-03-14

计数器单调递增。因此,如果之前的批次已经发生,那么新的批次将添加到之前的总数中。

您使用的是哪个后端?如果您使用的是 Prometheus,则可以将查询包装在增加函数中,以便可视化计数器增加的量。

(回答最初的问题:是的,计数器是线程安全的)

酆鸿彩
2023-03-14

计数器是线程安全的,在内部它们使用一些原子数据结构进行计数。根据您的代码,我怀疑记录器打印的内容与您在grafana中看到的内容大相径庭,因为记录器打印的是当前批次的大小,而计数器打印的是所有批次大小的总和。

 类似资料:
  • 我花了一些时间阅读的。对于我的特定用例,我需要始终使用应用程序开始时可用的特定值来启动计数器。 由于应用程序有多个pod,我希望设置这个初始值,然后可以增加任意数量的pod。< code >计数器支持的唯一方法是增量。我想到了使用< code>Gauge,但是有各种各样的缺点,因为我的度量始终是一个具有起始设置值的无限增量计数器。 以前有人解决过这个用例吗?或者有解决方法吗?

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

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

  • 我正在用Spring Boot2编写一个应用程序。我的方法试图产生价值,直到价值是唯一的。每个唯一生成的值都被添加到缓存中。一般来说,它应该在第一次尝试时生成值,但是应用程序运行得越多,生成的值就有越多的机会出现重复,并且需要再次生成。 我想有度量,显示值的百分位数。 假设我的代码如下: 我使用千分尺,但不知道我应该从什么开始。因为为了计算百分位数,我需要存储的不是单个值,而是值的数组

  • 我有一个Spring Boot应用程序,我有以下依赖关系:

  • 有没有什么简单的方法可以将千分尺计时器与网络流量控制器一起使用? 似乎@Timed只对非反应式方法有效。对于反应式,它记录非常低的时间值。 我发现了一个类似的问题:如何使用千分尺计时器记录异步方法的持续时间(返回单声道或通量),但对于这样一个常见的问题来说,答案太复杂了。 有什么想法吗?