fix: wire OTLP logs for diagnostics
This commit is contained in:
@@ -25,4 +25,31 @@ describe("diagnostic-events", () => {
|
||||
|
||||
expect(seqs).toEqual([1, 2]);
|
||||
});
|
||||
|
||||
test("emits message-flow events", async () => {
|
||||
resetDiagnosticEventsForTest();
|
||||
const types: string[] = [];
|
||||
const stop = onDiagnosticEvent((evt) => types.push(evt.type));
|
||||
|
||||
emitDiagnosticEvent({
|
||||
type: "webhook.received",
|
||||
channel: "telegram",
|
||||
updateType: "telegram-post",
|
||||
});
|
||||
emitDiagnosticEvent({
|
||||
type: "message.queued",
|
||||
channel: "telegram",
|
||||
source: "telegram",
|
||||
queueDepth: 1,
|
||||
});
|
||||
emitDiagnosticEvent({
|
||||
type: "session.state",
|
||||
state: "processing",
|
||||
reason: "run_started",
|
||||
});
|
||||
|
||||
stop();
|
||||
|
||||
expect(types).toEqual(["webhook.received", "message.queued", "session.state"]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
import type { ClawdbotConfig } from "../config/config.js";
|
||||
|
||||
export type DiagnosticUsageEvent = {
|
||||
type: "model.usage";
|
||||
export type DiagnosticSessionState = "idle" | "processing" | "waiting";
|
||||
|
||||
type DiagnosticBaseEvent = {
|
||||
ts: number;
|
||||
seq: number;
|
||||
};
|
||||
|
||||
export type DiagnosticUsageEvent = DiagnosticBaseEvent & {
|
||||
type: "model.usage";
|
||||
sessionKey?: string;
|
||||
sessionId?: string;
|
||||
channel?: string;
|
||||
@@ -25,7 +30,116 @@ export type DiagnosticUsageEvent = {
|
||||
durationMs?: number;
|
||||
};
|
||||
|
||||
export type DiagnosticEventPayload = DiagnosticUsageEvent;
|
||||
export type DiagnosticWebhookReceivedEvent = DiagnosticBaseEvent & {
|
||||
type: "webhook.received";
|
||||
channel: string;
|
||||
updateType?: string;
|
||||
chatId?: number | string;
|
||||
};
|
||||
|
||||
export type DiagnosticWebhookProcessedEvent = DiagnosticBaseEvent & {
|
||||
type: "webhook.processed";
|
||||
channel: string;
|
||||
updateType?: string;
|
||||
chatId?: number | string;
|
||||
durationMs?: number;
|
||||
};
|
||||
|
||||
export type DiagnosticWebhookErrorEvent = DiagnosticBaseEvent & {
|
||||
type: "webhook.error";
|
||||
channel: string;
|
||||
updateType?: string;
|
||||
chatId?: number | string;
|
||||
error: string;
|
||||
};
|
||||
|
||||
export type DiagnosticMessageQueuedEvent = DiagnosticBaseEvent & {
|
||||
type: "message.queued";
|
||||
sessionKey?: string;
|
||||
sessionId?: string;
|
||||
channel?: string;
|
||||
source: string;
|
||||
queueDepth?: number;
|
||||
};
|
||||
|
||||
export type DiagnosticMessageProcessedEvent = DiagnosticBaseEvent & {
|
||||
type: "message.processed";
|
||||
channel: string;
|
||||
messageId?: number | string;
|
||||
chatId?: number | string;
|
||||
sessionKey?: string;
|
||||
sessionId?: string;
|
||||
durationMs?: number;
|
||||
outcome: "completed" | "skipped" | "error";
|
||||
reason?: string;
|
||||
error?: string;
|
||||
};
|
||||
|
||||
export type DiagnosticSessionStateEvent = DiagnosticBaseEvent & {
|
||||
type: "session.state";
|
||||
sessionKey?: string;
|
||||
sessionId?: string;
|
||||
prevState?: DiagnosticSessionState;
|
||||
state: DiagnosticSessionState;
|
||||
reason?: string;
|
||||
queueDepth?: number;
|
||||
};
|
||||
|
||||
export type DiagnosticSessionStuckEvent = DiagnosticBaseEvent & {
|
||||
type: "session.stuck";
|
||||
sessionKey?: string;
|
||||
sessionId?: string;
|
||||
state: DiagnosticSessionState;
|
||||
ageMs: number;
|
||||
queueDepth?: number;
|
||||
};
|
||||
|
||||
export type DiagnosticLaneEnqueueEvent = DiagnosticBaseEvent & {
|
||||
type: "queue.lane.enqueue";
|
||||
lane: string;
|
||||
queueSize: number;
|
||||
};
|
||||
|
||||
export type DiagnosticLaneDequeueEvent = DiagnosticBaseEvent & {
|
||||
type: "queue.lane.dequeue";
|
||||
lane: string;
|
||||
queueSize: number;
|
||||
waitMs: number;
|
||||
};
|
||||
|
||||
export type DiagnosticRunAttemptEvent = DiagnosticBaseEvent & {
|
||||
type: "run.attempt";
|
||||
sessionKey?: string;
|
||||
sessionId?: string;
|
||||
runId: string;
|
||||
attempt: number;
|
||||
};
|
||||
|
||||
export type DiagnosticHeartbeatEvent = DiagnosticBaseEvent & {
|
||||
type: "diagnostic.heartbeat";
|
||||
webhooks: {
|
||||
received: number;
|
||||
processed: number;
|
||||
errors: number;
|
||||
};
|
||||
active: number;
|
||||
waiting: number;
|
||||
queued: number;
|
||||
};
|
||||
|
||||
export type DiagnosticEventPayload =
|
||||
| DiagnosticUsageEvent
|
||||
| DiagnosticWebhookReceivedEvent
|
||||
| DiagnosticWebhookProcessedEvent
|
||||
| DiagnosticWebhookErrorEvent
|
||||
| DiagnosticMessageQueuedEvent
|
||||
| DiagnosticMessageProcessedEvent
|
||||
| DiagnosticSessionStateEvent
|
||||
| DiagnosticSessionStuckEvent
|
||||
| DiagnosticLaneEnqueueEvent
|
||||
| DiagnosticLaneDequeueEvent
|
||||
| DiagnosticRunAttemptEvent
|
||||
| DiagnosticHeartbeatEvent;
|
||||
|
||||
let seq = 0;
|
||||
const listeners = new Set<(evt: DiagnosticEventPayload) => void>();
|
||||
|
||||
Reference in New Issue
Block a user