Repository navigation
Releases: pingedbrain/microburst
Release list
v0.10.0 — five transports: postgres, redis, mysql, grpc, generic tcp
Highlights
microburst is now multi-protocol: the same rules DSL, fired log, control API, metrics and stats drive five data planes.
--protocol postgres— (0.9.0) SQLSTATE-correct ErrorResponses, tx-aware injection--protocol redis— RESP2/3:-MOVED/-ASKcluster redirects real clients follow,READONLY/LOADING, MULTI-aware skipping, mid-bulkcut_reply--protocol mysql— ERR_Packet with real errno+SQLSTATE pairs (1213/40001deadlock,1040too-many-connections at handshake),SERVER_STATUS_IN_TRANStracking, prepared-statement id→SQL sosql:matchesCOM_STMT_EXECUTE--protocol grpc— h2c HTTP/2: trailers-onlyUNAVAILABLE, mid-streamgrpc-statusafter N real messages, RST_STREAM aborts, flow-control stall timeouts--protocol tcp— universal fallback: user-declared framing (length-prefix/delimiter/fixed),payload:byte-regex matching,cut/corrupt/respond:synthetic bytes — chaos on any wire protocol without a dedicated moduletransports.pyregistry — the formal seam: a new wire transport is a registry entry + a sibling package
Plus: sdk-matrix rust client moved off the legacy rustls-0.21 stack (dependabot fix).
1685 tests · live-verified against real PG16, Redis 7, MariaDB 11.8.
Full changelog: https://github.com/pingedbrain/microburst/blob/main/CHANGELOG.md
v0.9.0 — PostgreSQL wire mode + framed-upload faults
Highlights
--protocol postgres— a second wire protocol. TCP proxy speaking PG v3: SQLSTATE-correct ErrorResponses,FATAL-closes-connection semantics, tx-status-aware ERROR injection (skips inside transactions so client/upstream never desync),partial_rowsmid-ResultSet aborts, startup53300faults. Verified live against PG16 + psql. Issue #6 Phase 1.- Framed-upload faults —
cut_upload.after_messages(eventstream/gRPC message boundaries) andcorrupt_upload.at_message(poison a frame so the upstream's parser rejects it). /_microburst/stats— uptime, per-rule hit counts, upstream latency percentiles, per-service splits.- Fidelity harness upgrades — 25 real-AWS success goldens (content-scrubbed),
conform/diffon success shapes, a pytest regression gate that fails on serializer drift, and a weekly CI job measuring LocalStack against the AWS goldens.
1473 tests · fidelity report 28/28 vs real AWS.
Full changelog: https://github.com/pingedbrain/microburst/blob/main/CHANGELOG.md
v0.8.0
What's new
Envelope-shape conformance — report is 28/28
fidelity report and fidelity conform now diff a structural body
signature on top of status/code/Content-Type: namespace-qualified XML
element paths + <?xml presence, and JSON top-level keys + __type
namespacing. It immediately caught four real divergences that botocore's
parser tolerates — all fixed from captures:
- ec2 errors now render the real AWS envelope:
<?xml version="1.0" encoding="UTF-8"?>+<Response><Errors><Error>+<RequestID>at
text/xml;charset=UTF-8— distinct from the query envelope - query errors carry the model's
xmlNamespaceand AWS's
Type, Code, Messagemember order - coral front-layer codes use capital
Message - rest-json fills modeled
RequestID/RequestIdentifiermembers - athena
InvalidRequestExceptioncarries semantic
AthenaErrorCode/ErrorCode(probed against real AWS)
fidelity diff — compare any two capture sets
microburst fidelity diff A B diffs emulator-vs-emulator or
region-vs-region captures directly. Verified: AWS us-west-2 and
ap-southeast-2 captures are shape-identical 28/28.
Request-side faults — request: rule block
Faults on the client→proxy upload path, not just the response:
request:
slow_upload: {rate_kbps: 8} # pace the upload read
cut_upload: {after_bytes: 1024} # reset mid-PUT — SDK sees ECONNRESET on its write pathOn streaming uploads (S3 PutObject, >4 MiB payloads) a cut is a true
mid-write reset — boto3 sees ConnectionClosedError, a distinct retry
path from response faults.
SigV4 presets, header mutation, scheduling, hot-reload
expired-token(400),clock-skew(RequestTimeTooSkewed403),
bad-signature(SignatureDoesNotMatch403) presetsresponse: {set_headers:, strip_headers:}— wrong Content-Type on a
200, strippedx-amz-*: exercises SDK parse paths body corruption can'tactive_at/untilbound when a rule starts/stops matching
(starts_in_s/ends_in_sinGET /rules)--watchhot-reloads the--configruleset on save; a broken file
keeps the previous rules
Measured latency presets
latency: {preset: dynamodb} — 25 named service baselines measured
against real AWS (us-east-1, read-only ops, n=8). Each preset is the
service-side residual over the network floor — your own RTT stacks on
top, like the real thing. tools/latency_probe.py re-measures.
SDK matrix: Rust + .NET
tools/sdk-matrix/ now runs six SDKs — boto3, JS v3, Go v2, Java v2,
aws-sdk-rust, AWSSDK .NET — 20/20 cells pass with zero serializer
changes. SDK-specific HEAD-error parsing documented.
Install
pip install microburst
# or
docker run -p 9999:9999 ghcr.io/pingedbrain/microburst:v0.8.0Full changelog: CHANGELOG.md
v0.7.0 — emulator conformance + runnable failure scenarios
What's new
Emulator conformance — fidelity conform
microburst fidelity capture --endpoint-url <emulator> replays the same 28 probes against any AWS-compatible endpoint, and microburst fidelity conform --emu DIR --aws DIR diffs the captures against the committed real-AWS goldens on the fields SDKs actually read: HTTP status, parsed Error.Code, and Content-Type. Emulators (or gateways, proxies, test doubles) can gate on AWS wire similarity with zero AWS credentials.
First run against a real emulator found 21/28 divergences — systematic Content-Type drift, error codes that don't parse, and requests routed to the wrong service.
Runnable failure scenarios — examples/
Seven self-contained examples for end users, each with a chaos.yml + runnable app.py:
| Example | Failure story |
|---|---|
01-throttled-writes |
DynamoDB ProvisionedThroughputExceededException at 40% — SDK retries vs hard failure |
02-timeout-cascade |
App timeout shorter than the SDK retry budget — the sleeper bug |
03-poison-queue |
SQS receive/delete flakiness — idempotent consumers, duplicate delivery |
04-s3-slowdown-uploads |
SlowDown@503 + bandwidth cap on large uploads |
05-stream-cut |
Mid-frame event-stream truncation + terminal errors |
06-expired-token |
ExpiredTokenException bursts — does the app refresh credentials? |
07-http-dependency |
Latency/reset/timeout over arbitrary HTTP, no service matcher needed |
A test keeps every shipped config parseable against the rule DSL.
Install
pip install microburst
# or
docker run -p 9999:9999 ghcr.io/pingedbrain/microburst:v0.7.0Full changelog: CHANGELOG.md
v0.6.0
v0.5.1
v0.5.0
v0.4.0 — live-AWS-verified fidelity
Everything in this release was corrected against real AWS wire captures, not model inference.
Highlights
- Live-AWS fidelity diff —
tools/live_fidelity.pycaptures raw error responses from real AWS and diffs them againstrender_error: status, parsedError.Code, Content-Type, request-id placement.fidelity/REPORT.mdcommits the evidence: 13/13 probes match. - 8 wire-accuracy fixes it exposed: json services serve unmodeled client errors at 400 (not name-guessed 404),
x-amz-json-1.1content types,com.amazonaws.*__typeprefixes, rest-jsonx-amzn-ErrorTypeheaders, SQS'sAWS.SimpleQueueService.*query-compat namespace, Route53text/xml, empty-body HEAD errors, numeric codes → status. - REST collision sweep — all ~10.4k REST ops synthesized and self-resolved; only 5 remain ambiguous (genuine AWS aliases). Drove 3 matcher fixes: query-marker values, required querystring members, route specificity.
- Host / virtual-hosted detection —
bucket.s3.…, emulatorbucket.localhost,{accountId}.s3-control…. - Keep-alive fidelity — pooled connections verified through proxy, faults keep sockets alive,
resetstill kills.
Install: uvx microburst · docker pull ghcr.io/pingedbrain/microburst:0.4.0
v0.3.0 — Dashboard, Docker, HTTP/2
Highlights
microburst dashboard— live TUI: rules table + real-time fault stream over SSE.pip install 'microburst[tui]'- Docker image —
ghcr.io/pingedbrain/microburst:0.3.0, multi-stage slim build (167MB) --http2— HTTP/2 upstream transport (httpx via ALPN on https upstreams).pip install 'microburst[h2]'
Install
pip install 'microburst[tui,h2]'==0.3.0
# or
docker run -p 9999:9999 ghcr.io/pingedbrain/microburst:0.3.0 --upstream http://host.docker.internal:4566Full changelog: https://github.com/pingedbrain/microburst/blob/main/CHANGELOG.md
Generated with Devin
v0.2.0 — Grown-up chaos DSL
Highlights
- 436/436 AWS services — full protocol coverage:
smithy-rpc-v2-cbor(CloudWatch, GameLift, EventBridge v2…), query-compat JSON for migrated services, 50+ empirically-derived SigV4 scope aliases, presigned URLs, SigV4A - Grown-up rule DSL —
headers/body(jmespath on JSON, form, XML) matchers,ratewindows,sequencefail/pass patterns,deterministicper-resource flakiness,ttl_s - Response-side faults —
response:block: truncate, mid-stream abort, corrupt bodies, bandwidth shaping — applied while streaming the upstream response - Observability — SSE live tail (
/_microburst/fired/stream), Prometheus/metrics, fired-log filters, optional OTel spans - Latency distributions — gaussian and spike alongside uniform
- Layered architecture —
detection/,protocols/registry, composableeffects/, separate data/control planes
Fidelity
New headless harness (test_fidelity.py): every service's error wire format is rendered and parsed back through botocore's own protocol parser — Error.Code round-trips for all 436 modeled services. 538 tests.
Install
pip install microburst==0.2.0
microburst --upstream http://localhost:4566 --port 9999Full changelog: https://github.com/pingedbrain/microburst/blob/main/CHANGELOG.md
Generated with Devin