From 42f2eb5eae8b4b1edca22ddfeca0e74f00ef375b Mon Sep 17 00:00:00 2001 From: Ajay Date: Fri, 7 Apr 2023 14:31:08 -0400 Subject: [PATCH] Add traces to branding endpoint --- src/routes/getBranding.ts | 12 +++++++++--- src/utils/queryCacher.ts | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/routes/getBranding.ts b/src/routes/getBranding.ts index fff37dd..5c23731 100644 --- a/src/routes/getBranding.ts +++ b/src/routes/getBranding.ts @@ -19,7 +19,7 @@ enum BrandingSubmissionType { Thumbnail = "thumbnail" } -export async function getVideoBranding(videoID: VideoID, service: Service, ip: IPAddress): Promise { +export async function getVideoBranding(res: Response, videoID: VideoID, service: Service, ip: IPAddress): Promise { const getTitles = () => db.prepare( "all", `SELECT "titles"."title", "titles"."original", "titleVotes"."votes", "titleVotes"."locked", "titleVotes"."shadowHidden", "titles"."UUID", "titles"."videoID", "titles"."hashedVideoID" @@ -43,7 +43,13 @@ export async function getVideoBranding(videoID: VideoID, service: Service, ip: I thumbnails: await getThumbnails() }); - const branding = await QueryCacher.get(getBranding, brandingKey(videoID, service)); + const brandingTrace = await QueryCacher.getTraced(getBranding, brandingKey(videoID, service)); + const branding = brandingTrace.data; + + // Add trace info to request for debugging purposes + res.setHeader("X-Start-Time", brandingTrace.startTime); + res.setHeader("X-DB-Start-Time", brandingTrace.dbStartTime); + res.setHeader("X-End-Time", brandingTrace.endTime); const cache = { currentIP: null as Promise | null @@ -177,7 +183,7 @@ export async function getBranding(req: Request, res: Response) { const ip = getIP(req); try { - const result = await getVideoBranding(videoID, service, ip); + const result = await getVideoBranding(res, videoID, service, ip); const status = result.titles.length > 0 || result.thumbnails.length > 0 ? 200 : 404; return res.status(status).json(result); diff --git a/src/utils/queryCacher.ts b/src/utils/queryCacher.ts index b181631..2f843fa 100644 --- a/src/utils/queryCacher.ts +++ b/src/utils/queryCacher.ts @@ -22,6 +22,41 @@ async function get(fetchFromDB: () => Promise, key: string): Promise { return data; } + +async function getTraced(fetchFromDB: () => Promise, key: string): Promise<{ + data: T; + startTime: number; + dbStartTime?: number; + endTime: number; +}> { + const startTime = Date.now(); + + try { + const reply = await redis.get(key); + if (reply) { + Logger.debug(`Got data from redis: ${reply}`); + + return { + data: JSON.parse(reply), + startTime: startTime, + endTime: Date.now() + }; + } + } catch (e) { } //eslint-disable-line no-empty + + const dbStartTime = Date.now(); + const data = await fetchFromDB(); + + redis.setEx(key, config.redis?.expiryTime, JSON.stringify(data)).catch((err) => Logger.error(err)); + + return { + data, + startTime: startTime, + dbStartTime: dbStartTime, + endTime: Date.now() + }; +} + /** * Gets from redis for all specified values and splits the result before adding it to redis cache */ @@ -117,6 +152,7 @@ function clearFeatureCache(userID: HashedUserID, feature: Feature): void { export const QueryCacher = { get, + getTraced, getAndSplit, clearSegmentCache, clearBrandingCache,