Skip to content

Commit 93e26ec

Browse files
committed
Add telemetry using the extension API
This adds telemetry to the extension, utilizing the functionality provided by Podman Desktop.
1 parent dcf5f11 commit 93e26ec

File tree

6 files changed

+65
-24
lines changed

6 files changed

+65
-24
lines changed

.gitpod.yml

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# This configuration file was automatically generated by Gitpod.
2+
# Please adjust to your needs (see https://www.gitpod.io/docs/introduction/learn-gitpod/gitpod-yaml)
3+
# and commit this file to your remote git repository to share the goodness with others.
4+
5+
# Learn more from ready-to-use templates: https://www.gitpod.io/docs/introduction/getting-started/quickstart
6+
7+
tasks:
8+
- init: yarn install && yarn run build
9+
command: yarn run watch
10+
11+

src/command.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export interface ProviderCommand extends extensionApi.MenuItem {
3030

3131
export class CommandManager {
3232
private extensionContext: extensionApi.ExtensionContext;
33+
private telemetryLogger: extensionApi.TelemetryLogger;
3334
private commands: ProviderCommand[] = [];
3435
private disposables = new Map<string, Disposable>();
3536
constructor() {
@@ -69,14 +70,24 @@ export class CommandManager {
6970
const disposable = extensionApi.tray.registerProviderMenuItem(providerId, command);
7071
this.disposables.set(command.id, disposable);
7172
this.commands.push(command);
72-
this.extensionContext.subscriptions.push(extensionApi.commands.registerCommand(command.id, command.callback));
73+
74+
this.extensionContext.subscriptions.push(
75+
extensionApi.commands.registerCommand(command.id, () => {
76+
this.telemetryLogger.logUsage(command.id);
77+
command.callback();
78+
}),
79+
);
7380
}
7481

7582
setExtContext(extensionContext: extensionApi.ExtensionContext): void {
7683
this.extensionContext = extensionContext;
7784
extensionContext.subscriptions.push(extensionApi.Disposable.from(this));
7885
}
7986

87+
setTelemetryLogger(telemetryLogger: extensionApi.TelemetryLogger): void {
88+
this.telemetryLogger = telemetryLogger;
89+
}
90+
8091
dispose(): void {
8192
// dispose all commands registered
8293
for (const disposable of this.disposables.values()) {

src/crc-start.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ interface Auths {
3333

3434
const missingPullSecret = 'Failed to ask for pull secret';
3535

36-
export async function startCrc(logger: extensionApi.Logger): Promise<void> {
36+
export async function startCrc(
37+
logger: extensionApi.Logger,
38+
telemetryLogger: extensionApi.TelemetryLogger,
39+
): Promise<void> {
40+
telemetryLogger.logUsage('crc.start');
3741
try {
3842
// call crc setup to prepare bundle, before start
3943
if (isNeedSetup) {
@@ -58,7 +62,7 @@ export async function startCrc(logger: extensionApi.Logger): Promise<void> {
5862
// ask user to provide pull secret
5963
if (await askAndStorePullSecret(logger)) {
6064
// if pull secret provided try to start again
61-
return startCrc(logger);
65+
return startCrc(logger, telemetryLogger);
6266
}
6367
return;
6468
} else if (err.name === 'RequestError' && err.code === 'ECONNRESET') {

src/crc-stop.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616
* SPDX-License-Identifier: Apache-2.0
1717
***********************************************************************/
1818

19+
import type * as extensionApi from '@podman-desktop/api';
1920
import { commander } from './daemon-commander';
2021
import { crcLogProvider } from './log-provider';
2122

22-
export async function stopCrc(): Promise<void> {
23+
export async function stopCrc(telemetryLogger: extensionApi.TelemetryLogger): Promise<void> {
24+
telemetryLogger.logUsage('crc.stop');
2325
console.log('extension:crc: receive the call stop');
2426
try {
2527
await commander.stop();

src/extension.ts

+17-12
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export async function activate(extensionContext: extensionApi.ExtensionContext):
4343
const crcInstaller = new CrcInstall();
4444
extensionApi.configuration.getConfiguration();
4545
const crcVersion = await getCrcVersion();
46+
const telemetryLogger = extensionApi.env.createTelemetryLogger();
4647

4748
const detectionChecks: extensionApi.ProviderDetectionCheck[] = [];
4849
let status: extensionApi.ProviderStatus = 'not-installed';
@@ -75,13 +76,14 @@ export async function activate(extensionContext: extensionApi.ExtensionContext):
7576
extensionContext.subscriptions.push(provider);
7677

7778
const providerLifecycle: extensionApi.ProviderLifecycle = {
78-
status: () => crcStatus.getProviderStatus(),
79-
79+
status: () => {
80+
return crcStatus.getProviderStatus();
81+
},
8082
start: context => {
81-
return startCrc(context.log);
83+
return startCrc(context.log, telemetryLogger);
8284
},
8385
stop: () => {
84-
return stopCrc();
86+
return stopCrc(telemetryLogger);
8587
},
8688
};
8789

@@ -92,7 +94,7 @@ export async function activate(extensionContext: extensionApi.ExtensionContext):
9294
if (hasSetupFinished) {
9395
await needSetup();
9496
connectToCrc();
95-
presetChanged(provider, extensionContext);
97+
presetChanged(provider, extensionContext, telemetryLogger);
9698
}
9799
},
98100
}),
@@ -101,17 +103,18 @@ export async function activate(extensionContext: extensionApi.ExtensionContext):
101103
extensionContext.subscriptions.push(provider.registerLifecycle(providerLifecycle));
102104

103105
commandManager.setExtContext(extensionContext);
106+
commandManager.setTelemetryLogger(telemetryLogger);
104107

105108
registerOpenTerminalCommand();
106109
registerOpenConsoleCommand();
107110
registerLogInCommands();
108111
registerDeleteCommand();
109112

110-
syncPreferences(extensionContext);
113+
syncPreferences(extensionContext, telemetryLogger);
111114

112115
if (!isNeedSetup) {
113116
// initial preset check
114-
presetChanged(provider, extensionContext);
117+
presetChanged(provider, extensionContext, telemetryLogger);
115118
}
116119

117120
if (crcInstaller.isAbleToInstall()) {
@@ -125,7 +128,7 @@ export async function activate(extensionContext: extensionApi.ExtensionContext):
125128
return;
126129
}
127130
await connectToCrc();
128-
presetChanged(provider, extensionContext);
131+
presetChanged(provider, extensionContext, telemetryLogger);
129132
});
130133
},
131134
});
@@ -170,6 +173,7 @@ async function registerOpenShiftLocalCluster(
170173
name,
171174
provider: extensionApi.Provider,
172175
extensionContext: extensionApi.ExtensionContext,
176+
telemetryLogger: extensionApi.TelemetryLogger,
173177
): Promise<void> {
174178
const status = () => crcStatus.getConnectionStatus();
175179
const apiURL = 'https://api.crc.testing:6443';
@@ -184,10 +188,10 @@ async function registerOpenShiftLocalCluster(
184188
return deleteCrc();
185189
},
186190
start: ctx => {
187-
return startCrc(ctx.log);
191+
return startCrc(ctx.log, telemetryLogger);
188192
},
189193
stop: () => {
190-
return stopCrc();
194+
return stopCrc(telemetryLogger);
191195
},
192196
},
193197
};
@@ -230,6 +234,7 @@ async function connectToCrc(): Promise<void> {
230234
async function presetChanged(
231235
provider: extensionApi.Provider,
232236
extensionContext: extensionApi.ExtensionContext,
237+
telemetryLogger: extensionApi.TelemetryLogger,
233238
): Promise<void> {
234239
// TODO: handle situation if some cluster/connection was registered already
235240

@@ -239,8 +244,8 @@ async function presetChanged(
239244
// podman connection
240245
registerPodmanConnection(provider, extensionContext);
241246
} else if (preset === 'OpenShift') {
242-
registerOpenShiftLocalCluster('OpenShift Local', provider, extensionContext);
247+
registerOpenShiftLocalCluster('OpenShift Local', provider, extensionContext, telemetryLogger);
243248
} else if (preset === 'MicroShift') {
244-
registerOpenShiftLocalCluster('MicroShift', provider, extensionContext);
249+
registerOpenShiftLocalCluster('MicroShift', provider, extensionContext, telemetryLogger);
245250
}
246251
}

src/preferences.ts

+16-8
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ interface ConfigEntry {
4949

5050
let initialCrcConfig: Configuration;
5151

52-
export async function syncPreferences(context: extensionApi.ExtensionContext): Promise<void> {
52+
export async function syncPreferences(
53+
context: extensionApi.ExtensionContext,
54+
telemetryLogger: extensionApi.TelemetryLogger,
55+
): Promise<void> {
5356
try {
5457
initialCrcConfig = await commander.configGet();
5558

@@ -62,7 +65,7 @@ export async function syncPreferences(context: extensionApi.ExtensionContext): P
6265

6366
context.subscriptions.push(
6467
extensionApi.configuration.onDidChangeConfiguration(e => {
65-
configChanged(e);
68+
configChanged(e, telemetryLogger);
6669
}),
6770
);
6871

@@ -120,7 +123,10 @@ async function handleProxyChange(proxy?: extensionApi.ProxySettings): Promise<vo
120123
}
121124
}
122125

123-
async function configChanged(e: extensionApi.ConfigurationChangeEvent): Promise<void> {
126+
async function configChanged(
127+
e: extensionApi.ConfigurationChangeEvent,
128+
telemetryLogger: extensionApi.TelemetryLogger,
129+
): Promise<void> {
124130
const currentConfig = await commander.configGet();
125131

126132
const extConfig = extensionApi.configuration.getConfiguration();
@@ -167,7 +173,7 @@ async function configChanged(e: extensionApi.ConfigurationChangeEvent): Promise<
167173
if (!isEmpty(newConfig)) {
168174
await commander.configSet(newConfig);
169175
if (needRecreateCrc) {
170-
await handleRecreate();
176+
await handleRecreate(telemetryLogger);
171177
}
172178
}
173179
} catch (err) {
@@ -209,7 +215,7 @@ function validateRam(newVal: string | number): string | undefined {
209215
}
210216
}
211217

212-
async function handleRecreate(): Promise<void> {
218+
async function handleRecreate(telemetryLogger: extensionApi.TelemetryLogger): Promise<void> {
213219
const needDelete = crcStatus.status.CrcStatus !== 'No Cluster';
214220
const needStop = crcStatus.getProviderStatus() === 'started' || crcStatus.getProviderStatus() === 'starting';
215221

@@ -228,13 +234,15 @@ async function handleRecreate(): Promise<void> {
228234
...buttons,
229235
);
230236

237+
// we might wanna log what user clicked on.
238+
// for now we infer from the logged events
231239
if (result === 'Stop and Delete') {
232-
await stopCrc();
240+
await stopCrc(telemetryLogger);
233241
await deleteCrc();
234242
} else if (result === 'Delete and Restart') {
235-
await stopCrc();
243+
await stopCrc(telemetryLogger);
236244
await deleteCrc();
237-
await startCrc(defaultLogger);
245+
await startCrc(defaultLogger, telemetryLogger);
238246
} else if (result === 'Delete') {
239247
await deleteCrc();
240248
}

0 commit comments

Comments
 (0)