Lesson 6 / 25
Instrumenting an Application
Client libraries and what to measure.
Measure requests, errors and duration
Official and community client libraries exist for Go, Java, Python, Ruby, .NET, Node.js and more. Define metrics once at start-up, update them in code paths, and expose them on /metrics. For every service, start with the RED metrics: request Rate, Errors and Duration, labelled by a bounded route template (/orders/{id}, not the actual ID). Many frameworks have middleware that does this automatically, and OpenTelemetry can export metrics to Prometheus too.
RED metrics in Python
Using the prometheus_client library (a sketch; adapt to your framework).
from prometheus_client import Counter, Histogram, start_http_server
import time
REQUESTS = Counter("http_requests_total", "HTTP requests", ["route", "method", "status"])
LATENCY = Histogram("http_request_duration_seconds", "Request latency", ["route"],
buckets=[0.05, 0.1, 0.25, 0.3, 0.5, 1, 2.5])
def handle(route_template, method, handler):
start = time.perf_counter()
status = "500"
try:
status = str(handler())
return status
finally:
REQUESTS.labels(route_template, method, status).inc()
LATENCY.labels(route_template).observe(time.perf_counter() - start)
start_http_server(8000) # serves /metrics on port 8000Use route templates, never raw paths
Labelling by /orders/12345 creates a new series per order and can overwhelm Prometheus.
Quick check: What do the RED metrics stand for?
- Requests, Exports, Disks
- Reads, Edits, Deletes
- Red, Easy, Done
- Rate, Errors, Duration
Answer
Rate, Errors, Duration — A starting set for every service.