summaryrefslogtreecommitdiff
path: root/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts')
-rw-r--r--packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts70
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);
});