fix(core): add telemetry support for smart edit correction events (#10378)

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
This commit is contained in:
anthony bushong
2025-10-01 18:35:45 -07:00
committed by GitHub
parent 14dbda9145
commit aa8b2abe3d
6 changed files with 71 additions and 4 deletions
@@ -32,6 +32,7 @@ import type {
ModelSlashCommandEvent, ModelSlashCommandEvent,
ExtensionDisableEvent, ExtensionDisableEvent,
SmartEditStrategyEvent, SmartEditStrategyEvent,
SmartEditCorrectionEvent,
} from '../types.js'; } from '../types.js';
import { EventMetadataKey } from './event-metadata-key.js'; import { EventMetadataKey } from './event-metadata-key.js';
import type { Config } from '../../config/config.js'; import type { Config } from '../../config/config.js';
@@ -77,6 +78,7 @@ export enum EventNames {
MODEL_ROUTING = 'model_routing', MODEL_ROUTING = 'model_routing',
MODEL_SLASH_COMMAND = 'model_slash_command', MODEL_SLASH_COMMAND = 'model_slash_command',
SMART_EDIT_STRATEGY = 'smart_edit_strategy', SMART_EDIT_STRATEGY = 'smart_edit_strategy',
SMART_EDIT_CORRECTION = 'smart_edit_correction',
} }
export interface LogResponse { export interface LogResponse {
@@ -1055,6 +1057,20 @@ export class ClearcutLogger {
this.flushIfNeeded(); this.flushIfNeeded();
} }
logSmartEditCorrectionEvent(event: SmartEditCorrectionEvent): void {
const data: EventValue[] = [
{
gemini_cli_key: EventMetadataKey.GEMINI_CLI_SMART_EDIT_CORRECTION,
value: event.correction,
},
];
this.enqueueLogEvent(
this.createLogEvent(EventNames.SMART_EDIT_CORRECTION, data),
);
this.flushIfNeeded();
}
/** /**
* Adds default fields to data, and returns a new data array. This fields * Adds default fields to data, and returns a new data array. This fields
* should exist on all log events. * should exist on all log events.
@@ -88,6 +88,16 @@ export enum EventMetadataKey {
// Logs the length of tool output // Logs the length of tool output
GEMINI_CLI_TOOL_CALL_CONTENT_LENGTH = 93, GEMINI_CLI_TOOL_CALL_CONTENT_LENGTH = 93,
// ==========================================================================
// Replace Tool Call Event Keys
// ===========================================================================
// Logs a smart edit tool strategy choice.
GEMINI_CLI_SMART_EDIT_STRATEGY = 109,
// Logs a smart edit correction event.
GEMINI_CLI_SMART_EDIT_CORRECTION = 110,
// ========================================================================== // ==========================================================================
// GenAI API Request Event Keys // GenAI API Request Event Keys
// =========================================================================== // ===========================================================================
@@ -416,7 +426,4 @@ export enum EventMetadataKey {
// Logs an event when the user uses the /model command. // Logs an event when the user uses the /model command.
GEMINI_CLI_MODEL_SLASH_COMMAND = 108, GEMINI_CLI_MODEL_SLASH_COMMAND = 108,
// Logs a smart edit tool strategy choice.
GEMINI_CLI_SMART_EDIT_STRATEGY = 109,
} }
+1
View File
@@ -33,6 +33,7 @@ export const EVENT_FILE_OPERATION = 'gemini_cli.file_operation';
export const EVENT_MODEL_SLASH_COMMAND = 'gemini_cli.slash_command.model'; export const EVENT_MODEL_SLASH_COMMAND = 'gemini_cli.slash_command.model';
export const EVENT_SMART_EDIT_STRATEGY = 'gemini_cli.smart_edit.strategy'; export const EVENT_SMART_EDIT_STRATEGY = 'gemini_cli.smart_edit.strategy';
export const EVENT_MODEL_ROUTING = 'gemini_cli.model_routing'; export const EVENT_MODEL_ROUTING = 'gemini_cli.model_routing';
export const EVENT_SMART_EDIT_CORRECTION = 'gemini_cli.smart_edit.correction';
// Performance Events // Performance Events
export const EVENT_STARTUP_PERFORMANCE = 'gemini_cli.startup.performance'; export const EVENT_STARTUP_PERFORMANCE = 'gemini_cli.startup.performance';
+23
View File
@@ -35,6 +35,7 @@ import {
EVENT_MODEL_SLASH_COMMAND, EVENT_MODEL_SLASH_COMMAND,
EVENT_EXTENSION_DISABLE, EVENT_EXTENSION_DISABLE,
EVENT_SMART_EDIT_STRATEGY, EVENT_SMART_EDIT_STRATEGY,
EVENT_SMART_EDIT_CORRECTION,
} from './constants.js'; } from './constants.js';
import type { import type {
ApiErrorEvent, ApiErrorEvent,
@@ -66,6 +67,7 @@ import type {
ExtensionInstallEvent, ExtensionInstallEvent,
ModelSlashCommandEvent, ModelSlashCommandEvent,
SmartEditStrategyEvent, SmartEditStrategyEvent,
SmartEditCorrectionEvent,
} from './types.js'; } from './types.js';
import { import {
recordApiErrorMetrics, recordApiErrorMetrics,
@@ -839,3 +841,24 @@ export function logSmartEditStrategy(
}; };
logger.emit(logRecord); logger.emit(logRecord);
} }
export function logSmartEditCorrectionEvent(
config: Config,
event: SmartEditCorrectionEvent,
): void {
ClearcutLogger.getInstance(config)?.logSmartEditCorrectionEvent(event);
if (!isTelemetrySdkInitialized()) return;
const attributes: LogAttributes = {
...getCommonAttributes(config),
...event,
'event.name': EVENT_SMART_EDIT_CORRECTION,
};
const logger = logs.getLogger(SERVICE_NAME);
const logRecord: LogRecord = {
body: `Smart Edit Tool Correction: ${event.correction}`,
attributes,
};
logger.emit(logRecord);
}
+12
View File
@@ -714,3 +714,15 @@ export class SmartEditStrategyEvent implements BaseTelemetryEvent {
this.strategy = strategy; this.strategy = strategy;
} }
} }
export class SmartEditCorrectionEvent implements BaseTelemetryEvent {
'event.name': 'smart_edit_correction';
'event.timestamp': string;
correction: 'success' | 'failure';
constructor(correction: 'success' | 'failure') {
this['event.name'] = 'smart_edit_correction';
this['event.timestamp'] = new Date().toISOString();
this.correction = correction;
}
}
+9 -1
View File
@@ -34,6 +34,8 @@ import { applyReplacement } from './edit.js';
import { safeLiteralReplace } from '../utils/textUtils.js'; import { safeLiteralReplace } from '../utils/textUtils.js';
import { SmartEditStrategyEvent } from '../telemetry/types.js'; import { SmartEditStrategyEvent } from '../telemetry/types.js';
import { logSmartEditStrategy } from '../telemetry/loggers.js'; import { logSmartEditStrategy } from '../telemetry/loggers.js';
import { SmartEditCorrectionEvent } from '../telemetry/types.js';
import { logSmartEditCorrectionEvent } from '../telemetry/loggers.js';
interface ReplacementContext { interface ReplacementContext {
params: EditToolParams; params: EditToolParams;
@@ -416,7 +418,10 @@ class EditToolInvocation implements ToolInvocation<EditToolParams, ToolResult> {
); );
if (secondError) { if (secondError) {
// The fix failed, return the original error // The fix failed, log failure and return the original error
const event = new SmartEditCorrectionEvent('failure');
logSmartEditCorrectionEvent(this.config, event);
return { return {
currentContent, currentContent,
newContent: currentContent, newContent: currentContent,
@@ -427,6 +432,9 @@ class EditToolInvocation implements ToolInvocation<EditToolParams, ToolResult> {
}; };
} }
const event = new SmartEditCorrectionEvent('success');
logSmartEditCorrectionEvent(this.config, event);
return { return {
currentContent, currentContent,
newContent: secondAttemptResult.newContent, newContent: secondAttemptResult.newContent,