将自定义标签注入 Java 客户端的默认 jmx Prometheus 指标
Posted
技术标签:
【中文标题】将自定义标签注入 Java 客户端的默认 jmx Prometheus 指标【英文标题】:Inject custom label into default jmx Prometheus metrics for Java client 【发布时间】:2021-07-07 00:16:05 【问题描述】:我们的系统由多个基于 JAVA 的微服务组成,每个微服务利用 io.prometheus simpleclient 报告其 RT 状态
集成代码看起来很简单
// 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_bytespool="direct", 116776.0
我们的目的是添加一个自定义标签,然后它会比在 Grafana 中更容易分离。
jvm_buffer_pool_used_bytespool="direct",service="foo" 116776.0
我想相信这个库必须有这样的能力,不幸的是谷歌搜索了一段时间并没有那么成功
任何想法都会受到赞赏。
【问题讨论】:
【参考方案1】:我强烈建议使用Micrometer 来完成这项工作。这是
a) 更容易集成和
b) 你也可以添加所谓的 “common tags”正是您要查找的内容(Micrometer 使用术语“标签”而不是“标签”,但概念相同)。
registry.config().commonTags("service", "someService");
特别是对于 JVM 也通过 JMX 提供的“默认”指标,它可以轻松集成:
new JvmMemoryMetrics().bindTo(registry);
并且您在 prometheus 指标中获得了所有内存指标。 (更多信息请参见here)
【讨论】:
感谢您回答我的问题,但是,我们不能使用替代库。似乎我找到了通过提供自定义 MetricsServlet.class 实现来解决它的方法。 只是好奇,是什么阻碍了您使用其他库? 我们的系统基于数十个微服务。据我所知,Micrometer 使用的度量名称略有不同,转向 Micrometer 意味着,不合理的代码重构和 Grafana 仪表板调整,这不值得。以上是关于将自定义标签注入 Java 客户端的默认 jmx Prometheus 指标的主要内容,如果未能解决你的问题,请参考以下文章