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.

Easy Python 3.9+ Aug 9, 2026 Observability & SRE 14 views 0 copies

Python code

50 lines
Python 3.9+
from 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

stdout
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

  1. Use `secrets` module for cryptographic randomness if security matters
  2. 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

Run this sample

Open the browser IDE to tweak the example and see results without installing anything.

Open editor

More from Observability & SRE

Related tutorials and quizzes for this topic.