How Opservo works

Opservo installs a tiny read-only agent on your server, and every ~60 seconds it collects plain facts about the machine. Those facts are scored into a single 0–100 Health Score you can always trace back to the exact reason. This guide explains what we measure, how we measure it, and what every number means.

What Opservo watches for you

  • Performance — is the server keeping up, or are things about to feel slow?
  • Storage — will the disks run out of space, and are the drives themselves healthy?
  • Security — is the server locked down, and is anyone trying to break in?
  • Reliability — is anything crashing or restarting behind the scenes?
  • Maintenance — are updates, restarts and website certificates being kept up?
  • Network — can the server actually reach the internet properly?
  • Configuration — are the small settings right that cause big, confusing problems when wrong?

When something needs attention, Opservo tells you what it means and how to fix it in plain English — you never need to interpret a chart or open a terminal. The rest of this page is the detail, for whenever you want it.

The Health Score — how the number is built

The score is deterministic (the same facts always give the same number — no hidden AI, no time-of-day noise) and explainable (every point lost traces to a named rule). It’s built in four layers:

  1. Collectors gather facts (CPU %, is the firewall on, is a disk 96% full…). Facts only — never opinions.
  2. Rules turn a fact into a penalty when it crosses a threshold (e.g. disk >95% → −20).
  3. Each category starts at 100 and subtracts its penalties: score = 100 − Σ penalties (floored at 0).
  4. The overall score is a fixed-weight blend of the seven categories.

Category weights

Performance25%
Storage15%
Security20%
Reliability15%
Maintenance10%
Network10%
Configuration5%

Rating bands

100Perfect
95–99Excellent
90–94Very Good
80–89Good
70–79Fair
60–69Needs Attention
40–59Poor
0–39Critical

Example. A server with the firewall off (−20) and root SSH login allowed (−30) has a Security category of 100 − 50 = 50. At 20% weight that pulls the overall score down by 10 points — and the dashboard names exactly those two reasons.

Confidence, and why some checks read “n/a”

Every finding carries a confidence so you can trust it proportionally:

  • Definitive — a hard fact (“firewall is disabled”, “disk is 96% full”).
  • Likely — a strong but single-sample or derived signal (one CPU reading at 97%).
  • Heuristic — a pattern-based guess (“suspicious process”), shown as “worth checking”.

A check shows “n/a” when the agent genuinely can’t measure it on this machine — a probe that needs a physical disk on a cloud VM, or a config file the agent can’t read because it isn’t running as root. Missing data never lowers your score — that category simply scores from the checks it can see, and the panel shows a coverage indicator so it’s honest, not a false “all-good”. Hover any “n/a” to see exactly why.

Every check, what it means, and how we measure it

These are grouped by category. Each check shows what it means for your server; the exact technical source the agent reads lives behind “Technical details” at the bottom of each category — nothing is changed on your server unless you explicitly ask.

Performance

weight 25%

Is the server keeping up with its work right now — CPU, memory, and the pressure signals that precede a slowdown?

CheckWhat it meansPenalty
CPU utilizationThe processor is busy (≥90%) or saturated (≥95%).−8 / −15
Load vs coresMore work is queued than the CPUs can serve (load ≥ 2× cores).−10
IO waitThe CPU is stalling waiting on disk (>15%) — a storage bottleneck.−10
CPU stealThe hypervisor is taking cycles from this VM (>10%) — a noisy host.−8
Memory usageRAM is under pressure (≥85%) or nearly exhausted (≥95%, OOM risk).−8 / −15
Swap usageThe server is spilling to disk (>25%) or thrashing (>50%).−5 / −10
Memory-stall (PSI)Real time processes spent blocked waiting for memory (>10%).−8
CPU throttlingA cgroup is being CPU-capped (>5% of periods) — a container hitting its limit.−8
Disk latencyEach disk I/O is slow (>50 ms) on the busiest device.−8
File descriptorsOpen files are near the system limit (>80%).−6
Technical details — how each performance check is measured ▸
CPU utilizationSampled from the /proc/stat CPU counters between heartbeats.
Load vs coresKernel 1-minute load average ÷ CPU core count.
IO wait“iowait” slice of the /proc/stat CPU delta.
CPU steal“steal” slice of the /proc/stat CPU delta.
Memory usage/proc/meminfo (used ÷ total).
Swap usage/proc/meminfo swap used ÷ total.
Memory-stall (PSI)Linux Pressure-Stall Info: /proc/pressure/memory.
CPU throttlingcgroup cpu.stat throttled-periods delta.
Disk latency/proc/diskstats service-time delta.
File descriptors/proc/sys/fs/file-nr.

Storage

weight 15%

Will the disks last — space, inodes, and the physical health of the drives themselves?

