Skip to content

Releases: pingedbrain/microburst

v0.10.0 — five transports: postgres, redis, mysql, grpc, generic tcp

Choose a tag to compare

@pingedbrain pingedbrain released this 10 Oct 16:38

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/-ASK cluster redirects real clients follow, READONLY/LOADING, MULTI-aware skipping, mid-bulk cut_reply
  • --protocol mysql — ERR_Packet with real errno+SQLSTATE pairs (1213/40001 deadlock, 1040 too-many-connections at handshake), SERVER_STATUS_IN_TRANS tracking, prepared-statement id→SQL so sql: matches COM_STMT_EXECUTE
  • --protocol grpc — h2c HTTP/2: trailers-only UNAVAILABLE, mid-stream grpc-status after 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 module
  • transports.py registry — 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

Choose a tag to compare

@pingedbrain pingedbrain released this 09 Oct 20:21

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_rows mid-ResultSet aborts, startup 53300 faults. Verified live against PG16 + psql. Issue #6 Phase 1.
  • Framed-upload faults — cut_upload.after_messages (eventstream/gRPC message boundaries) and corrupt_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/diff on 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

Choose a tag to compare

@pingedbrain pingedbrain released this 09 Oct 18:06

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 xmlNamespace and AWS's
    Type, Code, Message member order
  • coral front-layer codes use capital Message
  • rest-json fills modeled RequestID/RequestIdentifier members
  • athena InvalidRequestException carries 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 path

On 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 (RequestTimeTooSkewed 403),
    bad-signature (SignatureDoesNotMatch 403) presets
  • response: {set_headers:, strip_headers:} — wrong Content-Type on a
    200, stripped x-amz-*: exercises SDK parse paths body corruption can't
  • active_at/until bound when a rule starts/stops matching
    (starts_in_s/ends_in_s in GET /rules)
  • --watch hot-reloads the --config ruleset 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.0

Full changelog: CHANGELOG.md

v0.7.0 — emulator conformance + runnable failure scenarios

Choose a tag to compare

@pingedbrain pingedbrain released this 08 Oct 23:30

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.0

Full changelog: CHANGELOG.md

v0.6.0

Choose a tag to compare

@pingedbrain pingedbrain released this 08 Oct 20:50

Full Changelog: v0.5.1...v0.6.0

v0.5.1

Choose a tag to compare

@pingedbrain pingedbrain released this 08 Oct 18:47

Full Changelog: v0.5.0...v0.5.1

v0.5.0

Choose a tag to compare

@pingedbrain pingedbrain released this 08 Oct 17:41

Full Changelog: v0.4.0...v0.5.0

v0.4.0 — live-AWS-verified fidelity

Choose a tag to compare

@pingedbrain pingedbrain released this 08 Oct 15:23

Everything in this release was corrected against real AWS wire captures, not model inference.

Highlights

  • Live-AWS fidelity diff — tools/live_fidelity.py captures raw error responses from real AWS and diffs them against render_error: status, parsed Error.Code, Content-Type, request-id placement. fidelity/REPORT.md commits 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.1 content types, com.amazonaws.* __type prefixes, rest-json x-amzn-ErrorType headers, SQS's AWS.SimpleQueueService.* query-compat namespace, Route53 text/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.…, emulator bucket.localhost, {accountId}.s3-control….
  • Keep-alive fidelity — pooled connections verified through proxy, faults keep sockets alive, reset still kills.

Install: uvx microburst · docker pull ghcr.io/pingedbrain/microburst:0.4.0

v0.3.0 — Dashboard, Docker, HTTP/2

Choose a tag to compare

@pingedbrain pingedbrain released this 08 Oct 13:12

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:4566

Full changelog: https://github.com/pingedbrain/microburst/blob/main/CHANGELOG.md

Generated with Devin

v0.2.0 — Grown-up chaos DSL

Choose a tag to compare

@pingedbrain pingedbrain released this 08 Oct 03:16

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, rate windows, sequence fail/pass patterns, deterministic per-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, composable effects/, 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 9999

Full changelog: https://github.com/pingedbrain/microburst/blob/main/CHANGELOG.md

Generated with Devin