Micrometer 指标和 Application Insights java 代理 - 指标累积,尽管它们不应该或者我错过了什么

问题描述

我们有一个 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));

最重要的是,我们配置了一个端点,它使用以下代码段返回 Prometheus 数据:

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

代理附加了一个配置文件,其中只设置了应用程序的 connectionString 和角色名称

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

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

  • 我们有一个 Timer 设置来测量我们应用程序中特定操作的时间。 Timer 由@Interceptor 使用@AroundInvoke 方法触发,并记录实际操作完成所需的时间。我们用这个代码片段来记录时间
...
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 的持续时间没有改变,Average 下降(表明指标值以持续时间 0 传递)。

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

我使用 SpringBoot 作为底层框架进行了同样的尝试,再次得到相同的结果。

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

谢谢

万利斯

解决方法

这是千分尺库中的一个问题,并且已经创建了一个相关的 PR