【问题标题】:prom-client returning empty object for default metrics in NodeJS applicationprom-client 在 NodeJS 应用程序中为默认指标返回空对象
【发布时间】:2021-06-28 08:54:13
【问题描述】:

我有一个 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。我怎样才能做到这一点?

【问题讨论】:

    标签: node.js npm prometheus prom-client


    【解决方案1】:

    发现问题。你需要意识到的是,register.metrics() 返回一个承诺。因此,使用 await register.metrics() 将返回默认指标的预期响应。更新后的代码sn-p如下。

    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 并查看默认指标。

    【讨论】:

      【解决方案2】:

      据我从您的代码中可以看出,您缺少两个非可选的东西来使其工作: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();
      })
      

      【讨论】:

      • 问题是关于获取默认指标。您指出的是自定义指标。我发布了一个答案,帮助我解决了这个问题。
      • 错过了“默认”上下文,很高兴得知您自己解决了这个问题。
      猜你喜欢
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 2020-07-22
      • 2011-04-05
      • 1970-01-01
      相关资源
      最近更新 更多