Changelog¶
0.13.1 (2026-09-15)¶
Bug Fixes¶
0.13.0 (2026-09-14)¶
Features¶
- HttpServerSettings builds the FastAPI entrypoint's config from environment settings (9c3e23e), closes #61
0.12.0 (2026-09-14)¶
⚠ BREAKING CHANGES¶
MetricsSettings(port=0)now raisesValidationError; passallow_ephemeral_port=True(orMETRICS__ALLOW_EPHEMERAL_PORT=true) to bind an ephemeral exposition port on purpose.
Features¶
- MetricsSettings rejects port=0 unless allow_ephemeral_port=True (7d51a43)
0.11.0 (2026-09-14)¶
Features¶
- GrpcConfig.from_settings builds the config from a grpc-server-kit settings object (599021b), closes #58
0.10.2 (2026-09-07)¶
Bug Fixes¶
0.10.1 (2026-09-07)¶
Bug Fixes¶
0.10.0 (2026-09-06)¶
Features¶
- AppSpec.drain_delay_seconds keeps the listeners open after readiness goes red (#47) (42c46c4), closes #46
0.9.1 (2026-09-06)¶
Bug Fixes¶
0.9.0 (2026-09-05)¶
Features¶
0.8.0 (2026-08-30)¶
⚠ BREAKING CHANGES¶
- MetricsSink.gauge() is abstract — a third-party metrics backend must implement it (set / inc / dec) or fail at construction.
Features¶
- record scheduled-job runs and add a gauge instrument to the metrics seam (#26) (92d45cf), closes #25
0.7.0 (2026-08-29)¶
Features¶
0.6.0 (2026-08-29)¶
Features¶
0.5.0 (2026-08-29)¶
Features¶
- observability: make the concrete sinks importable from servicewright.adapters.observability (#17) (0a04252), closes #16
0.4.0 (2026-08-28)¶
Features¶
- observability: let KeyRedactor exempt exact field names with safe_keys (#14) (a1b7ecf), closes #11
- observability: pass sentry_sdk.init options through SentryErrorTrackingSink (#12) (b434a21), closes #9
Bug Fixes¶
- core: make the observability section protocols read-only so narrowed settings satisfy them (#13) (ebc2c05), closes #8
- observability: keep stdlib extra fields in the structlog sink (#10) (ae85ffb)
0.3.0 (2026-08-28)¶
Features¶
0.2.0 (2026-08-14)¶
Features¶
- add Masker seam with ValueRedactor, ChainRedactor, per-surface redactors and span-attribute redaction (47e40e8)
Documentation¶
- point the README API reference link at its new url (08748d5)
- rewrite the documentation site with concepts, adapters, blueprints and runbooks (db5508c)
0.1.0 (2026-08-12)¶
Initial release of servicewright.
Features¶
Host+Entrypointmodel — oneAppSpecruns any number of transports (HTTP, gRPC, scheduler, daemon, one-shot) under a single lifecycle- Kubernetes-correct shutdown — readiness flips to false before draining, each entrypoint finishes in-flight work inside a grace window, the DI scope closes last
- Failure is visible — an essential entrypoint that dies mid-serve propagates out of
run(), so the process exit code distinguishes a crash from a graceful stop - Stop-aware startup — a signal during warmup or bind abandons startup instead of binding ports and reporting ready on a terminating process
- Signal escalation — the first SIGINT/SIGTERM drains gracefully, a second exits immediately with
128 + signum - Transport-neutral error taxonomy — one
ServiceErrorrenders as an RFC 9457 problem document over HTTP and as the mappedgrpc.StatusCodeover gRPC, with one masking rule and a pluggable renderer - Transport-neutral correlation store — one request id in the logs, in outbound propagation and in the response, bridged into structlog contextvars and OTel Baggage
- DI-agnostic two-tier scopes —
AppScopefor process-lifetime singletons, a freshUnitScopeper request/RPC/job; dishka adapter included - Pluggable observability — metrics, tracing, logging and error tracking as kernel protocols with prometheus, OpenTelemetry, Sentry, structlog and stdlib backends, plus
register_sinkfor your own - Priority-grouped, fail-fast warmup and a health registry driving both the HTTP probes and the gRPC health service
- Zero hard dependencies —
pip install servicewrightpulls nothing; every framework binding lives behind an extra