From 8ec8c1e7183d3722abd1f9bab80f05b2b713427d Mon Sep 17 00:00:00 2001 From: "yanlong.wang" Date: Thu, 16 May 2024 19:01:30 +0800 Subject: [PATCH] fix: logging for search error --- .../functions/src/cloud-functions/searcher.ts | 37 ++++++++++++------- .../functions/src/services/brave-search.ts | 8 ++-- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/backend/functions/src/cloud-functions/searcher.ts b/backend/functions/src/cloud-functions/searcher.ts index fa921e7..bfe9190 100644 --- a/backend/functions/src/cloud-functions/searcher.ts +++ b/backend/functions/src/cloud-functions/searcher.ts @@ -451,20 +451,31 @@ ${this.content} } } - const r = await this.braveSearchService.webSearch(query); + try { + const r = await this.braveSearchService.webSearch(query); - const nowDate = new Date(); - const record = SearchResult.from({ - query, - queryDigest, - response: r, - createdAt: nowDate, - expireAt: new Date(nowDate.valueOf() + this.cacheRetentionMs) - }); - SearchResult.save(record.degradeForFireStore()).catch((err) => { - this.logger.warn(`Failed to cache search result`, { err }); - }); + const nowDate = new Date(); + const record = SearchResult.from({ + query, + queryDigest, + response: r, + createdAt: nowDate, + expireAt: new Date(nowDate.valueOf() + this.cacheRetentionMs) + }); + SearchResult.save(record.degradeForFireStore()).catch((err) => { + this.logger.warn(`Failed to cache search result`, { err }); + }); + + return r; + } catch (err: any) { + if (cache) { + this.logger.warn(`Failed to fetch search result, but a stale cache is available. falling back to stale cache`, { err: marshalErrorLike(err) }); + + return cache.response as WebSearchApiResponse; + } + + throw err; + } - return r; } } diff --git a/backend/functions/src/services/brave-search.ts b/backend/functions/src/services/brave-search.ts index 30546eb..4bee939 100644 --- a/backend/functions/src/services/brave-search.ts +++ b/backend/functions/src/services/brave-search.ts @@ -1,4 +1,4 @@ -import { AsyncService, DownstreamServiceFailureError } from 'civkit'; +import { AsyncService, DownstreamServiceFailureError, marshalErrorLike } from 'civkit'; import { singleton } from 'tsyringe'; import { Logger } from '../shared/services/logger'; import { SecretExposer } from '../shared/services/secrets'; @@ -62,8 +62,10 @@ export class BraveSearchService extends AsyncService { const r = await this.braveSearchHTTP.webSearch(query, { headers: extraHeaders as Record }); return r.parsed; - } catch (err) { - throw new DownstreamServiceFailureError({ message: `Search failed`, cause: err }); + } catch (err: any) { + this.logger.error(`Web search failed: ${err?.message}`, { err: marshalErrorLike(err) }); + + throw new DownstreamServiceFailureError({ message: `Search failed` }); } }