Monitoring#

Monitoring is the production-time half of observability, the running operation of watching systems, surfacing change, and paging the operator when a fault crosses a threshold. The instrumentation layer (Instrumentation) produces the telemetry; this layer collects, stores, displays, alerts on, and routes it.

For the operator monitoring is two things at once. On defended estates it is the early-warning network for everything from disk-full to lateral movement. On operator-built capability it is the only honest view of whether the kit on target is doing what it was sent to do, with how much budget and at what cost.

Pillars#

The three signals plus the responses that close the loop.

Signal

Use

Metrics

Numerical time series for rates, errors, latency, saturation. Cheap to store, fast to query, the substrate every alert rule sits on.

Logs

Discrete event records. Where the operator goes when a metric tells them something is wrong and the next question is “what happened”.

Traces

Causal records across services. Where the operator goes when “what happened” spans more than one process.

Events / change feed

Deployments, config changes, feature flags, certificate rotations. The chronology behind every “what changed at 02:14”.

Alerts

Rules that turn signal into a page. Page on symptoms (user-facing), not causes.

Dashboards

Pre-built views for the operator on shift. Should be readable at 03:00 without a Slack thread.

The Stack#

A typical operator-facing monitoring stack assembles four layers. The components named below are the most common; substitutes exist for every slot.

        flowchart LR
  subgraph src[Sources]
    direction TB
    APP[Workload]
    HOST[Host / Node]
    NET[Network / Cloud]
  end
  subgraph collect[Collection]
    OTEL[OpenTelemetry Collector]
    FB[Fluent Bit / Vector]
  end
  subgraph storage[Storage]
    PROM[(Prometheus / Mimir / VictoriaMetrics / Thanos)]
    LOGS[(Loki / Elasticsearch / OpenSearch / ClickHouse)]
    TRACE[(Tempo / Jaeger / Honeycomb)]
  end
  subgraph view[View + Act]
    GRAF[Grafana]
    ALERT[Alertmanager]
    PAGE[PagerDuty / Opsgenie / Slack]
  end
  APP --> OTEL
  APP --> FB
  HOST --> OTEL
  HOST --> FB
  NET --> OTEL
  OTEL --> PROM
  OTEL --> TRACE
  OTEL --> LOGS
  FB --> LOGS
  PROM --> GRAF
  LOGS --> GRAF
  TRACE --> GRAF
  PROM --> ALERT
  ALERT --> PAGE
    

Layer

Role

Sources

The application, host, network, and cloud-provider APIs producing telemetry.

Collection

Daemons and sidecars that scrape, tail, batch, and forward telemetry. OpenTelemetry Collector is the cross-signal default; Fluent Bit, Vector, and Logstash for logs specifically.

Storage

Time-series stores for metrics, indexed stores for logs, span stores for traces. Operator picks open-source self-hosted or vendor-managed per signal.

View

Dashboards, ad-hoc query, alert routing. Grafana is the cross-vendor default UI; provider-managed dashboards (CloudWatch, Cloud Monitoring, Azure Monitor, VMware Aria Operations) ship out of the box on each cloud.

The Tools#

A short catalog of the components an operator picks among.

Metrics#

Tool

Role

Prometheus

The standard. Pull-based scraping, PromQL, alerting. Single-binary; horizontally scaled with Thanos, Cortex, Mimir, or VictoriaMetrics.

VictoriaMetrics

Drop-in Prometheus-compatible store, faster on large fleets.

Thanos / Cortex / Mimir

Long-term horizontal storage on top of Prometheus.

Datadog / New Relic / Dynatrace

SaaS metrics + APM. Pay per host or per metric series.

CloudWatch / Cloud Monitoring / Azure Monitor

Provider-native metrics. Bundled, integrates with provider IAM, billed per metric.

Logs#

Tool

Role

Loki

Grafana Labs’ log store. Indexes labels, not contents; cheap at scale.

Elasticsearch / OpenSearch

Full-text indexed search. Heavier; the SIEM substrate for many estates.

ClickHouse

Columnar OLAP that doubles as a log store. SignalFX, Cloudflare, Uber log here.

CloudWatch Logs / Cloud Logging / Azure Monitor Logs

Provider-managed. The path of least resistance inside a single cloud.

Splunk

The enterprise SIEM. Strong correlation language (SPL), strong price tag.

Traces#

Tool

Role

Tempo

Grafana Labs’ span store. Object-storage backed; pairs with Grafana.

Jaeger

The CNCF tracing project. Self-host with Cassandra or Elasticsearch.

Honeycomb / Lightstep

SaaS, query-first tracing. Drill into events rather than canned dashboards.

Datadog APM / New Relic / Dynatrace

SaaS APM with traces alongside metrics and logs.

Dashboards and alerting#

Tool

Role

Grafana

The default open-source dashboard. Plugs into every store above.

Alertmanager

Prometheus’s alert router. Groups, dedupes, and forwards.

PagerDuty / Opsgenie / Splunk On-Call

Paging and on-call rotation.

Slack / Microsoft Teams

Where most non-paging alerts land.

Alerts#

Page on symptoms (user-facing), not causes. The four signals worth alerting on directly are SRE’s golden signals.

  • Latency, p99 of every external request.

  • Traffic, request rate per service.

  • Errors, 5xx rate, error budget burn rate.

  • Saturation, CPU / memory / disk / queue depth headroom.

Cause-based alerts (disk-full, certificate-expiring-soon) belong on the dashboard, not the pager. They become alerts only when no symptom-based alert would catch the failure in time.

Alertmanager rule shape:

- alert: HighErrorRate
  expr: sum(rate(http_requests_total{status=~"5.."}[5m])) by (service)
        / sum(rate(http_requests_total[5m])) by (service)
        > 0.05
  for: 10m
  labels: { severity: page }
  annotations:
    summary: "{{ $labels.service }} 5xx rate above 5%"
    runbook: "https://runbooks.example.com/high-error-rate"

Operator Practice#

  • SLOs over alerts. Define service level objectives; let burn- rate alerts wake the operator. A static threshold becomes wrong the moment traffic shifts.

  • One source of truth per signal. A metric in two stores will drift between them; pick one, mirror as needed.

  • Cardinality discipline. Every high-cardinality label (user ID, request ID, full URL) multiplies storage cost. Move high-cardinality data to logs or traces.

  • Runbook links in every page. A page without a runbook is a request for the operator to invent one at 03:00.

  • Post-incident review every page. What signal caught it, what signal should have caught it earlier, what alert change closes the gap.

References#