Compare commits

..

3 Commits

Author SHA1 Message Date
Asher a73549539b
Cache unchanging telemetry data
Might make sense to cache the rest as well, and evict from the cache
periodically.  For now this is enough to fix a hang I often see in our
deployment of Coder.  Might only be surfacing now because new telemetry
calls were added to startup.
2024-06-12 15:09:45 -08:00
Asher e7ca9cd6ac
Fix changelog heading indentation 2024-06-12 13:05:41 -08:00
Asher 9da9f2029c
v4.90.0 2024-06-12 13:03:51 -08:00
2 changed files with 62 additions and 37 deletions

View File

@ -24,12 +24,21 @@ Code v99.99.999
Code v1.90.0 Code v1.90.0
## Changed ### Fixed
- Cache a call to get CPU information used in telemetry that could result in a
lack responsiveness if it was particularly slow.
## [4.90.0](https://github.com/coder/code-server/releases/tag/v4.90.0) - 2024-06-11
Code v1.90.0
### Changed
- Updated to Code 1.90.0. - Updated to Code 1.90.0.
- Updated Node to 20.11.1. - Updated Node to 20.11.1.
## Added ### Added
- Send contents to the clipboard in the integrated terminal by piping to - Send contents to the clipboard in the integrated terminal by piping to
`code-server --stdin-to-clipboard` or `code-server -c`. `code-server --stdin-to-clipboard` or `code-server -c`.
@ -45,7 +54,7 @@ Code v1.90.0
Code v1.89.1 Code v1.89.1
## Changed ### Changed
- Updated to Code 1.89.1. - Updated to Code 1.89.1.
@ -53,7 +62,7 @@ Code v1.89.1
Code v1.89.0 Code v1.89.0
## Changed ### Changed
- Updated to Code 1.89.0. - Updated to Code 1.89.0.
@ -61,7 +70,7 @@ Code v1.89.0
Code v1.88.1 Code v1.88.1
## Changed ### Changed
- Updated to Code 1.88.1. - Updated to Code 1.88.1.
@ -69,12 +78,12 @@ Code v1.88.1
Code v1.88.0 Code v1.88.0
## Changed ### Changed
- Updated to Code 1.88.0. - Updated to Code 1.88.0.
- Updated Node to 18.18.2. - Updated Node to 18.18.2.
## Fixed ### Fixed
- Fix masking the exit code when failing to install extensions on the command - Fix masking the exit code when failing to install extensions on the command
line outside the integrated terminal. Installing extensions inside the line outside the integrated terminal. Installing extensions inside the
@ -84,7 +93,7 @@ Code v1.88.0
Code v1.87.2 Code v1.87.2
## Changed ### Changed
- Updated to Code 1.87.2. - Updated to Code 1.87.2.
- Enable keep-alive for proxy agent. - Enable keep-alive for proxy agent.
@ -93,7 +102,7 @@ Code v1.87.2
Code v1.87.0 Code v1.87.0
## Changed ### Changed
- Updated to Code 1.87.0. - Updated to Code 1.87.0.
@ -101,7 +110,7 @@ Code v1.87.0
Code v1.86.2 Code v1.86.2
## Changed ### Changed
- Updated to Code 1.86.2. - Updated to Code 1.86.2.
@ -109,12 +118,12 @@ Code v1.86.2
Code v1.86.1 Code v1.86.1
## Changed ### Changed
- Updated to Code 1.86.1. - Updated to Code 1.86.1.
- Updated to Node 18.17.1. - Updated to Node 18.17.1.
## Added ### Added
- Docker images for Fedora and openSUSE. - Docker images for Fedora and openSUSE.
@ -122,7 +131,7 @@ Code v1.86.1
Code v1.86.0 Code v1.86.0
## Changed ### Changed
- Updated to Code 1.86.0. - Updated to Code 1.86.0.
@ -130,11 +139,11 @@ Code v1.86.0
Code v1.85.2 Code v1.85.2
## Changed ### Changed
- Updated to Code 1.85.2. - Updated to Code 1.85.2.
## Fixed ### Fixed
- Query variables are no longer double-encoded when going over the path proxy. - Query variables are no longer double-encoded when going over the path proxy.

