From 8a15040f047c53e59f5a3c56f5797f12b424b96b Mon Sep 17 00:00:00 2001 From: Eric Mc Sween <5454374+emcsween@users.noreply.github.com> Date: Mon, 5 Jun 2023 08:03:51 -0400 Subject: [PATCH] Merge pull request #13295 from overleaf/em-socket-leak-detection-pools Record the last request in socket leak detection GitOrigin-RevId: 376757e608358a7299e7ad7e327ed4fbac960d83 --- libraries/metrics/leaked_sockets.js | 73 +++++++++++++++-------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/libraries/metrics/leaked_sockets.js b/libraries/metrics/leaked_sockets.js index 3720b4af24..cdfb16822b 100644 --- a/libraries/metrics/leaked_sockets.js +++ b/libraries/metrics/leaked_sockets.js @@ -15,48 +15,49 @@ const MIN_SOCKET_LEAK_TIME = (parseInt(process.env.LEAKED_SOCKET_AGE_THRESHOLD, 10) || 15) * 60 * 1000 // Record HTTP events using diagnostics_channel +diagnosticsChannel.subscribe('http.client.request.start', handleRequest) +diagnosticsChannel.subscribe('http.server.request.start', handleRequest) +diagnosticsChannel.subscribe('http.client.response.finish', handleResponse) +diagnosticsChannel.subscribe('http.server.response.finish', handleResponse) -const channels = [ - 'http.client.request.start', - 'http.client.response.finish', - 'http.server.request.start', - 'http.server.response.finish', -] - -for (const channel of channels) { - diagnosticsChannel.subscribe(channel, handler(channel)) +function handleRequest({ request: req }) { + const socket = req?.socket + if (socket) { + recordRequest(req, socket) + } } -function handler(channel) { - return function ({ request: req, response: res }) { - const socket = req?.socket || res?.socket - if (!socket) { - return - } - // If we haven't seen this socket before, add a debug object from the request - if (!socket._ol_debug && req) { - const { method, protocol, path, url, rawHeaders, _header } = req - socket._ol_debug = { - method, - protocol, - url: url ?? path, - request: { headers: rawHeaders ?? _header, ts: new Date() }, - } - } else if (socket._ol_debug && res) { - // We've already seen the request, now add debug info from the response - const { statusCode, statusMessage, headers, _header } = res - Object.assign(socket._ol_debug, { - response: { - statusCode, - statusMessage, - headers: headers ?? _header, - ts: new Date(), - }, - }) - } +function recordRequest(req, socket) { + const { method, protocol, path, url, rawHeaders, _header } = req + socket._ol_debug = { + method, + protocol, + url: url ?? path, + request: { headers: rawHeaders ?? _header, ts: new Date() }, } } +function handleResponse({ request: req, response: res }) { + const socket = req?.socket || res?.socket + if (!socket || !res) { + return + } + if (!socket._ol_debug) { + // I don't know if this will ever happen, but if we missed the request, + // record it here. + recordRequest(req, socket) + } + const { statusCode, statusMessage, headers, _header } = res + Object.assign(socket._ol_debug, { + response: { + statusCode, + statusMessage, + headers: headers ?? _header, + ts: new Date(), + }, + }) +} + // Additional functions to log request headers with sensitive information redacted function flattenHeaders(rawHeaders) {