Как извлечь метрики prometheus для URL-адресов с параметрами пути

#node.js #express #prometheus #metrics #prom-client

#node.js #экспресс #prometheus #метрики #prom-клиент

Вопрос:

У меня есть приложение Node JS с таким URL-адресом:

 /app/:vehicleNumber/details
 

Он динамически принимает номера транспортных средств в URL.

API метрик на основе prom-client для HTTP-вызовов возвращает все URL-адреса как отдельные URL-адреса вместо того, чтобы объединять их в один URL-адрес с vehicleNumber в качестве переменной.

 http_request_duration_seconds_bucket{le="0.003",status_code="200",method="GET",path="/app/GJ98T0006/details"}
http_request_duration_seconds_bucket{le="0.003",status_code="200",method="GET",path="/app/KA28T6511/details"}
.....
 

Я хочу, чтобы количество основывалось на одном URL.
например

 http_request_duration_seconds_bucket{le="0.003",status_code="200",method="GET",path="/app/{var}/details"}
 

Это происходит, когда UUID присутствует в URL, но не для номеров транспортных средств, присутствующих в URL.

Комментарии:

1. Что вы используете для получения метрики для каждого маршрута? Это логика сбора метрик в комплекте или вы создали свою собственную?

2. Он входит в комплект. Я пытаюсь получить количество времени, когда вызывается API сведений о транспортном средстве. Но я получаю количество для каждого URL-адреса транспортного средства отдельно

3. Пожалуйста, укажите используемый вами модуль. В нем должна быть какая-то конфигурация «нормализации URL», которую вы можете использовать, чтобы получить то, что вы хотите.

Ответ №1:

Предполагая, что вы используете Express, вы, вероятно, хотите что-то вроде:

 let path = null;
if (req.route amp;amp; req.route.path) {
    path = req.baseUrl   req.route.path;
} else if (req.baseUrl) {
    path = req.baseUrl;
} else {
    /*
     * This request probably matched no routes. The
     * cardinality of the set of URLs that will match no
     * routes is infinite, so we'll just use a static value.
     */
    path = '(no match)';
}
 

path будет /app/:vehicleNumber/details . Эта req.route часть может быть не нужна для вашего варианта использования, но это не повредит — она пригодится, если вы используете express.Router({ mergeParams: true }) ее для составления своих маршрутов.