prom-client 为 NodeJS 应用程序中的默认指标返回空对象
prom-client returning empty object for default metrics in NodeJS application
我有一个 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 目标时,我看到以下错误。
"INVALID" is not a valid start token
我刚开始使用 npm 的 prom-client。我怎样才能使这项工作?
据我从你的代码中可以看出,你缺少两个非可选的东西来让它工作:1. 定义一个指标,2. 更新它(例如,增加一个计数器指标)。
大致如下:
- 指标定义:
const acounter = new prom.Counter({
name: 'my_counter_total',
help: 'The number of things I want to count'
});
- 指标更新(在任何 URL 路径、查询或方法上 want/need):
app.get('/moar', function (req, res) {
acounter.inc();
})
发现问题。您需要意识到的是,register.metrics()
return 是一个承诺。因此,使用 await register.metrics()
将 return 默认指标的预期响应。更新后的代码片段如下。
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 并查看默认指标。
我有一个 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 目标时,我看到以下错误。
"INVALID" is not a valid start token
我刚开始使用 npm 的 prom-client。我怎样才能使这项工作?
据我从你的代码中可以看出,你缺少两个非可选的东西来让它工作:1. 定义一个指标,2. 更新它(例如,增加一个计数器指标)。
大致如下:
- 指标定义:
const acounter = new prom.Counter({
name: 'my_counter_total',
help: 'The number of things I want to count'
});
- 指标更新(在任何 URL 路径、查询或方法上 want/need):
app.get('/moar', function (req, res) {
acounter.inc();
})
发现问题。您需要意识到的是,register.metrics()
return 是一个承诺。因此,使用 await register.metrics()
将 return 默认指标的预期响应。更新后的代码片段如下。
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 并查看默认指标。