summaryrefslogtreecommitdiff
path: root/packages/taler-util/src/observability.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-util/src/observability.ts')
-rw-r--r--packages/taler-util/src/observability.ts35
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;
+ }
+ }
+}