From b906f4f6d2b90cc3a25c6b6d12956971f144ab52 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Sat, 16 Sep 2023 07:34:44 +0200 Subject: Trace performance and upload to sentry --- src/index.ts | 52 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index 98958d1..f4279c8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,9 @@ import prom from "bun-prometheus-client"; import readConfig from "./config"; -Sentry.init({}); +Sentry.init({ + tracesSampleRate: 1.0, +}); const base = "."; const publicDir = path.resolve(base, "public") + path.sep; @@ -156,25 +158,48 @@ console.info( const server = Bun.serve({ fetch: async function (request) { - const pathname = new URL(request.url).pathname; + const pathname = new URL(request.url).pathname.replace(/\/\/+/g, "/"); const endTimer = metrics.requestDuration.startTimer({ path: pathname }); + const transaction = Sentry.startTransaction({ + name: pathname, + op: "http.server", + description: `${request.method} ${pathname}`, + data: { + url: request.url, + "http.method": request.method, + }, + tags: { + region: Bun.env.FLY_APP_REGION, + }, + }); + const span = transaction.startChild({ + op: "http.server", + description: `${request.method} ${pathname}`, + data: { + url: request.url, + "http.method": request.method, + }, + }); try { const file = files.get(pathname); metrics.requestsByPath.inc({ path: pathname }); - if (file) { + if (file && (await file.handle.exists())) { if ( parseIfModifiedSinceHeader( request.headers.get("if-modified-since"), ) >= file?.mtime.getTime() ) { metrics.requestsByStatus.inc({ status_code: 304 }); + span.setTag("http.status_code", 304); return new Response("", { status: 304, headers: defaultHeaders }); } const encodings = (request.headers.get("accept-encoding") || "") .split(",") .map((x) => x.trim().toLowerCase()); if (encodings.includes("br") && files.has(file.relPath + ".br")) { - return serveEncodedFile(files.get(file.relPath + ".br"), 200, { + span.setTag("http.encoding", "br"); + span.setTag("http.status_code", 200); + return serveFile(files.get(file.relPath + ".br"), 200, { "content-encoding": "br", "content-type": file.handle.type, }); @@ -182,7 +207,9 @@ const server = Bun.serve({ encodings.includes("zstd") && files.has(file.relPath + ".zst") ) { - return serveEncodedFile(files.get(file.relPath + ".zst"), 200, { + span.setTag("http.encoding", "zstd"); + span.setTag("http.status_code", 200); + return serveFile(files.get(file.relPath + ".zst"), 200, { "content-encoding": "zstd", "content-type": file.handle.type, }); @@ -190,20 +217,31 @@ const server = Bun.serve({ encodings.includes("gzip") && files.has(file.relPath + ".gz") ) { - return serveEncodedFile(files.get(file.relPath + ".gz"), 200, { + span.setTag("http.encoding", "gzip"); + span.setTag("http.status_code", 200); + return serveFile(files.get(file.relPath + ".gz"), 200, { "content-encoding": "gzip", "content-type": file.handle.type, }); } + span.setTag("http.encoding", "identity"); + span.setTag("http.status_code", 200); + return serveFile(file); + } else { + metrics.requestsByStatus.inc({ status_code: 404 }); + transaction.setTag("http.status_code", 404); + return serveFile(files.get("/404.html"), 404); } - return serveFile(file); } catch (error) { + span.setTag("http.status_code", 503); metrics.requestsByStatus.inc({ status_code: 503 }); Sentry.captureException(error); return new Response("Something went wrong", { status: 503 }); } finally { const seconds = endTimer(); metrics.requestDuration.observe(seconds); + span.finish(); + transaction.finish(); } }, }); -- cgit 1.4.1