@@ -20,14 +20,29 @@ Index: code-server/lib/vscode/src/vs/server/node/serverServices.ts
2020 import { NullPolicyService } from 'vs/platform/policy/common/policy';
2121 import { OneDataSystemAppender } from 'vs/platform/telemetry/node/1dsAppender';
2222 import { LoggerService } from 'vs/platform/log/node/loggerService';
23- @@ -149,7 +150,10 @@ export async function setupServerService
23+ @@ -146,10 +147,25 @@ export async function setupServerService
24+ const requestService = new RequestService(configurationService, environmentService, logService, loggerService);
25+ services.set(IRequestService, requestService);
26+
27+ + let isContainer = undefined;
28+ + try {
29+ + await Promises.stat('/run/.containerenv');
30+ + isContainer = true;
31+ + } catch (error) { /* Does not exist, probably. */ }
32+ + if (!isContainer) {
33+ + try {
34+ + const content = await Promises.readFile('/proc/self/cgroup', 'utf8')
35+ + isContainer = content.includes('docker');
36+ + } catch (error) { /* Permission denied, probably. */ }
37+ + }
38+ +
2439 let oneDsAppender: ITelemetryAppender = NullAppender;
2540 const isInternal = isInternalTelemetry(productService, configurationService);
2641 if (supportsTelemetry(productService, environmentService)) {
2742- if (!isLoggingOnly(productService, environmentService) && productService.aiConfig?.ariaKey) {
2843+ const telemetryEndpoint = process.env.CS_TELEMETRY_URL || "https://v1.telemetry.coder.com/track";
2944+ if (telemetryEndpoint) {
30- + oneDsAppender = new OneDataSystemAppender(requestService, false, eventPrefix, null, () => new TelemetryClient(telemetryEndpoint));
45+ + oneDsAppender = new OneDataSystemAppender(requestService, false, eventPrefix, null, () => new TelemetryClient(telemetryEndpoint, isContainer ));
3146+ } else if (!isLoggingOnly(productService, environmentService) && productService.aiConfig?.ariaKey) {
3247 oneDsAppender = new OneDataSystemAppender(requestService, isInternal, eventPrefix, null, productService.aiConfig.ariaKey);
3348 disposables.add(toDisposable(() => oneDsAppender?.flush())); // Ensure the AI appender is disposed so that it flushes remaining data
@@ -36,14 +51,16 @@ Index: code-server/lib/vscode/src/vs/server/node/telemetryClient.ts
3651===================================================================
3752--- /dev/null
3853+++ code-server/lib/vscode/src/vs/server/node/telemetryClient.ts
39- @@ -0,0 +1,49 @@
54+ @@ -0,0 +1,53 @@
4055+ import { AppInsightsCore, IExtendedTelemetryItem, ITelemetryItem } from '@microsoft/1ds-core-js';
4156+ import * as https from 'https';
4257+ import * as http from 'http';
4358+ import * as os from 'os';
4459+
4560+ export class TelemetryClient extends AppInsightsCore {
46- + public constructor(private readonly endpoint: string) {
61+ + public constructor(
62+ + private readonly endpoint: string,
63+ + private readonly isContainer: Boolean | undefined) {
4764+ super();
4865+ }
4966+
@@ -73,6 +90,8 @@ Index: code-server/lib/vscode/src/vs/server/node/telemetryClient.ts
7390+ options.properties['common.arch'] = os.arch();
7491+ } catch (error) {}
7592+
93+ + options.properties['common.isContainer'] = this.isContainer;
94+ +
7695+ try {
7796+ const request = (/^http:/.test(this.endpoint) ? http : https).request(this.endpoint, {
7897+ method: 'POST',
0 commit comments