mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-04-29 14:34:55 -07:00
feat(core): add telemetry for subagent execution (#10456)
This commit is contained in:
@@ -29,7 +29,10 @@ import {
|
||||
makeChatCompressionEvent,
|
||||
ModelRoutingEvent,
|
||||
ToolCallEvent,
|
||||
AgentStartEvent,
|
||||
AgentFinishEvent,
|
||||
} from '../types.js';
|
||||
import { AgentTerminateMode } from '../../agents/types.js';
|
||||
import { GIT_COMMIT_INFO, CLI_VERSION } from '../../generated/git-commit.js';
|
||||
import { UserAccountManager } from '../../utils/userAccountManager.js';
|
||||
import { InstallationManager } from '../../utils/installationManager.js';
|
||||
@@ -721,6 +724,87 @@ describe('ClearcutLogger', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('logAgentStartEvent', () => {
|
||||
it('logs an event with proper fields', () => {
|
||||
const { logger } = setup();
|
||||
const event = new AgentStartEvent('agent-123', 'TestAgent');
|
||||
|
||||
logger?.logAgentStartEvent(event);
|
||||
|
||||
const events = getEvents(logger!);
|
||||
expect(events.length).toBe(1);
|
||||
expect(events[0]).toHaveEventName(EventNames.AGENT_START);
|
||||
expect(events[0]).toHaveMetadataValue([
|
||||
EventMetadataKey.GEMINI_CLI_AGENT_ID,
|
||||
'agent-123',
|
||||
]);
|
||||
expect(events[0]).toHaveMetadataValue([
|
||||
EventMetadataKey.GEMINI_CLI_AGENT_NAME,
|
||||
'TestAgent',
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('logAgentFinishEvent', () => {
|
||||
it('logs an event with proper fields (success)', () => {
|
||||
const { logger } = setup();
|
||||
const event = new AgentFinishEvent(
|
||||
'agent-123',
|
||||
'TestAgent',
|
||||
1000,
|
||||
5,
|
||||
AgentTerminateMode.GOAL,
|
||||
);
|
||||
|
||||
logger?.logAgentFinishEvent(event);
|
||||
|
||||
const events = getEvents(logger!);
|
||||
expect(events.length).toBe(1);
|
||||
expect(events[0]).toHaveEventName(EventNames.AGENT_FINISH);
|
||||
expect(events[0]).toHaveMetadataValue([
|
||||
EventMetadataKey.GEMINI_CLI_AGENT_ID,
|
||||
'agent-123',
|
||||
]);
|
||||
expect(events[0]).toHaveMetadataValue([
|
||||
EventMetadataKey.GEMINI_CLI_AGENT_NAME,
|
||||
'TestAgent',
|
||||
]);
|
||||
expect(events[0]).toHaveMetadataValue([
|
||||
EventMetadataKey.GEMINI_CLI_AGENT_DURATION_MS,
|
||||
'1000',
|
||||
]);
|
||||
expect(events[0]).toHaveMetadataValue([
|
||||
EventMetadataKey.GEMINI_CLI_AGENT_TURN_COUNT,
|
||||
'5',
|
||||
]);
|
||||
expect(events[0]).toHaveMetadataValue([
|
||||
EventMetadataKey.GEMINI_CLI_AGENT_TERMINATE_REASON,
|
||||
'GOAL',
|
||||
]);
|
||||
});
|
||||
|
||||
it('logs an event with proper fields (error)', () => {
|
||||
const { logger } = setup();
|
||||
const event = new AgentFinishEvent(
|
||||
'agent-123',
|
||||
'TestAgent',
|
||||
500,
|
||||
2,
|
||||
AgentTerminateMode.ERROR,
|
||||
);
|
||||
|
||||
logger?.logAgentFinishEvent(event);
|
||||
|
||||
const events = getEvents(logger!);
|
||||
expect(events.length).toBe(1);
|
||||
expect(events[0]).toHaveEventName(EventNames.AGENT_FINISH);
|
||||
expect(events[0]).toHaveMetadataValue([
|
||||
EventMetadataKey.GEMINI_CLI_AGENT_TERMINATE_REASON,
|
||||
'ERROR',
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('logToolCallEvent', () => {
|
||||
it('logs an event with all diff metadata', () => {
|
||||
const { logger } = setup();
|
||||
|
||||
@@ -33,6 +33,8 @@ import type {
|
||||
ExtensionDisableEvent,
|
||||
SmartEditStrategyEvent,
|
||||
SmartEditCorrectionEvent,
|
||||
AgentStartEvent,
|
||||
AgentFinishEvent,
|
||||
} from '../types.js';
|
||||
import { EventMetadataKey } from './event-metadata-key.js';
|
||||
import type { Config } from '../../config/config.js';
|
||||
@@ -79,6 +81,8 @@ export enum EventNames {
|
||||
MODEL_SLASH_COMMAND = 'model_slash_command',
|
||||
SMART_EDIT_STRATEGY = 'smart_edit_strategy',
|
||||
SMART_EDIT_CORRECTION = 'smart_edit_correction',
|
||||
AGENT_START = 'agent_start',
|
||||
AGENT_FINISH = 'agent_finish',
|
||||
}
|
||||
|
||||
export interface LogResponse {
|
||||
@@ -1063,6 +1067,50 @@ export class ClearcutLogger {
|
||||
this.flushIfNeeded();
|
||||
}
|
||||
|
||||
logAgentStartEvent(event: AgentStartEvent): void {
|
||||
const data: EventValue[] = [
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_AGENT_ID,
|
||||
value: event.agent_id,
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_AGENT_NAME,
|
||||
value: event.agent_name,
|
||||
},
|
||||
];
|
||||
|
||||
this.enqueueLogEvent(this.createLogEvent(EventNames.AGENT_START, data));
|
||||
this.flushIfNeeded();
|
||||
}
|
||||
|
||||
logAgentFinishEvent(event: AgentFinishEvent): void {
|
||||
const data: EventValue[] = [
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_AGENT_ID,
|
||||
value: event.agent_id,
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_AGENT_NAME,
|
||||
value: event.agent_name,
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_AGENT_DURATION_MS,
|
||||
value: event.duration_ms.toString(),
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_AGENT_TURN_COUNT,
|
||||
value: event.turn_count.toString(),
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_AGENT_TERMINATE_REASON,
|
||||
value: event.terminate_reason,
|
||||
},
|
||||
];
|
||||
|
||||
this.enqueueLogEvent(this.createLogEvent(EventNames.AGENT_FINISH, data));
|
||||
this.flushIfNeeded();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds default fields to data, and returns a new data array. This fields
|
||||
* should exist on all log events.
|
||||
|
||||
@@ -426,4 +426,23 @@ export enum EventMetadataKey {
|
||||
|
||||
// Logs an event when the user uses the /model command.
|
||||
GEMINI_CLI_MODEL_SLASH_COMMAND = 108,
|
||||
|
||||
// ==========================================================================
|
||||
// Agent Event Keys
|
||||
// ==========================================================================
|
||||
|
||||
// Logs the name of the agent.
|
||||
GEMINI_CLI_AGENT_NAME = 111,
|
||||
|
||||
// Logs the unique ID of the agent instance.
|
||||
GEMINI_CLI_AGENT_ID = 112,
|
||||
|
||||
// Logs the duration of the agent execution in milliseconds.
|
||||
GEMINI_CLI_AGENT_DURATION_MS = 113,
|
||||
|
||||
// Logs the number of turns the agent took.
|
||||
GEMINI_CLI_AGENT_TURN_COUNT = 114,
|
||||
|
||||
// Logs the reason for agent termination.
|
||||
GEMINI_CLI_AGENT_TERMINATE_REASON = 115,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user