@cocorograph/hub-agent 0.8.96 → 0.8.97
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/package.json +1 -1
- package/src/startup-metrics.mjs +28 -0
package/package.json
CHANGED
package/src/startup-metrics.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os from "node:os"
|
|
1
2
|
import { monitorEventLoopDelay, performance } from "node:perf_hooks"
|
|
2
3
|
|
|
3
4
|
// performance.now() はプロセス起動を原点とする単調時計。テストでは _setNowForTest で差し替える。
|
|
@@ -26,10 +27,19 @@ export function logPhaseTiming(logger, msg, fields, now = defaultNow) {
|
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
|
|
30
|
+
/**
|
|
31
|
+
* 起動直後の混み具合を 10/30/60 秒時点で 1 行ずつ出す。
|
|
32
|
+
* cpu_*_ms はプロセス起動からの累積 CPU 時間、load_avg_1m は端末全体の 1 分負荷平均。
|
|
33
|
+
* 経過時間に比べて自分の CPU 時間が小さく負荷平均が高ければ、端末上の他プロセスとの取り合い
|
|
34
|
+
* (起動直後の CLI 一斉起動など) を疑う手掛かりになる。ただし負荷平均は過去 1 分の平均で、
|
|
35
|
+
* 起動前の負荷も残るため、これだけで原因を断定しない (I/O 待ちでも自分の CPU 時間は小さい)。
|
|
36
|
+
*/
|
|
29
37
|
export function startEventLoopMetrics(logger, {
|
|
30
38
|
now = defaultNow,
|
|
31
39
|
monitor = monitorEventLoopDelay,
|
|
32
40
|
schedule = setTimeout,
|
|
41
|
+
cpuUsage = () => process.cpuUsage(),
|
|
42
|
+
loadAvg = () => os.loadavg(),
|
|
33
43
|
} = {}) {
|
|
34
44
|
const histogram = monitor({ resolution: 20 })
|
|
35
45
|
histogram.enable()
|
|
@@ -41,6 +51,7 @@ export function startEventLoopMetrics(logger, {
|
|
|
41
51
|
p50_ms: histogram.percentile(50) / 1e6,
|
|
42
52
|
p99_ms: histogram.percentile(99) / 1e6,
|
|
43
53
|
max_ms: histogram.max / 1e6,
|
|
54
|
+
...cpuFields(cpuUsage, loadAvg),
|
|
44
55
|
}, "startup event loop delay")
|
|
45
56
|
} catch {
|
|
46
57
|
// 計測ログの失敗は無視する
|
|
@@ -50,3 +61,20 @@ export function startEventLoopMetrics(logger, {
|
|
|
50
61
|
}, Math.max(0, deadline - now())).unref()
|
|
51
62
|
}
|
|
52
63
|
}
|
|
64
|
+
|
|
65
|
+
function cpuFields(cpuUsage, loadAvg) {
|
|
66
|
+
const fields = {}
|
|
67
|
+
try {
|
|
68
|
+
const { user, system } = cpuUsage()
|
|
69
|
+
fields.cpu_user_ms = user / 1000
|
|
70
|
+
fields.cpu_system_ms = system / 1000
|
|
71
|
+
} catch {
|
|
72
|
+
// CPU 時間が取れなくても遅延の記録は出す
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
fields.load_avg_1m = loadAvg()[0]
|
|
76
|
+
} catch {
|
|
77
|
+
// 同上
|
|
78
|
+
}
|
|
79
|
+
return fields
|
|
80
|
+
}
|