Skip to content

Commit a93c416

Browse files
committed
log activation and failed analytics
1 parent b33befb commit a93c416

File tree

2 files changed

+24
-17
lines changed

2 files changed

+24
-17
lines changed

src/extension.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ if (!global.fetch) {
3434

3535
const FIRST_INSTALL_KEY = 'gitpod-desktop.firstInstall';
3636

37-
let telemetryService: TelemetryService;
37+
let telemetryService: TelemetryService | undefined;
3838
let remoteSession: RemoteSession | undefined;
39+
let logger: vscode.LogOutputChannel | undefined;
3940

4041
export async function activate(context: vscode.ExtensionContext) {
4142
const extensionId = context.extension.id;
@@ -47,18 +48,18 @@ export async function activate(context: vscode.ExtensionContext) {
4748
// sync between machines
4849
context.globalState.setKeysForSync([ReleaseNotes.RELEASE_NOTES_LAST_READ_KEY]);
4950

50-
const logger = vscode.window.createOutputChannel('Gitpod', { log: true });
51+
logger = vscode.window.createOutputChannel('Gitpod', { log: true });
5152
context.subscriptions.push(logger);
5253

5354
const onDidChangeLogLevel = (logLevel: vscode.LogLevel) => {
54-
logger.info(`Log level: ${vscode.LogLevel[logLevel]}`);
55+
logger!.info(`Log level: ${vscode.LogLevel[logLevel]}`);
5556
};
56-
context.subscriptions.push(logger.onDidChangeLogLevel(onDidChangeLogLevel));
57-
onDidChangeLogLevel(logger.logLevel);
57+
context.subscriptions.push(logger!.onDidChangeLogLevel(onDidChangeLogLevel));
58+
onDidChangeLogLevel(logger!.logLevel);
5859

5960
logger.info(`${extensionId}/${packageJSON.version} (${os.release()} ${os.platform()} ${os.arch()}) vscode/${vscode.version} (${vscode.env.appName})`);
6061

61-
telemetryService = new TelemetryService(extensionId, packageJSON.version, packageJSON.segmentKey);
62+
telemetryService = new TelemetryService(extensionId, packageJSON.version, packageJSON.segmentKey, logger!);
6263

6364
const notificationService = new NotificationService(telemetryService);
6465

@@ -112,11 +113,11 @@ export async function activate(context: vscode.ExtensionContext) {
112113
if (remoteConnectionInfo) {
113114
commandManager.register({ id: 'gitpod.api.autoTunnel', execute: () => remoteConnector.autoTunnelCommand });
114115

115-
remoteSession = new RemoteSession(remoteConnectionInfo.remoteAuthority, remoteConnectionInfo.connectionInfo, context, hostService, sessionService, settingsSync, experiments, logger, telemetryService, notificationService);
116+
remoteSession = new RemoteSession(remoteConnectionInfo.remoteAuthority, remoteConnectionInfo.connectionInfo, context, hostService, sessionService, settingsSync, experiments, logger!, telemetryService!, notificationService);
116117
await remoteSession.initialize();
117118
} else if (sessionService.isSignedIn()) {
118119
const restartFlow = { flow: 'restart_workspace', userId: sessionService.getUserId() };
119-
checkForStoppedWorkspaces(context, hostService.gitpodHost, restartFlow, notificationService, logger);
120+
checkForStoppedWorkspaces(context, hostService.gitpodHost, restartFlow, notificationService, logger!);
120121
}
121122
});
122123

@@ -125,15 +126,17 @@ export async function activate(context: vscode.ExtensionContext) {
125126
telemetryService?.sendTelemetryException(e);
126127
throw e;
127128
} finally {
128-
telemetryService?.sendTelemetryEvent('vscode_desktop_activate', {
129+
const activateProperties = {
129130
remoteName: vscode.env.remoteName || '',
130131
remoteUri: String(!!(vscode.workspace.workspaceFile || vscode.workspace.workspaceFolders?.[0].uri)),
131132
workspaceId: remoteConnectionInfo?.connectionInfo.workspaceId || '',
132133
instanceId: remoteConnectionInfo?.connectionInfo.instanceId || '',
133134
gitpodHost: remoteConnectionInfo?.connectionInfo.gitpodHost || '',
134135
debugWorkspace: remoteConnectionInfo ? String(!!remoteConnectionInfo.connectionInfo.debugWorkspace) : '',
135136
success: String(success)
136-
});
137+
};
138+
logger?.info('Activation properties:', JSON.stringify(activateProperties, undefined, 2));
139+
telemetryService?.sendTelemetryEvent('vscode_desktop_activate', activateProperties);
137140
}
138141
}
139142

src/services/telemetryService.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as os from 'os';
99
import * as vscode from 'vscode';
1010
import { Configuration } from '../configuration';
1111

12-
const analyticsClientFactory = async (key: string): Promise<BaseTelemetryClient> => {
12+
const analyticsClientFactory = async (key: string, logger: vscode.LogOutputChannel): Promise<BaseTelemetryClient> => {
1313
let segmentAnalyticsClient = new Analytics({ writeKey: key });
1414

1515
// Sets the analytics client into a standardized form
@@ -20,9 +20,13 @@ const analyticsClientFactory = async (key: string): Promise<BaseTelemetryClient>
2020
anonymousId: vscode.env.machineId,
2121
event: eventName,
2222
properties: data?.properties
23+
}, (err: any) => {
24+
if (err) {
25+
logger.error('Failed to log event to app analytics:', err);
26+
}
2327
});
2428
} catch (e: any) {
25-
console.error('Failed to log event to app analytics!', e);
29+
logger.error('Failed to log event to app analytics:', e);
2630
}
2731
},
2832
logException: (exception: Error, data?: AppenderData) => {
@@ -60,17 +64,17 @@ const analyticsClientFactory = async (key: string): Promise<BaseTelemetryClient>
6064
},
6165
}).then((resp) => {
6266
if (!resp.ok) {
63-
console.log(`Metrics endpoint responded with ${resp.status} ${resp.statusText}`);
67+
logger.warn(`Metrics endpoint responded with ${resp.status} ${resp.statusText}`);
6468
}
6569
}).catch((e) => {
66-
console.error('Failed to report error to metrics endpoint!', e);
70+
logger.error('Failed to report error to metrics endpoint!', e);
6771
});
6872
},
6973
flush: async () => {
7074
try {
7175
await segmentAnalyticsClient.closeAndFlush({ timeout: 3000 });
7276
} catch (e: any) {
73-
console.error('Failed to flush app analytics!', e);
77+
logger.error('Failed to flush app analytics!', e);
7478
}
7579
}
7680
};
@@ -102,8 +106,8 @@ export interface ITelemetryService {
102106
}
103107

104108
export class TelemetryService extends BaseTelemetryReporter implements ITelemetryService {
105-
constructor(extensionId: string, extensionVersion: string, key: string) {
106-
const appender = new BaseTelemetryAppender(key, (key) => analyticsClientFactory(key));
109+
constructor(extensionId: string, extensionVersion: string, key: string, logger: vscode.LogOutputChannel) {
110+
const appender = new BaseTelemetryAppender(key, (key) => analyticsClientFactory(key, logger));
107111
super(extensionId, extensionVersion, appender, {
108112
release: os.release(),
109113
platform: os.platform(),

0 commit comments

Comments
 (0)