Skip to content

Commit 5b234cf

Browse files
authored
Add output for tail being in sampling mode (#3146)
1 parent 133c042 commit 5b234cf

File tree

5 files changed

+64
-7
lines changed

5 files changed

+64
-7
lines changed

.changeset/witty-pumpkins-swim.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"wrangler": patch
3+
---
4+
5+
Added output for tail being in "sampling mode"

packages/wrangler/src/__tests__/pages-deployment-tail.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import type {
1313
ScheduledEvent,
1414
AlarmEvent,
1515
EmailEvent,
16+
TailInfo,
1617
} from "../tail/createTail";
1718
import type { RequestInit } from "undici";
1819
import type WebSocket from "ws";
@@ -655,6 +656,7 @@ function isRequest(
655656
| RequestEvent
656657
| AlarmEvent
657658
| EmailEvent
659+
| TailInfo
658660
| undefined
659661
| null
660662
): event is RequestEvent {

packages/wrangler/src/__tests__/tail.test.ts

+38-7
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type {
1414
ScheduledEvent,
1515
AlarmEvent,
1616
EmailEvent,
17+
TailInfo,
1718
} from "../tail/createTail";
1819
import type { RequestInit } from "undici";
1920
import type WebSocket from "ws";
@@ -56,10 +57,10 @@ describe("tail", () => {
5657
await runWrangler("tail durable-object--websocket--response");
5758
expect(std.out).toMatchInlineSnapshot(`""`);
5859
expect(std.warn).toMatchInlineSnapshot(`
59-
"[33m▲ [43;33m[[43;30mWARNING[43;33m][0m [1mBeginning log collection requires restarting the Durable Objects associated with durable-object--websocket--response. Any WebSocket connections or other non-persisted state will be lost as part of this restart.[0m
60+
"[33m▲ [43;33m[[43;30mWARNING[43;33m][0m [1mBeginning log collection requires restarting the Durable Objects associated with durable-object--websocket--response. Any WebSocket connections or other non-persisted state will be lost as part of this restart.[0m
6061
61-
"
62-
`);
62+
"
63+
`);
6364
expect(std.err).toMatchInlineSnapshot(`""`);
6465
});
6566
it("creates and then delete tails", async () => {
@@ -503,10 +504,31 @@ describe("tail", () => {
503504
)
504505
.replace(mockTailExpiration.toISOString(), "[mock expiration date]")
505506
).toMatchInlineSnapshot(`
506-
"Successfully created tail, expires at [mock expiration date]
507-
Connected to test-worker, waiting for logs...
508-
Email from:${mockEmailEventFrom} to:${mockEmailEventTo} size:${mockEmailEventSize} @ [mock event timestamp] - Ok"
509-
`);
507+
"Successfully created tail, expires at [mock expiration date]
508+
Connected to test-worker, waiting for logs...
509+
Email from:[email protected] to:[email protected] size:45416 @ [mock event timestamp] - Ok"
510+
`);
511+
});
512+
513+
it("logs tail overload message", async () => {
514+
const api = mockWebsocketAPIs();
515+
await runWrangler("tail test-worker --format pretty");
516+
517+
const event = generateTailInfo();
518+
const message = generateMockEventMessage({ event });
519+
const serializedMessage = serialize(message);
520+
521+
api.ws.send(serializedMessage);
522+
expect(
523+
std.out.replace(
524+
mockTailExpiration.toISOString(),
525+
"[mock expiration date]"
526+
)
527+
).toMatchInlineSnapshot(`
528+
"Successfully created tail, expires at [mock expiration date]
529+
Connected to test-worker, waiting for logs...
530+
Tail is currently in sampling mode due to the high volume of messages. To prevent messages from being dropped consider adding filters."
531+
`);
510532
});
511533

512534
it("should not crash when the tail message has a void event", async () => {
@@ -675,6 +697,7 @@ function isRequest(
675697
| RequestEvent
676698
| AlarmEvent
677699
| EmailEvent
700+
| TailInfo
678701
| undefined
679702
| null
680703
): event is RequestEvent {
@@ -956,3 +979,11 @@ function generateMockEmailEvent(opts?: Partial<EmailEvent>): EmailEvent {
956979
rawSize: opts?.rawSize || mockEmailEventSize,
957980
};
958981
}
982+
983+
function generateTailInfo(): TailInfo {
984+
return {
985+
message:
986+
"Tail is currently in sampling mode due to the high volume of messages. To prevent messages from being dropped consider adding filters.",
987+
type: "overload",
988+
};
989+
}

packages/wrangler/src/tail/createTail.ts

+9
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ export type TailEventMessage = {
252252
| ScheduledEvent
253253
| AlarmEvent
254254
| EmailEvent
255+
| TailInfo
255256
| undefined
256257
| null;
257258
};
@@ -404,3 +405,11 @@ export type EmailEvent = {
404405
*/
405406
rawSize: number;
406407
};
408+
409+
/**
410+
* Message from tail with information about the tail itself
411+
*/
412+
export type TailInfo = {
413+
message: string;
414+
type: string;
415+
};

packages/wrangler/src/tail/printing.ts

+10
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import chalk from "chalk";
12
import { logger } from "../logger";
23
import type {
34
AlarmEvent,
45
EmailEvent,
56
RequestEvent,
67
ScheduledEvent,
8+
TailInfo,
79
TailEventMessage,
810
} from "./createTail";
911
import type { Outcome } from "./filters";
@@ -48,6 +50,10 @@ export function prettyPrintLogs(data: WebSocket.RawData): void {
4850
).toLocaleString();
4951

5052
logger.log(`Alarm @ ${datetime} - ${outcome}`);
53+
} else if (isTailInfo(eventMessage.event)) {
54+
if (eventMessage.event.type === "overload") {
55+
logger.log(`${chalk.red.bold(eventMessage.event.message)}`);
56+
}
5157
} else {
5258
// Unknown event type
5359
const outcome = prettifyOutcome(eventMessage.outcome);
@@ -103,6 +109,10 @@ function isAlarmEvent(event: TailEventMessage["event"]): event is AlarmEvent {
103109
return Boolean(event && "scheduledTime" in event && !("cron" in event));
104110
}
105111

112+
function isTailInfo(event: TailEventMessage["event"]): event is TailInfo {
113+
return Boolean(event && "message" in event && "type" in event);
114+
}
115+
106116
function prettifyOutcome(outcome: Outcome): string {
107117
switch (outcome) {
108118
case "ok":

0 commit comments

Comments
 (0)