diff options
Diffstat (limited to 'packages/taler-util/src/observability.ts')
-rw-r--r-- | packages/taler-util/src/observability.ts | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/packages/taler-util/src/observability.ts b/packages/taler-util/src/observability.ts index fde951e37..198dcbe6e 100644 --- a/packages/taler-util/src/observability.ts +++ b/packages/taler-util/src/observability.ts @@ -15,6 +15,9 @@ */ import { ObservabilityEvent } from "./index.js"; +import { HttpRequestLibrary, HttpRequestOptions, HttpResponse } from "./http-common.js"; +import { ObservabilityEventType } from "./notifications.js" +import { getErrorDetailFromException } from "./errors.js"; /** * Observability sink can be passed into various operations (HTTP requests, DB access) @@ -23,3 +26,35 @@ import { ObservabilityEvent } from "./index.js"; export interface ObservabilityContext { observe(evt: ObservabilityEvent): void; } + +export class ObservableHttpClientLibrary implements HttpRequestLibrary { + constructor( + private impl: HttpRequestLibrary, + private oc: ObservabilityContext, + ) { } + async fetch( + url: string, + opt?: HttpRequestOptions | undefined, + ): Promise<HttpResponse> { + this.oc.observe({ + type: ObservabilityEventType.HttpFetchStart, + url: url, + }); + try { + const res = await this.impl.fetch(url, opt); + this.oc.observe({ + type: ObservabilityEventType.HttpFetchFinishSuccess, + url, + status: res.status, + }); + return res; + } catch (e) { + this.oc.observe({ + type: ObservabilityEventType.HttpFetchFinishError, + url, + error: getErrorDetailFromException(e), + }); + throw e; + } + } +} |