fix: clearcut logging (retry #3744) (#3751)

This commit is contained in:
Gaurav
2025-07-11 10:57:35 -07:00
committed by GitHub
parent 93284281de
commit 8f12e8a114
9 changed files with 444 additions and 184 deletions

View File

@@ -18,7 +18,10 @@ import {
import { EventMetadataKey } from './event-metadata-key.js';
import { Config } from '../../config/config.js';
import { getInstallationId } from '../../utils/user_id.js';
import { getGoogleAccountId } from '../../utils/user_id.js';
import {
getCachedGoogleAccount,
getLifetimeGoogleAccounts,
} from '../../utils/user_account.js';
const start_session_event_name = 'start_session';
const new_prompt_event_name = 'new_prompt';
@@ -65,14 +68,30 @@ export class ClearcutLogger {
]);
}
createLogEvent(name: string, data: object): object {
return {
createLogEvent(name: string, data: object[]): object {
const email = getCachedGoogleAccount();
const totalAccounts = getLifetimeGoogleAccounts();
data.push({
gemini_cli_key: EventMetadataKey.GEMINI_CLI_GOOGLE_ACCOUNTS_COUNT,
value: totalAccounts.toString(),
});
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const logEvent: any = {
console_type: 'GEMINI_CLI',
application: 102,
event_name: name,
client_install_id: getInstallationId(),
event_metadata: [data] as object[],
};
// Should log either email or install ID, not both. See go/cloudmill-1p-oss-instrumentation#define-sessionable-id
if (email) {
logEvent.client_email = email;
} else {
logEvent.client_install_id = getInstallationId();
}
return logEvent;
}
flushIfNeeded(): void {
@@ -80,30 +99,24 @@ export class ClearcutLogger {
return;
}
// Fire and forget - don't await
this.flushToClearcut().catch((error) => {
console.debug('Error flushing to Clearcut:', error);
});
}
async flushToClearcut(): Promise<LogResponse> {
flushToClearcut(): Promise<LogResponse> {
if (this.config?.getDebugMode()) {
console.log('Flushing log events to Clearcut.');
}
const eventsToSend = [...this.events];
this.events.length = 0;
const googleAccountId = await getGoogleAccountId();
return new Promise<Buffer>((resolve, reject) => {
const request = [
{
log_source_name: 'CONCORD',
request_time_ms: Date.now(),
log_event: eventsToSend,
// Add UserInfo with the raw Gaia ID
user_info: googleAccountId
? {
UserID: googleAccountId,
}
: undefined,
},
];
const body = JSON.stringify(request);
@@ -249,10 +262,10 @@ export class ClearcutLogger {
value: event.telemetry_log_user_prompts_enabled.toString(),
},
];
this.enqueueLogEvent(this.createLogEvent(start_session_event_name, data));
// Flush start event immediately
this.enqueueLogEvent(this.createLogEvent(start_session_event_name, data));
this.flushToClearcut().catch((error) => {
console.debug('Error flushing start session event to Clearcut:', error);
console.debug('Error flushing to Clearcut:', error);
});
}
@@ -273,9 +286,7 @@ export class ClearcutLogger {
];
this.enqueueLogEvent(this.createLogEvent(new_prompt_event_name, data));
this.flushToClearcut().catch((error) => {
console.debug('Error flushing to Clearcut:', error);
});
this.flushIfNeeded();
}
logToolCallEvent(event: ToolCallEvent): void {
@@ -310,10 +321,9 @@ export class ClearcutLogger {
},
];
this.enqueueLogEvent(this.createLogEvent(tool_call_event_name, data));
this.flushToClearcut().catch((error) => {
console.debug('Error flushing to Clearcut:', error);
});
const logEvent = this.createLogEvent(tool_call_event_name, data);
this.enqueueLogEvent(logEvent);
this.flushIfNeeded();
}
logApiRequestEvent(event: ApiRequestEvent): void {
@@ -329,9 +339,7 @@ export class ClearcutLogger {
];
this.enqueueLogEvent(this.createLogEvent(api_request_event_name, data));
this.flushToClearcut().catch((error) => {
console.debug('Error flushing to Clearcut:', error);
});
this.flushIfNeeded();
}
logApiResponseEvent(event: ApiResponseEvent): void {
@@ -388,9 +396,7 @@ export class ClearcutLogger {
];
this.enqueueLogEvent(this.createLogEvent(api_response_event_name, data));
this.flushToClearcut().catch((error) => {
console.debug('Error flushing to Clearcut:', error);
});
this.flushIfNeeded();
}
logApiErrorEvent(event: ApiErrorEvent): void {
@@ -422,9 +428,7 @@ export class ClearcutLogger {
];
this.enqueueLogEvent(this.createLogEvent(api_error_event_name, data));
this.flushToClearcut().catch((error) => {
console.debug('Error flushing to Clearcut:', error);
});
this.flushIfNeeded();
}
logEndSessionEvent(event: EndSessionEvent): void {
@@ -435,8 +439,8 @@ export class ClearcutLogger {
},
];
this.enqueueLogEvent(this.createLogEvent(end_session_event_name, data));
// Flush immediately on session end.
this.enqueueLogEvent(this.createLogEvent(end_session_event_name, data));
this.flushToClearcut().catch((error) => {
console.debug('Error flushing to Clearcut:', error);
});