ARCHIVED from builddistributedsystem.com on 2026-04-28 — URL: https://builddistributedsystem.com/tracks/tracer/tasks/task-23-2-1-metrics-collection
TASK

Implementation

Metrics quantify system behavior: how many requests, how fast, how much memory. Three types cover nearly everything: counters (monotonically increasing), gauges (can go up or down), and histograms (distribution of values like request duration).

Implement a node that records and queries metrics:

// Counter: increment by 1 on each request
{ "type": "counter", "msg_id": 1,
  "name": "http_requests_total", "value": 1,
  "labels": {"method": "POST", "service": "api"} }
-> { "type": "metric_recorded", "in_reply_to": 1,
    "name": "http_requests_total", "value": 1 }

// Gauge: current heap memory in bytes
{ "type": "gauge", "msg_id": 2,
  "name": "memory_usage_bytes", "value": 1073741824,
  "labels": {"service": "api", "type": "heap"} }
-> { "type": "metric_recorded", "in_reply_to": 2,
    "name": "memory_usage_bytes", "value": 1073741824 }

// Histogram: record one request duration observation
{ "type": "histogram", "msg_id": 3,
  "name": "request_duration_ms", "value": 123,
  "labels": {"endpoint": "/api/users"} }
-> { "type": "metric_recorded", "in_reply_to": 3,
    "name": "request_duration_ms", "count": 1, "sum": 123 }

Sample Test Cases

Counter metricTimeout: 5000ms
Input
{
  "src": "service",
  "dest": "metrics",
  "body": {
    "type": "counter",
    "msg_id": 1,
    "name": "http_requests_total",
    "value": 1,
    "labels": {
      "method": "POST",
      "service": "api"
    }
  }
}
Expected Output
{"type": "metric_recorded", "in_reply_to": 1, "name": "http_requests_total", "value": 1}
Gauge metricTimeout: 5000ms
Input
{
  "src": "service",
  "dest": "metrics",
  "body": {
    "type": "gauge",
    "msg_id": 1,
    "name": "memory_usage_bytes",
    "value": 1073741824,
    "labels": {
      "service": "api",
      "type": "heap"
    }
  }
}
Expected Output
{"type": "metric_recorded", "in_reply_to": 1, "name": "memory_usage_bytes", "value": 1073741824}
Histogram metricTimeout: 5000ms
Input
{
  "src": "service",
  "dest": "metrics",
  "body": {
    "type": "histogram",
    "msg_id": 1,
    "name": "request_duration_ms",
    "value": 123,
    "labels": {
      "endpoint": "/api/users"
    }
  }
}
Expected Output
{"type": "metric_recorded", "in_reply_to": 1, "name": "request_duration_ms", "count": 1, "sum": 123}

Hints

Hint 1
Counter: only increases — use for request counts, error counts, bytes sent
Hint 2
Gauge: can go up or down — use for memory usage, queue depth, connection count
Hint 3
Histogram: records value distribution — use for request duration, response size
Hint 4
Labels are key-value pairs that add dimensions (filter by service, endpoint, status)
Hint 5
p95 = value at the 95th percentile: 95% of requests complete faster than this
OVERVIEW

Theoretical Hub

Concept overview coming soon

Key Concepts

countergaugehistogramlabelspercentile
main.py
python
Implement Metrics Collection - The Tracer | Build Distributed Systems