【问题标题】:Metrics of micrometer (in spring boot) will remain in heap after scraping by Prometheus?被普罗米修斯刮擦后,千分尺的度量(在弹簧靴中)会保留在堆中吗?
【发布时间】:2019-07-22 10:02:03
【问题描述】:

我们有 Spring 应用程序,它启用了 micrometer 指标收集,并且指标在一定延迟后由 Prometheus 服务器收集。由于指标是时间序列数据,我的问题是,在 Spring 应用程序中收集的指标即使在复制到 Prometheus 后仍会保留在堆中,如果此类时间序列数据继续增长,那么堆将超出-内存不是吗?任何人对微米指标内存保留有一点了解,请告诉我们。

【问题讨论】:

    标签: jvm out-of-memory prometheus spring-micrometer


    【解决方案1】:

    监控方法具有职责分离。我们至少可以说出其中两个:

    1。掌握有关当前申请状态的知识。

    这是 Spring 应用程序的职责。它应该知道当前时间的所有状态和指标。应用程序本身没有时间序列数据。您无法得到“一小时前的应用程序指标是什么?”,因为 Spring 甚至几秒钟前都不知道应用程序的状态。

    2。收集申请状态的历史记录。

    这就是普罗米修斯来的地方。它从应用程序中抓取“当前”指标,并将其映射到当前时间戳。通过这种方式,它构建了一个时间序列,因此您可以询问 Prometheus“一小时前的应用程序指标是什么?”


    换句话说,在 Spring 应用程序的堆中,只存储当前状态,没有任何历史记录。因此不需要清理。

    【讨论】:

    • 感谢您的回复,我怀疑某个特定指标是在一段时间前(比如几个小时前)收集的,并保存在内存中并且从未更新,因为后来没有收集到最近的值。这些指标是否会被视为当前指标?例如,如果我将数据存储视为 HashMap,并且如果没有为指标(作为键值对)提供新值,则旧值保持原样......该指标值是否会被垃圾收集?
    • 是的,您描述的指标被视为应用程序当前状态的一部分。千分尺(从版本 2 开始的 spring boot 的默认指标库)无法确定上次更改此指标的时间。是的,指标没有 TTL,您添加的所有值都将保留到应用程序重新启动。似乎您可以取消注册或过滤不需要的指标,但您必须手动完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2023-02-22
    相关资源
    最近更新 更多