2

我有一个 NodeJS 应用程序,我想公开默认指标。我有以下实现。我正在使用prom-client包。

let express = require('express');
let app = express();

const client = require('prom-client');

// Create a Registry which registers the metrics
const register = new client.Registry()

// Add a default label which is added to all metrics
register.setDefaultLabels({
    app: 'example-nodejs-app'
})

// Enable the collection of default metrics
client.collectDefaultMetrics({ register })

app.get('/metrics', function (req, res) {
    // Return all metrics the Prometheus exposition format
    res.set('Content-Type', register.contentType)
    res.send(register.metrics())
})

let server = app.listen(8080, function () {
    let port = server.address().port
    console.log("Application running on port: %s", port)
})

当我导航到 http://localhost:8080/metrics 时,我得到一个空对象 ( {}) 作为响应。当我检查我的 Prometheus Targets 时,我看到以下错误。

"INVALID" is not a valid start token

在此处输入图像描述

我新使用来自 npm 的 prom-client。我怎样才能使这项工作?

4

2 回答 2

3

发现了问题。你需要意识到的是,register.metrics()返回一个承诺。因此, usingawait register.metrics()将返回默认指标的预期响应。更新的代码片段如下所示。

let express = require('express');
let app = express();

const client = require('prom-client');

// Create a Registry which registers the metrics
const register = new client.Registry()

// Add a default label which is added to all metrics
register.setDefaultLabels({
    app: 'example-nodejs-app'
})

// Enable the collection of default metrics
client.collectDefaultMetrics({ register })

app.get('/metrics', async function (req, res) {
    // Return all metrics the Prometheus exposition format
    res.set('Content-Type', register.contentType);
    let metrics = await register.metrics();
    res.send(metrics);
})

let server = app.listen(8080, function () {
    let port = server.address().port
    console.log("Application running on port: %s", port)
})

现在,在浏览器中导航到http://localhost:8080/metrics并查看默认指标。

于 2021-07-01T03:35:03.930 回答
1

据我从您的代码中可以看出,您缺少两个非可选的东西来使其工作:1.定义一个指标,2.更新它(例如,增加一个计数器指标)。

类似的东西:

  1. 指标定义:
const acounter = new prom.Counter({
  name: 'my_counter_total',
  help: 'The number of things I want to count'
});
  1. 指标更新(在您想要/需要的任何 URL 路径、查询或方法上):
app.get('/moar', function (req, res) {
  acounter.inc();
})
于 2021-06-29T13:16:44.067 回答