The Azure SDK team is pleased to announce our June 2026 client library releases.

21 packages released this month.

Stable Packages (12)

  • Core

  • Core - AMQP

  • Core - Macros

  • Core - OpenTelemetry

  • Identity

  • Key Vault - Certificates

  • Key Vault - Keys

  • Key Vault - Secrets

  • Storage - Blobs

  • TypeSpec Client Core

  • TypeSpec Core

  • TypeSpec Core Macros

Beta Packages (7)

  • Core Test

  • Core Test Macros

  • Cosmos DB

  • Cosmos DB Client Driver

  • Event Hubs

  • EventHubs Checkpoint Store for Azure Blob Storage

  • Key Vault - Certificates

Release highlights

Core 1.0.0 Changelog

Breaking Changes

  • Added #[non_exhaustive] to AttributeArray, AttributeValue, SpanStatus, and SpanKind.
  • Bearer token authorization now requires TLS (https).

Features Added

  • Initial stable release.

Core - AMQP 1.0.0 Changelog

Features Added

  • Initial stable release.

Core - Macros 1.0.0 Changelog

Features Added

  • Initial stable release.

Core - OpenTelemetry 1.0.0 Changelog

Features Added

  • Initial stable release.

Core Test 0.1.0 Changelog

Features Added

  • Initial release.

Core Test Macros 0.1.0 Changelog

Features Added

  • Initial release.

Cosmos DB 0.34.0 Changelog

