java - 千分尺指标和 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();
代理附加了一个配置文件,其中仅设置了应用程序的连接字符串和角色名称。
代理正确启动,并且数据在 Application Insights 资源中发布。自定义指标可在资源的 Monitoring -> Metrics 区域中选择。
我们面临的问题是指标数据会随着时间的推移而累积,尽管它们不应该如此。并举个例子:
- 我们有一个定时器设置来测量我们应用程序中特定操作的时间。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 设置,用于测量调用特定操作的次数(我知道可以通过 Timer 实现相同的操作,但它只是用于测试目的)
假设我们只调用一次绑定到 Counter 的操作。我们期望 Counter 值为 1,这是我们通过日志记录确认的。还假设我们只调用一次绑定到 Timer 的操作。我们期望只有这种触发被测量和记录。
在 Application Insights 资源中,我们看到每次代理发布信息时都会更新指标信息,并在后端没有任何触发器的情况下修改值。特别是,这两个指标都会增加 Count 聚合值,但由于 Timer 的持续时间不会改变,因此平均值会下降(表明通过持续时间 0 的指标值)。
另一方面,当调用 Prometheus 抓取端点时,数据被正确返回,即两个指标的 Count 都保持为 1,并且数据是预期的。
我已经尝试过使用 SpringBoot 作为底层框架,再次获得相同的结果。
有什么想法吗?我错过了什么吗?
谢谢
万吉利斯
解决方案
这是千分尺库中的一个问题,并且已经创建了一个相关的PR
推荐阅读
- c++ - 从我的字符串函数返回主函数是什么?
- arrays - Golang:使用相同的结构解析 JSON 中的两个数组数组
- python - 为什么发现两个相同的字符串不相等?
- python - 如何使用cupy循环numpy ndarray?真的会提高执行时间吗?
- javascript - 未捕获的 ReferenceError:openModal 未在 js 活动管理员中定义
- javascript - 如何在网络应用程序上打开手机上的相机?
- javascript - 基于动态值 es6 的解构
- javascript - 如何按各自的组号对数组中的对象进行分组
- css - 分层不透明元素共同打造新色彩
- ios - 无法在一个视图控制器上使用两个 UIPickerView