mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-04-27 21:44:25 -07:00
update(telemetry): add hashed_extension_name to field to extension events (#15025)
Co-authored-by: Shnatu <snatu@google.com>
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user