Skip to content

Commit 6b67630

Browse files
committed
fix: error logging in basket
1 parent ee829aa commit 6b67630

File tree

15 files changed

+336
-165
lines changed

15 files changed

+336
-165
lines changed

apps/basket/src/hooks/auth.ts

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77

88
import { and, db, eq, member, websites } from "@databuddy/db";
99
import { cacheable } from "@databuddy/redis";
10-
import { logger } from "../lib/logger";
11-
import { record, setAttributes } from "../lib/tracing";
10+
import { captureError, record, setAttributes } from "../lib/tracing";
1211

1312
type Website = typeof websites.$inferSelect;
1413

@@ -47,26 +46,23 @@ async function _resolveOwnerId(website: Website): Promise<string | null> {
4746
return orgMember.userId;
4847
}
4948

50-
logger.warn(
51-
{ websiteId: website.id, organizationId: website.organizationId },
52-
"Organization owner not found for website"
53-
);
49+
// logger.warn(
50+
// { websiteId: website.id, organizationId: website.organizationId },
51+
// "Organization owner not found for website"
52+
// );
5453
} catch (error) {
55-
logger.error(
56-
{
57-
websiteId: website.id,
58-
organizationId: website.organizationId,
59-
error,
60-
},
61-
"Failed to fetch organization owner"
62-
);
54+
captureError(error, {
55+
message: "Failed to fetch organization owner",
56+
websiteId: website.id,
57+
organizationId: website.organizationId || "unknown",
58+
});
6359
}
6460
}
6561

66-
logger.warn(
67-
{ websiteId: website.id },
68-
"No owner could be determined for website"
69-
);
62+
// logger.warn(
63+
// { websiteId: website.id },
64+
// "No owner could be determined for website"
65+
// );
7066
return null;
7167
}
7268

