Project: Dapr (App Definition and Development / Application Definition & Image Build)
File: v1.13.0.md

We're happy to announce the release of Dapr 1.13! We would like to extend our thanks to all the new and existing contributors who helped make this release happen. If you're new to Dapr, visit the page and familiarize yourself with Dapr. Docs have been updated with all the new features and changes of this release. To get started with new capabilities introduced in this release, go to the and the . Note: This release contains a few . See section on upgrading Dapr to version 1.13. These are the v1.13 release highlights: is a new that, when enabled, allows component updates to be picked up automatically, without the need for restarting the Dapr process. The component spec is reconciled and takes effect when running in both Kubernetes and Self-Hosted modes. You can now use Go and JavaScript/TypeScript to write fault-tolerant, workflow-based apps with durable execution. See the and try the or the . See the and try the or the You can now opt-in to make actor reminders data use protobuf serialization instead of JSON, which increases throughput, reduces latency, and improves stability when multiple Dapr instances are operating on the same reminders. With this feature enabled, we have observed improvements as high as 40% in Actor Reminders and Workflow benchmarks. This serialization method will become default in v1.14. Important: Once you enable this feature, you should not downgrade the Dapr control plane to an earlier version, as your reminders data may become unreadable. To enable protobuf serialization for actor reminders, set the following Helm argument on Kubernetes: `dapr_placement.maxActorApiLevel=20`. On self-hosted mode, run daprd with the flag: `--max-api-level=20` Dapr now includes an optional setting to enable low cardinality for metrics emitted by the HTTP server, which will be enabled by default in Dapr 1.14. Currently, the Dapr HTTP server emits metrics for each request path, which has been observed to cause significant memory usage and have other negative performance impact. When low-cardinality metrics are enabled, the HTTP Dapr server behaves more like the gRPC server and groups requests for each Dapr API together, possibly reducing memory consumption significantly. See additional info . Dapr now accepts a `dapr.io/block-shutdown-duration` annotation or `--dapr-block-shutdown-duration` CLI flag which delays the full shutdown procedure for this duration or until the app reports as unhealthy- whichever is sooner. During this period, all Subscriptions and input bindings will be closed. This is useful for applications that need to use the Dapr APIs as part of their own shutdown procedure. See additional info . The Dapr PubSub and State APIs now have the appropriate and standardized error codes returned to applications including enriched error details based on gRPC's richer error model. The remaining APIs are a work in progress, and community contributions towards this effort are greatly appreciated and very impactful. See additional info on the error codes . Check the docs for each SDK for per-SDK error code parsing and handling. See an . You can now use Rust to run Dapr Actors, a programming model for highly scalable stateful applications. See the You can now use a SQLite based name resolver for . This is useful for dealing with corporate firewalls and VPNs that filter mDNS. See additional info . PostgreSQL has a new v2 implementation which contains improvements to performance and reliability. New applications are encouraged to use v2. The v1 implementation remains supported and is not deprecated. There is no migration path from v1 to v2. See additional info

