Skip to content

Commit 6f46b10

Browse files
committed
fix: more logs
1 parent 717ee13 commit 6f46b10

File tree

4 files changed

+84
-95
lines changed

4 files changed

+84
-95
lines changed

apps/api/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,11 @@ export default {
108108
};
109109

110110
process.on("SIGINT", () => {
111-
logger.info("SIGINT signal received, shutting down...");
111+
logger.info({ message: "SIGINT signal received, shutting down..." });
112112
process.exit(0);
113113
});
114114

115115
process.on("SIGTERM", () => {
116-
logger.info("SIGTERM signal received, shutting down...");
116+
logger.info({ message: "SIGTERM signal received, shutting down..." });
117117
process.exit(0);
118118
});

apps/api/src/lib/api-key.ts

Lines changed: 33 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ const getCachedApiKeyBySecret = cacheable(
1717
),
1818
});
1919
return key ?? null;
20-
} catch {
20+
} catch (error) {
21+
logger.error({ error }, "Failed to get API key by secret from cache");
2122
return null;
2223
}
2324
},
@@ -36,7 +37,8 @@ const getCachedAccessEntries = cacheable(
3637
.select()
3738
.from(apikeyAccess)
3839
.where(eq(apikeyAccess.apikeyId, keyId));
39-
} catch {
40+
} catch (error) {
41+
logger.error({ error, keyId }, "Failed to get API key access entries from cache");
4042
return [] as InferSelectModel<typeof apikeyAccess>[];
4143
}
4244
},
@@ -67,33 +69,42 @@ export async function getApiKeyFromHeader(
6769
}
6870
const key = await getCachedApiKeyBySecret(secret);
6971
if (!key) {
70-
logger.warn("API key authentication failed: invalid key", {
71-
userAgent: headers.get("user-agent"),
72-
ip: headers.get("x-forwarded-for") || headers.get("x-real-ip"),
73-
method: "getApiKeyFromHeader",
74-
});
72+
logger.warn(
73+
{
74+
userAgent: headers.get("user-agent"),
75+
ip: headers.get("x-forwarded-for") || headers.get("x-real-ip"),
76+
method: "getApiKeyFromHeader",
77+
},
78+
"API key authentication failed: invalid key"
79+
);
7580
return null;
7681
}
7782
if (key.expiresAt && new Date(key.expiresAt) <= new Date()) {
78-
logger.warn("API key authentication failed: expired key", {
79-
apikeyId: key.id,
80-
expiresAt: key.expiresAt,
81-
userAgent: headers.get("user-agent"),
82-
ip: headers.get("x-forwarded-for") || headers.get("x-real-ip"),
83-
});
83+
logger.warn(
84+
{
85+
apikeyId: key.id,
86+
expiresAt: key.expiresAt,
87+
userAgent: headers.get("user-agent"),
88+
ip: headers.get("x-forwarded-for") || headers.get("x-real-ip"),
89+
},
90+
"API key authentication failed: expired key"
91+
);
8492
return null;
8593
}
8694

8795
// Audit log successful API key usage
88-
logger.info("API key used successfully", {
89-
apikeyId: key.id,
90-
userId: key.userId,
91-
organizationId: key.organizationId,
92-
scopes: key.scopes,
93-
userAgent: headers.get("user-agent"),
94-
ip: headers.get("x-forwarded-for") || headers.get("x-real-ip"),
95-
keyPrefix: key.prefix,
96-
});
96+
logger.info(
97+
{
98+
apikeyId: key.id,
99+
userId: key.userId,
100+
organizationId: key.organizationId,
101+
scopes: key.scopes,
102+
userAgent: headers.get("user-agent"),
103+
ip: headers.get("x-forwarded-for") || headers.get("x-real-ip"),
104+
keyPrefix: key.prefix,
105+
},
106+
"API key used successfully"
107+
);
97108

98109
return key;
99110
}
@@ -112,7 +123,6 @@ export async function resolveEffectiveScopesForWebsite(
112123
websiteId: string
113124
): Promise<Set<ApiScope>> {
114125
if (!key) {
115-
logger.debug("Cannot resolve scopes for null API key", { websiteId });
116126
return new Set();
117127
}
118128

@@ -133,15 +143,6 @@ export async function resolveEffectiveScopesForWebsite(
133143
}
134144
}
135145

136-
// Audit log scope resolution for website access
137-
logger.debug("Resolved effective scopes for website", {
138-
apikeyId: key.id,
139-
websiteId,
140-
effectiveScopes: Array.from(effective),
141-
globalScopes: key.scopes || [],
142-
accessEntriesCount: entries.length,
143-
});
144-
145146
return effective;
146147
}
147148

