Skip to content

Commit bf7aac9

Browse files
committed
Add output for tail being in sampling mode
1 parent 98e6630 commit bf7aac9

File tree

5 files changed

+56
-5
lines changed

5 files changed

+56
-5
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

+30-5
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 () => {
@@ -505,8 +506,23 @@ describe("tail", () => {
505506
).toMatchInlineSnapshot(`
506507
"Successfully created tail, expires at [mock expiration date]
507508
Connected to test-worker, waiting for logs...
508-
Email from:${mockEmailEventFrom} to:${mockEmailEventTo} size:${mockEmailEventSize} @ [mock event timestamp] - Ok"
509-
`);
509+
Email from:`);
510+
});
511+
512+
it("logs tail overload message", async () => {
513+
const api = mockWebsocketAPIs();
514+
await runWrangler("tail test-worker --format pretty");
515+
516+
const event = generateTailInfo();
517+
const message = generateMockEventMessage({ event });
518+
const serializedMessage = serialize(message);
519+
520+
api.ws.send(serializedMessage);
521+
expect(std.out).toMatchInlineSnapshot(`
522+
"Successfully created tail, expires at 3005-02-01T06:00:00.000Z
523+
Connected to test-worker, waiting for logs...
524+
Tail is currently in sampling mode due to the high volume of messages. To prevent messages from being dropped consider adding filters."
525+
`);
510526
});
511527

512528
it("should not crash when the tail message has a void event", async () => {
@@ -675,6 +691,7 @@ function isRequest(
675691
| RequestEvent
676692
| AlarmEvent
677693
| EmailEvent
694+
| TailInfo
678695
| undefined
679696
| null
680697
): event is RequestEvent {
@@ -956,3 +973,11 @@ function generateMockEmailEvent(opts?: Partial<EmailEvent>): EmailEvent {
956973
rawSize: opts?.rawSize || mockEmailEventSize,
957974
};
958975
}
976+
977+
function generateTailInfo(): TailInfo {
978+
return {
979+
message:
980+
"Tail is currently in sampling mode due to the high volume of messages. To prevent messages from being dropped consider adding filters.",
981+
type: "overload",
982+
};
983+
}

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)