Azure Blob Storage has a new v2 implementation, which is recommended for all new projects as it fixes a backwards-incompatible bug with key prefixes. The v1 implementation remains supported and is not deprecated. There is no migration path from v1 to v2. See additional info . Thanks to everyone who made this release possible! @a-elsheikh, @addjuarez, @AishwaryaBalyaya01, @alfred-mikhael, @amimimor, @andreas-eriksson, @andrew-hillier, @arthbalete, @artursouza, @ASHIQUEMD, @avo-sepp, @baransonmez, @berndverst, @bkc, @bmelbourne, @bruth, @burhan, @cgillum, @chaitanyab2311, @cicoyle, @ckcd, @cscetbon, @danielgerlag, @dasanind, @DeepanshuA, @ejba, @elena-kolevska, @emctl, @eunicecompra, @famarting, @farshaddavoudi, @fazledyn-or, @filintod, @frankbuckley, @frodera, @fvandillen, @fyzact, @georgestevens99, @Gonzoe79, @greenie-msft, @gspadotto, @hauju, @henrikkarstrom, @heunghingwan, @hhunter-ms, @ItalyPaleAle, @jamesmcroft, @jancespivo, @jellis18, @jerinthomas1404, @jhberge, @jigargandhi, @jjcollinge, @jorimvanhove, @JoshVanL, @kaibocai, @KarstenWintermann, @KrylixZA, @litan1106, @lrascao, @lucus-sun, @luigirende, @macel94, @marcduiker, @martbln, @mathieu-benoit, @mikeee, @MregXN, @msfussell, @mukundansundar, @nitroin, @olitomlinson, @paianish62, @passuied, @paulyuk, @philliphoff, @pngan, @prashantrewar, @prateek041, @pravinpushkar, @qustavo, @rabollin, @robertojrojas, @RyanLettieri, @sadath-12, @salaboy, @shivamkm07, @shubham1172, @sicoyle, @siebenluke, @skyao, @srilasya02, @srparupu, @stuartleeks, @Taction, @thapasusheel, @tlund101, @tmacam, @toneill818, @TWEESTY, @twinguy, @vermillionsword, @Viktorsubota, @willvelida, @WhitWaldo, @XavierGeerinck, @xiangpingjiang, @yaron2, @yash-nisar, @ytimocin ADDED New name-resolver based on SQLite for local development (alternative to mDNS) ADDED Option to emit metrics from HTTP server with lower cardinality for reduced memory consumption (disabled by default), and include more information in API logs ADDED Metrics for Dapr Workflow ADDED Improve Actor Reminders performance by serializing as protobuf (opt-in) UPDATED Switched default Docker registry to `ghcr.io` in Helm chart UPDATED Enforce Component names to be unique ADDED Helm chart option to deploy Placement with zero replicas ADDED Support for `priorityClass` in Helm charts ADDED Helm option `daprsidecarinjector.enableK8sDownwardAPIs` to improve detection of pod IP in certain Kubernetes environments ADDED Hot Reloading for components ADDED Add Helm chart options to configure the Service resources created ADDED Option `--dapr-block-shutdown-duration` to daprd ADDED Enhanced logging for Workflow ADDED Allow specifying control plane service for actors and/or reminders UPDATED Multiple performance improvements for Actor invocations UPDATED Tune actor app health check to recover more quickly from failure ADDED Metadata API: report actor runtime status ADDED Sentry JWKS validator: add support for passing root CA certs ADDED Cascading terminate and purge of child workflows ADDED Option to add extra env vars to control plane pods in Helm charts ADDED Tracing info to outbox requests ADDED Register Reflection service on gRPC server ADDED Support for application/json serialization to outbox FIXED Dapr Operator should not patch the Subscription CRDs if the conversion webhooks are disabled FIXED Error immediately when metrics export server fails FIXED Duplicate HTTP headers on non-successful responses FIXED Fixed multiple bugs in connection with Placement service FIXED Removed unused CLI flags for control plane services FIXED `grpcserverstatus` label missing for gRPC server latency metric FIXED Using `deploymentAnnotations` produces invalid Helm chart FIXED Send dropped PubSub message to dead-letter if configured FIXED Concurrency issue when halting all actors FIXED Change Operator default port to 443 FIXED Do not write SVID to local file FIXED Metadata API contains invalid value for PubSub subscription rule when undefined FIXED Prevent null traceparent from being returned to the caller FIXED Make Injector resilient to Sentry unavailability FIXED Missing namespace property in Sentry CA bundle ConfigMap Helm resource FIXED Grafana dashboards not working UPDATED Build Dapr using Go 1.21 REMOVED Remove deprecated `RenameReminder` methods REMOVED Remove `AppChannelAllowInsecureTLS` feature flag, and require TLS-enabled app channel to use TLS 1.2+ FIXED Workflow events of the same name are not buffered UPDATED Injector: Change daprd projected token audience to sentry SPIFFE ID ADDED Make workflow engine configurable ADDED Workflow creation policy

ADDED Authorization to the APIs of Operator and Placement ADDED Support for alternate backends for Dapr Workflow (currently limited to Dapr Actors only) ADDED Richer error codes model ADDED Standardize error messages for PubSub FIXED Fix timeouts in HTTP service invocation when resiliency policies with timeouts are applied ADDED Block Graceful Shutdown: stop input bindings and subscriptions FIXED dapr-api-token header population for proxied calls ADDED Calculate vnodes on daprd instead of the placement service FIXED Workflow Sub-Orchestration creation not working FIXED conflict with `content-length` metadata in pubsub subscription. ADDED Disable placement timeout with no peers FIXED Dapr workflow fails while purging retryable child workflows FIXED Workflow gRPC start API should generate instanceID if not present FIXED Subscriptions: Fix panic when match rule is empty ADDED gRPC metadata and HTTP headers added to binding response even in case of error Dapr 1.13 introduces 3 new components: State Store: PostgreSQL v2 This new version of the PostgreSQL state store can offer up to 10% improved performance in some scenarios. This version supports all stable capabilities, including Actor State Store; support for the Alpha Query API. Note that the v1 of the component continues to be supported and there are currently no plans to deprecate it. State Store: Azure Blob Storage v2 This version addresses a fundamental breaking change in the handling of the state key prefix. Note that the v1 of the component continues to be supported and there are currently no plans to deprecate it. Name Resolver: SQLite This component is particularly useful in local development or in single-node deployments, as an alternative to the default mDNS name resolver. Additionally, one component has been removed: The NATS Streaming component (which was deprecated in Dapr 1.11) has been removed, since the NATS Streaming Server project is deprecated. Users are encouraged to migrate to NATS

