Skip to content

Commit 4c9da91

Browse files
committed
feat: better traces
1 parent d4a3981 commit 4c9da91

File tree

6 files changed

+304
-270
lines changed

6 files changed

+304
-270
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export function insertError(
5858

5959
const { anonymizedIP, country, region } = geoData;
6060
const { browserName, browserVersion, osName, osVersion, deviceType } =
61-
parseUserAgent(userAgent);
61+
await parseUserAgent(userAgent);
6262

6363
const errorEvent: ErrorEvent = {
6464
id: randomUUID(),
@@ -140,7 +140,7 @@ export async function insertWebVitals(
140140

141141
const { country, region } = await getGeo(ip);
142142
const { browserName, browserVersion, osName, osVersion, deviceType } =
143-
parseUserAgent(userAgent);
143+
await parseUserAgent(userAgent);
144144

145145
const webVitalsEvent: WebVitalsEvent = {
146146
id: randomUUID(),
@@ -330,7 +330,7 @@ export function insertTrackEvent(
330330
deviceType,
331331
deviceBrand,
332332
deviceModel,
333-
} = parseUserAgent(userAgent);
333+
} = await parseUserAgent(userAgent);
334334
const now = Date.now();
335335

336336
const trackEvent: AnalyticsEvent = {

apps/basket/src/lib/request-validation.ts

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -199,27 +199,29 @@ export function checkForBot(
199199
query: any,
200200
clientId: string,
201201
userAgent: string
202-
): { error?: { status: string } } | undefined {
203-
const botCheck = detectBot(userAgent, request);
204-
if (botCheck.isBot) {
205-
logBlockedTraffic(
206-
request,
207-
body,
208-
query,
209-
botCheck.reason || "unknown_bot",
210-
botCheck.category || "Bot Detection",
211-
botCheck.botName,
212-
clientId
213-
);
214-
setAttributes({
215-
"validation.failed": true,
216-
"validation.reason": "bot_detected",
217-
"bot.name": botCheck.botName || "unknown",
218-
"bot.category": botCheck.category || "Bot Detection",
219-
"bot.detection_reason": botCheck.reason || "unknown_bot",
220-
});
221-
return { error: { status: "ignored" } };
222-
}
223-
return;
202+
): Promise<{ error?: { status: string } } | undefined> {
203+
return record("checkForBot", () => {
204+
const botCheck = detectBot(userAgent, request);
205+
if (botCheck.isBot) {
206+
logBlockedTraffic(
207+
request,
208+
body,
209+
query,
210+
botCheck.reason || "unknown_bot",
211+
botCheck.category || "Bot Detection",
212+
botCheck.botName,
213+
clientId
214+
);
215+
setAttributes({
216+
"validation.failed": true,
217+
"validation.reason": "bot_detected",
218+
"bot.name": botCheck.botName || "unknown",
219+
"bot.category": botCheck.category || "Bot Detection",
220+
"bot.detection_reason": botCheck.reason || "unknown_bot",
221+
});
222+
return { error: { status: "ignored" } };
223+
}
224+
return;
225+
});
224226
}
225227

apps/basket/src/lib/tracing.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,22 @@ function getTracer() {
6363
export function record<T>(name: string, fn: () => Promise<T> | T): Promise<T> {
6464
const tracer = getTracer();
6565
return tracer.startActiveSpan(name, async (span) => {
66+
const startTime = Date.now();
6667
try {
6768
const result = await fn();
69+
const duration = Date.now() - startTime;
70+
span.setAttribute("operation.duration_ms", duration);
71+
72+
if (duration > 1000) {
73+
span.setAttribute("operation.slow", true);
74+
span.setAttribute("operation.duration_seconds", duration / 1000);
75+
}
76+
6877
span.setStatus({ code: SpanStatusCode.OK });
6978
return result;
7079
} catch (error) {
80+
const duration = Date.now() - startTime;
81+
span.setAttribute("operation.duration_ms", duration);
7182
span.setStatus({
7283
code: SpanStatusCode.ERROR,
7384
message: error instanceof Error ? error.message : String(error),
@@ -145,8 +156,15 @@ export function endRequestSpan(
145156
statusCode: number,
146157
startTime: number
147158
): void {
159+
const duration = Date.now() - startTime;
148160
span.setAttribute("http.status_code", statusCode);
149-
span.setAttribute("http.response.duration_ms", Date.now() - startTime);
161+
span.setAttribute("http.response.duration_ms", duration);
162+
163+
if (duration > 500) {
164+
span.setAttribute("http.slow", true);
165+
span.setAttribute("http.duration_seconds", duration / 1000);
166+
}
167+
150168
span.setStatus({
151169
code: statusCode >= 400 ? SpanStatusCode.ERROR : SpanStatusCode.OK,
152170
message: statusCode >= 400 ? `HTTP ${statusCode}` : undefined,

0 commit comments

Comments
 (0)