update(telemetry): add hashed_extension_name to field to extension events (#15025)

Co-authored-by: Shnatu <snatu@google.com>
This commit is contained in:
Shardul Natu
2025-12-15 09:40:54 -08:00
committed by GitHub
parent fc2a5a42ce
commit d030a1f62f
5 changed files with 46 additions and 9 deletions
+7 -2
View File
@@ -327,6 +327,7 @@ export class ExtensionManager extends ExtensionLoader {
await logExtensionUpdateEvent( await logExtensionUpdateEvent(
this.telemetryConfig, this.telemetryConfig,
new ExtensionUpdateEvent( new ExtensionUpdateEvent(
newExtensionConfig.name,
hashValue(newExtensionConfig.name), hashValue(newExtensionConfig.name),
getExtensionId(newExtensionConfig, installMetadata), getExtensionId(newExtensionConfig, installMetadata),
newExtensionConfig.version, newExtensionConfig.version,
@@ -339,6 +340,7 @@ export class ExtensionManager extends ExtensionLoader {
await logExtensionInstallEvent( await logExtensionInstallEvent(
this.telemetryConfig, this.telemetryConfig,
new ExtensionInstallEvent( new ExtensionInstallEvent(
newExtensionConfig.name,
hashValue(newExtensionConfig.name), hashValue(newExtensionConfig.name),
getExtensionId(newExtensionConfig, installMetadata), getExtensionId(newExtensionConfig, installMetadata),
newExtensionConfig.version, newExtensionConfig.version,
@@ -375,6 +377,7 @@ export class ExtensionManager extends ExtensionLoader {
await logExtensionUpdateEvent( await logExtensionUpdateEvent(
this.telemetryConfig, this.telemetryConfig,
new ExtensionUpdateEvent( new ExtensionUpdateEvent(
config?.name ?? '',
hashValue(config?.name ?? ''), hashValue(config?.name ?? ''),
extensionId ?? '', extensionId ?? '',
newExtensionConfig?.version ?? '', newExtensionConfig?.version ?? '',
@@ -387,6 +390,7 @@ export class ExtensionManager extends ExtensionLoader {
await logExtensionInstallEvent( await logExtensionInstallEvent(
this.telemetryConfig, this.telemetryConfig,
new ExtensionInstallEvent( new ExtensionInstallEvent(
newExtensionConfig?.name ?? '',
hashValue(newExtensionConfig?.name ?? ''), hashValue(newExtensionConfig?.name ?? ''),
extensionId ?? '', extensionId ?? '',
newExtensionConfig?.version ?? '', newExtensionConfig?.version ?? '',
@@ -434,6 +438,7 @@ export class ExtensionManager extends ExtensionLoader {
await logExtensionUninstall( await logExtensionUninstall(
this.telemetryConfig, this.telemetryConfig,
new ExtensionUninstallEvent( new ExtensionUninstallEvent(
extension.name,
hashValue(extension.name), hashValue(extension.name),
extension.id, extension.id,
'success', 'success',
@@ -716,7 +721,7 @@ export class ExtensionManager extends ExtensionLoader {
} }
await logExtensionDisable( await logExtensionDisable(
this.telemetryConfig, this.telemetryConfig,
new ExtensionDisableEvent(hashValue(name), extension.id, scope), new ExtensionDisableEvent(name, hashValue(name), extension.id, scope),
); );
if (!this.config || this.config.getEnableExtensionReloading()) { if (!this.config || this.config.getEnableExtensionReloading()) {
// Only toggle the isActive state if we are actually going to disable it // Only toggle the isActive state if we are actually going to disable it
@@ -751,7 +756,7 @@ export class ExtensionManager extends ExtensionLoader {
} }
await logExtensionEnable( await logExtensionEnable(
this.telemetryConfig, this.telemetryConfig,
new ExtensionEnableEvent(hashValue(name), extension.id, scope), new ExtensionEnableEvent(name, hashValue(name), extension.id, scope),
); );
if (!this.config || this.config.getEnableExtensionReloading()) { if (!this.config || this.config.getEnableExtensionReloading()) {
// Only toggle the isActive state if we are actually going to disable it // Only toggle the isActive state if we are actually going to disable it
@@ -1771,6 +1771,7 @@ This extension will run the following MCP servers:
} else { } else {
expect(mockLogExtensionUninstall).toHaveBeenCalled(); expect(mockLogExtensionUninstall).toHaveBeenCalled();
expect(ExtensionUninstallEvent).toHaveBeenCalledWith( expect(ExtensionUninstallEvent).toHaveBeenCalledWith(
'my-local-extension',
hashValue('my-local-extension'), hashValue('my-local-extension'),
hashValue(userExtensionsDir), hashValue(userExtensionsDir),
'success', 'success',
@@ -1818,6 +1819,7 @@ This extension will run the following MCP servers:
expect(fs.existsSync(sourceExtDir)).toBe(false); expect(fs.existsSync(sourceExtDir)).toBe(false);
expect(mockLogExtensionUninstall).toHaveBeenCalled(); expect(mockLogExtensionUninstall).toHaveBeenCalled();
expect(ExtensionUninstallEvent).toHaveBeenCalledWith( expect(ExtensionUninstallEvent).toHaveBeenCalledWith(
'gemini-sql-extension',
hashValue('gemini-sql-extension'), hashValue('gemini-sql-extension'),
hashValue('https://github.com/google/gemini-sql-extension'), hashValue('https://github.com/google/gemini-sql-extension'),
'success', 'success',
@@ -1935,6 +1937,7 @@ This extension will run the following MCP servers:
expect(mockLogExtensionDisable).toHaveBeenCalled(); expect(mockLogExtensionDisable).toHaveBeenCalled();
expect(ExtensionDisableEvent).toHaveBeenCalledWith( expect(ExtensionDisableEvent).toHaveBeenCalledWith(
'ext1',
hashValue('ext1'), hashValue('ext1'),
hashValue(userExtensionsDir), hashValue(userExtensionsDir),
SettingScope.Workspace, SettingScope.Workspace,
@@ -2002,6 +2005,7 @@ This extension will run the following MCP servers:
expect(mockLogExtensionEnable).toHaveBeenCalled(); expect(mockLogExtensionEnable).toHaveBeenCalled();
expect(ExtensionEnableEvent).toHaveBeenCalledWith( expect(ExtensionEnableEvent).toHaveBeenCalledWith(
'ext1',
hashValue('ext1'), hashValue('ext1'),
hashValue(userExtensionsDir), hashValue(userExtensionsDir),
SettingScope.Workspace, SettingScope.Workspace,
@@ -1017,7 +1017,7 @@ export class ClearcutLogger {
const data: EventValue[] = [ const data: EventValue[] = [
{ {
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME, gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME,
value: event.extension_name, value: event.hashed_extension_name,
}, },
{ {
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID, gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID,
@@ -1051,7 +1051,7 @@ export class ClearcutLogger {
const data: EventValue[] = [ const data: EventValue[] = [
{ {
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME, gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME,
value: event.extension_name, value: event.hashed_extension_name,
}, },
{ {
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID, gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID,
@@ -1075,7 +1075,7 @@ export class ClearcutLogger {
const data: EventValue[] = [ const data: EventValue[] = [
{ {
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME, gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME,
value: event.extension_name, value: event.hashed_extension_name,
}, },
{ {
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID, gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID,
@@ -1175,7 +1175,7 @@ export class ClearcutLogger {
const data: EventValue[] = [ const data: EventValue[] = [
{ {
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME, gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME,
value: event.extension_name, value: event.hashed_extension_name,
}, },
{ {
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID, gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID,
@@ -1214,7 +1214,7 @@ export class ClearcutLogger {
const data: EventValue[] = [ const data: EventValue[] = [
{ {
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME, gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME,
value: event.extension_name, value: event.hashed_extension_name,
}, },
{ {
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID, gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_ID,
+15 -2
View File
@@ -1760,6 +1760,7 @@ describe('loggers', () => {
it('should log extension install event', async () => { it('should log extension install event', async () => {
const event = new ExtensionInstallEvent( const event = new ExtensionInstallEvent(
'testing', 'testing',
'testing-hash',
'testing-id', 'testing-id',
'0.1.0', '0.1.0',
'git', 'git',
@@ -1810,6 +1811,7 @@ describe('loggers', () => {
it('should log extension update event', async () => { it('should log extension update event', async () => {
const event = new ExtensionUpdateEvent( const event = new ExtensionUpdateEvent(
'testing', 'testing',
'testing-hash',
'testing-id', 'testing-id',
'0.1.0', '0.1.0',
'0.1.1', '0.1.1',
@@ -1861,6 +1863,7 @@ describe('loggers', () => {
it('should log extension uninstall event', async () => { it('should log extension uninstall event', async () => {
const event = new ExtensionUninstallEvent( const event = new ExtensionUninstallEvent(
'testing', 'testing',
'testing-hash',
'testing-id', 'testing-id',
'success', 'success',
); );
@@ -1903,7 +1906,12 @@ describe('loggers', () => {
}); });
it('should log extension enable event', async () => { it('should log extension enable event', async () => {
const event = new ExtensionEnableEvent('testing', 'testing-id', 'user'); const event = new ExtensionEnableEvent(
'testing',
'testing-hash',
'testing-id',
'user',
);
await logExtensionEnable(mockConfig, event); await logExtensionEnable(mockConfig, event);
@@ -1943,7 +1951,12 @@ describe('loggers', () => {
}); });
it('should log extension disable event', async () => { it('should log extension disable event', async () => {
const event = new ExtensionDisableEvent('testing', 'testing-id', 'user'); const event = new ExtensionDisableEvent(
'testing',
'testing-hash',
'testing-id',
'user',
);
await logExtensionDisable(mockConfig, event); await logExtensionDisable(mockConfig, event);
+15
View File
@@ -1231,6 +1231,7 @@ export class ExtensionInstallEvent implements BaseTelemetryEvent {
'event.name': 'extension_install'; 'event.name': 'extension_install';
'event.timestamp': string; 'event.timestamp': string;
extension_name: string; extension_name: string;
hashed_extension_name: string;
extension_id: string; extension_id: string;
extension_version: string; extension_version: string;
extension_source: string; extension_source: string;
@@ -1238,6 +1239,7 @@ export class ExtensionInstallEvent implements BaseTelemetryEvent {
constructor( constructor(
extension_name: string, extension_name: string,
hashed_extension_name: string,
extension_id: string, extension_id: string,
extension_version: string, extension_version: string,
extension_source: string, extension_source: string,
@@ -1246,6 +1248,7 @@ export class ExtensionInstallEvent implements BaseTelemetryEvent {
this['event.name'] = 'extension_install'; this['event.name'] = 'extension_install';
this['event.timestamp'] = new Date().toISOString(); this['event.timestamp'] = new Date().toISOString();
this.extension_name = extension_name; this.extension_name = extension_name;
this.hashed_extension_name = hashed_extension_name;
this.extension_id = extension_id; this.extension_id = extension_id;
this.extension_version = extension_version; this.extension_version = extension_version;
this.extension_source = extension_source; this.extension_source = extension_source;
@@ -1325,17 +1328,20 @@ export class ExtensionUninstallEvent implements BaseTelemetryEvent {
'event.name': 'extension_uninstall'; 'event.name': 'extension_uninstall';
'event.timestamp': string; 'event.timestamp': string;
extension_name: string; extension_name: string;
hashed_extension_name: string;
extension_id: string; extension_id: string;
status: 'success' | 'error'; status: 'success' | 'error';
constructor( constructor(
extension_name: string, extension_name: string,
hashed_extension_name: string,
extension_id: string, extension_id: string,
status: 'success' | 'error', status: 'success' | 'error',
) { ) {
this['event.name'] = 'extension_uninstall'; this['event.name'] = 'extension_uninstall';
this['event.timestamp'] = new Date().toISOString(); this['event.timestamp'] = new Date().toISOString();
this.extension_name = extension_name; this.extension_name = extension_name;
this.hashed_extension_name = hashed_extension_name;
this.extension_id = extension_id; this.extension_id = extension_id;
this.status = status; this.status = status;
} }
@@ -1360,6 +1366,7 @@ export class ExtensionUpdateEvent implements BaseTelemetryEvent {
'event.name': 'extension_update'; 'event.name': 'extension_update';
'event.timestamp': string; 'event.timestamp': string;
extension_name: string; extension_name: string;
hashed_extension_name: string;
extension_id: string; extension_id: string;
extension_previous_version: string; extension_previous_version: string;
extension_version: string; extension_version: string;
@@ -1368,6 +1375,7 @@ export class ExtensionUpdateEvent implements BaseTelemetryEvent {
constructor( constructor(
extension_name: string, extension_name: string,
hashed_extension_name: string,
extension_id: string, extension_id: string,
extension_version: string, extension_version: string,
extension_previous_version: string, extension_previous_version: string,
@@ -1377,6 +1385,7 @@ export class ExtensionUpdateEvent implements BaseTelemetryEvent {
this['event.name'] = 'extension_update'; this['event.name'] = 'extension_update';
this['event.timestamp'] = new Date().toISOString(); this['event.timestamp'] = new Date().toISOString();
this.extension_name = extension_name; this.extension_name = extension_name;
this.hashed_extension_name = hashed_extension_name;
this.extension_id = extension_id; this.extension_id = extension_id;
this.extension_version = extension_version; this.extension_version = extension_version;
this.extension_previous_version = extension_previous_version; this.extension_previous_version = extension_previous_version;
@@ -1407,17 +1416,20 @@ export class ExtensionEnableEvent implements BaseTelemetryEvent {
'event.name': 'extension_enable'; 'event.name': 'extension_enable';
'event.timestamp': string; 'event.timestamp': string;
extension_name: string; extension_name: string;
hashed_extension_name: string;
extension_id: string; extension_id: string;
setting_scope: string; setting_scope: string;
constructor( constructor(
extension_name: string, extension_name: string,
hashed_extension_name: string,
extension_id: string, extension_id: string,
settingScope: string, settingScope: string,
) { ) {
this['event.name'] = 'extension_enable'; this['event.name'] = 'extension_enable';
this['event.timestamp'] = new Date().toISOString(); this['event.timestamp'] = new Date().toISOString();
this.extension_name = extension_name; this.extension_name = extension_name;
this.hashed_extension_name = hashed_extension_name;
this.extension_id = extension_id; this.extension_id = extension_id;
this.setting_scope = settingScope; this.setting_scope = settingScope;
} }
@@ -1543,17 +1555,20 @@ export class ExtensionDisableEvent implements BaseTelemetryEvent {
'event.name': 'extension_disable'; 'event.name': 'extension_disable';
'event.timestamp': string; 'event.timestamp': string;
extension_name: string; extension_name: string;
hashed_extension_name: string;
extension_id: string; extension_id: string;
setting_scope: string; setting_scope: string;
constructor( constructor(
extension_name: string, extension_name: string,
hashed_extension_name: string,
extension_id: string, extension_id: string,
settingScope: string, settingScope: string,
) { ) {
this['event.name'] = 'extension_disable'; this['event.name'] = 'extension_disable';
this['event.timestamp'] = new Date().toISOString(); this['event.timestamp'] = new Date().toISOString();
this.extension_name = extension_name; this.extension_name = extension_name;
this.hashed_extension_name = hashed_extension_name;
this.extension_id = extension_id; this.extension_id = extension_id;
this.setting_scope = settingScope; this.setting_scope = settingScope;
} }