โšก
Zero to Platform Architect2026
Enterprise Platform & SRE Playbooks
Enterprise Platform & SRE Playbooksโฑ๏ธ 10 min readโšก Staff SRE Standard
๐ŸŽฏ Operations Test Bank →

Enterprise Lesson 5: Real User Monitoring (RUM), Telemetry Pipelines & Enterprise SRE Standards

๐Ÿง  The Concept (Explain Like Iโ€™m 5)

Imagine you manage a high-speed bullet train:

  • The Server-Side View (APM & Metrics): The train conductor looks at the speedometer and engine gauges inside the cabin (Prometheus/Grafana: โ€œEngine temperature is 90ยฐC, speed is 300 km/hโ€).
  • The Real Passenger Experience (RUM - Real User Monitoring): A passenger sitting in carriage 4 got seasick because the car tilted too hard (Cumulative Layout Shift - CLS), another passenger pressed the call button and waited 15 seconds for a response (Interaction to Next Paint - INP), and another passenger waited 10 minutes just to board the platform (Largest Contentful Paint - LCP).
    • If your backend servers report 100% CPU health and HTTP 200 OK, but your users see blank white screens or slow animations, your platform is failing!
  • Connecting the Dots (W3C traceparent): When the passenger presses the button, an invisible tracking tag is stamped on their ticket. That exact same tracking number travels through the conductorโ€™s radio, into the central rail dispatcher, and into the power grid substation (End-to-End Distributed Tracing from Browser to Database).
  • SRE Alerting Standards (Multi-Window Burn-Rate Alerting): Instead of screaming every time a raindrop hits the windshield (Alert Fatigue), the emergency alarm sounds only when the train is burning fuel so fast that it will run out of gas before reaching the next station (Error Budget Burn Rate).

๐Ÿ“ฑ Real User Monitoring (RUM) & Core Web Vitals Specs

Googleโ€™s Core Web Vitals form the universal baseline for frontend user experience:

flowchart LR
    LCP["<b>1. LCP (Largest Contentful Paint)</b><br/>Measures: Loading Performance<br/>โ€ข Good: &lt; 2.5s<br/>โ€ข Needs Improvement: 2.5s - 4.0s<br/>โ€ข Poor: &gt; 4.0s"]
    
    INP["<b>2. INP (Interaction to Next Paint)</b><br/>Measures: UI Responsiveness<br/>โ€ข Good: &lt; 200ms<br/>โ€ข Needs Improvement: 200ms - 500ms<br/>โ€ข Poor: &gt; 500ms"]

    CLS["<b>3. CLS (Cumulative Layout Shift)</b><br/>Measures: Visual Stability<br/>โ€ข Good: &lt; 0.1<br/>โ€ข Needs Improvement: 0.1 - 0.25<br/>โ€ข Poor: &gt; 0.25"]

    LCP --- INP --- CLS

๐Ÿ”— End-to-End Tracing: W3C traceparent Context Propagation

The W3C Trace Context specification standardizes how distributed traces travel across client-server boundaries:

๐Ÿ“ traceparent = 00 (version)-4bf92f3577b34da6a3ce929d0e0e4736 (trace-id (16 bytes))-00f067aa0ba902b7 (parent-id / span-id (8 bytes))-01 (trace-flags (sampled))

sequenceDiagram
    autonumber
    participant Browser as ๐Ÿ’ป User Browser (React / OTel Web SDK)
    participant CF as โšก CloudFront Edge (Forward traceparent)
    participant ALB as โš–๏ธ Application Load Balancer
    participant Gateway as ๐Ÿšช API Gateway / Ingress Pod
    participant OrderSvc as ๐Ÿ›’ Order Microservice (Java)
    participant DB as ๐Ÿ—„๏ธ PostgreSQL Database

    Browser->>Browser: User clicks 'Submit Payment' โž” Generate Span: 'click.checkout'
    Note over Browser: Inject Header: traceparent: 00-4bf92f...-00f067...-01
    Browser->>CF: POST /api/v1/orders (with traceparent)
    CF->>ALB: Forward traceparent unchanged
    ALB->>Gateway: Forward traceparent unchanged
    Gateway->>OrderSvc: Ingress Span extracted โž” Start Child Span
    OrderSvc->>DB: Execute SQL: INSERT INTO orders ... (Child Span: 'db.query')
    DB-->>OrderSvc: Query executes in 14ms โœ…
    OrderSvc-->>Gateway: HTTP 201 Created
    Gateway-->>Browser: HTTP 201 Created (End Span)
    Note over Browser: Trace visualized in Jaeger/Tempo from React click down to SQL INSERT!

