Skip to content

Commit f88b322

Browse files
committed
feat: actual logging
1 parent e1feb68 commit f88b322

File tree

25 files changed

+325
-738
lines changed

25 files changed

+325
-738
lines changed

apps/api/src/index.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import "./polyfills/compression";
22
import { auth } from "@databuddy/auth";
33
import { appRouter, createRPCContext } from "@databuddy/rpc";
4+
import { logger } from "@databuddy/shared/logger";
45
import cors from "@elysiajs/cors";
56
import { onError } from "@orpc/server";
67
import { RPCHandler } from "@orpc/server/fetch";
78
import { autumnHandler } from "autumn-js/elysia";
89
import { Elysia } from "elysia";
9-
import { logger } from "./lib/logger";
1010
import { assistant } from "./routes/assistant";
1111
// import { customSQL } from './routes/custom-sql';
1212
import { exportRoute } from "./routes/export";
@@ -59,16 +59,20 @@ const app = new Elysia()
5959
.use(query)
6060
.use(assistant)
6161
.use(exportRoute)
62-
.all("/rpc/*", async ({ request }: { request: Request }) => {
63-
const context = await createRPCContext({ headers: request.headers });
64-
const { response } = await rpcHandler.handle(request, {
65-
prefix: "/rpc",
66-
context,
67-
});
68-
return response ?? new Response("Not Found", { status: 404 });
69-
}, {
70-
parse: "none",
71-
})
62+
.all(
63+
"/rpc/*",
64+
async ({ request }: { request: Request }) => {
65+
const context = await createRPCContext({ headers: request.headers });
66+
const { response } = await rpcHandler.handle(request, {
67+
prefix: "/rpc",
68+
context,
69+
});
70+
return response ?? new Response("Not Found", { status: 404 });
71+
},
72+
{
73+
parse: "none",
74+
}
75+
)
7276
.onError(({ error, code }) => {
7377
const errorMessage = error instanceof Error ? error.message : String(error);
7478
logger.error({ message: errorMessage, code, error });

apps/basket/src/hooks/auth.ts

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -83,17 +83,22 @@ const getOwnerId = cacheable(
8383
// Cache the website lookup and owner lookup
8484
export const getWebsiteById = cacheable(
8585
async (id: string): Promise<WebsiteWithOwner | null> => {
86-
const website = await db.query.websites.findFirst({
87-
where: eq(websites.id, id),
88-
});
86+
try {
87+
const website = await db.query.websites.findFirst({
88+
where: eq(websites.id, id),
89+
});
8990

90-
if (!website) {
91-
return null;
92-
}
91+
if (!website) {
92+
return null;
93+
}
9394

94-
const ownerId = await getOwnerId(website);
95+
const ownerId = await getOwnerId(website);
9596

96-
return { ...website, ownerId };
97+
return { ...website, ownerId };
98+
} catch (error) {
99+
logger.error({ error, websiteId: id }, "Failed to get website by ID");
100+
return null;
101+
}
97102
},
98103
{
99104
expireInSec: 300,
@@ -124,7 +129,10 @@ export function isValidOrigin(
124129
return true;
125130
}
126131
if (!allowedDomain?.trim()) {
127-
logger.warn("[isValidOrigin] No allowed domain provided");
132+
logger.warn(
133+
{ originHeader },
134+
"[isValidOrigin] No allowed domain provided"
135+
);
128136
return false;
129137
}
130138
try {
@@ -139,9 +147,8 @@ export function isValidOrigin(
139147
);
140148
} catch (error) {
141149
logger.error(
142-
new Error(
143-
`[isValidOrigin] Validation failed: ${error instanceof Error ? error.message : String(error)}`
144-
)
150+
{ error, originHeader, allowedDomain },
151+
"[isValidOrigin] Validation failed"
145152
);
146153
return false;
147154
}
@@ -176,7 +183,7 @@ export function normalizeDomain(domain: string): string {
176183
}
177184
return finalDomain;
178185
} catch (error) {
179-
logger.error({ error }, `Failed to parse domain: ${domain}`);
186+
logger.error({ error, domain }, "Failed to parse domain");
180187
throw new Error(`Invalid domain format: ${domain}`);
181188
}
182189
}
@@ -297,9 +304,8 @@ export function isValidOriginSecure(
297304
);
298305
} catch (error) {
299306
logger.error(
300-
new Error(
301-
`[isValidOriginSecure] Validation failed: ${error instanceof Error ? error.message : String(error)}`
302-
)
307+
{ error, originHeader, allowedDomain },
308+
"[isValidOriginSecure] Validation failed"
303309
);
304310
return false;
305311
}
@@ -320,10 +326,15 @@ export function isLocalhost(hostname: string): boolean {
320326

321327
const getWebsiteByIdCached = cacheable(
322328
async (id: string): Promise<Website | null> => {
323-
const website = await db.query.websites.findFirst({
324-
where: eq(websites.id, id),
325-
});
326-
return website ?? null;
329+
try {
330+
const website = await db.query.websites.findFirst({
331+
where: eq(websites.id, id),
332+
});
333+
return website ?? null;
334+
} catch (error) {
335+
logger.error({ error, websiteId: id }, "Failed to get website by ID from cache");
336+
return null;
337+
}
327338
},
328339
{
329340
expireInSec: 300, // 5 minutes
@@ -347,11 +358,16 @@ const getOwnerIdCached = cacheable(
347358
export async function getWebsiteByIdV2(
348359
id: string
349360
): Promise<WebsiteWithOwner | null> {
350-
const website = await getWebsiteByIdCached(id);
351-
if (!website) {
361+
try {
362+
const website = await getWebsiteByIdCached(id);
363+
if (!website) {
364+
return null;
365+
}
366+
367+
const ownerId = await getOwnerIdCached(website);
368+
return { ...website, ownerId };
369+
} catch (error) {
370+
logger.error({ error, websiteId: id }, "Failed to get website by ID V2");
352371
return null;
353372
}
354-
355-
const ownerId = await getOwnerIdCached(website);
356-
return { ...website, ownerId };
357373
}

apps/basket/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,5 @@ console.log(`Basket service running on http://localhost:${port}`);
7878

7979
export default {
8080
fetch: app.fetch,
81-
port: Number.parseInt(port.toString()),
81+
port,
8282
};

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ 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";
67
import { sendEvent } from "./producer";
78

89
/**
@@ -84,7 +85,7 @@ export async function logBlockedTraffic(
8485
};
8586

8687
sendEvent("analytics-blocked-traffic", blockedEvent);
87-
} catch {
88-
//
88+
} catch (error) {
89+
logger.error({ error }, "Failed to log blocked traffic");
8990
}
9091
}

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

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
validatePerformanceMetric,
1515
validateSessionId,
1616
} from "../utils/validation";
17+
import { logger } from "./logger";
1718
import { sendEvent, sendEventBatch } from "./producer";
1819
import { checkDuplicate } from "./security";
1920

@@ -86,11 +87,11 @@ export async function insertError(
8687

8788
try {
8889
sendEvent("analytics-errors", errorEvent);
89-
} catch (err) {
90-
console.error("Failed to queue error event", {
91-
error: err as Error,
92-
eventId,
93-
});
90+
} catch (error) {
91+
logger.error(
92+
{ error, eventId },
93+
"Failed to queue error event"
94+
);
9495
}
9596
}
9697

@@ -152,11 +153,11 @@ export async function insertWebVitals(
152153

153154
try {
154155
sendEvent("analytics-web-vitals", webVitalsEvent);
155-
} catch (err) {
156-
console.error("Failed to queue web vitals event", {
157-
error: err as Error,
158-
eventId,
159-
});
156+
} catch (error) {
157+
logger.error(
158+
{ error, eventId },
159+
"Failed to queue web vitals event"
160+
);
160161
// Don't throw - event is buffered or sent async
161162
}
162163
}
@@ -206,11 +207,11 @@ export async function insertCustomEvent(
206207

207208
try {
208209
sendEvent("analytics-custom-events", customEvent);
209-
} catch (err) {
210-
console.error("Failed to queue custom event", {
211-
error: err as Error,
212-
eventId,
213-
});
210+
} catch (error) {
211+
logger.error(
212+
{ error, eventId },
213+
"Failed to queue custom event"
214+
);
214215
// Don't throw - event is buffered or sent async
215216
}
216217
}
@@ -258,11 +259,11 @@ export async function insertOutgoingLink(
258259

259260
try {
260261
sendEvent("analytics-outgoing-links", outgoingLinkEvent);
261-
} catch (err) {
262-
console.error("Failed to queue outgoing link event", {
263-
error: err as Error,
264-
eventId,
265-
});
262+
} catch (error) {
263+
logger.error(
264+
{ error, eventId },
265+
"Failed to queue outgoing link event"
266+
);
266267
}
267268
}
268269

@@ -380,11 +381,11 @@ export async function insertTrackEvent(
380381

381382
try {
382383
sendEvent("analytics-events", trackEvent);
383-
} catch (err) {
384-
console.error("Failed to queue track event", {
385-
error: err as Error,
386-
eventId,
387-
});
384+
} catch (error) {
385+
logger.error(
386+
{ error, eventId },
387+
"Failed to queue track event"
388+
);
388389
}
389390
}
390391

@@ -397,12 +398,11 @@ export async function insertTrackEventsBatch(
397398

398399
try {
399400
await sendEventBatch("analytics-events", events);
400-
} catch (err) {
401-
console.error("Failed to queue track events batch", {
402-
error: err as Error,
403-
count: events.length,
404-
});
405-
// Don't throw - events are buffered
401+
} catch (error) {
402+
logger.error(
403+
{ error, count: events.length },
404+
"Failed to queue track events batch"
405+
);
406406
}
407407
}
408408

@@ -413,11 +413,11 @@ export async function insertErrorsBatch(events: ErrorEvent[]): Promise<void> {
413413

414414
try {
415415
await sendEventBatch("analytics-errors", events);
416-
} catch (err) {
417-
console.error("Failed to queue errors batch", {
418-
error: err as Error,
419-
count: events.length,
420-
});
416+
} catch (error) {
417+
logger.error(
418+
{ error, count: events.length },
419+
"Failed to queue errors batch"
420+
);
421421
}
422422
}
423423

@@ -430,11 +430,11 @@ export async function insertWebVitalsBatch(
430430

431431
try {
432432
await sendEventBatch("analytics-web-vitals", events);
433-
} catch (err) {
434-
console.error("Failed to queue web vitals batch", {
435-
error: err as Error,
436-
count: events.length,
437-
});
433+
} catch (error) {
434+
logger.error(
435+
{ error, count: events.length },
436+
"Failed to queue web vitals batch"
437+
);
438438
}
439439
}
440440

@@ -447,11 +447,11 @@ export async function insertCustomEventsBatch(
447447

448448
try {
449449
await sendEventBatch("analytics-custom-events", events);
450-
} catch (err) {
451-
console.error("Failed to queue custom events batch", {
452-
error: err as Error,
453-
count: events.length,
454-
});
450+
} catch (error) {
451+
logger.error(
452+
{ error, count: events.length },
453+
"Failed to queue custom events batch"
454+
);
455455
}
456456
}
457457

@@ -464,10 +464,10 @@ export async function insertOutgoingLinksBatch(
464464

465465
try {
466466
await sendEventBatch("analytics-outgoing-links", events);
467-
} catch (err) {
468-
console.error("Failed to queue outgoing links batch", {
469-
error: err as Error,
470-
count: events.length,
471-
});
467+
} catch (error) {
468+
logger.error(
469+
{ error, count: events.length },
470+
"Failed to queue outgoing links batch"
471+
);
472472
}
473473
}

apps/basket/src/lib/logger.ts

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
1-
import pino from "pino";
1+
import { logger as sharedLogger } from "@databuddy/shared/logger";
22

3-
export const logger = pino({
4-
level: process.env.LOG_LEVEL || "info",
5-
transport:
6-
process.env.NODE_ENV === "development"
7-
? {
8-
target: "pino-pretty",
9-
options: {
10-
colorize: true,
11-
translateTime: "HH:MM:ss",
12-
ignore: "pid,hostname",
13-
},
14-
}
15-
: undefined,
3+
export const logger = sharedLogger.child({
4+
service: "basket",
165
});

0 commit comments

Comments
 (0)