View File

@ -50,50 +50,66 @@ Index: code-server/lib/vscode/src/vs/server/node/telemetryClient.ts
=================================================================== ===================================================================
--- /dev/null --- /dev/null
+++ code-server/lib/vscode/src/vs/server/node/telemetryClient.ts +++ code-server/lib/vscode/src/vs/server/node/telemetryClient.ts
@@ -0,0 +1,55 @@ @@ -0,0 +1,71 @@
+import { AppInsightsCore, IExtendedTelemetryItem, ITelemetryItem } from '@microsoft/1ds-core-js'; +import { AppInsightsCore, IExtendedTelemetryItem, ITelemetryItem } from '@microsoft/1ds-core-js';
+import * as https from 'https'; +import * as https from 'https';
+import * as http from 'http'; +import * as http from 'http';
+import * as os from 'os'; +import * as os from 'os';
+ +
+interface SystemInfo {
+ measurements: Record<string, number | undefined>;
+ properties: Record<string, string | boolean | null | undefined>;
+}
+
+export class TelemetryClient extends AppInsightsCore { +export class TelemetryClient extends AppInsightsCore {
+ private readonly systemInfo: SystemInfo = {
+ measurements: {},
+ properties: {},
+ };
+
+ public constructor( + public constructor(
+ private readonly endpoint: string, + private readonly endpoint: string,
+ private readonly machineId: string, + machineId: string,
+ private readonly isContainer: Boolean | undefined) { + isContainer: boolean | undefined) {
+ super(); + super();
+
+ // os.cpus() can take a very long time sometimes (personally I see 1-2
+ // seconds in a Coder workspace). This adds up significantly, especially
+ // when many telemetry requests are sent during startup, which can cause
+ // connection timeouts. Try to cache as much as we can.
+ try {
+ const cpus = os.cpus();
+ this.systemInfo.measurements.cores = cpus.length;
+ this.systemInfo.properties['common.cpuModel'] = cpus[0].model;
+ } catch (error) {}
+
+ try {
+ this.systemInfo.properties['common.shell'] = os.userInfo().shell;
+ this.systemInfo.properties['common.release'] = os.release();
+ this.systemInfo.properties['common.arch'] = os.arch();
+ } catch (error) {}
+
+ this.systemInfo.properties['common.remoteMachineId'] = machineId;
+ this.systemInfo.properties['common.isContainer'] = isContainer;
+ } + }
+ +
+ public override track(item: IExtendedTelemetryItem | ITelemetryItem): void { + public override track(item: IExtendedTelemetryItem | ITelemetryItem): void {
+ const options = item.baseData || {} + const options = item.baseData || {}
+ if (!options.properties) { + options.measurements = {
+ options.properties = {}; + ...(options.measurements || {}),
+ ...this.systemInfo.measurements,
+ } + }
+ if (!options.measurements) { + options.properties = {
+ options.measurements = {}; + ...(options.properties || {}),
+ ...this.systemInfo.properties,
+ } + }
+ +
+ try { + try {
+ const cpus = os.cpus();
+ options.measurements.cores = cpus.length;
+ options.properties['common.cpuModel'] = cpus[0].model;
+ } catch (error) {}
+
+ try {
+ options.measurements.memoryFree = os.freemem(); + options.measurements.memoryFree = os.freemem();
+ options.measurements.memoryTotal = os.totalmem(); + options.measurements.memoryTotal = os.totalmem();
+ } catch (error) {} + } catch (error) {}
+ +
+ try { + try {
+ options.properties['common.shell'] = os.userInfo().shell;
+ options.properties['common.release'] = os.release();
+ options.properties['common.arch'] = os.arch();
+ } catch (error) {}
+
+ options.properties['common.remoteMachineId'] = this.machineId;
+ options.properties['common.isContainer'] = this.isContainer;
+
+ try {
+ const request = (/^http:/.test(this.endpoint) ? http : https).request(this.endpoint, { + const request = (/^http:/.test(this.endpoint) ? http : https).request(this.endpoint, {
+ method: 'POST', + method: 'POST',
+ headers: { + headers: {