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
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python3
import sys
import json
def main():
# Your implementation here
for line in sys.stdin:
msg = json.loads(line)
print(json.dumps(msg), flush=True)
if __name__ == "__main__":
main()