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

We're happy to announce the release of Dapr 1.9.0! We would like to extend our thanks to all the new and existing contributors who helped make this release happen. Thanks to everyone who made this release possible! @1046102779, @117503445, @AaronCrawfis, @Abirdcfly, @addjuarez, @ahmedhesham6, @akhilac1, @akkie, @amulyavarote, @anoymouscoder, @artursouza, @bbrandt, @beiwei30, @benc-uk, @berndverst, @bibryam, @blublinsky, @c-thiel, @CeresCa, @cgillum, @christle, @clareliguori, @cmendible, @codefromthecrypt, @CrazyHZM, @daixiang0, @DeepanshuA, @DiegoAJR, @dss539, @dwhiteddsoft, @famarting, @fjvela, @gabrielemilan, @gautric, @greenie-msft, @halspang, @helbing, @hhunter-ms, @hueifeng, @hunter007, @hypernova3, @imneov, @ItalyPaleAle, @jaczhao, @jigargandhi, @jilichao, @jinjianfeng-chn, @jjcollinge, @johnewart, @juazasan, @kumaya, @l0ll098, @Lichmaker, @mandarj123, @marioreggiori, @martin-bucinskas, @mcandeia, @mikeb26, @mindovermiles262, @msfussell, @mthmulders, @mukundansundar, @my-petrichor, @NickLarsenNZ, @nyemade-uversky, @ostreek, @piotrkpc, @pravinpushkar, @qiangmzsx, @qqbuby, @rabollin, @RcXu, @rogerogers, @RyanLettieri, @saber-wang, @sarsharma, @shivamkm07, @shivanisinghnitp, @shubham1172, @sk593, @skyao, @sunzhaochang, @Taction, @tanvigour, @thisiskun, @tmacam, @Trolldemorted, @webup, @Willmish, @winterfoxnet, @x-shadow-man, @XavierGeerinck, @xingrux, @yaron2, @yash-nisar, @zcong1993 Dapr has built-in components that are included as part of the runtime. Dapr now allows you to create private components called . These are components that are self-hosted (exe or container), can be written in any language that supports gRPC, exist outside the Dapr runtime, and are able to "plug" into Dapr. Simply write a component with a gRPC service, drop a binary into the filesystem and you're good to go. Works for both Kubernetes and self-hosted modes.<br> OpenTelemetry (OTEL) combines projects like OpenCensus, Zipkin, and OpenTracing into standard API and specification sets for tracing and metrics. In this release, Dapr includes , which is the preferred way to send traces to observability tools. Metrics have been added for . The number of resiliency policies loaded and the number of times a resiliency policy has been executed. on Dapr sidecars to write traces for your applications to any monitoring service that supports the OTEL protocol. App health checks are a new feature that allows probing for the health of your application and reacting to status changes. Applications can become unresponsive for a variety of reasons: for example, they could be too busy to accept new work, or could be crashed or in a deadlock state. Sometimes the condition can be transient, for example if the app is just busy or if the application is being restarted for whatever reason and is in its initialization phase. When app health checks are enabled, the Dapr runtime will periodically poll your application via HTTP or gRPC calls. When it detects a failure in the app's health, Dapr stops accepting new work on behalf of the application. With resiliency policies you can now set default policies, which can have a broad scope. This is done through reserved keywords that apply to given policy. There are 3 default policies types: DefaultRetryPolicy DefaultTimeoutPolicy DefaultCircuitBreakerPolicy If these policies are defined, they are used for every operation to a service, application, or component. They can also be modified to be more specific through the usage of additional keywords for specific targets. You can now use any middleware components when making service-to-service invocation calls. For example, for token validation in a zero-trust environment or to apply OAuth policies. Service-to-service invocation middleware components apply to all outgoing calls from Dapr sidecar to the receiving application. Drive infrastructure efficiency with namespaced consumer groups for pub/sub. This feature allows you to deploy Dapr applications to different namespaces who all share the same app id, and have all topic subscriptions scoped at the namespace level. This allows development teams to reuse the same pub/sub underlying infrastructure without needing to change their code based on the namespace they are running