CheckWhat it meansPenalty
Disk usageA filesystem is nearly full (>90%) or critical (>95%).−10 / −20
Projected fullA mount is trending toward 100% within days.−10
Min free spaceVery little absolute space remains on a data mount (<2 GiB).−8
Inode usageA filesystem is running out of inodes (>90%) — can’t create files even with space free.−15
SMART healthThe drive’s own self-assessment is WARN or FAIL.−15 / −35
SSD lifeThe SSD’s remaining write life is low (<20%).−10
Drive temperatureA drive is running hot (>60 °C).−8
RAID/array degradedA software RAID/ZFS/LVM array lost redundancy.−25
Mount failedA configured mount didn’t come up.−20
Read-only filesystemA real filesystem is mounted read-only.−20
Deleted-open filesSpace is held by deleted-but-still-open files (>2 GiB) — space that df can’t see.−8
Disk saturationThe busiest disk is doing I/O most of the time (>90% util).−8
Technical details — how each storage check is measured ▸
Disk usagestatfs on each real mount (like df).
Projected fullLinear projection over 48h of usage history.
Min free spaceSmallest free-bytes across data mounts ≥10 GiB.
Inode usagestatfs inode counts (df -i).
SMART healthsmartctl -H (needs smartmontools; physical disks only).
SSD lifesmartctl wear-level attribute.
Drive temperaturesmartctl temperature attribute.
RAID/array degradedmdadm / zpool status.
Mount failedsystemd .mount unit in failed state.
Read-only filesystem/proc/mounts flags.
Deleted-open filesScan of /proc/*/fd for deleted inodes.
Disk saturation/proc/diskstats busy-time delta.

Security

weight 20%

How locked-down the server is — no configuration required. Every finding is also actionable from the Security tab.

CheckWhat it meansPenalty
FirewallNo host firewall is active, so every open port is reachable.−20
Root SSH loginSSH allows logging in directly as root.−30
Password authenticationSSH accepts passwords (brute-forceable).−15
Empty passwordsSSH permits accounts with no password.−40
Weak ciphersSSH offers legacy/weak ciphers or MACs.−10
Failed SSH loginsActive brute-force pressure (>50/hr, or heavy >200/hr).−10 / −25
Brute-force guardBrute-force is happening but no fail2ban/sshguard is running.−10
Security updatesSecurity (CVE) patches are pending.−15
Auto security updatesThe OS won’t install security patches on its own.−5
Exposed database portsA database is reachable from the public internet.−15 ea (cap −30)
Public listening surfaceOther services are bound to all interfaces beyond web/SSH/DB.−2 ea (cap −8)
Passwordless sudoA sudoers rule grants root with no password (NOPASSWD).−10
Suspicious processesA process matches known-malicious patterns (heuristic).−25 (low confidence)
Technical details — how each security check is measured ▸
Firewallufw status / iptables INPUT policy.
Root SSH loginPermitRootLogin in sshd_config.
Password authenticationPasswordAuthentication in sshd_config.
Empty passwordsPermitEmptyPasswords in sshd_config.
Weak ciphersCiphers/MACs lines in sshd_config.
Failed SSH loginsCounts failures in the auth journal (last hour).
Brute-force guardsystemctl is-active fail2ban / sshguard / crowdsec.
Security updatesapt / dnf pending security count.
Auto security updatesunattended-upgrades config / dnf-automatic timer.
Exposed database portsListening sockets on 3306/5432/6379/27017 bound publicly.
Public listening surfaceListening sockets on 0.0.0.0/:: (from the network collector).
Passwordless sudoParse /etc/sudoers + /etc/sudoers.d (needs root).
Suspicious processesProcess name/path/CWD pattern match.

Reliability

weight 15%

Is anything crashing, flapping, or failing under the hood — services, the kernel, and the hardware.

CheckWhat it meansPenalty
Failed servicesA systemd/PM2 service is in a failed or dead state.−10 ea (cap −40)
Restart stormsA service is flapping (≥5 restarts).−10 ea
Container crash loopsA container is restarting repeatedly.−10 ea
OOM killsThe kernel killed a process for running out of memory.−10 ea (cap −30)
Kernel panicThe kernel hit a fatal fault this boot.−50
SegfaultsProcesses are crashing with segmentation faults.−5 ea (cap −10)
Filesystem remount ROThe kernel forced a filesystem read-only after I/O errors.−40
Hardware errors (MCE)Machine-check / hardware errors — failing CPU/RAM/PCIe.−15 ea (cap −40)
Hung tasksA task was blocked >120 s — an I/O stall or deadlock.−5 ea (cap −15)
Frequent rebootsThe server rebooted more than once in 24h (crash/flapping).−8 ea (cap −25)
Core dumpsCrashed programs left core dumps.−5 ea (cap −15)
Journal critical errorsAn elevated burst of critical-priority log entries (>10/boot).−8 (low confidence)
Technical details — how each reliability check is measured ▸
Failed servicessystemctl / PM2 status (maintenance units excluded).
Restart stormsUnit restart counter.
Container crash loopsDocker restart count / “restarting” state.
OOM killsKernel log (journalctl -k / dmesg) “Killed process”.
Kernel panicKernel log “kernel panic”.
SegfaultsKernel log “segfault / general protection fault”.
Filesystem remount ROKernel log “Remounting filesystem read-only”.
Hardware errors (MCE)Kernel log “Hardware Error / machine check”.
Hung tasksKernel log “blocked for more than N seconds”.
Frequent rebootsjournalctl --list-boots start times.
Core dumpscoredumpctl list / systemd-coredump spool.
Journal critical errorsjournalctl -p 2 -b count.

Maintenance

weight 10%

Housekeeping that quietly turns into an outage if ignored — patches, reboots, certificates, packages.

CheckWhat it meansPenalty
Reboot requiredA kernel/libc update needs a reboot to take effect.−10
Pending updatesGeneral package updates are available.−5
Security updatesSecurity patches pending (also scored under Security).−15
Certificate expiryA TLS certificate is expired or expiring soon (<30/<7 days).−5 / −10 / −15
Broken packagesThe package manager is in a half-configured state.−10
Orphaned packagesMany packages no longer have a source (>10).−3
Log rotationLog rotation is broken — logs can fill the disk.−5
Technical details — how each maintenance check is measured ▸
Reboot required/var/run/reboot-required (Debian) or equivalent.
Pending updatesapt / dnf pending count.
Security updatesapt / dnf pending security count.
Certificate expiryLive TLS handshake per detected vhost.
Broken packagesdpkg / rpm consistency check.
Orphaned packagesPackage-manager orphan query.
Log rotationlogrotate config/state check.

Network

weight 10%

Can the server actually reach the world — link, gateway, DNS, and packet health.

CheckWhat it meansPenalty
Packet lossThe gateway is dropping pings (>5%).−10
Interface downThe primary network interface is down.−15
DNS resolutionThe server can’t resolve names.−10
Gateway unreachableThe default gateway doesn’t answer.−12
Interface errorsThe NIC is logging RX/TX errors or drops.−8
Technical details — how each network check is measured ▸
Packet lossICMP ping to the default gateway.
Interface down/sys/class/net operstate.
DNS resolutionLive resolver lookup.
Gateway unreachableICMP ping / ARP to the gateway.
Interface errors/sys/class/net error counters (per-heartbeat delta).

Configuration

weight 5%

Small settings that cause big, confusing problems when wrong.

CheckWhat it meansPenalty
Time synchronizedThe clock is not being kept in sync (breaks TLS, logs, tokens).−10
Swap configuredNo swap is configured — a memory spike means instant OOM.−5
Technical details — how each configuration check is measured ▸
Time synchronizedtimedatectl / NTP sync state.
Swap configured/proc/swaps.

Taking action — from the panel, not SSH

Every finding can be resolved without leaving the dashboard, three ways:

  • Fix with AI — the AI diagnoses the specific problem and runs the fix, showing you every command first.
  • Fix manually — the exact commands are shown to copy/run yourself over SSH (or run in-place if remote actions are on).
  • One-click controls — the Security tab has toggles for Firewall, Root login, Brute-force guard (fail2ban) and Auto security updates, plus “Block this IP” for attackers — each with a plain-English confirm dialog.

Running anything requires Remote actions to be turned on for that server (see below). Until then, Opservo is strictly read-only and only shows you the fix.

The agent, installing, and updates

The agent is a single <10 MB Go binary. It only makes outbound HTTPS calls — there are no inbound ports to open — and every heartbeat is signed (HMAC) so the cloud can’t be spoofed.

  • Install — “Add New Server” hands you a one-line command (curl … | sudo … bash). First data appears in under 5 minutes.
  • Auto-update — agents check for a new build hourly and update themselves (download → verify checksum → swap → restart). New checks roll out on their own.
  • Update from the panel — when a server is behind, an amber “Update agent” button appears in the server header; one click pushes the update (or shows the SSH command if remote actions are off).
  • Reinstall — the ⋯ menu → “Re-install / upgrade agent…” gives a command that reuses the server’s credentials (no duplicate server).
  • Run as root — a few checks (SSH hardening, sudoers, core dumps, SMART) can only be read as root; otherwise they show “n/a”, never a false pass.

Privacy & safety

  • Read-only by default. The agent never runs a command unless you explicitly enable Remote actions for that specific server — and even then every command is confirmed and written to a permanent audit log.
  • Opt-in per server. A fleet-wide agent update never makes a server remotely executable; each box is enabled individually.
  • No inbound ports. Commands are pulled over the agent’s existing outbound HTTPS and HMAC-signed — the cloud never connects in.
  • Data minimisation. Raw log lines are never stored; IPs/usernames in security findings are masked at the agent before they leave the box.

Scores are only comparable within a scoring version. Every rule, threshold and penalty above is enforced in code and unit-tested — the same facts always produce the same score.