Клиент Prometheus в Nodejs - настройка значений меток

Я использую prom-client с Прометеем. Я инициализирую гистограмму следующим образом: теперь, когда запрос обработан, я бы хотел установить время, необходимое для его обработки (я получаю его из объекта запроса узла), и установить значения меток.

const southboundMetricsHistogram = prometheusClient.register.getSingleMetric(consts.PROMETHEUS_SOUTHBOUND_METRICS_NAME) ||
    new prometheusClient.Histogram({
        name: consts.PROMETHEUS_SOUTHBOUND_METRICS_NAME,
        help: consts.PROMETHEUS_SOUTHBOUND_METRICS_DESC,
        labelNames: ['target', 'route', 'status_code', 'method'],
        buckets: consts.PROMETHEUS_SOUTHBOUND_DURATION_SIZES_BUCKETS
    });

Я пытался использовать observe или же labels но я получаю ошибки. Можно ли установить истекшее время и значения метки?

Благодарю.

3 ответа

Решение

Решено так:

southboundMetricsHistogram.observe({target: request.target, method: request.method, route: response.req.path, status_code: response.statusCode}, response.elapsedTime);

Вот полный пример

          import express from 'express';
    import pino from 'pino';
    import expressPino from 'express-pino-logger';
    import promClient from 'prom-client';
    
    const PORT = process.env.PORT || 5555;
    
    const logger = pino({level:process.env.LOG_LEVEL || 'info'})
    const expressLogger = expressPino({logger});
    
    const app = express();
    app.use(express.json(), expressLogger);
    
    // Create a Registry which registers the metrics
    const register = new promClient.Registry()
    promClient.collectDefaultMetrics({ register });
    
    const Histogram = promClient.Histogram;
    const requestDuration = new Histogram({
        name: 'http_request_duration_seconds',
        help: 'request duration histogram',
        labelNames: ['handler' , 'method', 'statuscode'],
        //buckets: [0.5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000],
        buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],
    });
    
    // Register the histogram
    register.registerMetric(requestDuration)
    
    const profilerMiddleware = (req, res, next) => {
        //const start = Date.now();
        const end = requestDuration.startTimer()
        res.once('finish', () => {
        //const duration = Date.now() - start;
        //requestDuration.labels(req.url, req.method, res.statusCode).observe(duration);
        //requestDuration.observe({ handler:req.url, method: req.method, statuscode: res.statusCode }, duration);
        const duration = end({ handler:req.url, method: req.method, statuscode: res.statusCode });
        logger.info('Duration  %d', duration);
        });
    
    next();
    };
    app.use(profilerMiddleware);
    
    
    app.get('/health', (req, res) => {
        logger.debug('Calling res.send');    
        return res.status(200).send({message: "Health is good"});
    });
    
    app.listen(PORT, () => {
        logger.info('App is listening for requests on port %d', PORT);
    });
    
    // Setup server to Prometheus scrapes:
    app.get('/metrics', async (req, res) => {
        try {
            res.set('Content-Type', register.contentType);
            res.end(await register.metrics());
        } catch (ex) {
            res.status(500).end(ex);
        }
    });

Похоже, гистограмма в клиентской библиотеке node.js имеет встроенную startTimer() Функция для этой цели.

В разделе примеров на их Github приведен следующий пример:

const end = histogram.startTimer();
xhrRequest(function(err, res) {
end(); // Observes the value to xhrRequests duration in seconds
});

Таким образом, вы можете просто запустить таймер, когда запрос сделан, а затем остановить его, когда ответ отправлен.

Источник

Другие вопросы по тегам