Learn about . Now there's a new way to consume the Dapr CLI on Windows: . You can now use (as an alternative to the Docker runtime) for your local development. Learn about a ). You can now specify a property in the Configuration spec to specify a denylist of component types that cannot be initialized. This prevents Dapr from using excluded components during initialization. now support the ability to return multiple keys and secret values with a single call. For example and secret stores. This makes it easier for an application to retrieve multiple keys at once. In this release, the following component improvements were designated as : Memcached Azure Table Storage Apache Cassandra RabbitMQ Local Storage Postgres Local File Local ENV Variable There are now 105 built-in components in Dapr. Three new components were added in this release: 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 in the runtime and SDKs. See section on upgrading Dapr to version 1.9.0. ADDED Trace export using OpenTelemetry protocol ADDED Deprecation notice of Actor Reminder's Rename API FIXED Bug in runtime. HTTP Pipeline invocation executes as designed ADDED Metrics for Resiliency FIXED Postgres support for Configuration API CHANGED Converting configuration API response from an array to dictionary. FIXED Remove state store entries for unregistered timers FIXED Dapr service still exists after the deployment deleted ADDED Kubernetes namespace isolation option for Dapr PubSub ADDED App health checks: pause bindings and pubsub components when app is not healthy FIXED Incorrect log messages FIXED gRPC proxy recreates connection on every request ADDED Component denylist via Configuration CRD FIXED Metric for mtlsWorkloadCertRotated FIXED Building a new component that uses GRPC protocol crashes due to codec being globally applied FIXED Error thrown while using HTTP Configuration Subscribe API ADDED Dead letter topics to Subscription CRD ADDED Otel section to Configuration CRD ADDED Add output-binding component alicloud.sls support logic RENAMED Distributed Lock API UnlockResponse.Status ADDED New parameter to daprd binary: `resources-path` ADDED Missing endpoints for API allowlist FIXED HTTP Unsubscribe response to return a response body ADDED Active Actors count in gRPC metadata API ADDED Recommended labels to Dapr control plane Kubernetes objects ADDED Support Lock component aliasing ADDED Missing `registered_components` in GRPC Metadata API FIXED gRPC Service Invocation to emit metrics ADDED State Store Pluggable Components ADDED Metric for service updates ADDED New `time` attribute to CloudEvent automatically if not present FIXED Bug where components would not be loaded on operator restart ADDED Kubernetes support for Pluggable Components REMOVED `application/json` as default content type for service invocation FIXED gRPC span status on error ADDED Wait of 30s for Dapr api to be ready to establish connection from dapr runtime. ADDED PubSub Pluggable Component FIXED Dapr input binding request fails when returning status code 204 in an input binding handler. ADDED Metadata to InvokeActorRequest. ADDED Protos for Bindings Pluggable Components ADDED PubSub and SecretStore capabilities/features to the Metadata API results. ADDED Metadata to invokeActorReq FIXED Configuration Building Block where Http Subscribe AlphaV1 API would need the app to be in ready

