diff options
Diffstat (limited to 'packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts')
| -rw-r--r-- | packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts | 70 |
1 files changed, 37 insertions, 33 deletions
diff --git a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts index b75d87ef..42b1f6fc 100644 --- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts +++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts @@ -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); }); |
