需要啥配置才能让带有 spring-boot 的千分尺输出 uvm_info 仪表?

Posted

技术标签:

【中文标题】需要啥配置才能让带有 spring-boot 的千分尺输出 uvm_info 仪表?【英文标题】:What configuration is required to get micrometer with spring-boot to output jvm_info guage?需要什么配置才能让带有 spring-boot 的千分尺输出 uvm_info 仪表? 【发布时间】:2019-08-19 15:35:44 【问题描述】:

我有许多非 spring-boot 服务,它们使用 io.prometheus simpleclient_hotspot 自动生成 JVM 指标。

我正在尝试与这些以及使用千分尺默认设置的 spring-boot 服务产生的 JVM 指标保持一致。

我需要为千分尺进行一些额外的配置,以便它生成指标,例如:

# TYPE jvm_info gauge
jvm_infoversion="
...
jvm_memory_bytes_used
jvm_memory_pool_bytes_max
etc...

?

我很欣赏开箱即用的千分尺正在记录:jvm_memory_used_bytes,它与来自 simpleclient_hotspot 的相同指标的名称不匹配:(

如果可能,我希望实现一致性,jvm_info 在 micrometer/spring-boot 中特别有用。

【问题讨论】:

【参考方案1】:

我建议您查看微米核心库中的NamingConvention。有几个使用它将名称转换为不同监控系统的示例(查找实现NamingConvention 的类)。例如,如果您正在使用 Prometheus(看起来可能是),您可以查看 PrometheusNamingConvention 作为示例。看来您会对实现/覆盖 public String name(String name, Meter.Type type, @Nullable String baseUnit) 方法感兴趣。

【讨论】:

【参考方案2】:

回答我自己的问题

    我最终为 JVM 版本信息实现了这个:
    import io.micrometer.core.instrument.Gauge;
    import io.micrometer.core.instrument.MeterRegistry;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    /**
     * Migrated From simpleclient_hotspot/src/main/java/io/prometheus/client/hotspot/VersionInfoExports.java
     * Because its not included in Micrometer.
     */
    @Component
    public class JvmVersionInfoExports 
    
        private static final Logger LOGGER = LoggerFactory.getLogger(JvmVersionInfoExports.class);
    
        public JvmVersionInfoExports(MeterRegistry meterRegistry) 
            LOGGER.info("Adding JVM Metrics");
            Gauge.builder("jvm_info", () -> 1L)
                    .description("JVM version info")
                    .tag("version", System.getProperty("java.runtime.version", "unknown"))
                    .tag("vendor", System.getProperty("java.vm.vendor", "unknown"))
                    .tag("runtime", System.getProperty("java.runtime.name", "unknown"))
                    .register(meterRegistry);
        
     
    我最终为操作系统版本信息实现了这个:
    import io.micrometer.core.instrument.Gauge;
    import io.micrometer.core.instrument.MeterRegistry;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Component
    public class OsVersionInfoExports 
        private static final Logger LOGGER = LoggerFactory.getLogger(OsVersionInfoExports.class);
    
        public OsVersionInfoExports(MeterRegistry meterRegistry) 
            LOGGER.info("Adding OS Metrics");
            Gauge.builder("os_info", () -> 1L)
                    .description("OS version info")
                    .tag("version", System.getProperty("os.version", "unknown"))
                    .tag("arch", System.getProperty("os.arch", "unknown"))
                    .tag("name", System.getProperty("os.name", "unknown"))
                    .register(meterRegistry);
        
    

虽然这些论文滥用了 Micrometer Gauge,但它们为我提供了兼容性,我需要使用 Micrometer 和 Prometheus HotSpot 库的组合来跨服务跟踪这些细节。

【讨论】:

以上是关于需要啥配置才能让带有 spring-boot 的千分尺输出 uvm_info 仪表?的主要内容,如果未能解决你的问题,请参考以下文章

我需要做啥才能打开带有特殊字符的 URL

这个 SQL 需要采用啥格式才能让 Oracle 接受?

我需要做啥才能让 Internet Explorer 8 接受自签名证书?

@runwith注解需要引入啥依赖才能使用

我需要做啥才能让 Hash.from_xml() 工作?

带有 Spring-boot XML 配置的 Couchbase 5.0