Fix extensions logging race condition and slash command logging (#12732)

This commit is contained in:
christine betts
2025-11-08 10:29:36 -05:00
committed by GitHub
parent 9116cf2bab
commit 43b8731241
6 changed files with 105 additions and 51 deletions
@@ -940,7 +940,7 @@ export class ClearcutLogger {
this.flushIfNeeded();
}
logExtensionInstallEvent(event: ExtensionInstallEvent): void {
async logExtensionInstallEvent(event: ExtensionInstallEvent): Promise<void> {
const data: EventValue[] = [
{
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME,
@@ -967,12 +967,14 @@ export class ClearcutLogger {
this.enqueueLogEvent(
this.createBasicLogEvent(EventNames.EXTENSION_INSTALL, data),
);
this.flushToClearcut().catch((error) => {
await this.flushToClearcut().catch((error) => {
debugLogger.debug('Error flushing to Clearcut:', error);
});
}
logExtensionUninstallEvent(event: ExtensionUninstallEvent): void {
async logExtensionUninstallEvent(
event: ExtensionUninstallEvent,
): Promise<void> {
const data: EventValue[] = [
{
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME,
@@ -991,12 +993,12 @@ export class ClearcutLogger {
this.enqueueLogEvent(
this.createBasicLogEvent(EventNames.EXTENSION_UNINSTALL, data),
);
this.flushToClearcut().catch((error) => {
await this.flushToClearcut().catch((error) => {
debugLogger.debug('Error flushing to Clearcut:', error);
});
}
logExtensionUpdateEvent(event: ExtensionUpdateEvent): void {
async logExtensionUpdateEvent(event: ExtensionUpdateEvent): Promise<void> {
const data: EventValue[] = [
{
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME,
@@ -1027,7 +1029,7 @@ export class ClearcutLogger {
this.enqueueLogEvent(
this.createBasicLogEvent(EventNames.EXTENSION_UPDATE, data),
);
this.flushToClearcut().catch((error) => {
await this.flushToClearcut().catch((error) => {
debugLogger.debug('Error flushing to Clearcut:', error);
});
}
@@ -1096,7 +1098,7 @@ export class ClearcutLogger {
this.flushIfNeeded();
}
logExtensionEnableEvent(event: ExtensionEnableEvent): void {
async logExtensionEnableEvent(event: ExtensionEnableEvent): Promise<void> {
const data: EventValue[] = [
{
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME,
@@ -1116,7 +1118,7 @@ export class ClearcutLogger {
this.enqueueLogEvent(
this.createBasicLogEvent(EventNames.EXTENSION_ENABLE, data),
);
this.flushToClearcut().catch((error) => {
await this.flushToClearcut().catch((error) => {
debugLogger.debug('Error flushing to Clearcut:', error);
});
}
@@ -1135,7 +1137,7 @@ export class ClearcutLogger {
this.flushIfNeeded();
}
logExtensionDisableEvent(event: ExtensionDisableEvent): void {
async logExtensionDisableEvent(event: ExtensionDisableEvent): Promise<void> {
const data: EventValue[] = [
{
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EXTENSION_NAME,
@@ -1155,7 +1157,7 @@ export class ClearcutLogger {
this.enqueueLogEvent(
this.createBasicLogEvent(EventNames.EXTENSION_DISABLE, data),
);
this.flushToClearcut().catch((error) => {
await this.flushToClearcut().catch((error) => {
debugLogger.debug('Error flushing to Clearcut:', error);
});
}
+18 -19
View File
@@ -1516,10 +1516,10 @@ describe('loggers', () => {
});
afterEach(() => {
vi.resetAllMocks();
vi.clearAllMocks();
});
it('should log extension install event', () => {
it('should log extension install event', async () => {
const event = new ExtensionInstallEvent(
'testing',
'testing-id',
@@ -1528,7 +1528,7 @@ describe('loggers', () => {
'success',
);
logExtensionInstallEvent(mockConfig, event);
await logExtensionInstallEvent(mockConfig, event);
expect(
ClearcutLogger.prototype.logExtensionInstallEvent,
@@ -1551,7 +1551,7 @@ describe('loggers', () => {
});
});
describe('logExtensionUpdate', () => {
describe('logExtensionUpdate', async () => {
const mockConfig = {
getSessionId: () => 'test-session-id',
getUsageStatisticsEnabled: () => true,
@@ -1565,10 +1565,10 @@ describe('loggers', () => {
});
afterEach(() => {
vi.resetAllMocks();
vi.clearAllMocks();
});
it('should log extension update event', () => {
it('should log extension update event', async () => {
const event = new ExtensionUpdateEvent(
'testing',
'testing-id',
@@ -1578,7 +1578,7 @@ describe('loggers', () => {
'success',
);
logExtensionUpdateEvent(mockConfig, event);
await logExtensionUpdateEvent(mockConfig, event);
expect(
ClearcutLogger.prototype.logExtensionUpdateEvent,
@@ -1602,7 +1602,7 @@ describe('loggers', () => {
});
});
describe('logExtensionUninstall', () => {
describe('logExtensionUninstall', async () => {
const mockConfig = {
getSessionId: () => 'test-session-id',
getUsageStatisticsEnabled: () => true,
@@ -1616,17 +1616,16 @@ describe('loggers', () => {
});
afterEach(() => {
vi.resetAllMocks();
vi.clearAllMocks();
});
it('should log extension uninstall event', () => {
it('should log extension uninstall event', async () => {
const event = new ExtensionUninstallEvent(
'testing',
'testing-id',
'success',
);
logExtensionUninstall(mockConfig, event);
await logExtensionUninstall(mockConfig, event);
expect(
ClearcutLogger.prototype.logExtensionUninstallEvent,
@@ -1647,7 +1646,7 @@ describe('loggers', () => {
});
});
describe('logExtensionEnable', () => {
describe('logExtensionEnable', async () => {
const mockConfig = {
getSessionId: () => 'test-session-id',
getUsageStatisticsEnabled: () => true,
@@ -1658,13 +1657,13 @@ describe('loggers', () => {
});
afterEach(() => {
vi.resetAllMocks();
vi.clearAllMocks();
});
it('should log extension enable event', () => {
it('should log extension enable event', async () => {
const event = new ExtensionEnableEvent('testing', 'testing-id', 'user');
logExtensionEnable(mockConfig, event);
await logExtensionEnable(mockConfig, event);
expect(
ClearcutLogger.prototype.logExtensionEnableEvent,
@@ -1696,13 +1695,13 @@ describe('loggers', () => {
});
afterEach(() => {
vi.resetAllMocks();
vi.clearAllMocks();
});
it('should log extension disable event', () => {
it('should log extension disable event', async () => {
const event = new ExtensionDisableEvent('testing', 'testing-id', 'user');
logExtensionDisable(mockConfig, event);
await logExtensionDisable(mockConfig, event);
expect(
ClearcutLogger.prototype.logExtensionDisableEvent,
+15 -15
View File
@@ -507,11 +507,11 @@ export function logModelSlashCommand(
recordModelSlashCommand(config, event);
}
export function logExtensionInstallEvent(
export async function logExtensionInstallEvent(
config: Config,
event: ExtensionInstallEvent,
): void {
ClearcutLogger.getInstance(config)?.logExtensionInstallEvent(event);
): Promise<void> {
await ClearcutLogger.getInstance(config)?.logExtensionInstallEvent(event);
if (!isTelemetrySdkInitialized()) return;
const logger = logs.getLogger(SERVICE_NAME);
@@ -522,11 +522,11 @@ export function logExtensionInstallEvent(
logger.emit(logRecord);
}
export function logExtensionUninstall(
export async function logExtensionUninstall(
config: Config,
event: ExtensionUninstallEvent,
): void {
ClearcutLogger.getInstance(config)?.logExtensionUninstallEvent(event);
): Promise<void> {
await ClearcutLogger.getInstance(config)?.logExtensionUninstallEvent(event);
if (!isTelemetrySdkInitialized()) return;
const logger = logs.getLogger(SERVICE_NAME);
@@ -537,11 +537,11 @@ export function logExtensionUninstall(
logger.emit(logRecord);
}
export function logExtensionUpdateEvent(
export async function logExtensionUpdateEvent(
config: Config,
event: ExtensionUpdateEvent,
): void {
ClearcutLogger.getInstance(config)?.logExtensionUpdateEvent(event);
): Promise<void> {
await ClearcutLogger.getInstance(config)?.logExtensionUpdateEvent(event);
if (!isTelemetrySdkInitialized()) return;
const logger = logs.getLogger(SERVICE_NAME);
@@ -552,11 +552,11 @@ export function logExtensionUpdateEvent(
logger.emit(logRecord);
}
export function logExtensionEnable(
export async function logExtensionEnable(
config: Config,
event: ExtensionEnableEvent,
): void {
ClearcutLogger.getInstance(config)?.logExtensionEnableEvent(event);
): Promise<void> {
await ClearcutLogger.getInstance(config)?.logExtensionEnableEvent(event);
if (!isTelemetrySdkInitialized()) return;
const logger = logs.getLogger(SERVICE_NAME);
@@ -567,11 +567,11 @@ export function logExtensionEnable(
logger.emit(logRecord);
}
export function logExtensionDisable(
export async function logExtensionDisable(
config: Config,
event: ExtensionDisableEvent,
): void {
ClearcutLogger.getInstance(config)?.logExtensionDisableEvent(event);
): Promise<void> {
await ClearcutLogger.getInstance(config)?.logExtensionDisableEvent(event);
if (!isTelemetrySdkInitialized()) return;
const logger = logs.getLogger(SERVICE_NAME);