Production OpenTelemetry Collector Configuration (otel-collector-config.yaml)

In production Kubernetes, the OpenTelemetry Collector acts as the high-throughput, vendor-neutral telemetry router. It ingests OTLP traces from the frontend SDK and backend services, applies memory-limiting protection, executes tail-based sampling, and forwards traces to Grafana Tempo and metrics to Prometheus:

# /etc/otelcol/config.yaml - Production OpenTelemetry Collector Pipeline
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
        cors:
          allowed_origins:
            - "https://*.corp.com"
            - "https://*.pages.dev"
          allowed_headers:
            - "traceparent"
            - "tracestate"
            - "baggage"

processors:
  # 1. Critical Safeguard: Drops telemetry before collector process is OOMKilled by Linux kernel
  memory_limiter:
    check_interval: 1s
    limit_percentage: 75
    spike_limit_percentage: 20

  # 2. Enrich spans with EKS node, container, and AWS metadata
  resourcedetection:
    detectors: [env, eks, ec2]
    timeout: 2s

  # 3. Microsecond Batching for Wire & Network Optimization
  batch:
    send_batch_size: 8192
    timeout: 1s

  # 4. Tail-Based Sampling: Retain 100% of errors & latency anomalies, drop 90% of routine 200 OKs
  tail_sampling:
    decision_wait: 10s
    num_traces: 10000
    expected_new_traces_per_sec: 2000
    policies:
      # Policy A: Keep 100% of HTTP 5xx Server Errors
      - name: drop-errors-policy
        type: status_code
        status_code: { status_codes: [ERROR] }

      # Policy B: Keep 100% of slow transactions (Latency > 500ms)
      - name: high-latency-policy
        type: latency
        latency: { threshold_ms: 500 }

      # Policy C: Sample only 5% of healthy HTTP 200 OK transactions (FinOps Storage Control)
      - name: probabilistic-sample-ok
        type: probabilistic
        probabilistic: { sampling_percentage: 5.0 }

exporters:
  # Traces Pipeline: Grafana Tempo / Jaeger (OTLP gRPC)
  otlp/tempo:
    endpoint: tempo-distributor.monitoring.svc.cluster.local:4317
    tls:
      insecure: true

  # Metrics Pipeline: Prometheus Remote Write / Scrape Endpoint
  prometheus:
    endpoint: 0.0.0.0:8889
    namespace: otel

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, resourcedetection, tail_sampling, batch]
      exporters: [otlp/tempo]
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, resourcedetection, batch]
      exporters: [prometheus]

  telemetry:
    metrics:
      address: 0.0.0.0:8888 # Collector self-monitoring health metrics

๐Ÿ“Š The 3 Telemetry Pillars: RED vs. USE vs. 4 Golden Signals

Staff Platform Architects apply the right telemetry framework depending on the operational boundary:

Framework Best Applied To Core Dimensions Key PromQL Examples
RED Method Request-driven microservices, REST APIs, gRPC. Rate (Requests/sec)
Errors (Failed requests/sec)
Duration (Latency distribution)
sum(rate(http_requests_total[5m]))
sum(rate(http_requests_total{status=~"5.."}[5m]))
histogram_quantile(0.99, sum(rate(http_duration_bucket[5m])) by (le))
USE Method Host infrastructure, EC2 instances, Kubernetes nodes, disks, memory. Utilization (% time busy)
Saturation (Queue length)
Errors (Hardware error count)
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
node_load1 / count by (instance) (node_cpu_seconds_total{mode="idle"})
rate(node_disk_io_time_weighted_seconds_total[5m])
4 Golden Signals End-to-end user-facing systems (Google SRE standard). Latency (Time to serve)
Traffic (Demand)
Errors (Failure rate)
Saturation (Resource capacity constraint)
Comprehensive composite dashboards combining RED and USE indicators.

