microburst is a fault-injection proxy that sits between your SDK and any AWS endpoint — emulator or real. It serves the failures AWS actually serves: modeled error shapes, retryable statuses, dying connections. Your retries, backoff and timeouts get tested for real.
Point AWS_ENDPOINT_URL at the proxy. Signed or unsigned, microburst resolves the service, operation and resource — then decides: inject, or forward.
Faults are rendered in the service's own wire protocol and parsed back cleanly by the SDK — so your client sees the same exception classes it'd see in production.
Errors rendered via botocore service models across all 436 modeled services — json, query, ec2, rest-xml, rest-json, smithy-rpc-v2-cbor. A fidelity harness round-trips every modeled error code through the SDK's own parser.
Match on service, operation, region, resource, headers, or jmespath over the parsed body — JSON, form-encoded and XML. Cadence via probability, deterministic hashing, rate windows, sequences and TTLs.
Uniform, gaussian, spike distributions — or throttle response bodies to KiB/s.
TCP resets, timeouts, mid-stream aborts, truncated and corrupted bodies.
microburst dashboard — live fault feed over SSE, rules table, sparkline.
Fired log with filters, SSE live tail, Prometheus /metrics, OpenTelemetry spans. Every fault is auditable — chaos you can defend in a review.
PyPI package, GHCR image, docker-compose example, composite GitHub Action — uses: pingedbrain/microburst@v0.3.0 drops it into any workflow.
Rules are YAML — hot-reloadable via the control API at runtime. What AWS sees is a faithful fault; what you see is a deterministic experiment.
# 10% of DynamoDB writes throttle - service: dynamodb operation: PutItem probability: 0.1 error: code: ProvisionedThroughputExceededException # the vip tenant always feels pain — deterministically - service: dynamodb body: "Item.tenant.S == 'vip'" deterministic: true probability: 0.4 latency: { dist: gaussian, mean: 800, stddev: 200 } # S3 reads: 200 OK, corrupt payload. the insidious one. - service: s3 operation: GetObject response: { corrupt_bytes: 16 }
[{
"rule": 1,
"service": "dynamodb",
"operation": "PutItem",
"action": "error:ProvisionedThroughputExceededException",
"resource": "orders",
"ts": 1759952134.7
},{
"rule": 3,
"service": "s3",
"operation": "GetObject",
"action": "response:corrupt:16B",
"resource": "assets/logo.png",
"ts": 1759952136.1
}]