MCPcopy
hub / github.com/browserless/browserless / readCpu

Method readCpu

src/monitoring.ts:225–259  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

223 }
224
225 protected async readCpu(): Promise<number | null> {
226 let usageNsContent: string;
227 let quotaContent: string;
228 let periodContent: string;
229 try {
230 [usageNsContent, quotaContent, periodContent] = await Promise.all([
231 readWithTimeout('/sys/fs/cgroup/cpu/cpuacct.usage', this.readFile),
232 readWithTimeout('/sys/fs/cgroup/cpu/cpu.cfs_quota_us', this.readFile),
233 readWithTimeout('/sys/fs/cgroup/cpu/cpu.cfs_period_us', this.readFile),
234 ]);
235 } catch (err) {
236 this.logOnce('cpu-read', err);
237 return null;
238 }
239
240 const usageNs = Number(usageNsContent.trim());
241 const cores = parseCpuV1Quota(quotaContent, periodContent);
242 if (!Number.isFinite(usageNs) || cores === null || cores <= 0) {
243 this.logOnce('cpu-parse', new Error('cgroup v1 cpu parse failed'));
244 return null;
245 }
246
247 const usageUsec = usageNs / 1000;
248 const timestamp = this.now();
249 const previous = this.lastSample;
250 this.lastSample = { usageUsec, timestamp };
251 if (!previous) return null;
252
253 const dWallMs = timestamp - previous.timestamp;
254 if (dWallMs <= 0) return null;
255 const dUsageUsec = usageUsec - previous.usageUsec;
256 if (dUsageUsec < 0) return null;
257
258 return dUsageUsec / (dWallMs * cores * 1000);
259 }
260
261 protected async readMemory(): Promise<number | null> {
262 let usageContent: string;

Callers 1

readMethod · 0.95

Calls 3

logOnceMethod · 0.95
readWithTimeoutFunction · 0.85
parseCpuV1QuotaFunction · 0.85

Tested by

no test coverage detected