7

我正在尝试监视登录的用户,我通过调用 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,我读到千分尺用 Wea​​kReference 包装它们的 obj 输入(因此垃圾收集)。我不知道如何解决它。如果有人知道如何解决这个问题,那就太好了。

4

1 回答 1

5

这是 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()));
于 2018-06-18T11:59:02.077 回答