@@ -151,33 +152,14 @@ export async function hasWebsiteScope(
151152
required: ApiScope
152153
): Promise<boolean> {
153154
if (!key) {
154-
logger.debug("Scope check failed: null API key", {
155-
websiteId,
156-
requiredScope: required,
157-
});
158155
return false;
159156
}
160157

161158
if ((key.scopes || []).includes(required)) {
162-
logger.debug("Scope check passed via global scope", {
163-
apikeyId: key.id,
164-
websiteId,
165-
requiredScope: required,
166-
source: "global",
167-
});
168159
return true;
169160
}
170161
const effective = await resolveEffectiveScopesForWebsite(key, websiteId);
171162
const hasScope = effective.has(required);
172163

173-
logger.debug("Scope check result", {
174-
apikeyId: key.id,
175-
websiteId,
176-
requiredScope: required,
177-
hasScope,
178-
source: hasScope ? "effective" : "denied",
179-
effectiveScopes: Array.from(effective),
180-
});
181-
182164
return hasScope;
183165
}

apps/api/src/lib/export/data-fetcher.ts

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -48,32 +48,29 @@ export async function fetchExportData(
4848
// Execute queries in parallel with secure parameters
4949
const [events, errors, webVitals] = await Promise.all([
5050
chQuery<SanitizedEvent>(eventsQuery, queryParams).catch((error) => {
51-
logger.error({
52-
message: "Failed to fetch events for export",
53-
websiteId,
54-
error: error instanceof Error ? error.message : String(error),
55-
});
51+
logger.error(
52+
{ error, websiteId },
53+
"Failed to fetch events for export"
54+
);
5655
throw new Error(
5756
`Failed to fetch events: ${error instanceof Error ? error.message : String(error)}`
5857
);
5958
}),
6059
chQuery<SanitizedError>(errorsQuery, queryParams).catch((error) => {
61-
logger.error({
62-
message: "Failed to fetch errors for export",
63-
websiteId,
64-
error: error instanceof Error ? error.message : String(error),
65-
});
60+
logger.error(
61+
{ error, websiteId },
62+
"Failed to fetch errors for export"
63+
);
6664
throw new Error(
6765
`Failed to fetch errors: ${error instanceof Error ? error.message : String(error)}`
6866
);
6967
}),
7068
chQuery<SanitizedWebVitals>(webVitalsQuery, queryParams).catch(
7169
(error) => {
72-
logger.error({
73-
message: "Failed to fetch web vitals for export",
74-
websiteId,
75-
error: error instanceof Error ? error.message : String(error),
76-
});
70+
logger.error(
71+
{ error, websiteId },
72+
"Failed to fetch web vitals for export"
73+
);
7774
throw new Error(
7875
`Failed to fetch web vitals: ${error instanceof Error ? error.message : String(error)}`
7976
);
@@ -87,14 +84,15 @@ export async function fetchExportData(
8784
webVitals,
8885
};
8986
} catch (error) {
90-
logger.error({
91-
message: "Export data fetch failed",
92-
websiteId,
93-
startDate,
94-
endDate,
95-
error: error instanceof Error ? error.message : String(error),
96-
stack: error instanceof Error ? error.stack : undefined,
97-
});
87+
logger.error(
88+
{
89+
error,
90+
websiteId,
91+
startDate,
92+
endDate,
93+
},
94+
"Export data fetch failed"
95+
);
9896
throw error;
9997
}
10098
}

apps/api/src/lib/export/index.ts

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
} from "./file-generator";
1111
import type { ExportRequest } from "./types";
1212

13-
export interface ExportResult {
13+
export type ExportResult = {
1414
buffer: Buffer;
1515
filename: string;
1616
metadata: {
@@ -26,22 +26,28 @@ export async function processExport(
2626
): Promise<ExportResult> {
2727
const { website_id: websiteId, format = "json" } = request;
2828

29-
logger.info("Starting data export", {
30-
websiteId,
31-
startDate: request.start_date,
32-
endDate: request.end_date,
33-
format,
34-
});
29+
logger.info(
30+
{
31+
websiteId,
32+
startDate: request.start_date,
33+
endDate: request.end_date,
34+
format,
35+
},
36+
"Starting data export"
37+
);
3538

3639
// Fetch data from ClickHouse
3740
const data = await fetchExportData(request);
3841

39-
logger.info("Data export queries completed", {
40-
websiteId,
41-
eventsCount: data.events.length,
42-
errorsCount: data.errors.length,
43-
webVitalsCount: data.webVitals.length,
44-
});
42+
logger.info(
43+
{
44+
websiteId,
45+
eventsCount: data.events.length,
46+
errorsCount: data.errors.length,
47+
webVitalsCount: data.webVitals.length,
48+
},
49+
"Data export queries completed"
50+
);
4551

4652
// Generate export files
4753
const exportFiles = generateExportFiles(data, format);
@@ -55,12 +61,15 @@ export async function processExport(
5561
const totalRecords =
5662
data.events.length + data.errors.length + data.webVitals.length;
5763

58-
logger.info("Data export completed successfully", {
59-
websiteId,
60-
filename,
61-
totalSize: buffer.length,
62-
totalRecords,
63-
});
64+
logger.info(
65+
{
66+
websiteId,
67+
filename,
68+
totalSize: buffer.length,
69+
totalRecords,
70+
},
71+
"Data export completed successfully"
72+
);
6473

6574
return {
6675
buffer,

0 commit comments

Comments
 (0)