diff --git a/server/src/plugins/service-admin-http/index.ts b/server/src/plugins/service-admin-http/index.ts index 04a1326..6f2f757 100644 --- a/server/src/plugins/service-admin-http/index.ts +++ b/server/src/plugins/service-admin-http/index.ts @@ -195,16 +195,37 @@ export class Plugin extends BSBService, typeof Event otaImportApiKey: this.config.otaImportApiKey || undefined, }; + const self = this; const app = new H3({ + onRequest: (event) => { + const method = event.req.method ?? "GET"; + const path = event.req.url ?? "/"; + event.context.obs = self.createTrace(`${method} ${path}`, { + "http.method": method, + "http.url": path, + }); + }, onError: (error, event) => { + const reqObs = event.context.obs ?? obs; const status = error.status ?? 500; const path = event.req.url ?? "unknown"; if (status >= 500) { - obs.log.warn("HTTP {status} {path}: {err}", { + reqObs.log.error("HTTP {status} {path}: {err}", { status, path, err: error.message ?? String(error), }); + } else if (status >= 400) { + reqObs.log.warn("HTTP {status} {path}: {err}", { + status, + path, + err: error.message ?? String(error), + }); + } + }, + onResponse: (_response, event) => { + if (event.context.obs) { + event.context.obs.end(); } }, }); diff --git a/server/src/plugins/service-admin-http/middleware.ts b/server/src/plugins/service-admin-http/middleware.ts index 40f2d96..753f4fb 100644 --- a/server/src/plugins/service-admin-http/middleware.ts +++ b/server/src/plugins/service-admin-http/middleware.ts @@ -16,6 +16,7 @@ declare module "h3" { user?: User; session?: Session; apiKeyPrefix?: string; + obs?: import("@bsb/base").Observable; } } diff --git a/server/src/plugins/service-api-http/index.ts b/server/src/plugins/service-api-http/index.ts index 3525b6e..505eaf1 100644 --- a/server/src/plugins/service-api-http/index.ts +++ b/server/src/plugins/service-api-http/index.ts @@ -164,16 +164,37 @@ export class Plugin extends BSBService, typeof Event }, ); + const self = this; const app = new H3({ + onRequest: (event) => { + const method = event.req.method ?? "GET"; + const path = event.req.url ?? "/"; + event.context.obs = self.createTrace(`${method} ${path}`, { + "http.method": method, + "http.url": path, + }); + }, onError: (error, event) => { + const reqObs = event.context.obs ?? obs; const status = error.status ?? 500; const path = event.req.url ?? "unknown"; if (status >= 500) { - obs.log.warn("HTTP {status} {path}: {err}", { + reqObs.log.error("HTTP {status} {path}: {err}", { status, path, err: error.message ?? String(error), }); + } else if (status >= 400) { + reqObs.log.warn("HTTP {status} {path}: {err}", { + status, + path, + err: error.message ?? String(error), + }); + } + }, + onResponse: (_response, event) => { + if (event.context.obs) { + event.context.obs.end(); } }, });