易碎的普罗米修斯 java 客户端

Posted

技术标签:

【中文标题】易碎的普罗米修斯 java 客户端【英文标题】:Flaky prometheus java client 【发布时间】:2019-10-17 08:56:22 【问题描述】:

我在一个相对简单的应用程序中使用 Prometheus 0.6.0 Java 客户端。我只有两个计数器和两个仪表,它们通过 HTTP REST 端点公开,使用内置的 Prometheus HTTPServer 我看到了非常不稳定的行为。

有时,计数器根本不会注册(例如,在访问 HTTP 端点时从不显示),有时会显示 # HELP# TYPE 行,但不会显示实际指标。我可以在我的本地开发箱中看到片状,并在 kubernetes pod 上部署。

为了进一步缩小范围,我有这段代码来初始化计数器。而且我在致电counter.inc() 时一直收到 NPE。

Counter counter = Counter.build().name("counter").help(helpText).labelNames(tags).register();
counter.inc();

我用仪表尝试了上述方法,但我得到了同样的错误。

对于上下文,这是从类ApplicationMetrics 调用的,代码如下:

public static Counter counter1;
public static Counter counter2;

static void initializeMetrics() 
    counter1 = Counter.build().name("counter1").help(helpText1).labelNames(tags1).register();
    counter1.inc();

    counter2 = Counter.build().name("counter2").help(helpText2).labelNames(tags2).register();
    counter2.inc();

我正在从我的主应用程序启动类中的 start 方法发出一个静态方法调用。

void start() 
    // Initialize stuff for the rest of the app
    ApplicationMetrics.initializeMetrics();

我在配置/设置计数器的方式上做错了吗?我无法在普罗米修斯问题列表中找到与此相关的任何内容。

【问题讨论】:

你能包含更多代码来添加一些上下文吗?初始化代码在哪里,你在哪里增加计数器? @Chris 更新了帖子并提供了更多详细信息 【参考方案1】:

您正在创建一个带有标签的计数器(.labelNames(tags) 位),这实际上意味着您正在创建多个指标。如:

request_countapi="/users" 15
request_countapi="/groups" 3

因此,当您想要增加其中一项指标时,您需要说明是哪一项。

counter1.labels(tagValues1).inc();

否则,如果您实际上只想要一个计数器,只需将 .labelNames(tags1) 调用放到构建器即可。

无论如何,如果您使用现实生活中的示例而不是 "counter1"tags1,这个问题(和答案)会更加明显:

Counter requestCount = Counter.build()
    .name("request_count")
    .help("Number of requests, per API")
    .labelNames("api")
    .register();

那么很明显,直接递增requestCount 没有多大意义。

【讨论】:

以上是关于易碎的普罗米修斯 java 客户端的主要内容,如果未能解决你的问题,请参考以下文章

一文教你普罗米修斯Prometheus的基础应用

好文转发Java微服务监控及与普罗米修斯集成

java中普罗米修斯的错误(弹簧执行器)

普罗米修斯prometheus

在普罗米修斯中查找重复标签

在普罗米修斯中将计数器值初始化为0