Micrometer/Prometheus 如何防止仪表值变为 NaN?
Micrometer/Prometheus How do I keep a gauge value from becoming NaN?
我正在尝试监控登录用户,我通过调用 api 获取登录用户信息,这是我使用的代码,
public class MonitorService {
private InfoCollectionService infoService;
public MonitorService(InfoCollectionService infoService) {
this.infoService = infoService
}
@Scheduled(fixedDelay = 5000)
public void currentLoggedInUserMonitor() {
infoService.getLoggedInUser("channel").forEach(channel -> {
Metrics.gauge("LoggedInUsers.Inchannel_" + channel.getchannelName(), channel.getgetLoggedInUser());
});
}
}
而且我在 Prometheus 中看到了值,问题是几秒钟后,值变成了 NaN,我读到 Micrometer 测量仪用 WeakReference 包装它们的 obj 输入(因此垃圾收集)。我不知道如何解决 it.If 如果有人知道如何解决这个问题那就太好了。
这是 Micrometer 中的一个缺点,我最终会修复它。
同时您需要将值保存在映射中,以避免垃圾回收。请注意我们如何将仪表指向地图并使用 lambda 提取值以避免垃圾收集。
public class MonitorService {
private Map<String, Integer> gaugeCache = new HashMap<>();
private InfoCollectionService infoService;
public MonitorService(InfoCollectionService infoService) {
this.infoService = infoService
}
@Scheduled(fixedDelay = 5000)
public void currentLoggedInUserMonitor() {
infoService.getLoggedInUser("channel").forEach(channel -> {
gaugeCache.put(channel.getchannelName(), channel.getgetLoggedInUser());
Metrics.gauge("LoggedInUsers.Inchannel_" + channel.getchannelName(), gaugeCache, g -> g.get(channel.getchannelName()));
});
}
}
我还建议为各种频道使用标签:
Metrics.gauge("loggedInUsers.inChannel", Tag.of("channel",channel.getchannelName()), gaugeCache, g -> g.get(channel.getchannelName()));
我正在尝试监控登录用户,我通过调用 api 获取登录用户信息,这是我使用的代码,
public class MonitorService {
private InfoCollectionService infoService;
public MonitorService(InfoCollectionService infoService) {
this.infoService = infoService
}
@Scheduled(fixedDelay = 5000)
public void currentLoggedInUserMonitor() {
infoService.getLoggedInUser("channel").forEach(channel -> {
Metrics.gauge("LoggedInUsers.Inchannel_" + channel.getchannelName(), channel.getgetLoggedInUser());
});
}
}
而且我在 Prometheus 中看到了值,问题是几秒钟后,值变成了 NaN,我读到 Micrometer 测量仪用 WeakReference 包装它们的 obj 输入(因此垃圾收集)。我不知道如何解决 it.If 如果有人知道如何解决这个问题那就太好了。
这是 Micrometer 中的一个缺点,我最终会修复它。
同时您需要将值保存在映射中,以避免垃圾回收。请注意我们如何将仪表指向地图并使用 lambda 提取值以避免垃圾收集。
public class MonitorService {
private Map<String, Integer> gaugeCache = new HashMap<>();
private InfoCollectionService infoService;
public MonitorService(InfoCollectionService infoService) {
this.infoService = infoService
}
@Scheduled(fixedDelay = 5000)
public void currentLoggedInUserMonitor() {
infoService.getLoggedInUser("channel").forEach(channel -> {
gaugeCache.put(channel.getchannelName(), channel.getgetLoggedInUser());
Metrics.gauge("LoggedInUsers.Inchannel_" + channel.getchannelName(), gaugeCache, g -> g.get(channel.getchannelName()));
});
}
}
我还建议为各种频道使用标签:
Metrics.gauge("loggedInUsers.inChannel", Tag.of("channel",channel.getchannelName()), gaugeCache, g -> g.get(channel.getchannelName()));