0

Имею такую архитектуру:

docker-compose. В нем работает 3 сервиса: nginx, api, mysql. Api - nodejs/express.

Нужно сделать так, чтобы можно было получить среднее время доступа по каждому из роутов api.

Например:

GET: site/users - AVERAGE: 100 ms.
POST: site/users - AVERAGE: 122 ms.
GET: site/news - AVERAGE: 50 ms.
GET: site/news - AVERAGE: 52 ms.

Думал сделать свою функцию для morgan , сохраняя данные в объект формата: {URL: [ms, ms]}

Какие есть решения?

Lasna
  • 803

1 Answers1

0

Решил так:

import express from "express";
import logger from "morgan";

const app = express();

const Storage = {}; app.use(logger((tokens, req, res) => { const averageCalc = (array) => { const sum = array.reduce((a, b) => parseFloat(a) + parseFloat(b), 0); return (sum / array.length) || 0; };

const prepareStorageObjectMutate = (object, params) => {
    const {url, method} = params;

    object[url] = object[url] || {};
    object[url][method] = object[url][method] || [];

    return object;
};

const averageTimeHandler = (data) => {
    const result = {};
    Object.keys(data).forEach((url) => {

        Object.keys(data[url]).forEach((method) => {
            prepareStorageObjectMutate(result, {method, url});
            const dataArray = data[url][method];
            const average = averageCalc(dataArray);

            result[url][method] = `${average} ms`;
        });

    });
    return result;
};

try {
    const {method: methodF, url: urlF, "response-time": responseTimeF} = tokens;

    //Resolve data.
    const method = methodF(req, res);
    const url = urlF(req, res);
    const responseTime = responseTimeF(req, res);

    prepareStorageObjectMutate(Storage, {method, url});

    //Push response time.
    Storage[url][method].push(responseTime);
    const averageObject = averageTimeHandler(Storage);

    console.log(Storage);

    return JSON.stringify(averageObject);
} catch (error) {
    console.log("Logger error:");
    console.log(error);
}

}));

Пример:

{"/api/users":{"GET":"6.098857142857144 ms"},"/api/news":{"GET":"2.579153846153846 ms"},"/api/users/login":{"POST":"183.39033333333336 ms"}}
Lasna
  • 803