ADDED Pluggable Components Discovery ADDED Option to Helm chart to skip deploying Dapr dashboard FIXED Sidecar watchdog waits for the Dapr injector to be ready before running FIXED Multiple data race conditions FIXED Processing messages on ASB binding causes sidecar to crash in some situations FIXED `dapr list` does not include independent `daprd` instances ADDED Support for podman as container runtime ADDED Dapr installer to winget FIXED Dashboard to no longer be part of HA mode logic ADDED Support for custom metadata in `dapr publish` using the new `--metadata` flag. ADDED Support for dashboard port automatic selection. ADDED support for multiple kubeconfig files ADDED Support for private helm chart repo to install dapr cluster FIXED Differing behavior of `dapr uninstall -k` and `dapr uninstall` when `dapr` not installed ADDED Support for SystemDrive environment variable in Dapr install script for Windows ADDED Support for using Mariner-based images ADDED `dapr-internal-grpc-port` to `dapr run` options to set internal gRPC server port CHANGED Removing the use of the ioutil package FIXED `dapr init` issue in an environment where proxy is needed. FIXED Fixed redis version to redis 6 on `dapr init` ADDED Support for Windows MSI Installer for CLI ADDED App health check flags for `dapr run` CHANGED Configuration API response now a dictionary instead of array. FIXED AWS SQS/SNS submit more than 20 statement in access policy CHANGED refactored aws sqs policy inserting FIXED RocketMQ fix metadata properties ADDED middleware: changes wasm basic to use waPC ADDED Support for Azure AD auth in Azure Storage queues and SignalR bindings ADDED Kafka: SASL SCRAM SHA-256 and SHA-512 Authentication FIXED issue where Azure Service Bus binding would not receive messages after some time. FIXED SendGrid output binding content error. ADDED New binding: Alicloud SLS log storage ADDED Azure AppConfig configuration store ADDED pubsub.mqtt: support wildcard and shared subscriptions ADDED Support for wildcard topics in in-memory PubSub ADDED Added pubsub.FeatureSubscribeWildcards capability CHANGED pubsub.redis: better ack for messages ADDED Add user agent to AWS requests FIXED Azure Service Bus Component: MessageID isn't guaranteed to be unique CHANGED modify error msg for rocketmq binding FIXED aws sqs component can not support China region such as cn-northwest-1 ADDED Add auto-completion flag for Zeebe ADDED Allow metadata to flow through Service Bus queue ADDED Azure App Configuration: Implemented get all keys ADDED ADDED ADDED pubsub.snssqs: Support regions in other AWS partitions FIXED Ensure rethinkdb complies with state.TransactionalStore CHANGED binding.eventhub: use same name schema for storage leases like on pubsub.eventhub FIXED Handle service bus exported errors FIXED bindings.cron: ensure it can resume correctly after context cancellation FIXED Distributed Lock components' code doesn't reflect renaming on UnlockResponse.Status FIXED Removing the use of the ioutil package and Fix CVE-2021-42576 CHANGED Update code to reflect renaming on UnlockResponse.Status FIXED Kafka: ConsumeClaim should not return err when retry recovery failed ADDED feature(secretstore): add tencent/ssm FIXED Fix CosmosDB state store handling of nulls CHANGED Update to Go 1.19 FIXED Fixes to MySQL state store ADDED ETag support for the AWS Dynamo DB State Store FIXED Rethinkdb causes a panic error on daprd FIXED typos in Apache Cassandra logs FIXED Metadata propagation on Kafka event subscription ADDED read record header as metadata if available in kafka ADDED The component `bindings.azure.servicebusqueues` now supports a new field `disableEntityManagement`. When set to `true`, the queue will not be created automatically and sending/receiving messages will only require `Send`/`Listen` rights. CHANGED Rethinkdb state store: Remove falsely-advertised transaction support ADDED AWS DynamoDB first write concurrency support FIXED Redis pubsub - bug in reclaimPendingMessage ADDED Support for a key prefix in AWS SSM Parameter Store secret store component ADDED Secret Stores advertise supported

