将自定义标签注入 Java 客户端的默认 jmx Prometheus 指标

问题描述

我们的系统由多个基于 JAVA 的微服务组成,每个微服务都利用 io.prometheus simpleclient

集成代码看起来很简单

// Initialize default JVM metrics for Prometheus
    DefaultExports.initialize();

    DeploymentInfo monitoringServletInfo = Servlets.deployment()
            .setClassLoader(MonitoringServer.class.getClassLoader())
            .setcontextpath("/")
            .setDeploymentName("monitoring")
            .addServlet(Servlets.servlet(MetricsServlet.class).addMapping("/*"));

    DeploymentManager monitoringDeployment = Servlets.defaultContainer().addDeployment(monitoringServletInfo);
    monitoringDeployment.deploy();
    HttpHandler monitoringHandler = monitoringDeployment.start();

    server = Undertow.builder()
            .addHttpListener(port,"0.0.0.0")
            .setHandler(
                    Handlers.path().addExactPath(HEALTH_PATH,new HealthHandler())
                            .addExactPath(MONITORING_PATH,monitoringHandler))
            .build();

    server.start();

由于所有微服务都公开相同的指标名称,我们正在寻找一种通过为每个微服务提供自定义标签来区分它们的方法

例如,这个指标有以下定义

jvm_buffer_pool_used_bytes{pool="direct",} 116776.0

我们的目的是添加一个像这样的自定义标签,那么它会比在 Grafana 中分离起来超级容易。

jvm_buffer_pool_used_bytes{pool="direct",service="foo"} 116776.0

我想相信这个库必须有这样的能力,不幸的是,谷歌搜索了一段时间并没有那么成功

任何想法将不胜感激。

解决方法

我强烈建议使用 Micrometer 来完成这项工作。这是

a) 更容易集成和

b) 你也可以添加所谓的 “common tags”正是您要查找的内容(Micromether 使用术语“标签”而不是“标签”,但概念是相同的)。

registry.config().commonTags("service","someService");

特别是对于 JVM 也通过 JMX 提供的“默认”指标,它具有简单的集成:

new JvmMemoryMetrics().bindTo(registry);

并且您在 prometheus 指标中获得了所有内存指标。 (有关详细信息,请参阅 here