@@ -97,7 +93,10 @@ export const getWebsiteById = cacheable(
9793

9894
return { ...website, ownerId };
9995
} catch (error) {
100-
logger.error({ error, websiteId: id }, "Failed to get website by ID");
96+
captureError(error, {
97+
message: "Failed to get website by ID",
98+
websiteId: id,
99+
});
101100
return null;
102101
}
103102
},
@@ -130,7 +129,7 @@ export function isValidOrigin(
130129
return true;
131130
}
132131
if (!allowedDomain?.trim()) {
133-
logger.warn({ originHeader }, "[isValidOrigin] No allowed domain provided");
132+
// logger.warn({ originHeader }, "[isValidOrigin] No allowed domain provided");
134133
return false;
135134
}
136135
try {
@@ -144,10 +143,11 @@ export function isValidOrigin(
144143
isSubdomain(normalizedOriginDomain, normalizedAllowedDomain)
145144
);
146145
} catch (error) {
147-
logger.error(
148-
{ error, originHeader, allowedDomain },
149-
"[isValidOrigin] Validation failed"
150-
);
146+
captureError(error, {
147+
message: "[isValidOrigin] Validation failed",
148+
originHeader,
149+
allowedDomain,
150+
});
151151
return false;
152152
}
153153
}
@@ -181,7 +181,7 @@ export function normalizeDomain(domain: string): string {
181181
}
182182
return finalDomain;
183183
} catch (error) {
184-
logger.error({ error, domain }, "Failed to parse domain");
184+
captureError(error, { message: "Failed to parse domain", domain });
185185
throw new Error(`Invalid domain format: ${domain}`);
186186
}
187187
}
@@ -301,10 +301,11 @@ export function isValidOriginSecure(
301301
isSubdomain(normalizedOriginDomain, normalizedAllowedDomain)
302302
);
303303
} catch (error) {
304-
logger.error(
305-
{ error, originHeader, allowedDomain },
306-
"[isValidOriginSecure] Validation failed"
307-
);
304+
captureError(error, {
305+
message: "[isValidOriginSecure] Validation failed",
306+
originHeader,
307+
allowedDomain,
308+
});
308309
return false;
309310
}
310311
}
@@ -336,10 +337,10 @@ const getWebsiteByIdWithOwnerCached = cacheable(
336337
const ownerId = await _resolveOwnerId(website);
337338
return { ...website, ownerId };
338339
} catch (error) {
339-
logger.error(
340-
{ error, websiteId: id },
341-
"Failed to get website by ID from cache"
342-
);
340+
captureError(error, {
341+
message: "Failed to get website by ID from cache",
342+
websiteId: id,
343+
});
343344
return null;
344345
}
345346
},
@@ -374,7 +375,10 @@ export function getWebsiteByIdV2(id: string): Promise<WebsiteWithOwner | null> {
374375

375376
return result;
376377
} catch (error) {
377-
logger.error({ error, websiteId: id }, "Failed to get website by ID V2");
378+
captureError(error, {
379+
message: "Failed to get website by ID V2",
380+
websiteId: id,
381+
});
378382
setAttributes({
379383
"website.lookup_failed": true,
380384
});

apps/basket/src/index.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import "./polyfills/compression";
22

33
import { Elysia } from "elysia";
4-
import { logger } from "./lib/logger";
54
import { disconnectProducer, getProducerStats } from "./lib/producer";
65
import {
6+
captureError,
77
endRequestSpan,
88
initTracing,
99
shutdownTracing,
@@ -15,19 +15,29 @@ import { closeGeoIPReader } from "./utils/ip-geo";
1515

1616
initTracing();
1717

18+
process.on("unhandledRejection", (reason, _promise) => {
19+
console.error("Unhandled Rejection:", reason);
20+
captureError(reason);
21+
});
22+
23+
process.on("uncaughtException", (error) => {
24+
console.error("Uncaught Exception:", error);
25+
captureError(error);
26+
});
27+
1828
process.on("SIGTERM", async () => {
19-
logger.info("SIGTERM received, shutting down gracefully...");
29+
console.log("SIGTERM received, shutting down gracefully...");
2030
await Promise.all([disconnectProducer(), shutdownTracing()]).catch((error) =>
21-
logger.error({ error }, "Shutdown error")
31+
console.error("Shutdown error:", error)
2232
);
2333
closeGeoIPReader();
2434
process.exit(0);
2535
});
2636

2737
process.on("SIGINT", async () => {
28-
logger.info("SIGINT received, shutting down gracefully...");
38+
console.log("SIGINT received, shutting down gracefully...");
2939
await Promise.all([disconnectProducer(), shutdownTracing()]).catch((error) =>
30-
logger.error({ error }, "Shutdown error")
40+
console.error("Shutdown error:", error)
3141
);
3242
closeGeoIPReader();
3343
process.exit(0);
@@ -78,6 +88,10 @@ const app = new Elysia()
7888
}
7989
})
8090
.onBeforeHandle(function startTrace({ request, path, store }) {
91+
if (request.method === "OPTIONS" || path === "/health") {
92+
return;
93+
}
94+
8195
const method = request.method;
8296
const startTime = Date.now();
8397
const span = startRequestSpan(method, request.url, path);
@@ -103,7 +117,7 @@ const app = new Elysia()
103117
if (code === "NOT_FOUND") {
104118
return new Response(null, { status: 404 });
105119
}
106-
logger.error({ error }, "Error in basket service");
120+
captureError(error);
107121
})
108122
.options("*", () => new Response(null, { status: 204 }))
109123
.use(basketRouter)
@@ -119,7 +133,7 @@ const app = new Elysia()
119133

120134
const port = process.env.PORT || 4000;
121135

122-
logger.info(`Starting basket service on port ${port}`);
136+
console.log(`Starting basket service on port ${port}`);
123137

124138
export default {
125139
fetch: app.fetch,

apps/basket/src/lib/blocked-traffic.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import type { BlockedTraffic } from "@databuddy/db";
33
import { extractIpFromRequest, getGeo } from "../utils/ip-geo";
44
import { parseUserAgent } from "../utils/user-agent";
55
import { sanitizeString, VALIDATION_LIMITS } from "../utils/validation";
6-
import { logger } from "./logger";
76
import { sendEvent } from "./producer";
7+
import { captureError } from "./tracing";
88

99
async function _logBlockedTrafficAsync(
1010
request: Request,
@@ -85,7 +85,7 @@ async function _logBlockedTrafficAsync(
8585

8686
sendEvent("analytics-blocked-traffic", blockedEvent);
8787
} catch (error) {
88-
logger.error({ error }, "Failed to log blocked traffic");
88+
captureError(error, { message: "Failed to log blocked traffic" });
8989
}
9090
}
9191

@@ -110,6 +110,6 @@ export function logBlockedTraffic(
110110
botName,
111111
clientId
112112
).catch((error) => {
113-
logger.error({ error }, "Failed to log blocked traffic");
113+
captureError(error, { message: "Failed to log blocked traffic" });
114114
});
115115
}

apps/basket/src/lib/event-service.ts

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@ import {
1414
validatePerformanceMetric,
1515
validateSessionId,
1616
} from "../utils/validation";
17-
import { logger } from "./logger";
1817
import { sendEvent, sendEventBatch } from "./producer";
1918
import { checkDuplicate, getDailySalt, saltAnonymousId } from "./security";
20-
import { record, setAttributes } from "./tracing";
19+
import { captureError, record, setAttributes } from "./tracing";
2120

2221
/**
2322
* Insert an error event into the database
@@ -109,7 +108,7 @@ export function insertError(
109108
try {
110109
sendEvent("analytics-errors", errorEvent);
111110
} catch (error) {
112-
logger.error({ error, eventId }, "Failed to queue error event");
111+
captureError(error, { eventId });
113112
}
114113
});
115114
}
@@ -173,7 +172,7 @@ export async function insertWebVitals(
173172
try {
174173
sendEvent("analytics-web-vitals", webVitalsEvent);
175174
} catch (error) {
176-
logger.error({ error, eventId }, "Failed to queue web vitals event");
175+
captureError(error, { eventId });
177176
// Don't throw - event is buffered or sent async
178177
}
179178
}
@@ -224,7 +223,7 @@ export async function insertCustomEvent(
224223
try {
225224
sendEvent("analytics-custom-events", customEvent);
226225
} catch (error) {
227-
logger.error({ error, eventId }, "Failed to queue custom event");
226+
captureError(error, { eventId });
228227
// Don't throw - event is buffered or sent async
229228
}
230229
}
@@ -273,7 +272,7 @@ export async function insertOutgoingLink(
273272
try {
274273
sendEvent("analytics-outgoing-links", outgoingLinkEvent);
275274
} catch (error) {
276-
logger.error({ error, eventId }, "Failed to queue outgoing link event");
275+
captureError(error, { eventId });
277276
}
278277
}
279278

@@ -425,7 +424,7 @@ export function insertTrackEvent(
425424
try {
426425
sendEvent("analytics-events", trackEvent);
427426
} catch (error) {
428-
logger.error({ error, eventId }, "Failed to queue track event");
427+
captureError(error, { eventId });
429428
}
430429
});
431430
}
@@ -446,10 +445,7 @@ export function insertTrackEventsBatch(
446445
try {
447446
await sendEventBatch("analytics-events", events);
448447
} catch (error) {
449-
logger.error(
450-
{ error, count: events.length },
451-
"Failed to queue track events batch"
452-
);
448+
captureError(error, { count: events.length });
453449
}
454450
});
455451
}
@@ -468,10 +464,7 @@ export function insertErrorsBatch(events: ErrorEvent[]): Promise<void> {
468464
try {
469465
await sendEventBatch("analytics-errors", events);
470466
} catch (error) {
471-
logger.error(
472-
{ error, count: events.length },
473-
"Failed to queue errors batch"
474-
);
467+
captureError(error, { count: events.length });
475468
}
476469
});
477470
}
@@ -490,10 +483,7 @@ export function insertWebVitalsBatch(events: WebVitalsEvent[]): Promise<void> {
490483
try {
491484
await sendEventBatch("analytics-web-vitals", events);
492485
} catch (error) {
493-
logger.error(
494-
{ error, count: events.length },
495-
"Failed to queue web vitals batch"
496-
);
486+
captureError(error, { count: events.length });
497487
}
498488
});
499489
}
@@ -512,10 +502,7 @@ export function insertCustomEventsBatch(events: CustomEvent[]): Promise<void> {
512502
try {
513503
await sendEventBatch("analytics-custom-events", events);
514504
} catch (error) {
515-
logger.error(
516-
{ error, count: events.length },
517-
"Failed to queue custom events batch"
518-
);
505+
captureError(error, { count: events.length });
519506
}
520507
});
521508
}
@@ -536,10 +523,7 @@ export function insertOutgoingLinksBatch(
536523
try {
537524
await sendEventBatch("analytics-outgoing-links", events);
538525
} catch (error) {
539-
logger.error(
540-
{ error, count: events.length },
541-
"Failed to queue outgoing links batch"
542-
);
526+
captureError(error, { count: events.length });
543527
}
544528
});
545529
}

apps/basket/src/lib/logger.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)