From 9a46329fbda5926aefc8fdcd9c7a19a2f516885b Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Mon, 18 Nov 2024 10:34:34 +0100 Subject: [PATCH] Streaming: add development logging of database queries (#32945) --- streaming/database.js | 33 ++++++++++++++++++++++++++++++++- streaming/index.js | 3 ++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/streaming/database.js b/streaming/database.js index 9f1d742143..60a3b34ef0 100644 --- a/streaming/database.js +++ b/streaming/database.js @@ -116,13 +116,44 @@ let pool; /** * * @param {pg.PoolConfig} config + * @param {string} environment + * @param {import('pino').Logger} logger * @returns {pg.Pool} */ -export function getPool(config) { +export function getPool(config, environment, logger) { if (pool) { return pool; } pool = new pg.Pool(config); + + // Setup logging on pool.query and client.query for checked out clients: + // This is taken from: https://node-postgres.com/guides/project-structure + if (environment === 'development') { + const logQuery = (originalQuery) => { + return async (queryTextOrConfig, values, ...rest) => { + const start = process.hrtime(); + + const result = await originalQuery.apply(pool, [queryTextOrConfig, values, ...rest]); + + const duration = process.hrtime(start); + const durationInMs = (duration[0] * 1000000000 + duration[1]) / 1000000; + + logger.debug({ + query: queryTextOrConfig, + values, + duration: durationInMs + }, 'Executed database query'); + + return result; + }; + }; + + pool.on('connect', (client) => { + const originalQuery = client.query.bind(client); + client.query = logQuery(originalQuery); + }); + } + return pool; } diff --git a/streaming/index.js b/streaming/index.js index 3e362f1860..e00da1bb83 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -101,7 +101,8 @@ const CHANNEL_NAMES = [ ]; const startServer = async () => { - const pgPool = Database.getPool(Database.configFromEnv(process.env, environment)); + const pgConfig = Database.configFromEnv(process.env, environment); + const pgPool = Database.getPool(pgConfig, environment, logger); const metrics = setupMetrics(CHANNEL_NAMES, pgPool);