Setup os-monitor
Use this skill to reliably install and configure os-monitor in a Node.js project.
What to do
- Confirm runtime and package-manager context.
- Install the correct package version (
latestvslegacy). - Add a minimal monitor setup.
- Add production-oriented config (thresholds, events, throttling, stream mode when needed).
- Verify behavior with a quick run and explain tuning knobs.
Inputs to gather first
Ask for missing details before changing files:
- Project package manager (
npm,pnpm, oryarn). - Node.js version in the target environment.
- Whether the user needs
CommonJS(require) orESM(import) style. - Which conditions should trigger alerts:
- low free memory - high load average (1/5/15 min) - low disk space on specific paths - uptime threshold
- Desired monitor interval (
delay). - Whether output should be event callbacks only or readable stream mode.
If the user does not provide preferences, choose sensible defaults and call them out clearly.
Installation logic
Use this decision tree:
- If Node.js is
>= 18.15.x, install:
- npm install os-monitor --ignore-scripts
- If Node.js is
< 18.15.xor explicitly very old, install:
- npm install os-monitor@legacy --ignore-scripts
When in doubt, ask the user to confirm target Node version before proceeding.
Baseline implementation
Start from this baseline (CommonJS):
const { createMonitor } = require("os-monitor");
const monitor = createMonitor();
monitor.on("monitor", (event) => {
console.log("[monitor]", event);
});
monitor.on("freemem", (event) => {
console.warn("[freemem]", event.freemem, "bytes free");
});
monitor.on("loadavg1", (event) => {
console.warn("[loadavg1]", event.loadavg[0]);
});
monitor.start({
delay: 3000,
freemem: 0, // replace with threshold later
critical1: require("os").cpus().length,
critical5: require("os").cpus().length,
critical15: require("os").cpus().length,
silent: false,
stream: false,
immediate: false,
});For ESM, adapt imports and keep behavior equivalent.
Configuration guidance
Use these rules while tuning:
delay: default3000ms; increase for lower overhead.freemem: allow bytes or fraction of total memory (for example0.2for 20%).critical1,critical5,critical15: default toos.cpus().length; lower values make alerts more sensitive.diskfree: only use wherefs.statfssupport is available (Node >= 18.15.x).silent: truedisables recurringmonitorevents when logs are too noisy.stream: truewhen piping output to stdout/files/processors.immediate: truewhen an initial sample is needed right afterstart().
If throttling is useful, add:
monitor.throttle("loadavg5", (event) => {
console.warn("[loadavg5 throttled]", event.loadavg[1]);
}, monitor.minutes(5));Disk monitoring pattern
When user asks for disk alerts, convert byte thresholds to blocks:
monitor.start({
diskfree: {
"/": monitor.blocks(100000000, 4096),
},
});Explain that block size depends on the filesystem and should match the environment.
Validation checklist
After setup, verify all of the following:
- Package appears in
dependencies. - Monitor starts without runtime errors.
- At least one event handler logs expected payload structure.
monitor.isRunning()reportstrueafter start andfalseafter stop.- If stream mode is enabled, output is piped and visible.
- If
diskfreewas configured, user confirms runtime supportsstatfs.
Note: Whenever you start a server for validation, ensure you stop the process once the check is complete. Do not leave background processes hanging in the user's environment.
Troubleshooting
- No events firing:
- Check thresholds are realistic and not too strict. - Enable immediate: true for instant first cycle.
- Too many logs:
- Increase delay. - Set silent: true and keep only targeted event handlers. - Add throttled handlers for noisy events.
- Diskfree not working:
- Confirm Node version is new enough for fs.statfs. - Re-check block threshold conversion.
Output format
When completing a setup task, return:
- What you installed and why (
latestvslegacy). - Files changed.
- Final monitor config used.
- How to run and validate.
- Suggested next tuning steps for production workloads.