Прежде всего, я заявляю, что не знаю dd-tracer, но я могу попытаться предоставить способ получения запрошенного времени, тогда разработчик должен использовать его по мере необходимости.
Основная неточность, которая приходит мне на ум, заключается в том, что каждая ОС имеет свой собственный стек TCP, а запись в сокет TCP является буферизованной операцией: для тела ответа, меньшего, чем буфер стека TCP ОС, мы, вероятно, собираемся измерить время, близкое к 0; на результат, который мы имеем, кроме того, влияет Node.js событие l oop load. Чем больше становится тело ответа, тем больше время, связанное с загрузкой события l oop, становится незначительным. Итак, если мы хотим измерить время записи для всех запросов только для одной точки, но мы будем проводить анализ только для длительных запросов, я думаю, что измерение будет достаточно точным.
Другой возможный источником неточности является то, как обработчики запросов записывают свои выходные данные: если обработчик запросов записывает часть тела, затем выполняет длительную операцию для вычисления последней части тела, затем записывает недостающую часть тела, на измеренное время влияет длительная вычислительная работа; мы должны позаботиться о том, чтобы все обработчики запросов записывали заголовки и тело сразу.
Мое предложение решения (которое работает только в том случае, если сервер не реализует функцию keep alive) состоит в том, чтобы добавить подобное промежуточное ПО.
app.use((req, res, next) => {
let start;
const { write } = res.socket;
// Wrap only first write call
// Do not use arrow function to get access to arguments
res.socket.write = function() {
// Immediately restore write property to not wrap next calls
res.socket.write = write;
// Take the start time
start = new Date().getTime();
// Actually call first write
write.apply(res.socket, arguments);
};
res.socket.on("close", () => {
// Take the elapsed time in result
const result = new Date().getTime() - start;
// Handle the result as needed
console.log("elapsed", result);
});
next();
});
Надеюсь, это поможет.