A minimal observability stack

Observability tooling has a gravity problem. Every component you add is easy to justify in isolation and hard to justify in aggregate, and six months later you are maintaining a distributed system whose only job is to tell you whether your distributed system is working.

For anything up to a few dozen hosts, three components cover almost everything:

What I actually run

node_exporter on every box, Prometheus scraping every fifteen seconds, Loki for logs, Grafana in front. That is four processes and about 300 MB of RSS for a five-node setup, which is less than the JVM heap of some agents I have been asked to install.

scrape_configs:
  - job_name: node
    static_configs:
      - targets:
          - 10.0.0.11:9100
          - 10.0.0.12:9100
          - 10.0.0.13:9100
    relabel_configs:
      - source_labels: [__address__]
        regex: '([^:]+):.*'
        target_label: instance

The four alerts worth having

Alerting is where minimalism pays off fastest. Every alert you cannot act on is a page you will learn to ignore. I keep four:

AlertConditionWhy
Disk fillingpredict_linear(node_filesystem_avail[6h], 86400) < 0Gives a day of warning instead of an hour
Certificate expiry< 14 days remainingRenewal failures are silent until they are not
Target downup == 0 for 5mThe only alert that catches everything at once
Memory pressureavailable < 8% for 10mOOM killer arrives without warning otherwise

Everything else goes on the dashboard and nobody gets woken up for it. If a condition is worth a page, it is worth writing down what the responder should do. If you cannot write that sentence, it is not an alert — it is a graph.

Retention

Thirty days of metrics, seven days of logs, both on the same disk. People ask for a year and then look at the last six hours. If you need a year, you need it for a specific question, and that question deserves its own pipeline rather than a blanket retention policy that quietly fills the disk.

The dashboard that gets used is the one with four panels, not the one with forty.

What I deliberately skip

No tracing. No service mesh. No anomaly detection. No hosted APM. Each of these is correct for some scale, and none of them is correct for five nodes where the failure modes are already known. The value of the small stack is not that it is cheap — it is that when something breaks, the tooling is not one of the suspects.

If the setup ever outgrows this, the migration is a config change, not a rewrite. That is the point of keeping it small: you get to choose when to grow.