Other improvements and fixes to components: Bindings: Invocation metadata property `ttl` is now an alias for `ttlInSeconds` and accepts a Go duration format in addition to seconds as whole numbers AWS S3: Added support for Content-Type in the metadata request Handle object not found error Azure Blob Storage: Handle object not found error GCP Bucket: Handle object not found error Huawei OBS: Handle object not found error Kafka: Added support for AWS IAM with AWS Kafka clusters PubSub: Invocation metadata property `ttl` is now an alias for `ttlInSeconds` and accepts a Go duration format in addition to seconds as whole numbers AWS SQS: Fixed errors during Dapr shutdown and with message polling behavior GCP PubSub: Fixed: reduce unnecessary administrator calls on publish to a GCP PubSub Topic Kafka: Added support for AWS IAM with AWS Kafka clusters Added Avro schema registry support Added message key and other metadata as metadata in consumer Added more configuration options to control prefetching and concurrency Redis: Added support for message metadata Secret stores: AWS Secret Manager and AWS Parameter Store: Added connection validation State stores: AWS DynamoDB: Fixed: validate AWS connection Azure Blob Storage (v1): Added `disableEntityManagement` metadata option to work with minimal Microsoft Entra ID permissions Azure CosmosDB: Added ability to pass explicit partition key in Query method Cassandra: Added TLS verification support via metadata option`EnableHostVerification` Microsoft SQL Server: Improve performance of Multi invocations with 1 operation only MySQL: Improved performance of Set operations with first-write-wins Improved performance of Multi invocations with 1 operation only PostgreSQL (v1): Improved performance of Multi invocations with 1 operation only Redis: Fixed: numeric operators do not work correctly on large numbers when querying SQLite: Fixed: when connecting to an in-memory database, limit to 1 concurrent connection Improved performance of Set operations with first-write-wins Improved performance of Multi invocations with 1 operation only All components that support the alpha Query APIs now offer new filter types Name resolvers: Consul: Added local in-memory caching of Consul responses Azure components: Allow Azure Auth order to be specified via `azureAuthMethods` component metadata FIXED Unix: Directories in `~/.dapr` given 777 permissions. UPDATE Upgrade go to 1.21 ADDED Add --run-file support for stdin UPDATED Can't use C# 9.0 Record for actor method return type UPDATED Error Suppression and Vault Name Mapping FIXED HttpClient created by DaprClient.CreateInvokeHttpClient can't find the target service to invoke ADDED ADDED FEATURE PREVIEW: Add Actor State TTL support ADDED Proposal: Strongly-typed non-remoted Actor clients FIXED bug: Dapr not handling enums as string in pub/sub with JsonSerializerOptions UPDATED Increase Logging Metrics for Workflow UPDATED GetBulkStateAsync should have typed overload that performs bulk deserialization FIXED Exception running Actor example: Type 'Dapr.Actors.Runtime.ActorReminder' cannot be serialized. UPDATED ADDED Support .NET 8 FIXED ADDED add some descriptions to README in workflow example ADDED Proposal: Support cancellation tokens for non-remoted actor interfaces UPDATED use daprWorkflowClient instead of daprClient in workflow sample UPDATED Weakly-typed actors should support polymorphic response and null response ADDED Cascade Terminate/Purge for workflow FIXED AddDaprClient incompatible with keyed services UPDATED Update protos and related use for Dapr 1.13. ADDED Workflow implementation in SDK RESOLVED Allow overriding the default logger FIXED Unable to get the HTTP response details by Dapr HttpBinding if the state code is not 200 UPDATED reactore-core to v3.5.0. UPDATED Update project-reactor dependency & fix deprecated calls ADDED Additional CloudEvent fields (pubsubname, topic, time, etc) FIXED HTTP HEAD calls must not have a request body ADDED Provide getGuid() method in Java workflow SDK FIXED Cannot schedule a workflow at a specific date/time ADDED Workflow Log Enhancements ADDED Support JDK17 and springboot3 in Dapr Java SDK ADDED Error details and payload to the DaprException ADDED Use health check to wait for sidecar ADDED Saga Pattern support ADDED Check outbound healthz endpoint on sidecar wait ADDED Support Cascade Terminate/Purge feature for Dapr Workflow CHANGED Improved developer experience for error handling DEPRECATED The `wait` method is now deprecated and will be removed in a future release. The automatic outbound health check covers this use case. ADDED Python decorators for workflow ADDED Add support for retry policies FIXED Child Workflow doesn't work if input or instance_id is not passed CHANGED Logs enhancements - Structured logging and right log levels ADDED Allow optional explicit naming of workflow and activity names FIXED try/except not working correctly in workflow functions FIXED Actor reminder and timer to accept empty period parameter UPDATED Accept the API token through theDAPRAPITOKENenvironment variable FIXED ActorId accepts invalid IDs, causing issues when making Actor HTTP calls FIXED PubSub Example UPDATED gRPC endpoint parsing FIXED File Header Styling ADDED Workflow Authoring Support FIXED Configuration gRPC calls not sending metadata UPDATED Update dependencies (axum, prost, tonic) UPDATED Protos updated to Dapr v1.13 CHANGED Handle metadata for Configuration API ADDED Configuration client API implemented ADDED Initial actor runtime implementation Dapr 1.13 Quickstarts include these major updates: ADDED* by @kaibocai ADDED* by @mikeee UPDATED* All C# Quickstarts upgraded to .NET 8 by @pngan UPDATED* updates for Quickstart authors by @paulyuk [977] Other improvements include: UPDATED dapr.yml updates UPDATED Update app.js - `process.env.STATESTORENAME` UPDATED use daprWorkflowClient instead of daprClient in workflow sample UPDATED Change dotnet TargetFramework from v7.0 to v8.0 UPDATED Clarified actor state persistence description UPDATED Updating CI/CD actions to use release-1.13 of dapr/dapr runtime [976] UPDATED Update