Bugs Fixed

  • Fixed CosmosClientBuilder::with_user_agent_suffix not propagating the suffix to data-plane requests. The suffix was only applied to the SDK’s account-metadata pipeline; requests issued through the driver transport pipeline (the vast majority of operations) had a User-Agent header without the configured suffix. The suffix is now forwarded to CosmosDriverRuntimeBuilder so it appears on every outgoing request. (#4368)

Breaking Changes

  • All fallible public APIs now return azure_data_cosmos::Result<T> (= Result<T, CosmosError>) instead of azure_core::Result<T>, and the error type was renamed ErrorCosmosError (with CosmosErrorBuilder for construction). Categorization moved from a Kind enum to predicates on CosmosStatus (is_not_found(), is_throttled(), is_transient(), …); the underlying azure_core::Error is still reachable via std::error::Error::source(). (#4442)
  • Moved QueryOptions::max_item_count and QueryOptions::continuation_token into the new QueryOptions::feed: FeedOptions field. Callers that read or assign these fields directly should switch to options.feed.max_item_count / options.feed.continuation_token. The with_max_item_count / with_continuation_token convenience setters on QueryOptions continue to work unchanged. (#4447)
  • ThroughputProperties is now #[non_exhaustive] and no longer derives Default. The Default impl produced a meaningless wire payload (no manual throughput and no autoscale settings, which would send an empty offer body). Callers should use ThroughputProperties::manual(throughput) or ThroughputProperties::autoscale(starting_maximum_throughput, increment_percent) instead. (#4447)
  • Marked the following public model enums and response wrappers as #[non_exhaustive] to allow future variants/fields to be added without further breaking changes: VectorDataType, VectorDistanceFunction, ConflictResolutionMode, IndexingMode, SpatialType, CompositeIndexOrder, VectorIndexType, BatchResponse, ItemResponse, ResourceResponse<T>, ResponseBody, ResponseHeaders, PartitionKeyVersion and CosmosStatus. Callers must use .. wildcard arms in matches over these enums and cannot construct these structs via struct-literal syntax (the SDK already provides constructors / setters for the constructable types). (#4447)
  • CosmosClientBuilder::build now takes AccountReference directly instead of impl Into<AccountReference>. Callers should construct an AccountReference explicitly via AccountReference::with_credential or AccountReference::with_authentication_key and pass it in. (#4447)
  • Replaced EffectivePartitionKey::min() / EffectivePartitionKey::max() with associated constants EffectivePartitionKey::MIN / EffectivePartitionKey::MAX. The inner storage also changed from String to Cow<'static, str> so the constants can borrow static strings without allocating. Callers should rewrite EffectivePartitionKey::min() as EffectivePartitionKey::MIN.clone() (or just &EffectivePartitionKey::MIN for comparisons). (#4447)
  • Removed PartitionKeyValue::undefined() (use the existing PartitionKeyValue::UNDEFINED associated constant instead) and replaced the test-only PartitionKeyValue::infinity() constructor with a publicly-available PartitionKeyValue::INFINITY associated constant. (#4447)
  • Removed FeedRange::can_merge() and FeedRange::merge_with(). These are SDK-internal helpers used only by the session-token coalescing pipeline and are now implemented internally. (#4447)
  • Renamed CosmosAccountEndpointAccountEndpoint and CosmosAccountReferenceAccountReference. The Cosmos prefix is implied by the containing azure_data_cosmos crate. (#4447)
  • Renamed CosmosAccountReference::with_master_key() to with_authentication_key(). (#4447)
  • Renamed FeedPageIteratorQueryPageIterator and FeedItemIteratorQueryItemIterator. These iterators are only produced by query APIs today; the Feed* names are reserved for future non-query feed APIs. (#4447)
  • Removed the request_charge() and session_token() convenience accessors from FeedPage and QueryFeedPage. Use page.headers().request_charge() and page.headers().session_token() instead — the parsed ResponseHeaders already exposes these values and provides full typed access to every other response header. (#4447)
  • Tightened AccountReference constructors. with_credential now accepts impl Into<AccountEndpoint> instead of a concrete AccountEndpoint. The former with_master_key is renamed to with_authentication_key and now takes AccountEndpoint (which has FromStr and From<Url> impls) and impl Into<Secret> for the key. The two From<(AccountEndpoint, _)> / From<(Url, _)> tuple conversions are removed; construct a AccountReference via the named constructors instead. (#4447)
  • Removed azure_data_cosmos::ConnectionString from the public API. The type was a parsing helper not consumed by any public SDK API. Users who still need support for Connection String parsing can parse the connection string themselves and construct an AccountReference via the named constructors. (#4447)
  • Refactored the response surface to be SDK-owned. ItemResponse drops its type parameter (use response.into_model::<MyItem>() or response.into_body().into_single::<MyItem>()); ResourceResponse<T> keeps its parameter so .into_model()? still works without a turbofish. status() now returns CosmosStatus, headers() returns &ResponseHeaders (typed accessors only — etag(), request_charge(), session_token(), continuation(), activity_id(), substatus(), index_metrics(), query_metrics(), offer_replace_pending(), server_duration_ms(), lsn(), item_lsn(), item_count(), …), and into_body() returns the SDK-owned ResponseBody enum (NoPayload / Bytes / Items) with single(), items(), into_single::<T>(), into_items::<T>(), and is_empty() helpers. FeedPage::headers() / QueryFeedPage::headers() now return &ResponseHeaders instead of &azure_core::http::headers::Headers. The ItemResponse::etag() convenience accessor is removed (use response.headers().etag()). CosmosStatus is re-exported from the driver and implements PartialEq<StatusCode> and From<CosmosStatus> for StatusCode/u16, so existing comparisons keep working. (#4401)

Features Added

  • CosmosError can capture a stack backtrace on construction. Capture is opt-in (off by default; on when RUST_BACKTRACE is set or when explicit capacities are supplied) and protected against error storms by two configurable per-second limiters on the runtime builder. (#4442)
  • Introduced azure_data_cosmos::CosmosError and the crate-wide azure_data_cosmos::Result<T> alias, surfacing typed CosmosStatus (with predicate accessors like is_not_found() / is_throttled() / is_transient()), the originating CosmosResponse, and the operation DiagnosticsContext on every failure. From<CosmosError> for azure_core::Error is provided so callers using ? against azure_core::Error continue to compose. (#4442)
  • Added RoutingStrategy::PreferredRegions to allow specifying a fixed region preference order for failover, hedging, and retry. (#4485)
  • Standardized every client-method options type with a public operation: OperationOptions field and with_operation_options(OperationOptions) -> Self setter, so any per-request OperationOptions setting can be configured via any options type. The following options types previously had no way to attach OperationOptions and now do: ReadContainerOptions, ReadDatabaseOptions, ReplaceContainerOptions, CreateContainerOptions, CreateDatabaseOptions, DeleteContainerOptions, DeleteDatabaseOptions, QueryContainersOptions, QueryDatabasesOptions, ThroughputOptions, ReadFeedRangesOptions. For CreateContainerOptions / CreateDatabaseOptions / ReplaceContainerOptions, the SDK still forces content_response_on_write = Enabled on the resolved options because control-plane mutations require the response body. ReadFeedRangesOptions::operation is currently inert (the underlying routing-map cache does not go through the operation pipeline) but is added for shape consistency with the other options types. (#4447)
  • Added new() constructors and with_x consuming setters to multi-required-field model types so callers can build them declaratively without struct-literal syntax (which is now blocked by #[non_exhaustive]): VectorEmbedding::new(path, data_type, dimensions, distance_function) + with_path / with_data_type / with_dimensions / with_distance_function; ConflictResolutionPolicy::new(mode) + with_resolution_path / with_resolution_procedure; SpatialIndex::new(path) + with_type (singular pusher onto types); CompositeIndexProperty::new(path, order) + with_path / with_order; VectorIndex::new(path, index_type) + with_path / with_index_type. These types do not implement Default — their constructors require values that have no meaningful default. (#4447)
  • Derived Default on VectorEmbeddingPolicy, UniqueKeyPolicy, UniqueKey, PropertyPath, and CompositeIndex, and added singular with_x pushers / setters: VectorEmbeddingPolicy::with_embedding, UniqueKeyPolicy::with_unique_key, UniqueKey::with_path, PropertyPath::with_path, and CompositeIndex::with_property. This matches the existing IndexingPolicy::with_included_path style and lets callers build these policies declaratively without constructing intermediate Vecs. (#4447)
  • Added QueryFeedPage::as_feed_page() returning &FeedPage<T>, so a query page can be passed to APIs that accept the more general FeedPage type. Query-specific metadata (index/query metrics) remains accessible on the QueryFeedPage itself. (#4447)
  • Added QueryOptions::with_populate_index_metrics(bool), with_populate_query_metrics(bool), and with_max_item_count(MaxItemCountHint) setters. These replace the previous pattern of passing raw x-ms-cosmos-populateindexmetrics, x-ms-documentdb-populatequerymetrics, and x-ms-max-item-count values through OperationOptions::with_custom_headers for query execution. max_item_count takes the new MaxItemCountHint enum with ServerDecides and Limit(NonZeroU32) variants, so callers don’t have to traffic in the -1 wire sentinel directly. (#4401)
  • Added ContainerClient::patch_item() for applying JSON-Patch-style mutations to a single item. Supports add/set/replace/remove/increment/move ops via the new PatchInstructions/PatchOperation/CosmosNumber types. Added PatchItemOptions for per-request configuration (max_attempts, session_token, etc.). PatchItemOptions intentionally does not expose a Precondition or SQL filter predicate — the driver-side PATCH handler owns the internal If-Match end-to-end, and predicate evaluation is out of scope for this preview. The method’s rustdoc documents the non-idempotent-under-transport-failure caveat. (#4386)
  • Support for simple cross-partition queries with SELECT projections and WHERE filters. Cross-partition queries are now done through fan-out in the client, and provide a client-generated continuation token that can be used to resume the query. See ContainerClient::query_items() and FeedScope for details. (#4440)
  • Added QueryOptions::continuation_token and QueryOptions::with_continuation_token(...) for resuming queries from a continuation token. (#4440)
  • Added a new FeedOptions type that wraps the paging knobs (max_item_count, continuation_token) common to feed-style operations, so future feed APIs (change feed, read-feed, etc.) can adopt the same shape without redeclaring fields. QueryOptions now embeds it as a pub feed: FeedOptions field with a with_feed_options(FeedOptions) setter. The existing QueryOptions::with_max_item_count and QueryOptions::with_continuation_token setters are retained as convenience functions that mutate the embedded feed (they’re expected to be used commonly enough to warrant the shortcut). (#4447)

Cosmos DB 0.35.0 Changelog

Bugs Fixed

  • Writes to multi-write Cosmos accounts now send the x-ms-cosmos-allow-tentative-writes: true request header. Without it, satellite write regions returned 403 / 3 (WriteForbidden), breaking write failover to non-primary regions. (#4500)

Features Added

  • Exposed cross-regional read hedging. Enable it by attaching an OperationOptions built with OperationOptionsBuilder::with_availability_strategy(AvailabilityStrategy::Hedging(HedgingStrategy::new(HedgeThreshold::new(threshold)?))) to a request (e.g. ItemReadOptions::with_operation_options) or to the client defaults via CosmosClientBuilder::with_operation_options. The AvailabilityStrategy, HedgingStrategy, and HedgeThreshold types are now re-exported from azure_data_cosmos. When enabled, the driver speculatively dispatches the read to a second preferred region after the configured threshold elapses and returns whichever response classifies as final first, cancelling the losing leg structurally (no detached tasks); AvailabilityStrategy::Disabled turns hedging off for that scope, and when no strategy is configured the driver applies a built-in default for multi-region reads. (#4432)
  • Added configurable retry limits for throttled (HTTP 429, rate-limited) requests, mirroring the .NET and Java SDKs’ ThrottlingRetryOptions. A new nested ThrottlingRetryOptions group on OperationOptions (field throttling_retry_options) carries max_retry_count (env AZURE_COSMOS_MAX_THROTTLE_RETRY_COUNT, default 9, 0 disables throttle retries) and max_retry_wait_time (default 30s), settable per-request via OperationOptions/OperationOptionsBuilder and ThrottlingRetryOptionsBuilder. New client-wide setter CosmosClientBuilder::with_throttling_retry_options(ThrottlingRetryOptions) forwards the group as runtime-layer defaults. Both budgets apply per transport-pipeline invocation, not per logical operation — an operation that fans out across regions (failover, hedging) starts a fresh budget per leg; use OperationOptions::end_to_end_latency_policy to bound total per-operation wall-clock time. (#4544)

Cosmos DB Client Driver 0.3.0 Changelog

Bugs Fixed

  • build_transport_error (the abort wrap on the retry-budget-exhausted transport path) now forwards the inner cosmos error’s diagnostics onto the synthesized outer error. Previously the wrap passed None, so outer.diagnostics() returned None even when the underlying transport error carried a full Arc<DiagnosticsContext>; consumers had to walk source().diagnostics() to recover it. The operation diagnostics are now reachable directly on the error surfaced to callers.
  • Aborted operations now carry the operation’s completed DiagnosticsContext (retry history, region attempts, per-request events) onto the returned Error. Previously the abort branch of the operation pipeline mutated the local DiagnosticsContextBuilder and dropped it, so err.diagnostics() returned None on every aborted operation even though the success path had always attached diagnostics to the CosmosResponse. Added a builder path to re-decorate an existing error with diagnostics — CosmosError::builder().from_error(err).with_diagnostics(ctx).build() — so the abort site can attach the operation’s completed DiagnosticsContext without losing the original error’s wire payload, headers, status, or source chain.
  • infer_request_sent_status now classifies TRANSPORT_DNS_FAILED and TRANSPORT_HTTP2_INCOMPATIBLE (HTTP/2 protocol-negotiation failures such as HTTP_1_1_REQUIRED) as RequestSentStatus::NotSent, alongside the existing TRANSPORT_CONNECTION_FAILED case. Both failure modes provably precede any request bytes going onto the wire (DNS resolution happens before connect; H2 negotiation happens during the preface, before the request frame is emitted), so non-idempotent writes (Create / Replace / PATCH) may be retried safely. This restores the pre-refactor contract that callers used to rely on under azure_core::ErrorKind::Connection; the new typed boundary mapper had been refining those same chains into the more specific sub-statuses, which were falling through to RequestSentStatus::Unknown and disabling safe retries. Generic TRANSPORT_IO_FAILED continues to map to Unknown (it can fire mid-stream after request bytes left the socket).

  • CosmosResponseHeaders now parses x-ms-offer-replace-pending case-insensitively (true / True / TRUE and false / False / FALSE are all accepted). Previously the field used strict bool::FromStr parsing, which would silently drop Pascal-case values the service may emit and cause the throughput-replace poller to treat in-progress replacements as completed.
  • Restored periodic database-account metadata refresh on long-running clients. The per-operation lookup in CosmosDriver::execute_operation was caching the first response forever, so GET <account-endpoint>/ fired exactly once per process and the cached regional endpoint information was never updated. Each CosmosDriver now spawns a background loop in LocationStateStore::start_account_refresh_loop that re-fetches account metadata every 5 minutes. The loop is owned by the driver’s BackgroundTaskManager and is aborted automatically when the driver is dropped. (#4407)
  • Account-metadata refresh failures from the periodic background loop in LocationStateStore are now logged at tracing::warn! instead of being silently swallowed, so operators can detect that the SDK is serving stale account metadata. Behavior is unchanged — operations still succeed against the cached endpoints. (#4407)
  • PATCH RMW loop now reconciles the synthesized response body’s _etag system property with the inner Replace’s response header. Previously the post-image returned to callers carried the Read’s _etag, so response.into_model::<T>() on a type with an _etag field would yield a stale tag that no longer matched response.headers().etag — breaking optimistic-concurrency round-tripping. When the inner Replace returns a non-empty body (caller enabled content_response_on_write), the service’s authoritative post-image is now surfaced verbatim. (#4386)
  • PATCH RMW loop now folds the 412 response’s x-ms-session-token (via SessionToken::merge) into the carry-forward token threaded into the next attempt’s Read. Previously only the Read response’s token was carried forward, so a retry could regress to a strictly older session view than the failed Replace already observed. (#4386)
  • PPCB now records every 5xx failure for the affected partition, including the final failure that exhausts the failover retry budget. Previously the budget-exhausted abort path skipped emitting MarkPartitionUnavailable, causing the most diagnostic failure to be silently dropped from PPCB’s per-partition counter. (#4156)

Breaking Changes

  • Renamed the error surface: ErrorCosmosError, ErrorBuilderCosmosErrorBuilder. Categorization moved from a Kind enum to predicates on CosmosStatus (is_not_found(), is_throttled(), is_transient(), …); error details are reached via status() and response() instead of the previous flat accessors. (#4442)
  • Renamed MaxItemCount to MaxItemCountHint to better reflect that the value is a hint to the service (which may return fewer items) rather than a strict cap. The SDK already exposed the type under the new name via a use ... as MaxItemCountHint; the rename makes the canonical name consistent across both crates. Update callers that reference azure_data_cosmos_driver::models::MaxItemCount, CosmosRequestHeaders::max_item_count typings, or CosmosOperation::with_max_item_count argument types accordingly.
  • Marked PartitionKeyVersion and CosmosStatus as #[non_exhaustive] to allow future variants/fields to be added without further breaking changes. Callers must use .. wildcard arms when matching on PartitionKeyVersion; CosmosStatus already had private fields and is constructed via CosmosStatus::new / with_sub_status, so the attribute is primarily a forward-compat signal.
  • Slimmed the cached PartitionKeyRange to six fields, dropping eight metadata fields the routing-map cache never reads (resource_id, self_link, etag, timestamp, rid_prefix, target_throughput, lsn, owned_archival_pk_range_ids). The struct now retains the four fields the routing layer consults (id, min_inclusive, max_exclusive, status) plus throughput_fraction and parents, kept on the cached representation for downstream consumers that read them directly. As part of this change, PartialEq and Hash no longer hash resource_id: two ranges with the same id / min_inclusive / max_exclusive are now equal regardless of their _rid. Internal callers never used PartitionKeyRange as a hash-map key, but downstream consumers that did so should review their assumptions. Service responses are unchanged on the wire — the dropped JSON fields are silently ignored by serde on deserialization. (#4393)
  • Changed CosmosResponse::diagnostics() to return Arc<DiagnosticsContext> instead of &DiagnosticsContext. The returned Arc derefs transparently for read-only inspection (existing call patterns like response.diagnostics().activity_id() continue to work), but bindings of the form let d = response.diagnostics(); now own a cloned Arc handle rather than a borrow — letting callers retain operation diagnostics across into_body(). Replaces the additive CosmosResponse::diagnostics_arc() accessor introduced earlier in this preview cycle.
  • Removed CosmosResponse::body() -> &[u8]. The previous accessor panicked on multi-item feed bodies, which is unsafe for a public API. The non-consuming body_parts() -> &ResponseBody accessor has been renamed to body(). Callers needing borrowed access should pattern-match on ResponseBody::Bytes(b) / ResponseBody::Items(items); consuming callers can use into_body().single_item::<T>() or into_body().single().
  • Replaced EffectivePartitionKey::min() / EffectivePartitionKey::max() with associated constants EffectivePartitionKey::MIN / EffectivePartitionKey::MAX. The inner storage also changed from String to Cow<'static, str> so the constants can borrow static strings without allocating. Callers should rewrite EffectivePartitionKey::min() as EffectivePartitionKey::MIN.clone() (or just &EffectivePartitionKey::MIN for comparisons).
  • Removed PartitionKeyValue::undefined() (use the existing PartitionKeyValue::UNDEFINED associated constant instead) and replaced the test-only PartitionKeyValue::infinity() constructor with a publicly-available PartitionKeyValue::INFINITY associated constant.
  • Removed FeedRange::can_merge() and FeedRange::merge_with(). These were SDK-internal helpers used only by the session-token coalescing pipeline and are now implemented as private free functions inside azure_data_cosmos’s session helpers. Added FeedRange::is_logical_partition() as the minimum public predicate needed for external callers that wish to implement their own merge logic. FeedRange::is_subset_of() and FeedRange::overlaps() remain public informational APIs.
  • Removed ResponseBody::as_contiguous_bytes(), ResponseBody::into_bytes(), and CosmosResponse::into_bytes(). These helpers silently concatenated feed items into a single buffer, which is semantically wrong (feed items are independent JSON documents, not pieces of a larger byte stream). Callers should explicitly handle the ResponseBody::Bytes and ResponseBody::Items variants based on the operation type, or use ResponseBody::single() for single-payload responses. ResponseBody::into_string() now returns an error for feed bodies instead of concatenating items.

Features Added

  • CosmosError can capture a stack backtrace on construction. Capture is opt-in (off by default; on when RUST_BACKTRACE is set or when explicit capacities are supplied) and protected against error storms by two configurable per-second limiters on the runtime builder. See the README for details. (#4442)
  • Introduced CosmosError and the crate-wide Result<T> alias as the driver’s first-class error type, always exposing the typed CosmosStatus (with predicates like is_not_found() / is_throttled() / is_transient()), the originating CosmosResponse (when received), and the operation DiagnosticsContext. Construction goes through the fluent CosmosErrorBuilder. (#4442)
  • Added PartitionKeyDefinition::with_kind(PartitionKeyKind) and PartitionKeyDefinition::with_version(PartitionKeyVersion) consuming setters so callers can override the auto-inferred kind and the default V2 version without resorting to private-field workarounds. PartitionKeyDefinition::new(paths) continues to auto-infer the kind from the path count.
  • Reshaped PatchInstructions API so that PatchInstructions::new() creates an empty instruction set, where individual operations can be added via with_operation(). The PatchInstructions type also implements From<Vec<PatchOperation>> for ergonomic construction from a vector.
  • Refactored the driver response surface: introduced ResponseBody (a NoPayload / Bytes(Bytes) / Items(Vec<Bytes>) enum with single(), items(), into_single::<T>(), into_items::<T>(), and is_empty() helpers), added typed CosmosRequestHeaders fields for query / changefeed headers (max_item_count, incremental_feed, populate_index_metrics, populate_query_metrics, enable_cross_partition_query) so callers no longer need raw custom_headers, the pipeline now auto-emits x-ms-documentdb-isquery: True and Content-Type: application/query+json for OperationType::Query, and CosmosStatus gained PartialEq<StatusCode>, From<CosmosStatus> for StatusCode/u16, and a CosmosStatus::new(StatusCode) constructor. (#4401)
  • Added support for the x-ms-cosmos-hub-region-processing-only request header on retries after a 404 / 1002 (READ_SESSION_NOT_AVAILABLE) response on single-master data-plane Cosmos operations. The header asks the backend to route only to a region that has caught up to the requested LSN, reducing the chance of a follow-up retry hitting a region whose session is also behind. The header is scoped to single-master accounts (multi-master accounts already have a different recovery path) and to data-plane operations (metadata-pipeline operations are out of scope per the design spec). Once latched on the first 1002 within an operation, the header is emitted on every subsequent retry for that operation. (#4389)
  • Added local query-plan generator scaffolding under crate::query (lexer, parser, AST, planner, and in-memory evaluator). The scaffolding is not wired into the production query path yet — production callers still issue Gateway query-plan requests via CosmosOperation::query_plan. The __internal_testing cargo feature exposes query::__test_only_generate_query_plan_for_pk_paths, query::__TEST_ONLY_SUPPORTED_QUERY_FEATURES, and CosmosOperation::query_plan for cross-crate gateway-comparison tests; this feature is intentionally unstable and not covered by SemVer.
  • Added per-partition automatic failover (PPAF) for writes on single-master accounts. On 403/3 WriteForbidden, 503 ServiceUnavailable, 429/3092 SystemResourceUnavailable, 410/1022 Gone, or 408 RequestTimeout from a region, the affected partition is failed over to the next preferred region; subsequent writes for that partition skip the failed region. (#4156)
  • Added per-partition circuit breaker (PPCB) for reads (any account) and writes (multi-master accounts). Tracks failure counts per (partition_key_range_id, region) and routes to an alternate region once the threshold (default 10 reads, 5 writes) is exceeded. A background failback loop probes the original region for recovery. (#4156)
  • Added OperationOptions fields for tuning PPCB: circuit_breaker_failure_count_for_reads, circuit_breaker_failure_count_for_writes, circuit_breaker_timeout_counter_reset_window_in_minutes, allowed_partition_unavailability_duration_in_seconds, ppcb_stale_partition_unavailability_refresh_interval_in_seconds, and per_partition_circuit_breaker_enabled (each also configurable via the corresponding AZURE_COSMOS_* environment variable). (#4156)
  • Added CosmosDriverRuntimeBuilder::with_wrapping_sdk_identifier(impl Into<String>) so higher-level SDKs can prepend their own identifier (e.g., azsdk-rust-cosmos/0.34.0) to the driver’s User-Agent prefix. The driver only sanitizes ASCII and trims whitespace; the wrapping SDK is responsible for the full token format. When set, the User-Agent becomes <wrapping> azsdk-rust-cosmos-driver/<ver> <os>/<arch> rustc/<ver> [suffix]; when unset, the existing format is unchanged. (#4465)
  • Added OperationType::Patch plus CosmosOperation::patch_item() and the PatchOperation/CosmosNumber/PatchDocument model types. Patches are executed driver-side as a Read-Modify-Write loop via a dedicated patch_handler pipeline stage; see docs/PATCH_HANDLER_SPEC.md for the full contract. The handler owns the internal If-Match precondition end-to-end and rejects any caller-set Precondition on the outer PATCH operation with a clear error before issuing any sub-operation. (#4386)

Cosmos DB Client Driver 0.4.0 Changelog

Bugs Fixed

  • Data-plane and non-account metadata operations now fall back to the hub/primary write region endpoint instead of the global account endpoint when all regional endpoints are excluded or unavailable. (#4503)
  • Writes to multi-write Cosmos accounts now send the x-ms-cosmos-allow-tentative-writes: true request header (gated on enableMultipleWriteLocations from the account metadata). Without this header satellite write regions returned 403 / 3 (WriteForbidden), breaking write failover. (#4500)
  • Bootstrap account-metadata fetches now surface non-2xx responses as CosmosError with the wire status and body, instead of a missing field _self serde error. Diagnostics are populated on the same envelope used by the operation pipeline. (#4500)
  • A transient failure while refreshing the partition key range cache no longer replaces a known-good cached routing map with an empty placeholder; the previous map is preserved until the next successful refresh. (#4549)

Breaking Changes

  • Removed CosmosDriver::resolve_container_by_rid and the supporting CosmosOperation::read_container_by_rid factory and ContainerCache::get_or_fetch_by_rid. These RID-keyed entry points had no callers; container resolution now goes exclusively through resolve_container / resolve_container_by_name. (#4506)

Features Added

  • Added cross regional hedging for reads on single and multi-master accounts. Using AvailabilityStrategy::Hedging the user now has the option to pass a threshold, and the driver speculatively dispatches the same request to a second preferred region after the threshold hits and returns whichever response classifies as final first. The losing leg is cancelled structurally (no detached tasks). (#4432)
  • Added OperationOptions::consecutive_hedge_win_threshold (and the AZURE_COSMOS_CONSECUTIVE_HEDGE_WIN_THRESHOLD environment variable) to tune how aggressively cross-region hedging drives per-partition failover. This option does not enable hedging — hedging is turned on by setting OperationOptions::availability_strategy to AvailabilityStrategy::Hedging(HedgingStrategy::new(threshold)) (at the operation, account, or runtime layer); when no strategy is configured the driver applies a built-in default, and AvailabilityStrategy::Disabled turns it off. Once hedging is active, the driver speculatively dispatches a read to an alternate preferred region after the threshold elapses, and a “hedge win” is recorded whenever that alternate returns the final response before the primary. consecutive_hedge_win_threshold sets how many consecutive hedge wins on the same (partition, primary_region) pair are tolerated before the per-partition circuit breaker (PPCB) trips the partition away from its primary region (default 5, matching the .NET v3 SDK). Lower values trip the partition sooner when the primary is chronically slow but the alternate is healthy; higher values tolerate occasional latency spikes that the hedge happens to win, avoiding spurious failovers when both regions are healthy. (#4432)
  • Added configurable throttle (HTTP 429, rate-limited) retry limits to OperationOptions via the nested ThrottlingRetryOptions group (mirroring the .NET and Java SDKs’ ThrottlingRetryOptions): max_retry_count (env AZURE_COSMOS_MAX_THROTTLE_RETRY_COUNT, default 9, 0 disables retries) caps the number of 429 retries, and max_retry_wait_time (default 30s) caps the cumulative wait across them. Each field resolves independently through the standard operation → account → runtime → env layering and is threaded into the transport-level throttle retry loop via ThrottleRetryState::with_limits. The one-shot forced-final-retry safety net in execute_transport_pipeline is gated on attempt_count < max_attempts, so a configured max_retry_count = N produces at most N + 1 total requests on the wire (1 initial + N retries) — matching the .NET-parity MaxRetryAttemptsOnRateLimitedRequests contract. The forced-final retry remains active when the cumulative-wait budget is the limiter rather than the count. Both budgets are scoped per execute_transport_pipeline invocation; an operation that fans out across regions (failover, hedging) starts a fresh throttle budget per leg, so per-operation total wall-clock time should be bounded via OperationOptions::end_to_end_latency_policy. (#4544)

Event Hubs 0.15.0 Changelog

Breaking Changes

  • On the receive path, the amqp:link:stolen AMQP condition is no longer auto-retried. A receiver displaced by a higher-or-equal-epoch attacher now surfaces the error (translated to EventHubsError::ConsumerDisconnected by EventReceiver::stream_events) instead of silently re-attaching. Sender, CBS, and management operations retain the historical retry-on-stolen behavior.

Features Added

  • The EventProcessor now opens every partition receiver with AMQP epoch (owner level) 0 and surfaces broker-initiated displacement as the new EventHubsError::ConsumerDisconnected error kind. When a second EventProcessor instance claims a partition this instance is currently holding, the broker disconnects this instance’s receiver and the consumer’s stream_events() resolves with ConsumerDisconnected. This matches the behavior of EventProcessorClient in the .NET and Java Azure SDKs. Consumers should pattern-match on ErrorKind::ConsumerDisconnected to detect a stolen partition and re-acquire a client via next_partition_client().
  • Added EventHubsError::ConsumerDisconnected(Option<AmqpDescribedError>) error variant.

Bugs Fixed

  • Increased DEFAULT_PARTITION_EXPIRATION_DURATION from 10 seconds to 60 seconds. The previous default was shorter than DEFAULT_UPDATE_INTERVAL (30 seconds), so ownership records expired between load-balancing cycles. The load balancer perpetually saw current=0 for every consumer and continuously re-claimed partitions, causing widespread duplicate event processing. EventProcessorBuilder::build now rejects configurations where partition_expiration_duration <= update_interval. (#3851)
  • The EventProcessor’s load-balancer reconciliation now closes the underlying AMQP receiver for any partition that has been reassigned to another consumer, so the consumer’s stream_events() resolves and the loop can terminate. Previously a stolen partition’s client could continue to attempt receives until the broker tore down the link.

EventHubs Checkpoint Store for Azure Blob Storage 0.9.0 Changelog

Breaking Changes

Features Added

Bugs Fixed

Identity 1.0.0 Changelog

Features Added

  • Initial stable release.

Breaking Changes

  • Added #[non_exhaustive] to UserAssignedId.

Key Vault - Certificates 1.0.0 Changelog

Features Added

  • Initial stable release.

Breaking Changes

  • Bearer token authentication now requires TLS (https).
  • Renamed CertificateClient::create_certificate() to begin_create_certificate() per guidelines.
  • Vault URLs must use TLS (https).

Key Vault - Certificates 1.1.0-beta.1 Changelog

Features Added

  • Added an experimental PlatformManaged property on CertificatePolicy for Azure Key Vault internal usage. Any calls using this property will fail and it is not recommended to be used at this point. #4539.

Key Vault - Keys 1.0.0 Changelog

Features Added

  • Initial stable release.

Breaking Changes

  • Vault URLs must use TLS (https).

Key Vault - Secrets 1.0.0 Changelog

Features Added

  • Initial stable release.

Breaking Changes

  • Vault URLs must use TLS (https).

Storage - Blobs 1.0.0 Changelog

Breaking Changes

  • Consolidated client constructors: the existing from_url() constructors have been renamed to new(), replacing the previous endpoint-plus-name string overloads. Each client now has a single new() that takes a fully-formed Url:
  • BlobClient::new(blob_url: Url, ...)
  • BlockBlobClient::new(blob_url: Url, ...)
  • AppendBlobClient::new(blob_url: Url, ...)
  • PageBlobClient::new(blob_url: Url, ...)
  • BlobContainerClient::new(container_url: Url, ...)
  • BlobServiceClient::new(service_url: Url, ...)
  • BlobServiceClient::find_blobs_by_tags() is now pageable and returns Result<Pager<FilteredBlobResponse, XmlFormat>> instead of Result<Response<FilterBlobSegment, XmlFormat>>.
  • BlobContainerClient::find_blobs_by_tags() is now pageable and returns Result<Pager<FilteredBlobResponse, XmlFormat>> instead of Result<Response<FilteredBlobResponse, XmlFormat>>.
  • Renamed FilterBlobSegment to FilteredBlobResponse.
  • Renamed FilteredBlobResponse.blobs to FilteredBlobResponse.blob_items.
  • Changed FilteredBlobResponse.blob_items from Option<Vec<FilterBlobItem>> to Vec<FilterBlobItem>.
  • Renamed ListContainersSegmentResponse to ListContainersResponse.
  • Removed BlobFlatListSegment wrapper; ListBlobsResponse.blob_items is now Vec<BlobItem> directly (previously accessed via .segment.blob_items).
  • Renamed BlobProperties.customer_provided_key_sha256 to encryption_key_sha256.
  • Renamed BlobMetadata.additional_properties to values.
  • Renamed PageBlobClientCreateOptions::with_if_not_exists() to if_not_exists().
  • Renamed AppendBlobClientCreateOptions::with_if_not_exists() to if_not_exists().
  • Renamed BlockBlobClientUploadBlobFromUrlOptions::with_if_not_exists() to if_not_exists().
  • Renamed BlockBlobClientUploadOptions::with_if_not_exists() to if_not_exists().
  • Removed the endpoint() method from all clients. Use url() instead.
  • Removed PageBlobClient::get_page_ranges() along with the PageList, PageRange, ClearRange, PageBlobClientGetPageRangesOptions, and PageListHeaders types.
  • Removed the azure_storage_blob::error and azure_storage_blob::models::error module paths. Use the re-exported azure_storage_blob::{Result, StorageError} instead.

Bugs Fixed

  • All client constructors (BlobClient::new(), BlobContainerClient::new(), BlobServiceClient::new(), AppendBlobClient::new(), BlockBlobClient::new(), PageBlobClient::new()) now reject non-base URLs (e.g. data:, mailto:).

Features Added

  • Added with_tags() helpers to set blob tags on create/upload options by accepting BlobTags or HashMap<String, String> and encoding them into the x-ms-tags header format:
  • PageBlobClientCreateOptions::with_tags()
  • AppendBlobClientCreateOptions::with_tags()
  • BlockBlobClientUploadOptions::with_tags()
  • BlockBlobClientUploadBlobFromUrlOptions::with_tags()
  • BlockBlobClientCommitBlockListOptions::with_tags()

TypeSpec Client Core 1.0.0 Changelog

Breaking Changes

  • Added #[non_exhaustive] to AttributeArray, AttributeValue, SpanStatus, and SpanKind.
  • new_http_client() now panics if the reqwest feature is not enabled.

Features Added

  • Initial stable release.

TypeSpec Core 1.0.0 Changelog

Features Added

  • Initial stable release.

TypeSpec Core Macros 1.0.0 Changelog

Features Added

  • Initial stable release.

Latest Releases

View all the latest versions of Rust crates here.

Installation Instructions

To install any of our crates, copy and paste the following commands into a terminal:

$> cargo add azure_core@1.0.0
$> cargo add azure_core_amqp@1.0.0
$> cargo add azure_core_macros@1.0.0
$> cargo add azure_core_opentelemetry@1.0.0
$> cargo add azure_core_test@0.1.0
$> cargo add azure_core_test_macros@0.1.0
$> cargo add azure_data_cosmos@0.34.0
$> cargo add azure_data_cosmos@0.35.0
$> cargo add azure_data_cosmos_driver@0.3.0
$> cargo add azure_data_cosmos_driver@0.4.0
$> cargo add azure_identity@1.0.0
$> cargo add azure_messaging_eventhubs@0.15.0
$> cargo add azure_messaging_eventhubs_checkpointstore_blob@0.9.0
$> cargo add azure_security_keyvault_certificates@1.0.0
$> cargo add azure_security_keyvault_certificates@1.1.0-beta.1
$> cargo add azure_security_keyvault_keys@1.0.0
$> cargo add azure_security_keyvault_secrets@1.0.0
$> cargo add azure_storage_blob@1.0.0
$> cargo add typespec@1.0.0
$> cargo add typespec_client_core@1.0.0
$> cargo add typespec_macros@1.0.0

Feedback

If you have a bug or feature request for one of the libraries, please post an issue to GitHub.