August 12th, 2026
New this release:
-
🎉 (all, smithy-rs#4758)
Blobnow stores its contents asBytesand providesfrom_maybe_sharedandinto_bytesmethods to avoid copies inBytes-based protocol paths. -
🎉 (client) Add opt-in capture of selected operation-input members for telemetry. Naming input members via
Config::builder().emit_input_attributes([...])makes the SDK capture those members' values into
theConfigBag(asCapturedTelemetryAttributes) duringread_before_execution, before the input
is consumed by serialization. Any interceptor can then read a value via
cfg.load::<CapturedTelemetryAttributes>(), without threading it through atask_local!. Only
string-valued, non-@sensitivemembers are eligible; capture is off by default.use aws_smithy_types::telemetry::CapturedTelemetryAttributes; // Opt in to capturing the S3 `Bucket` input member. let config = aws_sdk_s3::Config::builder() .emit_input_attributes(["Bucket"]) // ... .build(); // In any interceptor, read the captured value off the config bag — no `task_local!`. if let Some(bucket) = cfg .load::<CapturedTelemetryAttributes>() .and_then(|a| a.get("Bucket")) { // use `bucket` }
-
🎉 (client) Emit captured telemetry attributes and transfer sizes on the built-in client metrics. Values
selected viaemit_input_attributes([...])are now attached as attributes on
smithy.client.call.durationandsmithy.client.call.attempt.duration. The operation-duration metric additionally
carries the outcome aserror.type(a coarse category, set only on failure) and the raw
http.status_codewhen a response was received. Real transferred-byte counts are recorded on their
own histograms,smithy.client.call.request.size/smithy.client.call.response.size, counted per
frame and emitted when the body completes — so a streaming body reports its true size rather than the
0that content-length reports for it.// The same opt-in that captures a member now also emits it on the built-in metrics. let config = aws_sdk_s3::Config::builder() .emit_input_attributes(["Bucket"]) // ... .build(); // `smithy.client.call.duration` is now emitted with, e.g.: // rpc.service="S3", rpc.method="GetObject", Bucket="my-bucket", // error.type="connector" (on failure), http.status_code=200 // // and body sizes on their own instruments, e.g.: // smithy.client.call.response.size { rpc.service="S3", rpc.method="GetObject" } = 1024
-
🎉 (client) Add support for configuring additional server names in TLS certificate verification.
When standard hostname verification fails, the client retries verification against
each configured additional server name. This is useful when a server presents a
certificate whose Subject Alternative Names (SANs) do not include the hostname used
to connect, but do include an alternative name the client has been configured to accept. -
🐛 (server, smithy-rs#4731, @hsbakshi) Fix RPC v2 CBOR server routing to use the verbatim Smithy operation shape name, matching the URI sent by spec-compliant clients.
For operations whose modeled name starts lowercase, regeneration changes the accepted route from the previous capitalized form (for example,
GetFoo) to the spec-compliant verbatim form (getFoo). Operations already modeled with an uppercase initial are unchanged.Set
rpcV2CborAddCapitalizedRoutetotrueto also register the legacy capitalized route during migration. -
🐛 (server, smithy-rs#4743, @takenoko-gohan) Fix server codegen referencing
MakeSensitiveat the wrong module path. The type is located atinstrumentation::sensitivity::MakeSensitive, so generating a sensitive status-code formatter
previously failed to compile (E0425). -
🐛 (server) Make
DefaultMetricsPlugin'sServiceimpl generic over the request body type instead of
hardcodinghyper::body::Incoming. The plugin only reads request extensions (operation name,
service name, request ID) and never touches the body, so it composes with any body type. This
fixes a compilation error when usingDefaultMetricsPluginwith request bodies other than
hyper::body::Incoming. -
(client, smithy-rs#4764) Improve discoverability of the retry token bucket: the
config::retrymodule docs, theretry_configbuilder method, and theTokenBuckettype now point toRetryPartition::custom().token_bucket(...)for sizing or isolating the bucket.
Contributors
Thank you for your contributions! ❤