# Metrics — Derived Rules > Derives from `domains/observability/first-principles.md` P1 (Structured by Default), P4 (Cardinality Discipline), P8 (SLI/SLO Awareness). ## The Four Golden Signals | Signal | What | |--------|------| | Latency | Time to serve a request (p50, p95, p99) | | Traffic | Request rate (req/s) | | Errors | Error rate (errors/s, or % of traffic) | | Saturation | How full is the system (CPU, memory, queue depth) | - All four are needed. Missing one is a blind spot. - Latency is percentiles, not average. Average hides the long tail. ## Cardinality (P4) - Labels have bounded cardinality. `user_id` as a label = unbounded cardinality = unbounded bill. - High-cardinality dimensions belong in traces, not metrics. - A metric with `user_id` as a label is a 1M-series metric. That is a budget bomb. ## Counter vs Gauge vs Histogram | Type | What | Example | |------|------|---------| | Counter | Monotonically increasing | `http_requests_total` | | Gauge | A value at a point in time | `active_connections` | | Histogram | Distribution of values | `http_request_duration_seconds` | - A counter never decreases. Use `rate()` over time to get the rate. - A gauge can go up and down. Use it for saturation. - A histogram gives percentiles. Use it for latency. ## SLI/SLO (P8) - SLI (Service Level Indicator): a metric of good/total (e.g., 99.9% of requests < 500ms). - SLO (Service Level Objective): the target for the SLI (e.g., 99.9% over 30 days). - Error budget: 1 - SLO. If SLO is 99.9%, error budget is 0.1%. Spend it on feature risk, not bugs. - When the error budget is exhausted, freeze features. Fix reliability. ## What Violates Metrics Discipline | Violation | Principle | |-----------|-----------| | `user_id` as a label | P4 Cardinality | | Average latency only | P8 (hides the tail) | | No error rate metric | P8 (no SLI) | | 1000 metrics, no SLO | P8 (no objective) | | A counter that decreases | (type error) |