feat(infra) - Add logging for when user tries to exit multiple times (#11218)

Co-authored-by: gemini-cli-robot <gemini-cli-robot@google.com>
This commit is contained in:
shishu314
2025-10-22 17:39:27 -04:00
committed by GitHub
parent 30dd2f1dfe
commit 4f220e945a
5 changed files with 219 additions and 176 deletions
+1
View File
@@ -108,6 +108,7 @@ export {
// Custom metrics for token usage and API responses
recordCustomTokenUsageMetrics,
recordCustomApiResponseMetrics,
recordExitFail,
// OpenTelemetry GenAI semantic convention for token usage and operation duration
recordGenAiClientTokenUsage,
recordGenAiClientOperationDuration,
@@ -92,6 +92,7 @@ describe('Telemetry Metrics', () => {
let recordGenAiClientTokenUsageModule: typeof import('./metrics.js').recordGenAiClientTokenUsage;
let recordGenAiClientOperationDurationModule: typeof import('./metrics.js').recordGenAiClientOperationDuration;
let recordFlickerFrameModule: typeof import('./metrics.js').recordFlickerFrame;
let recordExitFailModule: typeof import('./metrics.js').recordExitFail;
let recordAgentRunMetricsModule: typeof import('./metrics.js').recordAgentRunMetrics;
beforeEach(async () => {
@@ -133,6 +134,7 @@ describe('Telemetry Metrics', () => {
recordGenAiClientOperationDurationModule =
metricsJsModule.recordGenAiClientOperationDuration;
recordFlickerFrameModule = metricsJsModule.recordFlickerFrame;
recordExitFailModule = metricsJsModule.recordExitFail;
recordAgentRunMetricsModule = metricsJsModule.recordAgentRunMetrics;
const otelApiModule = await import('@opentelemetry/api');
@@ -170,6 +172,28 @@ describe('Telemetry Metrics', () => {
});
});
describe('recordExitFail', () => {
it('does not record metrics if not initialized', () => {
const config = makeFakeConfig({});
recordExitFailModule(config);
expect(mockCounterAddFn).not.toHaveBeenCalled();
});
it('records a exit fail event when initialized', () => {
const config = makeFakeConfig({});
initializeMetricsModule(config);
recordExitFailModule(config);
// Called for session, then for exit fail
expect(mockCounterAddFn).toHaveBeenCalledTimes(2);
expect(mockCounterAddFn).toHaveBeenNthCalledWith(2, 1, {
'session.id': 'test-session-id',
'installation.id': 'test-installation-id',
'user.email': 'test@example.com',
});
});
});
describe('initializeMetrics', () => {
const mockConfig = {
getSessionId: () => 'test-session-id',
+16
View File
@@ -56,6 +56,7 @@ const REGRESSION_PERCENTAGE_CHANGE =
'gemini_cli.performance.regression.percentage_change';
const BASELINE_COMPARISON = 'gemini_cli.performance.baseline.comparison';
const FLICKER_FRAME_COUNT = 'gemini_cli.ui.flicker.count';
const EXIT_FAIL_COUNT = 'gemini_cli.exit.fail.count';
const baseMetricDefinition = {
getCommonAttributes,
@@ -175,6 +176,12 @@ const COUNTER_DEFINITIONS = {
assign: (c: Counter) => (flickerFrameCounter = c),
attributes: {} as Record<string, never>,
},
[EXIT_FAIL_COUNT]: {
description: 'Counts CLI exit failures.',
valueType: ValueType.INT,
assign: (c: Counter) => (exitFailCounter = c),
attributes: {} as Record<string, never>,
},
} as const;
const HISTOGRAM_DEFINITIONS = {
@@ -458,6 +465,7 @@ let agentRunCounter: Counter | undefined;
let agentDurationHistogram: Histogram | undefined;
let agentTurnsHistogram: Histogram | undefined;
let flickerFrameCounter: Counter | undefined;
let exitFailCounter: Counter | undefined;
// OpenTelemetry GenAI Semantic Convention Metrics
let genAiClientTokenUsageHistogram: Histogram | undefined;
@@ -623,6 +631,14 @@ export function recordFlickerFrame(config: Config): void {
flickerFrameCounter.add(1, baseMetricDefinition.getCommonAttributes(config));
}
/**
* Records a metric for when user failed to exit
*/
export function recordExitFail(config: Config): void {
if (!exitFailCounter || !isMetricsInitialized) return;
exitFailCounter.add(1, baseMetricDefinition.getCommonAttributes(config));
}
/**
* Records a metric for when an invalid chunk is received from a stream.
*/