FIXED dapr-bot (assign) is broken FIXED correct readme (https://github.com/dapr/quickstarts/pull/976) FIXED Quickstart tests are failing as CRON Binding is not getting loaded FIXED Proposal: Upgrade C# quickstarts to .NET 8 LTS FIXED Its Not clear which is the most up-to-date-dotnet Workflow Sample FIXED Fix the DAPR bot script addressing this issue #966 To upgrade to this release of Dapr, follow the steps here to ensure a smooth upgrade. You know, the one where you don't get red errors on the terminal.. we all hate that, right? Uninstall Dapr using the CLI you currently have installed. Note that this will remove the default $HOME/.dapr directory, binaries and all containers daprredis, daprplacement and dapr_zipkin. Linux users need to run sudo if docker command needs sudo: ```bash dapr uninstall --all ``` For RC releases like this, download the latest and greatest release from and put the `dapr` binary in your PATH. Once you have installed the CLI, run: ```bash dapr init --runtime-version=1.13 ``` Wait for the update to finish, ensure you are using the latest version of Dapr(1.13) with: ```bash $ dapr --version CLI version: 1.13 Runtime version: 1.13 ``` You can perform zero-downtime upgrades using both Helm 3 and the Dapr CLI. Download the latest RC release from and put the `dapr` binary in your PATH. To upgrade Dapr, run: ``` dapr upgrade --runtime-version 1.13 -k ``` To upgrade with high availability mode: ``` dapr upgrade --runtime-version 1.13 --enable-ha=true -k ``` Wait until the operation is finished and check your status with `dapr status -k`. All done! Note: Make sure your deployments are restarted to pick the latest version of the Dapr sidecar To upgrade Dapr using Helm, run: ``` helm repo add dapr https://dapr.github.io/helm-charts/ helm repo update helm upgrade dapr dapr/dapr --version 1.13 --namespace=dapr-system --wait ``` Wait until the operation is finished and check your status with `dapr status -k`. All done! Note: Make sure your deployments are restarted to pick the latest version of the Dapr sidecar Please see for a complete guide to installing Dapr on Kubernetes You can use Helm 3 to install Dapr: ``` helm repo add dapr https://dapr.github.io/helm-charts/ helm repo update kubectl create namespace dapr-system helm install dapr dapr/dapr --version 1.13 --namespace dapr-system --wait ``` Alternatively, you can use the latest version of CLI: ``` dapr init --runtime-version=1.13 -k ``` Verify the control plane pods are running and are healthy: ``` $ dapr status -k NAME NAMESPACE HEALTHY STATUS REPLICAS VERSION AGE CREATED dapr-sidecar-injector dapr-system True Running 1 1.13 15s 2024-02-26 13:07.39 dapr-sentry dapr-system True Running 1 1.13 15s 2024-02-26 13:07.39 dapr-operator dapr-system True Running 1 1.13 15s 2024-02-26 13:07.39 dapr-placement dapr-system True Running 1 1.13 15s 2024-02-26 13:07.39 ``` After Dapr 1.13 has been installed, perform a rolling restart for your deployments to pick up the new version of the sidecar. This can be done with: ``` kubectl rollout restart deploy/<deployment-name> ``` The NATS Streaming PubSub component, which was deprecated in Dapr 1.11, has been removed. The NATS Streaming Server project has been deprecated since June 2023, and users are encouraged to switch to and the . The deprecated `RenameReminder` methods have been removed from the Dapr Actor APIs and SDKs The preview flag `AppChannelAllowInsecureTLS` feature flag has been removed. The Dapr app channel now requires TLS 1.2 or higher when TLS is enabled, and this behavior cannot be disabled When terminating or stopping a Workflow, the default behavior has changed to cascade the action to child Workflows. Non-cascading termination/purge can be requested in the API

Components must now have a unique name across all component types As part of the Richer Error Codes model change (, ), a subset of the State and PubSub API errors has been updated to use an appropriate status code (ex. `INVALIDARGUMENT`, `FAILEDPRECONDITION`) instead of the generic `UNKNOWN` Additional breaking changes for the Dapr .NET SDK: Polymorphic Responses in Weakly-typed Actors in Dapr .NET SDK: Description: The .NET 6 and .NET 8 targets of the Dapr .NET SDK have different serialization behavior of properties of a derived response object on an operation of a weakly-typed actor client. Impact: Impacts users upgrading a consumer application to .NET 8 running Dapr `1.13` or later. Root cause: In the .NET 6 target of the SDK, the actor runtime serializes the response object on an operation of a weakly-typed actor client using the runtime type of the response object. In the .NET 8 target of the SDK, the actor runtime serializes the response object using the base response type as declared on the operation on the actor interface. Solution: For .NET 8, the developer must decorate the base response class that is declared on the operation on the actor interface with a `JsonDerivedType` attribute specifying the derived response class. Alternatively, a custom `IJsonTypeInfoResolver` implementation can be set on the `JsonSerializerOptions.TypeInfoResolver` property adding a `JsonDerivedType` instance to the `JsonPolymorphismOptions.DerivedTypes` property on the `JsonTypeInfo.PolymorphismOptions` property. Notes: While .NET 7 introduced polymorphic (de)serialization using `JsonDerivedType` attribute or `JsonPolymorphismOptions` on a custom `IJsonTypeInfoResolver` implementation, Dapr does not ship a .NET 7 target of the SDK. Hence, a .NET 7 consumer application uses the .NET 6 target of the Dapr SDK. Therefore, this breaking change only applies when upgrading a consumer application to .NET 8. The new serialization behavior in the .NET 8 version of the SDK allows for polymorphic deserialization of the response by a weakly-typed actor client. This requires that the programmer specifies a `typeDiscriminator` on the `JsonDerivedType` attribute. The .NET 6 and .NET 8 targets of the Dapr .NET SDK have different serialization behavior of properties of a derived response object on an operation of a weakly-typed actor client. Impacts users upgrading a consumer application to .NET 8 running Dapr `1.13` or later. In the .NET 6 target of the SDK, the actor runtime serializes the response object on an operation of a weakly-typed actor client using the runtime type of the response object. In the .NET 8 target of the SDK, the actor runtime serializes the response object using the base response type as declared on the operation on the actor interface. For .NET 8, the programmer must decorate the base response class that is declared on the operation on the actor interface with a `JsonDerivedType` attribute specifying the derived response class. Alternatively, a custom `IJsonTypeInfoResolver` implementation can be set on the `JsonSerializerOptions.TypeInfoResolver` property adding a `JsonDerivedType` instance to the `JsonPolymorphismOptions.DerivedTypes` property on the `JsonTypeInfo.PolymorphismOptions` property. Note that while .NET 7 introduced polymorphic (de)serialization using `JsonDerivedType` attribute or `JsonPolymorphismOptions` on a custom `IJsonTypeInfoResolver` implementation, Dapr does not ship a .NET 7 target of the SDK. Hence, a .NET 7 consumer application uses the .NET 6 target of the Dapr SDK. Therefore, this breaking change only applies when upgrading a consumer application to .NET 8. Note that the new serialization behavior in the .NET 8 version of the SDK allows for polymorphic deserialization of the response by a weakly-typed actor client. This requires that the programmer specifies a `typeDiscriminator` on the `JsonDerivedType` attribute. UPDATED Project Reactor dependency & fix deprecated calls