片状普罗米修斯 java 客户端

Flaky prometheus java client

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

有时,计数器根本不会被注册(例如,在访问 HTTP 端点时从不显示),有时会显示 # HELP# TYPE 行,但不会显示实际指标。我能够在我的本地开发箱和部署在 kubernetes pods.

上看到这种脆弱性

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

的电话中一直收到 NPE
Counter counter = Counter.build().name("counter").help(helpText).labelNames(tags).register();
counter.inc();

我用仪表试过上面的方法,我得到了同样的错误。

对于上下文,这是从 class 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();
}

并且我在主应用程序启动 class.

中从 start 方法发出静态方法调用
void start() {
    // Initialize stuff for the rest of the app
    ApplicationMetrics.initializeMetrics();
}

我是不是在计数器 configured/set 上做错了什么?我无法在普罗米修斯问题列表中找到与此相关的任何内容。

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

request_count{api="/users"} 15
request_count{api="/groups"} 3

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

counter1.labels(tagValues1).inc();

否则,如果您实际上只需要一个计数器,只需放弃对构建器的 .labelNames(tags1) 调用。

无论如何,如果您使用 real-life 示例而不是 "counter1"tags1:

,这个问题(和答案)会更加明显
Counter requestCount = Counter.build()
    .name("request_count")
    .help("Number of requests, per API")
    .labelNames("api")
    .register();

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