From 6a0c257099960f9ae30a412117aff3f4324f7632 Mon Sep 17 00:00:00 2001 From: Austin McKinley Date: Wed, 19 Aug 2026 08:32:14 -0700 Subject: [PATCH] Log slow Blink database queries --- bskylink/src/cache/safelinkClient.ts | 16 +++++++++------- bskylink/src/db/index.ts | 22 ++++++++++++++++++++++ bskylink/src/routes/shortLink.ts | 12 +++++++----- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/bskylink/src/cache/safelinkClient.ts b/bskylink/src/cache/safelinkClient.ts index d0f16e72c1..c48b49ddc4 100644 --- a/bskylink/src/cache/safelinkClient.ts +++ b/bskylink/src/cache/safelinkClient.ts @@ -98,13 +98,15 @@ export class SafelinkClient { url: string, pattern: ToolsOzoneSafelinkDefs.PatternType, ): Promise { - return db.db - .selectFrom('safelink_rule') - .selectAll() - .where('url', '=', url) - .where('pattern', '=', pattern) - .orderBy('createdAt', 'desc') - .executeTakeFirstOrThrow() + return db.observeQuery(`resolve_safelink_${pattern}_rule`, () => + db.db + .selectFrom('safelink_rule') + .selectAll() + .where('url', '=', url) + .where('pattern', '=', pattern) + .orderBy('createdAt', 'desc') + .executeTakeFirstOrThrow(), + ) } private async addRule(db: Database, rule: SafelinkRule) { diff --git a/bskylink/src/db/index.ts b/bskylink/src/db/index.ts index d335f80146..bb53b79a59 100644 --- a/bskylink/src/db/index.ts +++ b/bskylink/src/db/index.ts @@ -1,4 +1,5 @@ import assert from 'assert' +import {performance} from 'node:perf_hooks' import { Kysely, type KyselyPlugin, @@ -101,6 +102,27 @@ export class Database { return this.db.isTransaction } + async observeQuery(operation: string, query: () => Promise): Promise { + const startedAt = performance.now() + try { + return await query() + } finally { + const durationMs = Math.round(performance.now() - startedAt) + if (durationMs >= 1000) { + log.warn( + { + durationMs, + operation, + poolIdleConnections: this.cfg.pool.idleCount, + poolTotalConnections: this.cfg.pool.totalCount, + poolWaitingRequests: this.cfg.pool.waitingCount, + }, + 'slow database query', + ) + } + } + } + assertTransaction() { assert(this.isTransaction, 'Transaction required') } diff --git a/bskylink/src/routes/shortLink.ts b/bskylink/src/routes/shortLink.ts index 276aae1ca1..35f48f99ae 100644 --- a/bskylink/src/routes/shortLink.ts +++ b/bskylink/src/routes/shortLink.ts @@ -16,11 +16,13 @@ export default function (ctx: AppContext, app: Express) { typeof linkId === 'string', 'express guarantees id parameter is a string', ) - const found = await ctx.db.db - .selectFrom('link') - .selectAll() - .where('id', '=', linkId) - .executeTakeFirst() + const found = await ctx.db.observeQuery('resolve_short_link', () => + ctx.db.db + .selectFrom('link') + .selectAll() + .where('id', '=', linkId) + .executeTakeFirst(), + ) if (!found) { // potentially broken or mistyped link res.setHeader('Cache-Control', 'no-store')