Skip to content

Commit 8bde2f3

Browse files
authored
Merge pull request #599 from PRX/feat/598-log-all-requests-responses
598: log all requests and responses
2 parents d6b2550 + ab8f3d7 commit 8bde2f3

6 files changed

Lines changed: 67 additions & 7 deletions

File tree

next.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const nextConfig: NextConfig = withPlausibleProxy({
77
})({
88
output: "standalone",
99
trailingSlash: false,
10+
skipProxyUrlNormalize: true,
1011
redirects,
1112
experimental: {
1213
turbopackFileSystemCacheForDev: false,

src/app/(main)/@hero/[...alias]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export default async function PageHero({
3535
resourceType = undefined;
3636
}
3737

38-
if (resourceType !== "post--page") {
38+
if (!resourceId || resourceType !== "post--page") {
3939
return null;
4040
}
4141

src/app/(main)/episodes/page.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,6 @@ export default async function EpisodesPage({
6464
};
6565
const whereArgs = convertSearchFiltersToWhereArgs(searchFilters);
6666

67-
console.warn(whereArgs);
68-
6967
const data = await getCachedEpisodes({
7068
first: 60,
7169
where: {

src/hooks/useLocalStorage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export function useLocalStorage<T>(key: string, initialValue?: T) {
5454
setLocalStorageItem(key, nextState);
5555
}
5656
} catch (e) {
57+
// There was a problem parsing local storage data. This should not halt. Log as a warning.
5758
console.warn(e);
5859
}
5960
},

src/instrumentation.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import { PinoTransport } from "@loglayer/transport-pino";
44
import pino from "pino";
55
import { serializeError } from "serialize-error";
66

7-
const deploymentEnv = process.env.NODE_ENV || "development";
7+
const deploymentEnv =
8+
process.env.PRX_ENVIRONMENT || process.env.NODE_ENV || "development";
89

910
function stripAnsiCodes(str: string): string {
1011
// This regex matches all ANSI escape sequences that next.js likes to put in the console logs
@@ -89,6 +90,14 @@ export async function register() {
8990
},
9091
},
9192
}),
93+
redact: [
94+
"cookie",
95+
"cookies",
96+
"request.cookie",
97+
"request.cookies",
98+
"request.*.cookie",
99+
"request.*.cookies",
100+
],
92101
}),
93102
}),
94103
],

src/proxy.ts

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,42 @@ import { SFContentTypeEnum } from "@/gen/search_filters_pb";
22
import { encodeContentSearchFiltersParam } from "@/lib/util/binaryData";
33
import { type NextRequest, NextResponse, type ProxyConfig } from "next/server";
44

5+
const deploymentEnv =
6+
process.env.PRX_ENVIRONMENT || process.env.NODE_ENV || "development";
7+
8+
function logger(
9+
request: NextRequest,
10+
response: NextResponse | Response,
11+
requestedAt: Temporal.Instant,
12+
) {
13+
const requestUrl = request.nextUrl.clone();
14+
const now = Temporal.Now.instant();
15+
const responseDuration = now.since(requestedAt);
16+
17+
console.log("Proxy Logger", {
18+
totalTime: responseDuration.milliseconds,
19+
request: {
20+
path: requestUrl.pathname,
21+
searchParams: requestUrl.searchParams.toString(),
22+
method: request.method,
23+
headers: request.headers
24+
.entries()
25+
// biome-ignore lint/performance/noAccumulatingSpread: Fine for now.
26+
.reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {}),
27+
},
28+
response: {
29+
status: response.status,
30+
statusText: response.statusText,
31+
headers: response.headers
32+
.entries()
33+
// biome-ignore lint/performance/noAccumulatingSpread: Fine for now.
34+
.reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {}),
35+
},
36+
});
37+
}
38+
539
export async function proxy(request: NextRequest) {
40+
const requestedAt = Temporal.Now.instant();
641
const url = request.nextUrl.clone();
742

843
/**
@@ -17,7 +52,11 @@ export async function proxy(request: NextRequest) {
1752
url.searchParams.set("sf", sf);
1853
url.searchParams.delete("v");
1954

20-
return NextResponse.redirect(url);
55+
const response = NextResponse.redirect(url);
56+
57+
logger(request, response, requestedAt);
58+
59+
return response;
2160
}
2261

2362
/**
@@ -33,7 +72,11 @@ export async function proxy(request: NextRequest) {
3372

3473
url.pathname = newPath;
3574

36-
return NextResponse.redirect(url);
75+
const response = NextResponse.redirect(url);
76+
77+
logger(request, response, requestedAt);
78+
79+
return response;
3780
}
3881

3982
/**
@@ -52,13 +95,17 @@ export async function proxy(request: NextRequest) {
5295
}
5396

5497
if (!isImageUrlOk) {
55-
return Response.json(
98+
const response = Response.json(
5699
{
57100
success: false,
58101
message: `Source image not accessible: ${imageApiUrl}`,
59102
},
60103
{ status: 422 },
61104
);
105+
106+
logger(request, response, requestedAt);
107+
108+
return response;
62109
}
63110
}
64111

@@ -136,6 +183,10 @@ export async function proxy(request: NextRequest) {
136183
}
137184
}
138185

186+
if (deploymentEnv !== "development") {
187+
logger(request, response, requestedAt);
188+
}
189+
139190
return response;
140191
}
141192

0 commit comments

Comments
 (0)