๐Ÿ“ SLI, SLO, SLA & Error Budget Mathematical Formulations

To eliminate subjective debates about system reliability, SRE relies on formal mathematical formulations:

1. Service Level Indicator (SLI)

The quantifiable metric of service performance: ๐Ÿ“ SLI = (โˆ‘ Successful / Good Events) / (โˆ‘ Total Valid Events) ร— 100%

2. Service Level Objective (SLO)

The internal target agreed upon between engineering and product: ๐Ÿ“ SLO = 99.9% (โ€œThree Ninesโ€ over a 30-day rolling window)

3. Service Level Agreement (SLA)

The legally binding contract with financial penalties/credits paid to customers if violated: ๐Ÿ“ SLA = 99.5% (Contractual penalty threshold)

4. Error Budget

The allowable amount of unreliability before engineering stops shipping features: ๐Ÿ“ Error Budget = 100% - SLO = 100% - 99.9% = 0.1%

๐Ÿ“ Downtime Budget (30 Days) = 30 ร— 24 ร— 60 minutes ร— 0.001 = 43.2 minutes

Real-Time Prometheus Recording Rules (SLI & Error Budget Calculation)

# Prometheus Recording Rules: Real-Time SLI & Remaining Error Budget
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: payment-service-sli-recording-rules
  namespace: monitoring
spec:
  groups:
    - name: payment-sli-calculations
      interval: 30s
      rules:
        # SLI: Ratio of 2xx/3xx HTTP requests to total HTTP requests
        - record: job:payment_service:sli_ratio_5m
          expr: |
            sum(rate(http_requests_total{job="payment-service",status=~"[23].."}[5m]))
            /
            sum(rate(http_requests_total{job="payment-service"}[5m]))

        # Error Budget Remaining (Ratio of 0.1% budget remaining over 30-day rolling window)
        - record: job:payment_service:error_budget_remaining_ratio_30d
          expr: |
            1 - (
              (1 - (
                sum(increase(http_requests_total{job="payment-service",status=~"[23].."}[30d]))
                /
                sum(increase(http_requests_total{job="payment-service"}[30d]))
              ))
              /
              (1 - 0.999)
            )

๐Ÿšจ Google SRE Multi-Window Multi-Burn-Rate Alerting

Standard threshold alerts (e.g., โ€œAlert if error rate > 1% for 5 minutesโ€) suffer from two fatal flaws:

  1. High Alert Fatigue: Temporary 30-second network blips page the on-call engineer at 3:00 AM.
  2. Slow Outage Detection: A slow burn consuming 100% of the monthly error budget over 3 days never triggers a 1% threshold alert!

The Google SRE Handbook standard utilizes Multi-Window Multi-Burn-Rate Alerting:

flowchart TD
    BurnRate["๐Ÿ”ฅ Error Budget Burn Rate"]

    subgraph UrgentCritical ["Page On-Call (PagerDuty) - Severe Outage"]
        P1["<b>14.4x Burn Rate</b><br/>โ€ข Consumes 2% budget in 1 hour<br/>โ€ข Windows: 1 hour AND 5 minutes"]
        P2["<b>6x Burn Rate</b><br/>โ€ข Consumes 5% budget in 6 hours<br/>โ€ข Windows: 6 hours AND 30 minutes"]
    end

    subgraph LowPriorityTicket ["Create Jira / Slack Notification - Slow Burn"]
        T1["<b>1x Burn Rate</b><br/>โ€ข Consumes 100% budget in 30 days<br/>โ€ข Windows: 3 days AND 6 hours"]
    end

    BurnRate --> UrgentCritical
    BurnRate --> LowPriorityTicket

