Ask a team how they deploy, and you'll usually get one answer: "we use Docker," or "it's just a systemd service," or "it runs under PM2." Ask what's actually running on the box, and the answer is almost always messier — a mix of all three, accumulated one decision at a time.
The database runs as a systemd-managed package because that's how the Linux distro ships it. The main app is containerized because that's what the team standardized on last year. And the background worker some engineer needed "just to test something" is still running under PM2, eighteen months later, because it never broke.
Why this happens to almost everyone
Nobody plans this. It's the natural result of a team growing over time, adopting new tools without retiring old ones, and installing standalone software (Postgres, Redis, RabbitMQ, nginx) the way its own documentation recommends — usually a system package, managed by systemd, not a container.
Node.js teams add a second layer: PM2 is the fastest way to keep a Node process alive and restart it on crash, so it becomes the default answer for "how do I run this script forever" long before anyone's thought about monitoring it.
The monitoring gap this creates
Most monitoring setups are built around one of these three models, not all of them. A Docker-focused tool sees your containers and nothing else. A systemd checklist only watches the units someone remembered to add to a config file. PM2 processes, run by a developer on a whim, often aren't monitored by anything at all — they just quietly restart themselves when they crash, with nobody counting how often.
The result: the one service that's actually failing is very often the one nothing is watching, because it doesn't fit whichever single model the monitoring tool assumed.
What actually covers all three
- Docker — every running container is inherently something a human deliberately started. Auto-discovering all of them, with no allowlist, is safe and complete.
- systemd — the tricky one. systemd mixes OS infrastructure (cron, network managers) with real applications in one flat namespace. The fix is a curated checklist of well-known standalone software (nginx, Postgres, Redis, RabbitMQ, and similar), checked automatically but only reported if it's genuinely installed — plus whatever else an operator explicitly names.
- PM2 — same trust model as Docker. Every PM2-managed process is a deliberate application, never OS noise, so it can be auto-discovered with zero configuration too.
Covering all three isn't a nice-to-have feature — it's the difference between a monitoring tool that watches your infrastructure and one that watches whatever fraction of it happens to match its assumptions.
HiSRE auto-discovers Docker containers, systemd services, and PM2 processes out of the box — no allowlists, no per-service config.
Try HiSRE Free