microSRE

Know when your server needs you.
Linux health checks at your cadence - no Prometheus, Grafana, or metrics agent.

# Install in one command
curl -fsSL https://microsre.io/install.sh | bash

How it works ↓

The dashboard problem

"We asked our team: when was the last time a dashboard helped you fix an incident?"

The answer was silence. Everyone looked at logs.

We had built dashboards for every new service - Prometheus, Grafana, the whole stack. Years later, not a single engineer on the team used them during an outage. They grepped logs, checked process state, traced what happened around the error. The dashboards were there because "that is what monitoring looks like," not because they solved problems.

microSRE is built for people who already know this. Alerts when something is wrong. The tools you already use to investigate. No graphs to scroll, no panels to configure, no compliance theater.

How it works

microSRE reads /proc directly - the same kernel interface that ps, top, and iostat use, but without the fragile parsing and version drift. It samples CPU, memory, disk I/O, and network counters, then diffs them to produce rates.

What "needs you" means: for every resource - CPU, memory, disk, network - microSRE reports utilization, saturation, and errors, the USE-method taxonomy, from whatever the kernel exposes. CPU: utilization and run queue. Memory: utilization, pressure-stall averages, and OOM kills. Disk: utilization, await, and queue depth. Network: throughput, TCP retransmits, and listen-backlog overflows. Thresholds are yours to set; the signals are the kernel's. The default 60-second cadence nods to the classic 60-second Linux checklist - the same discipline, automated and always on. Your schedule: 10-second checks when a one-minute average would hide the spikes you're trying to catch.

It also watches application logs you specify, matching each line against error patterns. When error volume crosses your threshold in a time window, it alerts. No SDK to install, no code to instrument, no vendor to depend on. And it measures itself: every tick reports its own collection time (collect.*_seconds) and its footprint - CPU time, memory, storage reads caused, wakeups (self.*) - so its cost is checkable on your machine, not promised in a README.

Works without an account: alerts go straight from your machine to Slack, Discord, or Telegram - or any URL that accepts a JSON POST - with no microSRE server in the path. That channel is the record. No webhook configured? Alerts still land in the system log. The hosted fleet view is opt-in; everything on this page works standalone, with nothing to install alongside - no agent, no collector, no OpenTelemetry. No dashboards. No data-source sprawl. No lock-in. Your metrics, your logs, your machine.

📊
CPU & memory

/proc/stat, /proc/meminfo, /proc/pressure (some + full averages)

💾
Disk I/O

/proc/diskstats - utilization, await, queue depth; space via statvfs

🌐
Network

/proc/net/dev, /proc/net/snmp, /proc/net/netstat - throughput, retransmits, listen overflows

📜
App logs

Pattern match, rate threshold, alert

What an alert looks like

This is the shipped default template, rendered with example values - every alert carries the command that tells you what to check next:

🔌 Listen backlog overflow on web-01

*2026-10-16 09:14:03*

14 listen overflow(s), 3 dropped connection(s) during the last check.

Check the backlog: `ss -lnt` (Send-Q vs Recv-Q), `nstat | grep -i listen`

Why /proc directly

Standard tools are built for human eyes, not automation. Each one re-scans the same kernel counters, reformats them for a terminal, and truncates whatever didn't fit a readable column. Reading /proc directly means one scan instead of many, trivial parsing instead of format-string archaeology, and the full field - nothing lost in translation to a human-friendly layout.

Reading /proc directly gives you:

To be fair, /proc drifts too: fields appear and change meaning across kernel versions - PSI itself only landed in 4.20, and some counters mean different things on different filesystems. So every signal microSRE reports is traced to the exact file and field it comes from, in the documentation. No counter is named on faith.

Why logs directly

Log scanning extends the same philosophy: observe applications from the outside, without modifying them. And logging was solved decades ago: applications print to stdout, the runtime stores it on disk, and when things break you read it - with grep once there got to be too much of it. What changed since is volume, and the honest answer to volume was better search, not surgery on the application. Instead we got JSON scaffolding wrapped around every line and an SDK in every repo. Your logs already contain the errors; you just have to alert on them. microSRE reads them where they land and matches lines the way you always have - a pattern, a threshold. No code changes. No SDK to break, no network dependency to fail, no vendor to disappear. Keep them local, archive them, or ship them to centralized storage - the pattern alerts either way.

Every hop between an error and a person ships loss: the reporting SDK drops when the service is down, the collector crashloops, the metrics agent misses a pod that dies between scrapes, the telemetry buffer grows through the outage and dies with the process before reaching the vendor. Different failure, same shape - errors vanish exactly when things are worst. The file on disk was written before the failure - it does not buffer, retry, or need the network at the moment everything is on fire. The disk is not invincible; it fails too. It just fails less often than everything we have stacked on top of it.

It's the observer that can't be blinded by the observed.

No hoarding

Most monitoring agents run a hoard-first pipeline: buffer every metric and every log line "just in case", then forward all of it to a remote store. microSRE does the opposite - it reads the source in place, acts on it, and keeps nothing beyond the current check. What to keep and for how long - logs local, archived, shipped, or sampled away - is your decision, not the agent's. (Traces are a different story: they answer questions metrics and logs structurally cannot, and shipping those is a reasonable choice. It is the ship-everything-by-default culture around metrics and logs we opt out of.)

Notifications get the same treatment. On-call tools keep their own log of every page, acknowledgment, and escalation - a second incident history, stored inside the vendor's system. For a large org that audit trail earns its keep. But the alert already landed in your chat, the discussion happened there, and that history is searchable, backed up, and yours. Replaying last night's pages should not require logging into another tool. Where a formal trail is genuinely needed, it should be an explicit opt-in - like shipping logs or adding dashboards - not a side effect of being paged.

The agent is free and open source (MIT), forever; a hosted fleet view and dead-man escalation are coming - see plans.

Prometheus-compatible, pipeline-free

Set prometheus_listen and the daemon serves every metric it checks at /metrics in Prometheus text exposition format - off by default, nothing listens until you ask. Each metric carries a comment naming the exact /proc file and field it came from. Point your own Prometheus (or anything that scrapes) at it - keep history, draw graphs, wire your own alerts - or just curl the endpoint and read the values: a text format you can see in a terminal is a format you can debug, and an observability tool that hides its own output is not very observable. We adopted the format, not the pipeline: no agent, no remote-write, no background shipper. Here are the metrics - everything downstream is your choice.

Across your fleet

Built for fleets of pets, not herds of cattle - the tens of servers you know by name, not thousands you don't.

The hosted view is optional - the standalone setup above is complete without it. Alerts route by failure domain, not severity: a sick host speaks for itself, so critical alerts are delivered by your machines, never through us. A dead host cannot speak - silence can only be observed from outside, and comparing against time or other machines is aggregation. The hosted service does only that, and you can lose it without losing your pages.

The fleet view is spare: every server's health in one place, longer history, alerting rules that span machines. Not another dashboard builder. No log lines or /proc dumps leave your machines; the hosted view receives only your metrics, your alert rules, and alert state.

Private beta includes:

Designed into the split, not bolted on: