Skip to content

Commit 0d3b0cc

Browse files
devkiransteven-tey
andauthored
Fix logs (dubinc#3761)
Co-authored-by: Steven Tey <stevensteel97@gmail.com>
1 parent 20be702 commit 0d3b0cc

File tree

7 files changed

+108
-88
lines changed

7 files changed

+108
-88
lines changed

apps/web/app/(ee)/api/track/open/route.ts

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,18 @@ export const POST = withAxiom(async (req) => {
162162
headers: COMMON_CORS_HEADERS,
163163
});
164164

165-
captureRequestLog({
166-
req: reqForLog,
167-
response: jsonResponse,
168-
workspace: { id: workspaceId },
169-
session: undefined,
170-
token: null,
171-
url,
172-
requestHeaders,
173-
startTime,
174-
});
165+
waitUntil(
166+
captureRequestLog({
167+
req: reqForLog,
168+
response: jsonResponse,
169+
workspace: { id: workspaceId },
170+
session: undefined,
171+
token: null,
172+
url,
173+
requestHeaders,
174+
startTime,
175+
}),
176+
);
175177

176178
return jsonResponse;
177179
} catch (error) {
@@ -181,16 +183,18 @@ export const POST = withAxiom(async (req) => {
181183
);
182184

183185
if (workspaceId) {
184-
captureRequestLog({
185-
req: reqForLog,
186-
response: errorResponse,
187-
workspace: { id: workspaceId },
188-
session: undefined,
189-
token: null,
190-
url,
191-
requestHeaders,
192-
startTime,
193-
});
186+
waitUntil(
187+
captureRequestLog({
188+
req: reqForLog,
189+
response: errorResponse,
190+
workspace: { id: workspaceId },
191+
session: undefined,
192+
token: null,
193+
url,
194+
requestHeaders,
195+
startTime,
196+
}),
197+
);
194198
}
195199

196200
return errorResponse;

apps/web/lib/api-logs/capture-request-log.ts

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { WorkspaceWithUsers } from "@/lib/types";
2-
import { waitUntil } from "@vercel/functions";
32
import { TokenCacheItem } from "../auth/token-cache";
43
import { Session } from "../auth/utils";
54
import { HTTP_MUTATION_METHODS, ROUTE_PATTERNS } from "./constants";
@@ -37,7 +36,7 @@ export function getRoutePattern(path: string): string {
3736
return "unknown";
3837
}
3938

40-
export function captureRequestLog({
39+
export async function captureRequestLog({
4140
req,
4241
response,
4342
workspace,
@@ -69,33 +68,29 @@ export function captureRequestLog({
6968
const duration = Date.now() - startTime;
7069
const responseClone = response.clone();
7170

72-
waitUntil(
73-
(async () => {
74-
let requestBody = null;
75-
let responseBody = null;
71+
let requestBody = null;
72+
let responseBody = null;
7673

77-
try {
78-
requestBody = await req.json();
79-
} catch {}
74+
try {
75+
requestBody = await req.json();
76+
} catch {}
8077

81-
try {
82-
responseBody = await responseClone.json();
83-
} catch {}
78+
try {
79+
responseBody = await responseClone.json();
80+
} catch {}
8481

85-
await recordApiLog({
86-
workspaceId: workspace.id,
87-
method: req.method,
88-
path: url.pathname,
89-
routePattern,
90-
statusCode: response.status,
91-
duration,
92-
userAgent: requestHeaders.get("user-agent"),
93-
requestBody,
94-
responseBody,
95-
tokenId: token?.id ?? null,
96-
userId: session?.user?.id ?? null,
97-
requestType: "api",
98-
});
99-
})(),
100-
);
82+
return await recordApiLog({
83+
workspaceId: workspace.id,
84+
method: req.method,
85+
path: url.pathname,
86+
routePattern,
87+
statusCode: response.status,
88+
duration,
89+
userAgent: requestHeaders.get("user-agent"),
90+
requestBody,
91+
responseBody,
92+
tokenId: token?.id ?? null,
93+
userId: session?.user?.id ?? null,
94+
requestType: "api",
95+
});
10196
}

apps/web/lib/api-logs/capture-webhook-log.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export async function captureWebhookLog({
3333
userAgent: string | null;
3434
}) {
3535
const actor = WEBHOOK_REQUEST_ACTORS_BY_PATH[path];
36+
3637
return await recordApiLog({
3738
workspaceId,
3839
method,

apps/web/lib/auth/publishable-key.ts

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ratelimit } from "@/lib/upstash";
55
import { prisma } from "@dub/prisma";
66
import { Project } from "@dub/prisma/client";
77
import { getSearchParams } from "@dub/utils";
8+
import { waitUntil } from "@vercel/functions";
89
import { headers } from "next/headers";
910
import { COMMON_CORS_HEADERS } from "../api/cors";
1011

@@ -114,16 +115,18 @@ export const withPublishableKey = (
114115
workspace,
115116
});
116117

117-
captureRequestLog({
118-
req: reqForLog,
119-
response,
120-
workspace,
121-
session: undefined,
122-
token: null,
123-
url,
124-
requestHeaders,
125-
startTime,
126-
});
118+
waitUntil(
119+
captureRequestLog({
120+
req: reqForLog,
121+
response,
122+
workspace,
123+
session: undefined,
124+
token: null,
125+
url,
126+
requestHeaders,
127+
startTime,
128+
}),
129+
);
127130

128131
return response;
129132
} else {
@@ -139,16 +142,18 @@ export const withPublishableKey = (
139142
);
140143

141144
if (workspace) {
142-
captureRequestLog({
143-
req: reqForLog,
144-
response: errorResponse,
145-
workspace,
146-
session: undefined,
147-
token: null,
148-
url,
149-
requestHeaders,
150-
startTime,
151-
});
145+
waitUntil(
146+
captureRequestLog({
147+
req: reqForLog,
148+
response: errorResponse,
149+
workspace,
150+
session: undefined,
151+
token: null,
152+
url,
153+
requestHeaders,
154+
startTime,
155+
}),
156+
);
152157
}
153158

154159
return errorResponse;

apps/web/lib/auth/workspace.ts

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,9 @@ export const withWorkspace = (
357357

358358
// workspace doesn't exist
359359
if (!workspace || !workspace.users) {
360+
// Clear so the catch path won't record this error against a partial/wrong workspace.
361+
workspace = undefined;
362+
360363
throw new DubApiError({
361364
code: "not_found",
362365
message: "Workspace not found.",
@@ -478,16 +481,18 @@ export const withWorkspace = (
478481
});
479482

480483
if (workspace) {
481-
captureRequestLog({
482-
req: reqForLog,
483-
response,
484-
workspace,
485-
session,
486-
token,
487-
url,
488-
requestHeaders,
489-
startTime,
490-
});
484+
waitUntil(
485+
captureRequestLog({
486+
req: reqForLog,
487+
response,
488+
workspace,
489+
session,
490+
token,
491+
url,
492+
requestHeaders,
493+
startTime,
494+
}),
495+
);
491496
}
492497

493498
return response;
@@ -498,16 +503,18 @@ export const withWorkspace = (
498503
);
499504

500505
if (workspace) {
501-
captureRequestLog({
502-
req: reqForLog,
503-
response: errorResponse,
504-
workspace,
505-
session,
506-
token,
507-
url,
508-
requestHeaders,
509-
startTime,
510-
});
506+
waitUntil(
507+
captureRequestLog({
508+
req: reqForLog,
509+
response: errorResponse,
510+
workspace,
511+
session,
512+
token,
513+
url,
514+
requestHeaders,
515+
startTime,
516+
}),
517+
);
511518
}
512519

513520
return errorResponse;

apps/web/ui/layout/sidebar/app-sidebar-nav.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import {
3737
ShieldCheck,
3838
ShieldKeyhole,
3939
Sliders,
40+
StackY3,
4041
Tag,
4142
Trophy,
4243
UserCheck,
@@ -406,6 +407,11 @@ const NAV_AREAS: SidebarNavAreas<SidebarNavData> = {
406407
icon: Key,
407408
href: `/${slug}/settings/tokens`,
408409
},
410+
{
411+
name: "Logs",
412+
icon: StackY3,
413+
href: `/${slug}/settings/logs`,
414+
},
409415
{
410416
name: "Tracking",
411417
icon: MarketingTarget,

packages/utils/src/constants/reserved-slugs.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ export const RESERVED_SLUGS = [
1111
"share",
1212
"deeplink",
1313
"robots.txt",
14+
"undefined",
15+
"null",
1416
"proxy",
1517
"account",
1618
"api",

0 commit comments

Comments
 (0)