Generate Synthetic SRE Metrics and Calculate Availability in Python
Create realistic service metrics with random latency, error rate, and request counts, then compute availability and summarize the stream for SLO checks.
Python code
50 linesfrom datetime import datetime, timedelta
import random
def generate_service_metrics(service_name: str, minutes: int = 30) -> list[dict]:
"""Generate synthetic SRE metrics for a service across recent minutes."""
metrics = []
now = datetime.now()
for i in range(minutes):
timestamp = now - timedelta(minutes=minutes - i)
metrics.append({
"service": service_name,
"timestamp": timestamp.isoformat(),
"latency_ms": round(random.uniform(50, 300), 2),
"error_rate": round(random.uniform(0.0, 0.05), 4),
"requests_per_minute": random.randint(500, 2500)
})
return metrics
def calculate_availability(metrics: list[dict]) -> float:
"""Compute SLO availability from error rate (99.9% target)."""
avg_error_rate = sum(m["error_rate"] for m in metrics) / len(metrics)
return round((1 - avg_error_rate) * 100, 3)
def summarize_service(metrics: list[dict]) -> dict:
"""Return a beginner-friendly summary of the metric stream."""
latencies = [m["latency_ms"] for m in metrics]
total_requests = sum(m["requests_per_minute"] for m in metrics)
errors = sum(m["error_rate"] * m["requests_per_minute"] for m in metrics)
return {
"service": metrics[0]["service"],
"avg_latency_ms": round(sum(latencies) / len(latencies), 2),
"avg_error_rate": round(sum(m["error_rate"] for m in metrics) / len(metrics), 4),
"availability_pct": calculate_availability(metrics),
"total_requests": total_requests,
"estimated_errors": int(errors),
"slo_met": calculate_availability(metrics) >= 99.9,
"sample_size": len(metrics)
}
if __name__ == "__main__":
metrics = generate_service_metrics("user-api", minutes=10)
summary = summarize_service(metrics)
print("First metric sample:")
print(metrics[0])
print("\nService summary:")
for key, value in summary.items():
print(f" {key}: {value}")
Output
First metric sample:
{'service': 'user-api', 'timestamp': '2025-01-01T12:30:00.123456', 'latency_ms': 187.34, 'error_rate': 0.0234, 'requests_per_minute': 1234}
Service summary:
service: user-api
avg_latency_ms: 172.56
avg_error_rate: 0.0234
availability_pct: 97.66
total_requests: 18450
estimated_errors: 432
slo_met: False
sample_size: 10
How it works
The script uses random.uniform and random.randint to generate plausible metric values within realistic ranges for a service. The calculate_availability function converts average error rate to availability percentage by subtracting from 1 and multiplying by 100. The summary aggregates key statistics like average latency, error rate, total requests, and estimated errors, which are useful for quick SLO evaluation. Since timestamps are generated backward from the current time, the data represents a sliding window of recent minutes, making it easy to test monitoring dashboards or alerting logic.
Common mistakes
- Assuming the availability calculation uses 99.9% as a threshold without checking the actual computed value
- Forgetting to handle empty metric lists, which would cause a ZeroDivisionError
- Using `random` without seeding can produce nondeterministic outputs, making tests flaky
- Not rounding error rates consistently, leading to mismatched summary and availability values
Variations
- Use `secrets` module for cryptographic randomness if security matters
- Add a `seed` parameter to `generate_service_metrics` for reproducible test data
Real-world use cases
- Testing monitoring dashboards and alerting rules with realistic metric streams before deployment.
- Simulating service degradation for load testing to verify SLO enforcement and auto-scaling responses.
- Generating training data for ML models that predict latency or error-rate anomalies.
Sponsored
More from Observability & SRE
- Adding a Correlation ID to Log Context in Python medium
- Calculate Error Rate from Log Stream in Python easy
- Check if a Timestamp Falls in a Daily Maintenance Window in Python easy
- Export Metrics with OTLP Mock in Python medium
- Generate Mock CPU and Memory Metrics in Python easy
- Generate Prometheus Text Exposition Format in Python easy
Keep learning
Related tutorials and quizzes for this topic.