Production PromQL Rule: Multi-Window Multi-Burn-Rate Alert

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: payment-service-slo-alerts
  namespace: monitoring
spec:
  groups:
    - name: payment-slo-alerts
      rules:
        # Alert 1: 14.4x Burn Rate over 1h (Consumes 2% of budget in 1 hour)
        - alert: PaymentServiceErrorBudgetFastBurn
          expr: |
            (
              sum(rate(http_requests_total{job="payment-service",status=~"5.."}[1h]))
              /
              sum(rate(http_requests_total{job="payment-service"}[1h]))
            ) > (14.4 * (1 - 0.999))
            and
            (
              sum(rate(http_requests_total{job="payment-service",status=~"5.."}[5m]))
              /
              sum(rate(http_requests_total{job="payment-service"}[5m]))
            ) > (14.4 * (1 - 0.999))
          for: 2m
          labels:
            severity: critical
            page: on-call
          annotations:
            summary: "Payment API error budget burning at 14.4x (2% budget consumed in 1 hour)"
            description: "High error rate detected over both 1-hour and 5-minute windows."

โš ๏ธ Real-World Failure Modes & Exception Playbooks

Failure Mode 1: The Missing Trace Context CORS Wall

  • The Disaster: Platform team configures OpenTelemetry Web SDK in the frontend. All API calls suddenly fail in production with CORS Preflight Error: Request header field traceparent is not allowed by Access-Control-Allow-Headers.
  • The Root Cause: Adding traceparent and tracestate headers to browser fetch() triggers a CORS preflight OPTIONS request. The API backend was not configured to allow the W3C tracing headers.
  • The SRE Playbook:
    1. Update Ingress / API Gateway CORS configuration: Access-Control-Allow-Headers: Content-Type, Authorization, traceparent, tracestate
    2. Verify that preflight OPTIONS requests return HTTP 204 No Content without requiring authentication.

Failure Mode 2: Alert Storm Induced by AWS Subnet Micro-Partition

  • The Disaster: A transient 10-second packet drop occurs across AZ-1a. Two hundred different microservice single-window alert rules fire simultaneously, generating 200 PagerDuty phone calls and completely overwhelming the on-call incident commander.
  • The Root Cause: Individual services relied on single-window thresholds without alert inhibition or multi-burn-rate validation.
  • The SRE Playbook:
    1. Migrate all PagerDuty alerts to Multi-Window Multi-Burn-Rate rules. A 10-second blip cannot sustain an elevated error rate across a 5-minute and 1-hour joint evaluation window.
    2. Implement Alertmanager Inhibition Rules (inhibit_rules): if an infrastructure alert (NodeNetworkDown or VPCBlackhole) is firing, suppress all downstream application 5xx alerts.

๐ŸŽค Staff/Principal Architect Interview Questions

Q1: Why must a multi-window burn rate alert evaluate two windows (e.g., 1 hour AND 5 minutes) simultaneously?

Model Answer:
If you evaluate only the long window (1 hour), the alert will continue firing for an entire hour after the issue has been completely fixed, creating severe alert noise.
If you evaluate only the short window (5 minutes), a brief transient spike that resolves itself will wake up on-call engineers unnecessarily.
By evaluating both windows with an AND operator, the alert only triggers if the error rate is high right now (5 minutes) and has persisted long enough to cause measurable error budget depletion (1 hour), and it automatically resolves the moment the short window returns to normal.

Q2: How does INP (Interaction to Next Paint) differ from legacy FID (First Input Delay)?

Model Answer:
FID (First Input Delay) only measured the delay on the first single user interaction (e.g. clicking the initial page button) and measured only the input delay, ignoring the time the browser took to execute JavaScript event handlers and update the screen.
INP (Interaction to Next Paint) evaluates all user interactions (clicks, taps, keypresses) throughout the entire lifespan of the page session, tracking the longest duration between interaction and the actual screen frame paint. It provides a vastly superior reflection of perceived runtime UI jank and main thread JavaScript blocking.