feat(03-01): hook metrics recording into agent request flow

- Track active requests with startRequest/endRequest around lane queue work
- Increment messagesProcessed on successful agent.process completion
- Record errors and error events on agent.send failures
- Record tool failure events with tool name and error details
This commit is contained in:
William Valentin
2026-02-09 21:29:14 -08:00
parent bd1880a44c
commit a0feff9637
+24
View File
@@ -37,6 +37,9 @@ export function createAgentHandlers(deps: AgentHandlerDeps) {
// Enqueue the work — if the lane is idle it runs immediately, // Enqueue the work — if the lane is idle it runs immediately,
// otherwise it waits for earlier requests on the same session to finish. // otherwise it waits for earlier requests on the same session to finish.
const requestId = request.id.toString();
deps.metrics?.startRequest(requestId, { sessionId: laneId, channel: 'ws' });
return deps.laneQueue.enqueue(laneId, async () => { return deps.laneQueue.enqueue(laneId, async () => {
deps.sessionBridge.setBusy(connectionId, true); deps.sessionBridge.setBusy(connectionId, true);
@@ -53,6 +56,17 @@ export function createAgentHandlers(deps: AgentHandlerDeps) {
error: event.result.error, error: event.result.error,
} : undefined, } : undefined,
})); }));
// Record tool failures as error events
if (event.result && !event.result.success) {
deps.metrics?.incrementErrors();
deps.metrics?.recordEvent({
timestamp: Date.now(),
level: 'error',
source: 'tool',
message: `Tool '${event.tool}' failed: ${event.result.error ?? 'unknown error'}`,
context: { sessionId: laneId, tool: event.tool },
});
}
} }
}); });
@@ -66,13 +80,23 @@ export function createAgentHandlers(deps: AgentHandlerDeps) {
})); }));
const response = await agent.process(params.message!, attachments); const response = await agent.process(params.message!, attachments);
deps.metrics?.incrementMessages();
send(makeEvent(request.id, 'done', { content: response })); send(makeEvent(request.id, 'done', { content: response }));
} catch (err) { } catch (err) {
const message = err instanceof Error ? err.message : 'Unknown error'; const message = err instanceof Error ? err.message : 'Unknown error';
deps.metrics?.incrementErrors();
deps.metrics?.recordEvent({
timestamp: Date.now(),
level: 'error',
source: 'agent.send',
message,
context: { sessionId: laneId },
});
send(makeEvent(request.id, 'error', { code: ErrorCode.InternalError, message })); send(makeEvent(request.id, 'error', { code: ErrorCode.InternalError, message }));
} finally { } finally {
deps.sessionBridge.setBusy(connectionId, false); deps.sessionBridge.setBusy(connectionId, false);
deps.sessionBridge.setOnToolUse(connectionId, undefined); deps.sessionBridge.setOnToolUse(connectionId, undefined);
deps.metrics?.endRequest(requestId);
} }
}); });
}, },