Enable clearcut logging by default (#1309)

Clearcut logging can now be disabled via disableDataCollection in user settings
This commit is contained in:
owenofbrien 2025-06-23 12:18:58 -05:00 committed by GitHub
parent 07880d43d2
commit 631591ce79
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 80 additions and 55 deletions

View File

@ -226,7 +226,7 @@ export async function loadCliConfig(
process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? process.env.OTEL_EXPORTER_OTLP_ENDPOINT ??
settings.telemetry?.otlpEndpoint, settings.telemetry?.otlpEndpoint,
logPrompts: argv.telemetryLogPrompts ?? settings.telemetry?.logPrompts, logPrompts: argv.telemetryLogPrompts ?? settings.telemetry?.logPrompts,
disableDataCollection: settings.telemetry?.disableDataCollection ?? true, disableDataCollection: settings.telemetry?.disableDataCollection ?? false,
}, },
// Git-aware file filtering settings // Git-aware file filtering settings
fileFiltering: { fileFiltering: {

View File

@ -117,7 +117,6 @@ export interface ConfigParameters {
fileDiscoveryService?: FileDiscoveryService; fileDiscoveryService?: FileDiscoveryService;
bugCommand?: BugCommandSettings; bugCommand?: BugCommandSettings;
model: string; model: string;
disableDataCollection?: boolean;
extensionContextFilePaths?: string[]; extensionContextFilePaths?: string[];
} }
@ -155,7 +154,6 @@ export class Config {
private readonly cwd: string; private readonly cwd: string;
private readonly bugCommand: BugCommandSettings | undefined; private readonly bugCommand: BugCommandSettings | undefined;
private readonly model: string; private readonly model: string;
private readonly disableDataCollection: boolean;
private readonly extensionContextFilePaths: string[]; private readonly extensionContextFilePaths: string[];
constructor(params: ConfigParameters) { constructor(params: ConfigParameters) {
@ -183,6 +181,7 @@ export class Config {
target: params.telemetry?.target ?? DEFAULT_TELEMETRY_TARGET, target: params.telemetry?.target ?? DEFAULT_TELEMETRY_TARGET,
otlpEndpoint: params.telemetry?.otlpEndpoint ?? DEFAULT_OTLP_ENDPOINT, otlpEndpoint: params.telemetry?.otlpEndpoint ?? DEFAULT_OTLP_ENDPOINT,
logPrompts: params.telemetry?.logPrompts ?? true, logPrompts: params.telemetry?.logPrompts ?? true,
disableDataCollection: params.telemetry?.disableDataCollection ?? false,
}; };
this.fileFiltering = { this.fileFiltering = {
@ -196,8 +195,6 @@ export class Config {
this.fileDiscoveryService = params.fileDiscoveryService ?? null; this.fileDiscoveryService = params.fileDiscoveryService ?? null;
this.bugCommand = params.bugCommand; this.bugCommand = params.bugCommand;
this.model = params.model; this.model = params.model;
this.disableDataCollection =
params.telemetry?.disableDataCollection ?? true;
this.extensionContextFilePaths = params.extensionContextFilePaths ?? []; this.extensionContextFilePaths = params.extensionContextFilePaths ?? [];
if (params.contextFileName) { if (params.contextFileName) {
@ -208,10 +205,12 @@ export class Config {
initializeTelemetry(this); initializeTelemetry(this);
} }
if (!this.disableDataCollection) { if (!this.getDisableDataCollection()) {
ClearcutLogger.getInstance(this)?.enqueueLogEvent( ClearcutLogger.getInstance(this)?.logStartSessionEvent(
new StartSessionEvent(this), new StartSessionEvent(this),
); );
} else {
console.log('Data collection is disabled.');
} }
} }
@ -387,7 +386,7 @@ export class Config {
} }
getDisableDataCollection(): boolean { getDisableDataCollection(): boolean {
return this.disableDataCollection; return this.telemetrySettings.disableDataCollection ?? false;
} }
getExtensionContextFilePaths(): string[] { getExtensionContextFilePaths(): string[] {

View File

@ -64,7 +64,7 @@ export class ClearcutLogger {
]); ]);
} }
createLogEvent(name: string, data: Map<EventMetadataKey, string>): object { createLogEvent(name: string, data: object): object {
return { return {
Application: 'GEMINI_CLI', Application: 'GEMINI_CLI',
event_name: name, event_name: name,
@ -83,6 +83,7 @@ export class ClearcutLogger {
} }
flushToClearcut(): Promise<LogResponse> { flushToClearcut(): Promise<LogResponse> {
console.log('Flushing log events to Clearcut.');
return new Promise<Buffer>((resolve, reject) => { return new Promise<Buffer>((resolve, reject) => {
const request = [ const request = [
{ {
@ -92,6 +93,7 @@ export class ClearcutLogger {
}, },
]; ];
const body = JSON.stringify(request); const body = JSON.stringify(request);
console.log('Clearcut POST request body:', body);
const options = { const options = {
hostname: 'play.googleapis.com', hostname: 'play.googleapis.com',
path: '/log', path: '/log',
@ -106,6 +108,7 @@ export class ClearcutLogger {
}); });
}); });
req.on('error', (e) => { req.on('error', (e) => {
console.log('Clearcut POST request error: ', e);
reject(e); reject(e);
}); });
req.end(body); req.end(body);
@ -152,58 +155,81 @@ export class ClearcutLogger {
// message is corrupted. // message is corrupted.
return undefined; return undefined;
} }
return {
const returnVal = {
nextRequestWaitMs: Number(ms), nextRequestWaitMs: Number(ms),
}; };
console.log('Clearcut response: ', returnVal);
return returnVal;
} }
logStartSessionEvent(event: StartSessionEvent): void { logStartSessionEvent(event: StartSessionEvent): void {
const data: Map<EventMetadataKey, string> = new Map(); const data = [
{
data.set(EventMetadataKey.GEMINI_CLI_START_SESSION_MODEL, event.model); EventMetadataKey: EventMetadataKey.GEMINI_CLI_START_SESSION_MODEL,
data.set( value: event.model,
EventMetadataKey.GEMINI_CLI_START_SESSION_EMBEDDING_MODEL, },
event.embedding_model, {
); EventMetadataKey:
data.set( EventMetadataKey.GEMINI_CLI_START_SESSION_EMBEDDING_MODEL,
EventMetadataKey.GEMINI_CLI_START_SESSION_SANDBOX, value: event.embedding_model,
event.sandbox_enabled.toString(), },
); {
data.set( EventMetadataKey: EventMetadataKey.GEMINI_CLI_START_SESSION_SANDBOX,
EventMetadataKey.GEMINI_CLI_START_SESSION_CORE_TOOLS, value: event.sandbox_enabled.toString(),
event.core_tools_enabled, },
); {
data.set( EventMetadataKey: EventMetadataKey.GEMINI_CLI_START_SESSION_CORE_TOOLS,
EventMetadataKey.GEMINI_CLI_START_SESSION_APPROVAL_MODE, value: event.core_tools_enabled,
event.approval_mode, },
); {
data.set( EventMetadataKey:
EventMetadataKey.GEMINI_CLI_START_SESSION_API_KEY_ENABLED, EventMetadataKey.GEMINI_CLI_START_SESSION_APPROVAL_MODE,
event.api_key_enabled.toString(), value: event.approval_mode,
); },
data.set( {
EventMetadataKey.GEMINI_CLI_START_SESSION_VERTEX_API_ENABLED, EventMetadataKey:
event.vertex_ai_enabled.toString(), EventMetadataKey.GEMINI_CLI_START_SESSION_API_KEY_ENABLED,
); value: event.api_key_enabled.toString(),
data.set( },
EventMetadataKey.GEMINI_CLI_START_SESSION_DEBUG_MODE_ENABLED, {
event.debug_enabled.toString(), EventMetadataKey:
); EventMetadataKey.GEMINI_CLI_START_SESSION_VERTEX_API_ENABLED,
data.set( value: event.vertex_ai_enabled.toString(),
EventMetadataKey.GEMINI_CLI_START_SESSION_MCP_SERVERS, },
event.mcp_servers, {
); EventMetadataKey:
data.set( EventMetadataKey.GEMINI_CLI_START_SESSION_DEBUG_MODE_ENABLED,
EventMetadataKey.GEMINI_CLI_START_SESSION_TELEMETRY_ENABLED, value: event.debug_enabled.toString(),
event.telemetry_enabled.toString(), },
); {
data.set( EventMetadataKey:
EventMetadataKey.GEMINI_CLI_START_SESSION_TELEMETRY_LOG_USER_PROMPTS_ENABLED, EventMetadataKey.GEMINI_CLI_START_SESSION_VERTEX_API_ENABLED,
event.telemetry_log_user_prompts_enabled.toString(), value: event.vertex_ai_enabled.toString(),
); },
{
EventMetadataKey: EventMetadataKey.GEMINI_CLI_START_SESSION_MCP_SERVERS,
value: event.mcp_servers,
},
{
EventMetadataKey:
EventMetadataKey.GEMINI_CLI_START_SESSION_VERTEX_API_ENABLED,
value: event.vertex_ai_enabled.toString(),
},
{
EventMetadataKey:
EventMetadataKey.GEMINI_CLI_START_SESSION_TELEMETRY_ENABLED,
value: event.telemetry_enabled.toString(),
},
{
EventMetadataKey:
EventMetadataKey.GEMINI_CLI_START_SESSION_TELEMETRY_LOG_USER_PROMPTS_ENABLED,
value: event.telemetry_log_user_prompts_enabled.toString(),
},
];
this.enqueueLogEvent(this.createLogEvent(start_session_event_name, data)); this.enqueueLogEvent(this.createLogEvent(start_session_event_name, data));
this.flushIfNeeded(); // Flush start event immediately
this.flushToClearcut();
} }
logNewPromptEvent(event: UserPromptEvent): void { logNewPromptEvent(event: UserPromptEvent): void {