Skip to content

Commit 28918e3

Browse files
authored
Add command to show telemetry output and some clean up (#239697)
fix #238725
1 parent 0d0873e commit 28918e3

22 files changed

+101
-70
lines changed

Diff for: src/vs/code/electron-utility/sharedProcess/sharedProcessMain.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ class SharedProcessMain extends Disposable implements IClientConnectionFilter {
296296
const appenders: ITelemetryAppender[] = [];
297297
const internalTelemetry = isInternalTelemetry(productService, configurationService);
298298
if (supportsTelemetry(productService, environmentService)) {
299-
const logAppender = new TelemetryLogAppender(logService, loggerService, environmentService, productService);
299+
const logAppender = new TelemetryLogAppender('', false, loggerService, environmentService, productService);
300300
appenders.push(logAppender);
301301
if (!isLoggingOnly(productService, environmentService) && productService.aiConfig?.ariaKey) {
302302
const collectorAppender = new OneDataSystemAppender(requestService, internalTelemetry, 'monacoworkbench', null, productService.aiConfig.ariaKey);
@@ -320,7 +320,7 @@ class SharedProcessMain extends Disposable implements IClientConnectionFilter {
320320
services.set(ITelemetryService, telemetryService);
321321

322322
// Custom Endpoint Telemetry
323-
const customEndpointTelemetryService = new CustomEndpointTelemetryService(configurationService, telemetryService, logService, loggerService, environmentService, productService);
323+
const customEndpointTelemetryService = new CustomEndpointTelemetryService(configurationService, telemetryService, loggerService, environmentService, productService);
324324
services.set(ICustomEndpointTelemetryService, customEndpointTelemetryService);
325325

326326
// Extension Management

Diff for: src/vs/platform/telemetry/common/telemetryLogAppender.ts

+9-10
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,37 @@
66
import { Disposable } from '../../../base/common/lifecycle.js';
77
import { localize } from '../../../nls.js';
88
import { IEnvironmentService } from '../../environment/common/environment.js';
9-
import { ILogService, ILogger, ILoggerService, LogLevel } from '../../log/common/log.js';
9+
import { ILogger, ILoggerService } from '../../log/common/log.js';
1010
import { IProductService } from '../../product/common/productService.js';
11-
import { ITelemetryAppender, TelemetryLogGroup, isLoggingOnly, supportsTelemetry, telemetryLogId, validateTelemetryData } from './telemetryUtils.js';
11+
import { ITelemetryAppender, TelemetryLogGroup, isLoggingOnly, telemetryLogId, validateTelemetryData } from './telemetryUtils.js';
1212

1313
export class TelemetryLogAppender extends Disposable implements ITelemetryAppender {
1414

1515
private readonly logger: ILogger;
1616

1717
constructor(
18-
@ILogService logService: ILogService,
18+
private readonly prefix: string,
19+
remote: boolean,
1920
@ILoggerService loggerService: ILoggerService,
2021
@IEnvironmentService environmentService: IEnvironmentService,
2122
@IProductService productService: IProductService,
22-
private readonly prefix: string = '',
2323
) {
2424
super();
2525

26-
const logger = loggerService.getLogger(telemetryLogId);
26+
const id = remote ? 'remoteTelemetry' : telemetryLogId;
27+
const logger = loggerService.getLogger(id);
2728
if (logger) {
2829
this.logger = this._register(logger);
2930
} else {
3031
// Not a perfect check, but a nice way to indicate if we only have logging enabled for debug purposes and nothing is actually being sent
3132
const justLoggingAndNotSending = isLoggingOnly(productService, environmentService);
3233
const logSuffix = justLoggingAndNotSending ? ' (Not Sent)' : '';
33-
const isVisible = () => supportsTelemetry(productService, environmentService) && logService.getLevel() === LogLevel.Trace;
34-
this.logger = this._register(loggerService.createLogger(telemetryLogId,
34+
this.logger = this._register(loggerService.createLogger(id,
3535
{
3636
name: localize('telemetryLog', "Telemetry{0}", logSuffix),
37-
hidden: !isVisible(),
38-
group: TelemetryLogGroup
37+
group: TelemetryLogGroup,
38+
hidden: true
3939
}));
40-
this._register(logService.onDidChangeLogLevel(() => loggerService.setVisibility(telemetryLogId, isVisible())));
4140
}
4241
}
4342

Diff for: src/vs/platform/telemetry/common/telemetryUtils.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ export class NullEndpointTelemetryService implements ICustomEndpointTelemetrySer
5757
}
5858

5959
export const telemetryLogId = 'telemetry';
60-
export const extensionTelemetryLogChannelId = 'extensionTelemetryLog';
61-
export const TelemetryLogGroup: LoggerGroup = { id: 'telemetry', name: localize('telemetryLogName', "Telemetry") };
60+
export const TelemetryLogGroup: LoggerGroup = { id: telemetryLogId, name: localize('telemetryLogName', "Telemetry") };
6261

6362
export interface ITelemetryAppender {
6463
log(eventName: string, data: any): void;

Diff for: src/vs/platform/telemetry/node/customEndpointTelemetryService.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { FileAccess } from '../../../base/common/network.js';
77
import { Client as TelemetryClient } from '../../../base/parts/ipc/node/ipc.cp.js';
88
import { IConfigurationService } from '../../configuration/common/configuration.js';
99
import { IEnvironmentService } from '../../environment/common/environment.js';
10-
import { ILogService, ILoggerService } from '../../log/common/log.js';
10+
import { ILoggerService } from '../../log/common/log.js';
1111
import { IProductService } from '../../product/common/productService.js';
1212
import { ICustomEndpointTelemetryService, ITelemetryData, ITelemetryEndpoint, ITelemetryService } from '../common/telemetry.js';
1313
import { TelemetryAppenderClient } from '../common/telemetryIpc.js';
@@ -22,7 +22,6 @@ export class CustomEndpointTelemetryService implements ICustomEndpointTelemetryS
2222
constructor(
2323
@IConfigurationService private readonly configurationService: IConfigurationService,
2424
@ITelemetryService private readonly telemetryService: ITelemetryService,
25-
@ILogService private readonly logService: ILogService,
2625
@ILoggerService private readonly loggerService: ILoggerService,
2726
@IEnvironmentService private readonly environmentService: IEnvironmentService,
2827
@IProductService private readonly productService: IProductService
@@ -51,7 +50,7 @@ export class CustomEndpointTelemetryService implements ICustomEndpointTelemetryS
5150
const channel = client.getChannel('telemetryAppender');
5251
const appenders = [
5352
new TelemetryAppenderClient(channel),
54-
new TelemetryLogAppender(this.logService, this.loggerService, this.environmentService, this.productService, `[${endpoint.id}] `),
53+
new TelemetryLogAppender(`[${endpoint.id}] `, false, this.loggerService, this.environmentService, this.productService),
5554
];
5655

5756
this.customTelemetryServices.set(endpoint.id, new TelemetryService({

Diff for: src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Event } from '../../../../base/common/event.js';
77
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
88
import { IEnvironmentService } from '../../../environment/common/environment.js';
99
import { TestInstantiationService } from '../../../instantiation/test/common/instantiationServiceMock.js';
10-
import { AbstractLogger, DEFAULT_LOG_LEVEL, ILogger, ILoggerService, LogLevel, NullLogService } from '../../../log/common/log.js';
10+
import { AbstractLogger, DEFAULT_LOG_LEVEL, ILogger, ILoggerService, LogLevel } from '../../../log/common/log.js';
1111
import { IProductService } from '../../../product/common/productService.js';
1212
import { TelemetryLogAppender } from '../../common/telemetryLogAppender.js';
1313

@@ -91,7 +91,7 @@ suite('TelemetryLogAdapter', () => {
9191
test('Do not Log Telemetry if log level is not trace', async () => {
9292
const testLoggerService = new TestTelemetryLoggerService(DEFAULT_LOG_LEVEL);
9393
const testInstantiationService = new TestInstantiationService();
94-
const testObject = new TelemetryLogAppender(new NullLogService(), testLoggerService, testInstantiationService.stub(IEnvironmentService, {}), testInstantiationService.stub(IProductService, {}));
94+
const testObject = new TelemetryLogAppender('', false, testLoggerService, testInstantiationService.stub(IEnvironmentService, {}), testInstantiationService.stub(IProductService, {}));
9595
testObject.log('testEvent', { hello: 'world', isTrue: true, numberBetween1And3: 2 });
9696
assert.strictEqual(testLoggerService.createLogger().logs.length, 0);
9797
testObject.dispose();
@@ -101,7 +101,7 @@ suite('TelemetryLogAdapter', () => {
101101
test('Log Telemetry if log level is trace', async () => {
102102
const testLoggerService = new TestTelemetryLoggerService(LogLevel.Trace);
103103
const testInstantiationService = new TestInstantiationService();
104-
const testObject = new TelemetryLogAppender(new NullLogService(), testLoggerService, testInstantiationService.stub(IEnvironmentService, {}), testInstantiationService.stub(IProductService, {}));
104+
const testObject = new TelemetryLogAppender('', false, testLoggerService, testInstantiationService.stub(IEnvironmentService, {}), testInstantiationService.stub(IProductService, {}));
105105
testObject.log('testEvent', { hello: 'world', isTrue: true, numberBetween1And3: 2 });
106106
assert.strictEqual(testLoggerService.createLogger().logs[0], 'telemetry/testEvent' + JSON.stringify([{
107107
properties: {

Diff for: src/vs/server/node/serverServices.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ import { RemoteUserDataProfilesServiceChannel } from '../../platform/userDataPro
7979
import { NodePtyHostStarter } from '../../platform/terminal/node/nodePtyHostStarter.js';
8080
import { CSSDevelopmentService, ICSSDevelopmentService } from '../../platform/cssDev/node/cssDevService.js';
8181
import { AllowedExtensionsService } from '../../platform/extensionManagement/common/allowedExtensionsService.js';
82+
import { TelemetryLogAppender } from '../../platform/telemetry/common/telemetryLogAppender.js';
8283

8384
const eventPrefix = 'monacoworkbench';
8485

@@ -161,7 +162,7 @@ export async function setupServerServices(connectionToken: ServerConnectionToken
161162
}
162163

163164
const config: ITelemetryServiceConfig = {
164-
appenders: [oneDsAppender],
165+
appenders: [oneDsAppender, new TelemetryLogAppender('', true, loggerService, environmentService, productService)],
165166
commonProperties: resolveCommonProperties(release(), hostname(), process.arch, productService.commit, productService.version + '-remote', machineId, sqmId, devDeviceId, isInternal, 'remoteAgent'),
166167
piiPaths: getPiiPathsFromEnvironment(environmentService)
167168
};

Diff for: src/vs/workbench/api/common/extHost.common.services.ts

-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import { IExtHostWindow, ExtHostWindow } from './extHostWindow.js';
2121
import { IExtHostConsumerFileSystem, ExtHostConsumerFileSystem } from './extHostFileSystemConsumer.js';
2222
import { IExtHostFileSystemInfo, ExtHostFileSystemInfo } from './extHostFileSystemInfo.js';
2323
import { IExtHostSecretState, ExtHostSecretState } from './extHostSecretState.js';
24-
import { ExtHostTelemetry, IExtHostTelemetry } from './extHostTelemetry.js';
2524
import { ExtHostEditorTabs, IExtHostEditorTabs } from './extHostEditorTabs.js';
2625
import { ExtHostLoggerService } from './extHostLoggerService.js';
2726
import { ILoggerService } from '../../../platform/log/common/log.js';
@@ -57,6 +56,5 @@ registerSingleton(IExtHostTunnelService, ExtHostTunnelService, InstantiationType
5756
registerSingleton(IExtHostWindow, ExtHostWindow, InstantiationType.Eager);
5857
registerSingleton(IExtHostWorkspace, ExtHostWorkspace, InstantiationType.Eager);
5958
registerSingleton(IExtHostSecretState, ExtHostSecretState, InstantiationType.Eager);
60-
registerSingleton(IExtHostTelemetry, ExtHostTelemetry, InstantiationType.Eager);
6159
registerSingleton(IExtHostEditorTabs, ExtHostEditorTabs, InstantiationType.Eager);
6260
registerSingleton(IExtHostVariableResolverProvider, ExtHostVariableResolverProviderService, InstantiationType.Eager);

Diff for: src/vs/workbench/api/common/extHostTelemetry.ts

+7-24
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@ import { createDecorator } from '../../../platform/instantiation/common/instanti
88
import { Event, Emitter } from '../../../base/common/event.js';
99
import { ExtHostTelemetryShape } from './extHost.protocol.js';
1010
import { ICommonProperties, TelemetryLevel } from '../../../platform/telemetry/common/telemetry.js';
11-
import { ILogger, ILoggerService, LogLevel, isLogLevel } from '../../../platform/log/common/log.js';
11+
import { ILogger, ILoggerService } from '../../../platform/log/common/log.js';
1212
import { IExtHostInitDataService } from './extHostInitDataService.js';
1313
import { ExtensionIdentifier, IExtensionDescription } from '../../../platform/extensions/common/extensions.js';
1414
import { UIKind } from '../../services/extensions/common/extensionHostProtocol.js';
1515
import { getRemoteName } from '../../../platform/remote/common/remoteHosts.js';
16-
import { cleanData, cleanRemoteAuthority, extensionTelemetryLogChannelId, TelemetryLogGroup } from '../../../platform/telemetry/common/telemetryUtils.js';
16+
import { cleanData, cleanRemoteAuthority, TelemetryLogGroup } from '../../../platform/telemetry/common/telemetryUtils.js';
1717
import { mixin } from '../../../base/common/objects.js';
18-
import { URI } from '../../../base/common/uri.js';
1918
import { Disposable } from '../../../base/common/lifecycle.js';
2019
import { localize } from '../../../nls.js';
2120

@@ -31,38 +30,25 @@ export class ExtHostTelemetry extends Disposable implements ExtHostTelemetryShap
3130

3231
private _productConfig: { usage: boolean; error: boolean } = { usage: true, error: true };
3332
private _level: TelemetryLevel = TelemetryLevel.NONE;
34-
// This holds whether or not we're running with --disable-telemetry, etc. Usings supportsTelemtry() from the main thread
35-
private _telemetryIsSupported: boolean = false;
3633
private _oldTelemetryEnablement: boolean | undefined;
3734
private readonly _inLoggingOnlyMode: boolean = false;
38-
private readonly extHostTelemetryLogFile: URI;
3935
private readonly _outputLogger: ILogger;
4036
private readonly _telemetryLoggers = new Map<string, ExtHostTelemetryLogger[]>();
4137

4238
constructor(
39+
isWorker: boolean,
4340
@IExtHostInitDataService private readonly initData: IExtHostInitDataService,
44-
@ILoggerService private readonly loggerService: ILoggerService,
41+
@ILoggerService loggerService: ILoggerService,
4542
) {
4643
super();
47-
this.extHostTelemetryLogFile = URI.revive(this.initData.environment.extensionTelemetryLogResource);
4844
this._inLoggingOnlyMode = this.initData.environment.isExtensionTelemetryLoggingOnly;
49-
this._outputLogger = loggerService.createLogger(this.extHostTelemetryLogFile,
45+
const id = initData.remote.isRemote ? 'remoteExtHostTelemetry' : isWorker ? 'workerExtHostTelemetry' : 'extHostTelemetry';
46+
this._outputLogger = this._register(loggerService.createLogger(id,
5047
{
51-
id: extensionTelemetryLogChannelId,
5248
name: localize('extensionTelemetryLog', "Extension Telemetry{0}", this._inLoggingOnlyMode ? ' (Not Sent)' : ''),
5349
hidden: true,
5450
group: TelemetryLogGroup,
55-
});
56-
this._register(this._outputLogger);
57-
this._register(loggerService.onDidChangeLogLevel(arg => {
58-
if (isLogLevel(arg)) {
59-
this.updateLoggerVisibility();
60-
}
61-
}));
62-
}
63-
64-
private updateLoggerVisibility(): void {
65-
this.loggerService.setVisibility(this.extHostTelemetryLogFile, this._telemetryIsSupported && this.loggerService.getLogLevel() === LogLevel.Trace);
51+
}));
6652
}
6753

6854
getTelemetryConfiguration(): boolean {
@@ -95,9 +81,7 @@ export class ExtHostTelemetry extends Disposable implements ExtHostTelemetryShap
9581

9682
$initializeTelemetryLevel(level: TelemetryLevel, supportsTelemetry: boolean, productConfig?: { usage: boolean; error: boolean }): void {
9783
this._level = level;
98-
this._telemetryIsSupported = supportsTelemetry;
9984
this._productConfig = productConfig ?? { usage: true, error: true };
100-
this.updateLoggerVisibility();
10185
}
10286

10387
getBuiltInCommonProperties(extension: IExtensionDescription): ICommonProperties {
@@ -155,7 +139,6 @@ export class ExtHostTelemetry extends Disposable implements ExtHostTelemetryShap
155139
this._onDidChangeTelemetryEnabled.fire(this.getTelemetryConfiguration());
156140
}
157141
this._onDidChangeTelemetryConfiguration.fire(this.getTelemetryDetails());
158-
this.updateLoggerVisibility();
159142
}
160143

161144
onExtensionError(extension: ExtensionIdentifier, error: Error): boolean {

Diff for: src/vs/workbench/api/common/extensionHostMain.ts

-1
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,6 @@ export class ExtensionHostMain {
214214
initData.environment.extensionTestsLocationURI = URI.revive(rpcProtocol.transformIncomingURIs(initData.environment.extensionTestsLocationURI));
215215
initData.environment.globalStorageHome = URI.revive(rpcProtocol.transformIncomingURIs(initData.environment.globalStorageHome));
216216
initData.environment.workspaceStorageHome = URI.revive(rpcProtocol.transformIncomingURIs(initData.environment.workspaceStorageHome));
217-
initData.environment.extensionTelemetryLogResource = URI.revive(rpcProtocol.transformIncomingURIs(initData.environment.extensionTelemetryLogResource));
218217
initData.nlsBaseUrl = URI.revive(rpcProtocol.transformIncomingURIs(initData.nlsBaseUrl));
219218
initData.logsLocation = URI.revive(rpcProtocol.transformIncomingURIs(initData.logsLocation));
220219
initData.workspace = rpcProtocol.transformIncomingURIs(initData.workspace);

Diff for: src/vs/workbench/api/node/extHost.node.services.ts

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { ExtHostLogService } from '../common/extHostLogService.js';
2626
import { SyncDescriptor } from '../../../platform/instantiation/common/descriptors.js';
2727
import { ISignService } from '../../../platform/sign/common/sign.js';
2828
import { SignService } from '../../../platform/sign/node/signService.js';
29+
import { ExtHostTelemetry, IExtHostTelemetry } from '../common/extHostTelemetry.js';
2930

3031
// #########################################################################
3132
// ### ###
@@ -38,6 +39,7 @@ registerSingleton(ILoggerService, ExtHostLoggerService, InstantiationType.Delaye
3839
registerSingleton(ILogService, new SyncDescriptor(ExtHostLogService, [false], true));
3940
registerSingleton(ISignService, SignService, InstantiationType.Delayed);
4041
registerSingleton(IExtensionStoragePaths, ExtensionStoragePaths, InstantiationType.Eager);
42+
registerSingleton(IExtHostTelemetry, new SyncDescriptor(ExtHostTelemetry, [false], true));
4143

4244
registerSingleton(IExtHostDebugService, ExtHostDebugService, InstantiationType.Eager);
4345
registerSingleton(IExtHostSearch, NativeExtHostSearch, InstantiationType.Eager);

Diff for: src/vs/workbench/api/test/browser/extHostTelemetry.test.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ suite('ExtHostTelemetry', function () {
3131
extensionTestsLocationURI: undefined,
3232
appRoot: undefined,
3333
appName: 'test',
34-
extensionTelemetryLogResource: URI.parse('fake'),
3534
isExtensionTelemetryLoggingOnly: false,
3635
appHost: 'test',
3736
appLanguage: 'en',
@@ -70,7 +69,7 @@ suite('ExtHostTelemetry', function () {
7069
};
7170

7271
const createExtHostTelemetry = () => {
73-
const extensionTelemetry = new ExtHostTelemetry(new class extends mock<IExtHostInitDataService>() {
72+
const extensionTelemetry = new ExtHostTelemetry(false, new class extends mock<IExtHostInitDataService>() {
7473
override environment: IEnvironment = mockEnvironment;
7574
override telemetryInfo = mockTelemetryInfo;
7675
override remote = mockRemote;
@@ -274,7 +273,7 @@ suite('ExtHostTelemetry', function () {
274273

275274
// Have to re-duplicate code here because I the logger service isn't exposed in the simple setup functions
276275
const loggerService = new TestTelemetryLoggerService(LogLevel.Trace);
277-
const extensionTelemetry = new ExtHostTelemetry(new class extends mock<IExtHostInitDataService>() {
276+
const extensionTelemetry = new ExtHostTelemetry(false, new class extends mock<IExtHostInitDataService>() {
278277
override environment: IEnvironment = mockEnvironment;
279278
override telemetryInfo = mockTelemetryInfo;
280279
override remote = mockRemote;

Diff for: src/vs/workbench/api/worker/extHost.worker.services.ts

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { ILogService } from '../../../platform/log/common/log.js';
99
import { IExtHostExtensionService } from '../common/extHostExtensionService.js';
1010
import { ExtHostLogService } from '../common/extHostLogService.js';
1111
import { ExtensionStoragePaths, IExtensionStoragePaths } from '../common/extHostStoragePaths.js';
12+
import { ExtHostTelemetry, IExtHostTelemetry } from '../common/extHostTelemetry.js';
1213
import { ExtHostExtensionService } from './extHostExtensionService.js';
1314

1415
// #########################################################################
@@ -20,3 +21,4 @@ import { ExtHostExtensionService } from './extHostExtensionService.js';
2021
registerSingleton(ILogService, new SyncDescriptor(ExtHostLogService, [true], true));
2122
registerSingleton(IExtHostExtensionService, ExtHostExtensionService, InstantiationType.Eager);
2223
registerSingleton(IExtensionStoragePaths, ExtensionStoragePaths, InstantiationType.Eager);
24+
registerSingleton(IExtHostTelemetry, new SyncDescriptor(ExtHostTelemetry, [true], true));

0 commit comments

Comments
 (0)