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:
@@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user