FIXED Kafka ConsumeClaim now returns when session context is done FIXED Duration based metadata serialization ADDED Support for Postgres as configuration store FIXED Addressed an issue in Azure App Config configuration store component preventing fetching of keys when using connection string authentication. ADDED Secret Stores now advertise supported Features. FIXED Addressed an issue in the Zeebe component parsing duration metadata ADDED Azure App Config configuration store `Subscribe` and `Unsubscribe` implementation FIXED Azure App Config store - GetAll return outdated values CHANGED Upgrade all Azure components using the Azure SDK for Go to their latest minor / patch SDK versions FIXED Sanitize metadata in requests to Azure Blob Storage #2112 FIXED mqtt component appends "-producer" making it incompatible with remote publisher ADDED Support for presigning in AWS S3 binding ADDED Adds time to CloudEvent automatically if not present FIXED Error handling in runtime and Redis config store ADDED New authentication options for RabbitMQ PubSub component FIXED OAuth2 middleware was not generating random identifiers CHANGED MQTT PubSub to handle consumerId and producerId separately FIXED Authentication issue with Kafka binding and pubsub FIXED Wrong Dapr runtime version on About menu ADDED Publish Dashboard image to GHCR as well ADDED Support for querying of logs across all replica instances ADDED Information on hosted actor types and count across replicas ADDED Support passing trace headers ADDED Support for TTL and time/interval formats in actor timers/reminders ADDED Support for Sidecar Metadata APIs CHANGED Change configuration API response to dictionary ADDED Support the DeadLetter Topic of pubsub FIXED Problem of determining whether there is a MetadataSeparator error ADDED Actor exception details passed to caller FIXED Actors Healthz are now always `AllowAnonymous`. ADDED Support for sidecar shutdown API FIXED SDK code doesn't reflect renaming on UnlockResponse.Status FIXED panic: error creating default client: error creating connection to '127.0.0.1:50001': context deadline exceeded: context deadline exceeded FIXED fix: client default timeout FIXED feature(apphealth&configuration): add app health check & adapt new configuration API ADDED Add SaveStateWithETag() convenience function ADDED Configuration building block HTTP APIs and gRPC unsubscribe API FIXED Metadata ignored on Htttp Service invocation CHANGED Change configuration API response to dictionary CHANGED CloudEvent class to be non-final and inherited at application's code ADDED Support for Sidecar Metadata APIs CHANGED Configuration API response to dictionary ADDED Support for Distributed Lock API ADDED Example for using pubsub with FastApi ADDED `dapr.ext.grpc` support for specifying max pubsub message length (`>4MB`) FIXED `dapr.ext.grpc` removed optional `app_port` parameter from being required in run method CHANGED Increased minimum `protobuf` version from `3.20.1` to `>=4.21.0` ADDED Support for timeouts in service invocation calls from Dapr client ADDED Add PEP 561 `py.typed` markers to all packages to allow consumers to check dapr types with e.g. mypy ADDED feat(lock): Distributed lock API support FIXED fix(types): Module 'HTTP' has no default export error FIXED docs(index): Fix index content and images due to a bad merge ADDED chore(deprecation): Warning message to dapr-client builds ADDED feat(state): Metadata field to the state save operation FIXED fix(client): Sidecar not starting when calling getClient ADDED tests(e2e/grpc): Configuration API test for subscribe all keys ADDED feat(pubsub): Allow passing metadata to publish and subscribe API CHANGED chore(github): Migrate from master branch to main branch FIXED fix(pubsub): Send correct HTTP response in subscribe event handler FIXED fix(lock): Renaming distributed lock API UnlockResponse.Status FIXED fix(client): Reusing same HTTP client instance ADDED feat(pubsub): Implement pubsub dead letter & single/multi routing ADDED feat(actors): Allow actors to be configurable ADDED feat(metadata): Support capabilities field in metadata API ADDED docs(dev): Reference documentation for release process FIXED fix(logger): Propagate logger to sidecar awaiting method FIXED fix(types): Mark exported types as dependencies in

ADDED docs(lock): Distributed locks documentation ADDED feat(client): API token authentication support using DAPRAPITOKEN ADDED feat(actors): Ability to specify type in ActorStateManager ADDED chore(ci): Add prettifier, prettify codebase, and add check to build CI ADDED feat(pubsub): Allow headers to be passed to pubsub FIXED Why Pub-Sub url does not redirect to an external page FIXED Some quickstarts demos incompatible with Java 11 FIXED Python pubsub examples failing FIXED Distributed calculator example is not working 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.9.0 ``` Wait for the update to finish, ensure you are using the latest version of Dapr(1.9.0) with: ```bash $ dapr --version CLI version: 1.9.0 Runtime version: 1.9.0 ``` 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.9.0 -k ``` To upgrade with high availability mode: ``` dapr upgrade --runtime-version 1.9.0 --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.9.0 --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.9.0 --namespace dapr-system --wait ``` Alternatively, you can use the latest version of CLI: ``` dapr init --runtime-version=1.9.0 -k ``` Verify the control plane pods are running and are healthy: ``` $ dapr status -k NAME NAMESPACE HEALTHY STATUS REPLICAS VERSION AGE CREATED dapr-dashboard dapr-system True Running 1 0.11.0 15s 2022-10-04 13:07.39 dapr-sidecar-injector dapr-system True Running 1 1.9.0 15s 2022-10-04 13:07.39 dapr-sentry dapr-system True Running 1 1.9.0 15s 2022-10-04 13:07.39 dapr-operator dapr-system True Running 1 1.9.0 15s 2022-10-04 13:07.39 dapr-placement dapr-system True Running 1 1.9.0 15s 2022-10-04 13:07.39 ``` After Dapr 1.9.0 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> ``` RENAMED Distributed Lock API UnlockResponse.Status REMOVED `application/json` as default content type for service invocation CHANGED Configuration API response to dictionary CHANGED Service Invocation NoDefaultContentType flag has been removed and it's now enabled by default FIXED Distributed Lock components' code doesn't reflect renaming on UnlockResponse.Status FIXED SDK code doesn't reflect renaming on UnlockResponse.Status CHANGED Configuration API response to dictionary ADDED Unsubscribe API to PreviewClient CHANGED Configuration API response to dictionary CHANGED Configuration API response to dictionary CHANGED Configuration API response to dictionary