221
}
222
223
>
export async function createAgentHostTelemetryService(options: IAgentHostTelemetryServiceOptions): Promise<IAgentHostTelemetryService> {
agentHostTelemetryService.ts
224
>
const { environmentService, productService, fileService, loggerService, logService, disposables } = options;
225
>
if (options.disableTelemetry || !loggerService || !supportsTelemetry(productService, environmentService)) {
226
return disposables.add(new AgentHostTelemetryService(NullTelemetryService));
227
}
229
>
const configurationService = disposables.add(new ConfigurationService(joinPath(environmentService.appSettingsHome, 'settings.json'), fileService, new NullPolicyService(), logService));
230
>
await configurationService.initialize();
231
>
232
>
const appenders: ITelemetryAppender[] = [
233
>
disposables.add(new TelemetryLogAppender('', false, loggerService, environmentService, productService)),
234
>
];
235
>
const internalTelemetry = isInternalTelemetry(productService, configurationService);
236
>
const loggingOnly = isLoggingOnly(productService, environmentService);
237
>
if (!loggingOnly && productService.aiConfig?.ariaKey) {
238
const collectorAppender = new OneDataSystemAppender(options.requestService, internalTelemetry, 'monacoworkbench', null, productService.aiConfig.ariaKey);
239
disposables.add(toDisposable(() => { void collectorAppender.flush(); }));
240
appenders.push(collectorAppender);
241
}
243
>
// Prefer the host-forwarded identifiers (see `agentHostTelemetryEnv`) so the
244
>
// agent host reports the same persisted machineId/sqmId/devDeviceId as the
245
>
// workbench. Fall back to computing them live when not provided (e.g. the
246
>
// remote/server agent host, which does not forward them).
247
>
const [machineId, sqmId, devDeviceId] = await Promise.all([
248
>
process.env[AgentHostMachineIdEnvKey] || getMachineId(error => logService.error(error)),
249
>
process.env[AgentHostSqmIdEnvKey] || getSqmMachineId(error => logService.error(error)),
250
>
process.env[AgentHostDevDeviceIdEnvKey] || getDevDeviceId(error => logService.error(error)),
251
>
]);
252
>
253
>
const commonProperties = resolveCommonProperties(release(), hostname(), process.arch, productService.commit, productService.version, machineId, sqmId, devDeviceId, internalTelemetry, productService.date);
254
>
255
>
const telemetryService = new TelemetryService({
256
>
appenders,
257
>
sendErrorTelemetry: true,
258
>
commonProperties,
259
>
piiPaths: getPiiPathsFromEnvironment(environmentService),
260
>
}, configurationService, productService);
261
>
262
>
const extensionVersion = loggingOnly ? undefined : await resolveCopilotExtensionVersion(environmentService, fileService, logService);
263
>
const internalSender = loggingOnly ? undefined : disposables.add(new AgentHostInternalTelemetrySender({ requestService: options.requestService, commonProperties, extensionVersion }));
264
>
const restricted = loggingOnly ? undefined : new AgentHostRestrictedTelemetrySender(commonProperties, logService, undefined, internalSender, options.fetchFn);
265
>
266
>
return disposables.add(new AgentHostTelemetryService(telemetryService, restricted));
267
>
}