@alwaysmeticulous/remote-replay-launcher 2.200.0 → 2.201.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/resource-tracker.d.ts +11 -0
- package/dist/resource-tracker.js +76 -0
- package/dist/resource-tracker.js.map +1 -0
- package/package.json +6 -5
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@ const client_1 = require("@alwaysmeticulous/client");
|
|
|
8
8
|
const common_1 = require("@alwaysmeticulous/common");
|
|
9
9
|
const tunnels_client_1 = require("@alwaysmeticulous/tunnels-client");
|
|
10
10
|
const loglevel_1 = __importDefault(require("loglevel"));
|
|
11
|
+
const resource_tracker_1 = require("./resource-tracker");
|
|
11
12
|
const url_utils_1 = require("./url.utils");
|
|
12
13
|
const POLL_LOCK_INTERVAL_MS = 5000; // 5 seconds
|
|
13
14
|
const PROGRESS_UPDATE_INTERVAL_MS = 5000; // 5 seconds
|
|
@@ -87,6 +88,7 @@ const executeRemoteTestRun = async ({ apiToken: apiToken_, appUrl, commitSha, se
|
|
|
87
88
|
testRunCompleted.resolve(completedTestRun);
|
|
88
89
|
};
|
|
89
90
|
// Poll every few seconds for progress updates and exit when the test run is completed
|
|
91
|
+
const resourceTracker = new resource_tracker_1.ResourceTracker(logger, testRun);
|
|
90
92
|
progressUpdateInterval = setInterval(async () => {
|
|
91
93
|
const updatedTestRun = await (0, client_1.getTestRun)({ client, testRunId: testRun.id });
|
|
92
94
|
onProgressUpdate === null || onProgressUpdate === void 0 ? void 0 : onProgressUpdate(updatedTestRun);
|
|
@@ -98,6 +100,7 @@ const executeRemoteTestRun = async ({ apiToken: apiToken_, appUrl, commitSha, se
|
|
|
98
100
|
logger.info(`Retrying test run... (status is now ${updatedTestRun.status})`);
|
|
99
101
|
startedWaitingForRetryAt = undefined;
|
|
100
102
|
}
|
|
103
|
+
resourceTracker.checkUsage();
|
|
101
104
|
}, PROGRESS_UPDATE_INTERVAL_MS);
|
|
102
105
|
const completedTestRun = await testRunCompleted.promise;
|
|
103
106
|
const tunnelUnlocked = (0, common_1.defer)();
|
|
@@ -106,6 +109,7 @@ const executeRemoteTestRun = async ({ apiToken: apiToken_, appUrl, commitSha, se
|
|
|
106
109
|
const isLocked = await (0, client_1.getIsLocked)({ client, deploymentId });
|
|
107
110
|
if (isLocked) {
|
|
108
111
|
onTunnelStillLocked === null || onTunnelStillLocked === void 0 ? void 0 : onTunnelStillLocked();
|
|
112
|
+
resourceTracker.checkUsage();
|
|
109
113
|
return false;
|
|
110
114
|
}
|
|
111
115
|
tunnelUnlocked.resolve();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,qDAQkC;AAClC,qDAAyE;AACzE,qEAA+D;AAC/D,wDAA2B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TestRun } from "@alwaysmeticulous/client";
|
|
2
|
+
import { Logger } from "loglevel";
|
|
3
|
+
export declare class ResourceTracker {
|
|
4
|
+
private previousCpuUsage;
|
|
5
|
+
private haveLoggedWarning;
|
|
6
|
+
private readonly logger;
|
|
7
|
+
private readonly testRun;
|
|
8
|
+
constructor(logger: Logger, testRun: TestRun);
|
|
9
|
+
checkUsage(): void;
|
|
10
|
+
private computeCpuUsage;
|
|
11
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.ResourceTracker = void 0;
|
|
30
|
+
const os_1 = __importDefault(require("os"));
|
|
31
|
+
const Sentry = __importStar(require("@sentry/node"));
|
|
32
|
+
class ResourceTracker {
|
|
33
|
+
constructor(logger, testRun) {
|
|
34
|
+
this.haveLoggedWarning = false;
|
|
35
|
+
this.previousCpuUsage = this.computeCpuUsage();
|
|
36
|
+
this.logger = logger;
|
|
37
|
+
this.testRun = testRun;
|
|
38
|
+
}
|
|
39
|
+
checkUsage() {
|
|
40
|
+
if (this.haveLoggedWarning) {
|
|
41
|
+
// We only want to log a warning once, so we can stop tracking usage once we've warned.
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const currentCpuUsage = this.computeCpuUsage();
|
|
45
|
+
const activeSinceLastCall = currentCpuUsage.active - this.previousCpuUsage.active;
|
|
46
|
+
const idleSinceLastCall = currentCpuUsage.idle - this.previousCpuUsage.idle;
|
|
47
|
+
const cpuUsagePercentage = (activeSinceLastCall / (activeSinceLastCall + idleSinceLastCall)) * 100;
|
|
48
|
+
const memoryUsagePercentage = ((os_1.default.totalmem() - os_1.default.freemem()) / os_1.default.totalmem()) * 100;
|
|
49
|
+
if (cpuUsagePercentage > 80 || memoryUsagePercentage > 80) {
|
|
50
|
+
this.logger.warn(`
|
|
51
|
+
Detected that there may be resource contention on the machine (${cpuUsagePercentage.toFixed()}% CPU usage, ${memoryUsagePercentage.toFixed()}% memory usage).
|
|
52
|
+
Heavy load may result in network requests not being processed and lead to flaky tests.
|
|
53
|
+
We recommend running tests on a machine with more resources.
|
|
54
|
+
`);
|
|
55
|
+
Sentry.captureMessage("Detected resource contention on tunnel machine", {
|
|
56
|
+
level: "warning",
|
|
57
|
+
extra: {
|
|
58
|
+
cpuUsagePercentage,
|
|
59
|
+
memoryUsagePercentage,
|
|
60
|
+
testRunId: this.testRun.id,
|
|
61
|
+
projectId: this.testRun.project.id,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
this.haveLoggedWarning = true;
|
|
65
|
+
}
|
|
66
|
+
this.previousCpuUsage = currentCpuUsage;
|
|
67
|
+
}
|
|
68
|
+
computeCpuUsage() {
|
|
69
|
+
return os_1.default.cpus().reduce((acc, cpu) => ({
|
|
70
|
+
active: acc.active + cpu.times.user + cpu.times.nice + cpu.times.sys,
|
|
71
|
+
idle: acc.idle + cpu.times.idle,
|
|
72
|
+
}), { active: 0, idle: 0 });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.ResourceTracker = ResourceTracker;
|
|
76
|
+
//# sourceMappingURL=resource-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-tracker.js","sourceRoot":"","sources":["../src/resource-tracker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAoB;AAEpB,qDAAuC;AAGvC,MAAa,eAAe;IAM1B,YAAY,MAAc,EAAE,OAAgB;QAJpC,sBAAiB,GAAY,KAAK,CAAC;QAKzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEM,UAAU;QACf,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,uFAAuF;YACvF,OAAO;SACR;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,mBAAmB,GACvB,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QACxD,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAC5E,MAAM,kBAAkB,GACtB,CAAC,mBAAmB,GAAG,CAAC,mBAAmB,GAAG,iBAAiB,CAAC,CAAC,GAAG,GAAG,CAAC;QAC1E,MAAM,qBAAqB,GACzB,CAAC,CAAC,YAAE,CAAC,QAAQ,EAAE,GAAG,YAAE,CAAC,OAAO,EAAE,CAAC,GAAG,YAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC;QAEzD,IAAI,kBAAkB,GAAG,EAAE,IAAI,qBAAqB,GAAG,EAAE,EAAE;YACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CACd;2EACmE,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,qBAAqB,CAAC,OAAO,EAAE;;;WAG3I,CACJ,CAAC;YACF,MAAM,CAAC,cAAc,CAAC,gDAAgD,EAAE;gBACtE,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE;oBACL,kBAAkB;oBAClB,qBAAqB;oBACrB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;oBAC1B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;iBACnC;aACF,CAAC,CAAC;YACH,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;SAC/B;QAED,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;IAC1C,CAAC;IAEO,eAAe;QACrB,OAAO,YAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CACrB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG;YACpE,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI;SAChC,CAAC,EACF,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CACvB,CAAC;IACJ,CAAC;CACF;AA3DD,0CA2DC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwaysmeticulous/remote-replay-launcher",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.201.0",
|
|
4
4
|
"description": "Executes a remote replay on Meticulous' infrastructure",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -20,9 +20,10 @@
|
|
|
20
20
|
"test": "jest --passWithNoTests"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@alwaysmeticulous/client": "^2.
|
|
24
|
-
"@alwaysmeticulous/common": "^2.
|
|
25
|
-
"@alwaysmeticulous/tunnels-client": "^2.
|
|
23
|
+
"@alwaysmeticulous/client": "^2.201.0",
|
|
24
|
+
"@alwaysmeticulous/common": "^2.201.0",
|
|
25
|
+
"@alwaysmeticulous/tunnels-client": "^2.201.0",
|
|
26
|
+
"@sentry/node": "^8.33.1",
|
|
26
27
|
"loglevel": "^1.8.0"
|
|
27
28
|
},
|
|
28
29
|
"author": {
|
|
@@ -45,5 +46,5 @@
|
|
|
45
46
|
"jest": {
|
|
46
47
|
"preset": "../../jest.config.js"
|
|
47
48
|
},
|
|
48
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "febc97c342ee826171aff37a12df09e2a70a12bd"
|
|
49
50
|
}
|