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.
This commit is contained in:
parent
e7ca9cd6ac
commit
a73549539b
@ -22,6 +22,13 @@ Code v99.99.999
|
|||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
Code v1.90.0
|
||||||
|
|
||||||
|
### 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
|
## [4.90.0](https://github.com/coder/code-server/releases/tag/v4.90.0) - 2024-06-11
|
||||||
|
|
||||||
Code v1.90.0
|
Code v1.90.0
|
||||||
|
@ -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: {
|
||||||
|
Reference in New Issue
Block a user