千分尺指标和 Application Insights java 代理 - 指标会累积,尽管它们不应该(或者我错过了啥)

Posted

技术标签:

【中文标题】千分尺指标和 Application Insights java 代理 - 指标会累积,尽管它们不应该(或者我错过了啥)【英文标题】:Micrometer metrics & Application Insights java agent - Metrics accumulate although they shouldn't (or am I missing something)千分尺指标和 Application Insights java 代理 - 指标会累积,尽管它们不应该(或者我错过了什么) 【发布时间】:2021-05-25 12:58:04 【问题描述】:

我们有一个 Java EE JAX-RS 应用程序(Java EE 8 托管在 WildFly 20 上),其中我们将 Micrometer (v1.6.4) 配置为度量框架。我们正在尝试将其与 Azure Application Insights 连接,以便相关 Application Insights 资源可以使用指标(然后添加警报等)。

为此,我们附加了无代码 Application Insights 代理 (v3.0.2),该代理无需任何代码更改即可自动发布 Micrometer 指标。最重要的是,我们在 globalRegistry 中添加了一个 PrometheusMeterRegistry,仅用于调试目的(我们不使用 Prometheus)。

Metrics.globalRegistry.add(new PrometheusMeterRegistry(PrometheusConfig.DEFAULT));

除此之外,我们还配置了一个端点,该端点使用以下 sn-p 返回 Prometheus 数据:

PrometheusMeterRegistry promRegistry = (PrometheusMeterRegistry) registry;
result = promRegistry.scrape();

代理有一个附加的配置文件,其中只设置了应用程序的连接字符串和角色名称。

代理正确启动,并且数据在 Application Insights 资源中发布。可以在资源的 Monitoring -> Metrics 区域中选择自定义指标。

我们面临的问题是指标数据会随着时间的推移而累积,尽管它们不应该如此。并举个例子:

我们有一个定时器设置来测量我们应用程序中特定操作的时间。 Timer 由@Interceptor 使用@AroundInvoke 方法触发,并记录实际操作完成所需的时间。我们用这段代码sn-p来记录时间
...
Builder timerBuilder = Timer.builder(timerName);
Timer timer = timerBuilder.register(metricsProducer.getMetricsRegistry());

return timer.record(() -> 
    try 
        return ctx.proceed();
     catch (Exception e) 
        throw new RuntimeException(e.getMessage());
    
);
我们还设置了一个计数器,用于测量特定操作被调用的次数(我知道同样可以通过定时器来实现,但它只是用于测试目的)

假设我们只调用一次绑定到 Counter 的操作。我们期望 Counter 值为 1,这是我们通过日志记录确认的。 还假设我们只调用一次绑定到 Timer 的操作。我们希望只有这种触发被测量和记录。

在 Application Insights 资源中,我们看到每次代理发布信息时都会更新指标信息,并且在后端没有任何触发器的情况下修改值。 特别是,这两个指标都会增加 Count 聚合值,但由于 Timer 的持续时间不会改变,因此平均值会下降(建议传递指标值,持续时间为 0)。

另一方面,当调用 Prometheus 抓取端点时,数据会正确返回,即两个指标的 Count 都保持为 1,并且数据是预期的。

我已经尝试过使用 SpringBoot 作为底层框架,同样的结果。

有什么想法吗? 我错过了什么吗?

谢谢

万吉利斯

【问题讨论】:

这很可能与Micrometer中新注册的issue有关 【参考方案1】:

这是千分尺库的问题,已创建相关PR

【讨论】:

仅供参考:我合并了那个 PR,修复将在下一个版本中发布(应该在 spring-boot 2.5 GA 版本之前发生)

以上是关于千分尺指标和 Application Insights java 代理 - 指标会累积,尽管它们不应该(或者我错过了啥)的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 千分尺寄存器缓存指标

千分尺发送指标为零 - Spring Boot

Quarkus - 将千分尺指标推送到普罗米修斯

如何使用千分尺指定我想在spring-boot中使用的指标的白名单

千分尺暴露执行器指标 vs kube-state-metrics vs metrics-server 以设置 pod 请求/限制

以 Micrometer 为单位的 Counter 指标的动态标签值