Dapr v1.9 is now available

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!

@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


Pluggable components

Dapr has built-in components that are included as part of the runtime and shared. Dapr now allows you to create private components called [“pluggable components”](, which are self-hosted (process 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. Pluggable components work for both Kubernetes and self-hosted modes.

The Dapr community is already contributing pluggable components; for example:

Observability: Open Telemetry (OTEL) protocol support

OpenTelemetry (OTEL) combines projects like OpenCensus, Zipkin, and OpenTracing into standard API and specification sets for tracing and metrics. In this release, Dapr includes support for the OpenTelemetry protocol, which is the preferred way to send traces to observability tools.

Observability: Resiliency metrics

Metrics have been added for resiliency, tracing the number of resiliency policies loaded and the number of times a resiliency policy has been executed.

Learn about OpenTelemetry on Dapr sidecars to write traces for your applications to any monitoring service that supports the OTEL protocol.

Reliability: Application health checks

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: the app is just busy or the application is being restarted 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.

Learn about app health checks

Reliability: Default resiliency policies

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 policy 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.

Learn about default resiliency policies

Service Invocation: Application middleware

You can now use any middleware components when making service-to-service invocation calls, like 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.

Learn more about app middleware

Pub/Sub: Namespaced consumer groups

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 changing their code based on the namespace they are running in.

Learn about namespaced consumer groups.

CLI and Installers

Windows MSI installer

Now there’s a new way to consume the Dapr CLI on Windows: Install the CLI using the MSI installer.

Podman container runtime support

You can now use podman container runtime as an alternative to the Docker runtime for your local development.

Learn about a pluggable components.

Security: Component deny lists

You can now specify a components.deny 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.

Component updates

Multi-Key value secret stores

Secret stores now support the ability to return multiple keys and secret values with a single call. For example Hashicorp Vault and Local File secret stores. This makes it easier for an application to retrieve multiple keys at once.

Component stabilization

In this release, the following component improvements were designated as stable:

State management
  • Memcached
  • Azure Table Storage
  • Apache Cassandra
  • RabbitMQ
  • Local Storage
  • Postgres
Secrets management
  • Local File
  • Local ENV Variable

New components

There are now 105 built-in components in Dapr. Three new components were added in this release:

Next steps

If you’re new to Dapr, visit the getting started 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 Concepts and the Developing applications.

Note: This release contains breaking changes in the runtime and SDKs.

See this section on upgrading Dapr to version 1.9.0.

New in this release

Dapr Runtime

  • ADDED Trace export using OpenTelemetry protocol 2836
  • ADDED Deprecation notice of Actor Reminder’s Rename API 4445
  • FIXED Bug in runtime. HTTP Pipeline invocation executes as designed 4475
  • ADDED Metrics for Resiliency 4524
  • FIXED Postgres support for Configuration API 4551
  • CHANGED Converting configuration API response from an array to dictionary. 4556
  • FIXED Remove state store entries for unregistered timers 4801
  • FIXED Dapr service still exists after the deployment deleted 4849
  • ADDED Kubernetes namespace isolation option for Dapr PubSub 4872
  • ADDED App health checks: pause bindings and pubsub components when app is not healthy 4883
  • FIXED Incorrect log messages 4885 4901
  • FIXED gRPC proxy recreates connection on every request 4937
  • ADDED Component denylist via Configuration CRD 4946
  • FIXED Metric for mtlsWorkloadCertRotated 4951
  • FIXED Building a new component that uses GRPC protocol crashes due to codec being globally applied 4959
  • FIXED Error thrown while using HTTP Configuration Subscribe API 4968
  • ADDED Dead letter topics to Subscription CRD 4978
  • ADDED Otel section to Configuration CRD 4980
  • ADDED Add output-binding component alicloud.sls support logic 4983
  • RENAMED Distributed Lock API UnlockResponse.Status 4988
  • ADDED New parameter to daprd binary: resources-path 4998
  • ADDED Missing endpoints for API allowlist 5007
  • FIXED HTTP Unsubscribe response to return a response body 5017
  • ADDED Active Actors count in gRPC metadata API 5018
  • ADDED Recommended labels to Dapr control plane Kubernetes objects 5029
  • ADDED Support Lock component aliasing 5030
  • ADDED Missing registered_components in GRPC Metadata API 5051
  • FIXED gRPC Service Invocation to emit metrics 5073
  • ADDED State Store Pluggable Components 5102
  • ADDED Metric for service updates 5114
  • ADDED New time attribute to CloudEvent automatically if not present 5137
  • FIXED Bug where components would not be loaded on operator restart 5142
  • ADDED Kubernetes support for Pluggable Components 5151
  • REMOVED application/json as default content type for service invocation 5165
  • FIXED gRPC span status on error 5166
  • ADDED Wait of 30s for Dapr api to be ready to establish connection from dapr runtime. 5168
  • ADDED PubSub Pluggable Component 5173 5175
  • FIXED Dapr input binding request fails when returning status code 204 in an input binding handler. 5180
  • ADDED Metadata to InvokeActorRequest. 5191
  • ADDED Protos for Bindings Pluggable Components 5194
  • ADDED PubSub and SecretStore capabilities/features to the Metadata API results. 5211
  • ADDED Metadata to invokeActorReq 5215
  • FIXED Configuration Building Block where Http Subscribe AlphaV1 API would need the app to be in ready status. 5236
  • ADDED Pluggable Components Discovery 5261
  • ADDED Option to Helm chart to skip deploying Dapr dashboard 5263
  • FIXED Sidecar watchdog waits for the Dapr injector to be ready before running 5287
  • FIXED Multiple data race conditions 5143 5289
  • FIXED Processing messages on ASB binding causes sidecar to crash in some situations 5304

Dapr CLI

  • FIXED dapr list does not include independent daprd instances 220
  • ADDED Support for podman as container runtime 257
  • ADDED Dapr installer to winget 424
  • FIXED Dashboard to no longer be part of HA mode logic 817
  • ADDED Support for custom metadata in dapr publish using the new --metadata flag. 842
  • ADDED Support for dashboard port automatic selection. 863
  • ADDED support for multiple kubeconfig files 884
  • ADDED Support for private helm chart repo to install dapr cluster 895
  • FIXED Differing behavior of dapr uninstall -k and dapr uninstall when dapr not installed 952
  • ADDED Support for SystemDrive environment variable in Dapr install script for Windows 989
  • ADDED Support for using Mariner-based images 1004
  • ADDED dapr-internal-grpc-port to dapr run options to set internal gRPC server port 1026
  • CHANGED Removing the use of the ioutil package 1037
  • FIXED dapr init issue in an environment where proxy is needed. 1043
  • FIXED Fixed redis version to redis 6 on dapr init 1045
  • ADDED Support for Windows MSI Installer for CLI 1064
  • ADDED App health check flags for dapr run 1082


  • CHANGED Configuration API response now a dictionary instead of array. 1770
  • FIXED AWS SQS/SNS submit more than 20 statement in access policy 1780
  • CHANGED refactored aws sqs policy inserting 1807
  • FIXED RocketMQ fix metadata properties 1817
  • ADDED middleware: changes wasm basic to use waPC 1833
  • ADDED Support for Azure AD auth in Azure Storage queues and SignalR bindings 1842 1852
  • ADDED Kafka: SASL SCRAM SHA-256 and SHA-512 Authentication 1856
  • FIXED issue where Azure Service Bus binding would not receive messages after some time. 1865
  • FIXED SendGrid output binding content error. 1866
  • ADDED New binding: Alicloud SLS log storage 1873
  • ADDED Azure AppConfig configuration store 1874
  • ADDED pubsub.mqtt: support wildcard and shared subscriptions 1882 1901
  • ADDED Support for wildcard topics in in-memory PubSub 1966
  • ADDED Added pubsub.FeatureSubscribeWildcards capability 1887
  • CHANGED pubsub.redis: better ack for messages 1886
  • ADDED Add user agent to AWS requests 1890
  • FIXED Azure Service Bus Component: MessageID isn’t guaranteed to be unique 1892 1898
  • CHANGED modify error msg for rocketmq binding 1897
  • FIXED aws sqs component can not support China region such as cn-northwest-1 1907
  • ADDED Add auto-completion flag for Zeebe 1908
  • ADDED Allow metadata to flow through Service Bus queue 1911
  • ADDED Azure App Configuration: Implemented get all keys 1920
  • ADDED [Jetstream] Allow TLS Client Authentication 1923
  • ADDED [pubsub/jetstream]: allow tls client authentication 1924
  • ADDED pubsub.snssqs: Support regions in other AWS partitions 1925
  • FIXED Ensure rethinkdb complies with state.TransactionalStore 1930
  • CHANGED binding.eventhub: use same name schema for storage leases like on pubsub.eventhub 1940
  • FIXED Handle service bus exported errors 1942
  • FIXED bindings.cron: ensure it can resume correctly after context cancellation 1943
  • FIXED Distributed Lock components’ code doesn’t reflect renaming on UnlockResponse.Status 1950
  • FIXED Removing the use of the ioutil package and Fix CVE-2021-42576 1954
  • CHANGED Update code to reflect renaming on UnlockResponse.Status 1958
  • FIXED Kafka: ConsumeClaim should not return err when retry recovery failed 1965 2120
  • ADDED feature(secretstore): add tencent/ssm 1973
  • FIXED Fix CosmosDB state store handling of nulls 1974
  • CHANGED Update to Go 1.19 1975
  • FIXED Fixes to MySQL state store 1978
  • ADDED ETag support for the AWS Dynamo DB State Store 1981
  • FIXED Rethinkdb causes a panic error on daprd 1993
  • FIXED typos in Apache Cassandra logs 2010
  • FIXED Metadata propagation on Kafka event subscription 2016
  • ADDED read record header as metadata if available in kafka 2017
  • ADDED The component 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. 2018 2022
  • CHANGED Rethinkdb state store: Remove falsely-advertised transaction support 2020
  • ADDED AWS DynamoDB first write concurrency support 2021
  • FIXED Redis pubsub - bug in reclaimPendingMessage 2026
  • ADDED Support for a key prefix in AWS SSM Parameter Store secret store component 2043
  • ADDED Secret Stores advertise supported features. 2047
  • FIXED Kafka ConsumeClaim now returns when session context is done 2049
  • FIXED Duration based metadata serialization 2050
  • ADDED Support for Postgres as configuration store 2063
  • FIXED Addressed an issue in Azure App Config configuration store component preventing fetching of keys when using connection string authentication. 2064
  • ADDED Secret Stores now advertise supported Features. 2069
  • FIXED Addressed an issue in the Zeebe component parsing duration metadata 2070
  • ADDED Azure App Config configuration store Subscribe and Unsubscribe implementation 2088
  • FIXED Azure App Config store - GetAll return outdated values 2096
  • CHANGED Upgrade all Azure components using the Azure SDK for Go to their latest minor / patch SDK versions 2109
  • FIXED Sanitize metadata in requests to Azure Blob Storage #2112 2112
  • FIXED mqtt component appends “-producer” making it incompatible with remote publisher 2114
  • ADDED Support for presigning in AWS S3 binding 2121
  • ADDED Adds time to CloudEvent automatically if not present 2123
  • FIXED Error handling in runtime and Redis config store 2124
  • ADDED New authentication options for RabbitMQ PubSub component 2129
  • FIXED OAuth2 middleware was not generating random identifiers 2139
  • CHANGED MQTT PubSub to handle consumerId and producerId separately 2183


  • FIXED Wrong Dapr runtime version on About menu 201
  • ADDED Publish Dashboard image to GHCR as well 209
  • ADDED Support for querying of logs across all replica instances 216
  • ADDED Information on hosted actor types and count across replicas 218


  • ADDED Support passing trace headers 698
  • ADDED Support for TTL and time/interval formats in actor timers/reminders 788
  • ADDED Support for Sidecar Metadata APIs 883
  • CHANGED Change configuration API response to dictionary 884
  • ADDED Support the DeadLetter Topic of pubsub 897
  • FIXED Problem of determining whether there is a MetadataSeparator error 901
  • ADDED Actor exception details passed to caller 904
  • FIXED Actors Healthz are now always AllowAnonymous. 908
  • ADDED Support for sidecar shutdown API 914
  • FIXED SDK code doesn’t reflect renaming on UnlockResponse.Status 921


  • FIXED panic: error creating default client: error creating connection to ‘’: context deadline exceeded: context deadline exceeded 259
  • FIXED fix: client default timeout 310
  • FIXED feature(apphealth&configuration): add app health check & adapt new configuration API 323
  • ADDED Add SaveStateWithETag() convenience function 321

Java SDK

  • ADDED Configuration building block HTTP APIs and gRPC unsubscribe API 698
  • FIXED Metadata ignored on Htttp Service invocation 744
  • CHANGED Change configuration API response to dictionary 746
  • CHANGED CloudEvent class to be non-final and inherited at application’s code 773

Python SDK

  • ADDED Support for Sidecar Metadata APIs 410
  • CHANGED Configuration API response to dictionary 457
  • ADDED Support for Distributed Lock API 431
  • ADDED Example for using pubsub with FastApi 444
  • ADDED dapr.ext.grpc support for specifying max pubsub message length (>4MB) 451
  • FIXED dapr.ext.grpc removed optional app_port parameter from being required in run method 454
  • CHANGED Increased minimum protobuf version from 3.20.1 to >=4.21.0 457
  • ADDED Support for timeouts in service invocation calls from Dapr client 473
  • ADDED Add PEP 561 py.typed markers to all packages to allow consumers to check dapr types with e.g. mypy 475

JavaScript SDK

  • ADDED feat(lock): Distributed lock API support 306
  • FIXED fix(types): Module ‘HTTP’ has no default export error 308
  • FIXED docs(index): Fix index content and images due to a bad merge 311
  • ADDED chore(deprecation): Warning message to dapr-client builds 313
  • ADDED feat(state): Metadata field to the state save operation 323
  • FIXED fix(client): Sidecar not starting when calling getClient 324
  • ADDED tests(e2e/grpc): Configuration API test for subscribe all keys 327
  • ADDED feat(pubsub): Allow passing metadata to publish and subscribe API 329
  • CHANGED chore(github): Migrate from master branch to main branch 331
  • FIXED fix(pubsub): Send correct HTTP response in subscribe event handler 334
  • FIXED fix(lock): Renaming distributed lock API UnlockResponse.Status 337
  • FIXED fix(client): Reusing same HTTP client instance 340
  • ADDED feat(pubsub): Implement pubsub dead letter & single/multi routing 342
  • ADDED feat(actors): Allow actors to be configurable 346
  • ADDED feat(metadata): Support capabilities field in metadata API 347
  • ADDED docs(dev): Reference documentation for release process 353
  • FIXED fix(logger): Propagate logger to sidecar awaiting method 358
  • FIXED fix(types): Mark exported types as dependencies in package.json 359
  • ADDED docs(lock): Distributed locks documentation 362
  • ADDED feat(client): API token authentication support using DAPR_API_TOKEN 364
  • ADDED feat(actors): Ability to specify type in ActorStateManager 372
  • ADDED chore(ci): Add prettifier, prettify codebase, and add check to build CI 384
  • ADDED feat(pubsub): Allow headers to be passed to pubsub 389


  • FIXED Why Pub-Sub url does not redirect to an external page 711
  • FIXED Some quickstarts demos incompatible with Java 11 719
  • FIXED Python pubsub examples failing 724
  • FIXED Distributed calculator example is not working 726

Upgrading to Dapr 1.9.0

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?

Local Machine / Self-hosted

Uninstall Dapr using the CLI you currently have installed. Note that this will remove the default $HOME/.dapr directory, binaries and all containers dapr_redis, dapr_placement and dapr_zipkin. Linux users need to run sudo if docker command needs sudo:

dapr uninstall --all

For RC releases like this, download the latest and greatest release from here and put the dapr binary in your PATH.

Once you have installed the CLI, run:

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:

$ dapr --version

CLI version: 1.9.0
Runtime version: 1.9.0


Upgrading from previous version

You can perform zero-downtime upgrades using both Helm 3 and the Dapr CLI.

Upgrade using the CLI

Download the latest RC release from here 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

Upgrade using Helm

To upgrade Dapr using Helm, run:

helm repo add dapr
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

Starting a fresh install on a cluster

Please see how to deploy Dapr on a Kubernetes cluster for a complete guide to installing Dapr on Kubernetes

You can use Helm 3 to install Dapr:

helm repo add dapr
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
Post installation

Verify the control plane pods are running and are healthy:

$ dapr status -k
  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>

Breaking Changes

Dapr Runtime

  • RENAMED Distributed Lock API UnlockResponse.Status 4988
  • REMOVED application/json as default content type for service invocation 5165
  • CHANGED Configuration API response to dictionary 4556
  • CHANGED Service Invocation NoDefaultContentType flag has been removed and it’s now enabled by default 5243


  • FIXED Distributed Lock components’ code doesn’t reflect renaming on UnlockResponse.Status 1950


  • FIXED SDK code doesn’t reflect renaming on UnlockResponse.Status 921
  • CHANGED Configuration API response to dictionary 884

Java SDK

  • ADDED Unsubscribe API to PreviewClient 698
  • CHANGED Configuration API response to dictionary 746

Python SDK

  • CHANGED Configuration API response to dictionary 411


  • CHANGED Configuration API response to dictionary 291