Add traces to branding endpoint

This commit is contained in:
Ajay
2023-04-07 14:31:08 -04:00
parent e1a607ba39
commit 42f2eb5eae
2 changed files with 45 additions and 3 deletions

View File

@@ -19,7 +19,7 @@ enum BrandingSubmissionType {
Thumbnail = "thumbnail"
}
export async function getVideoBranding(videoID: VideoID, service: Service, ip: IPAddress): Promise<BrandingResult> {
export async function getVideoBranding(res: Response, videoID: VideoID, service: Service, ip: IPAddress): Promise<BrandingResult> {
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<HashedIP> | 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);

View File

@@ -22,6 +22,41 @@ async function get<T>(fetchFromDB: () => Promise<T>, key: string): Promise<T> {
return data;
}
async function getTraced<T>(fetchFromDB: () => Promise<T>, 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,