From c8fc5c45d7825668bc3e88d46911c2ac787c8767 Mon Sep 17 00:00:00 2001 From: yaron2 Date: Wed, 11 Oct 2023 17:20:39 -0700 Subject: [PATCH 01/19] update performance benchmarks Signed-off-by: yaron2 --- .../perf-actors-activation.md | 17 +++---- .../perf-pubsub.md | 50 +++++++++++++++++++ .../perf-service-invocation.md | 24 +++------ .../performance-and-scalability/perf-state.md | 50 +++++++++++++++++++ 4 files changed, 115 insertions(+), 26 deletions(-) create mode 100644 daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md create mode 100644 daprdocs/content/en/operations/performance-and-scalability/perf-state.md diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md b/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md index ddc604142fa..5b93b169cf2 100644 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md @@ -19,7 +19,7 @@ For applications using actors in Dapr there are two aspects to be considered. Fi * Sidecar Injector (control plane) * Sentry (optional, control plane) -## Performance summary for Dapr v1.0 +## Performance summary for Dapr v1.12 The actors API in Dapr sidecar will identify which hosts are registered for a given actor type and route the request to the appropriate host for a given actor ID. The host runs an instance of the application and uses the Dapr SDK (.Net, Java, Python or PHP) to handle actors requests via HTTP. @@ -40,17 +40,14 @@ Test parameters: * Sidecar limited to 0.5 vCPU * mTLS enabled * Sidecar telemetry enabled (tracing with a sampling rate of 0.1) -* Payload of an empty JSON object: `{}` ### Results -* The actual throughput was ~500 qps. -* The tp90 latency was ~3ms. -* The tp99 latency was ~6.2ms. -* Dapr app consumed ~523m CPU and ~304.7Mb of Memory -* Dapr sidecar consumed 2m CPU and ~18.2Mb of Memory +* The requested throughput was 500 qps. +* The actual throughput was 500 qps. +* The tp90 latency was ~3.2ms. +* The tp99 latency was ~7ms. +* Dapr app consumed ~339m CPU and ~336Mb of Memory +* Dapr sidecar consumed 93m CPU and ~60Mb of Memory * No app restarts * No sidecar restarts - -## Related links -* For more information see [overview of Dapr on Kubernetes]({{< ref kubernetes-overview.md >}}) \ No newline at end of file diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md b/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md new file mode 100644 index 00000000000..a6e596219d9 --- /dev/null +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md @@ -0,0 +1,50 @@ +--- +type: docs +title: "Pub/sub performance" +linkTitle: "Pub/sub performance" +weight: 20000 +description: "" +--- +This article provides pub/sub API performance benchmarks and resource utilization in Dapr on Kubernetes. + +## System overview + +Dapr consists of a data plane, the sidecar that runs next to your app, and a control plane that configures the sidecars and provides capabilities such as cert and identity management. + +### Kubernetes components + +* Sidecar (data plane) +* Placement (required for actors, control plane mapping actor types to hosts) +* Operator (control plane) +* Sidecar Injector (control plane) +* Sentry (optional, control plane) +* Kafka cluster with 3 replicas + +## Performance summary for Dapr v1.12 + +The Pub/Sub API is used to publish messages to a message broker. Dapr accepts requests from the app via HTTP or gRPC, wraps them in a cloud event if needed, and sends the request to the message broker. + +Performance varies based on the underlying message broker. The Pub/Sub performance test measures the added latency when publishing a message with Dapr compared with the baseline latency when publishing directly to the message broker. + +### Kubernetes performance test setup + +The test was conducted on a 3 node Kubernetes cluster, using commodity hardware running 4 cores and 8GB of RAM, without any network acceleration. + +Test parameters: + +* 1000 requests per second +* 1 replica +* 1 minute duration +* Sidecar limited to 0.5 vCPU +* Sidecar telemetry enabled (tracing with a sampling rate of 0.1) +* Payload of a 1kb size + +### Results + +* The requested throughput was 1000 qps +* The actual throughput was 1000 qps +* Added latency for 90th percentile was 0.64ms for gRPC and 0.49ms for HTTP +* Added latency for 99th percentile was 1.91ms for gRPC and 1.21ms for HTTP +* Dapr app consumed ~0.2 vCPU and ~30Mb of Memory for both gRPC and HTTP +* No app restarts +* No sidecar restarts diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md b/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md index 6246f346037..1808ea8969c 100644 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md @@ -29,7 +29,7 @@ For more information see [overview of Dapr in self-hosted mode]({{< ref self-hos For more information see [overview of Dapr on Kubernetes]({{< ref kubernetes-overview.md >}}). -## Performance summary for Dapr v1.0 +## Performance summary for Dapr v1.12 The service invocation API is a reverse proxy with built-in service discovery to connect to other services. This includes tracing, metrics, mTLS for in-transit encryption of traffic, together with resiliency in the form of retries for network partitions and connection errors. @@ -59,10 +59,10 @@ When running in a highly available production setup, the Dapr control plane cons | Component | vCPU | Memory | ------------- | ------------- | ------------- -| Operator | 0.001 | 12.5 Mb -| Sentry | 0.005 | 13.6 Mb -| Sidecar Injector | 0.002 | 14.6 Mb -| Placement | 0.001 | 20.9 Mb +| Operator | 0.003 | 18 Mb +| Sentry | 0.01 | 33 Mb +| Sidecar Injector | 0.008 | 17 Mb +| Placement | 0.005 | 25 Mb There are a number of variants that affect the CPU and memory consumption for each of the system components. These variants are shown in the table below. @@ -75,18 +75,10 @@ There are a number of variants that affect the CPU and memory consumption for ea ### Data plane performance -The Dapr sidecar uses 0.48 vCPU and 23Mb per 1000 requests per second. -End-to-end, the Dapr sidecars (client and server) add ~1.40 ms to the 90th percentile latency, and ~2.10 ms to the 99th percentile latency. End-to-end here is a call from one app to another app receiving a response. This is shown by steps 1-7 in [this diagram]({{< ref service-invocation-overview.md >}}). - -This performance is on par or better than commonly used service meshes. - -### Latency - In the test setup, requests went through the Dapr sidecar both on the client side (serving requests from the load tester tool) and the server side (the target app). mTLS and telemetry (tracing with a sampling rate of 0.1) and metrics were enabled on the Dapr test, and disabled for the baseline test. -Latency for 90th percentile - -
+The Dapr sidecar uses 0.45 vCPU and 38Mb per 1000 requests per second. +End-to-end, the Dapr sidecars (client and server) add ~1.20 ms to the 90th percentile latency, and ~2.50 ms to the 99th percentile latency. End-to-end here is a call from one app to another app receiving a response. This is shown by steps 1-7 in [this diagram]({{< ref service-invocation-overview.md >}}). -Latency for 99th percentile +This performance is on par or better than commonly used service meshes. diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-state.md b/daprdocs/content/en/operations/performance-and-scalability/perf-state.md new file mode 100644 index 00000000000..82d585c26b7 --- /dev/null +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-state.md @@ -0,0 +1,50 @@ +--- +type: docs +title: "State performance" +linkTitle: "State performance" +weight: 20000 +description: "" +--- +This article provides state API performance benchmarks and resource utilization in Dapr on Kubernetes. + +## System overview + +Dapr consists of a data plane, the sidecar that runs next to your app, and a control plane that configures the sidecars and provides capabilities such as cert and identity management. + +### Kubernetes components + +* Sidecar (data plane) +* Placement (required for actors, control plane mapping actor types to hosts) +* Operator (control plane) +* Sidecar Injector (control plane) +* Sentry (optional, control plane) +* PosgreSQL database (single node) + +## Performance summary for Dapr v1.12 + +The state API is used to persist state to a database, commonly called state store in Dapr. + +Performance varies based on the underlying state store. The state API performance test measures the added latency when using Dapr to get state compared with the baseline latency when getting state directly from the state store. + +### Kubernetes performance test setup + +The test was conducted on a 3 node Kubernetes cluster, using commodity hardware running 4 cores and 8GB of RAM, without any network acceleration. + +Test parameters: + +* 1000 requests per second +* 1 replica +* 1 minute duration +* Sidecar limited to 0.5 vCPU +* Sidecar telemetry enabled (tracing with a sampling rate of 0.1) +* Payload of a 1kb size + +### Results + +* The requested throughput was 1000 qps +* The actual throughput was 1000 qps +* Added latency for 90th percentile was 0.75ms for gRPC +* Added latency for 99th percentile was 1.52ms for gRPC +* Dapr app consumed ~0.3 vCPU and ~48 of Memory for gRPC +* No app restarts +* No sidecar restarts From 5b9ecdb1aaf0ba10c340c73b58bdac518d652b49 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Fri, 26 Jan 2024 17:04:26 -0500 Subject: [PATCH 02/19] prep 1.12 for endgame Signed-off-by: Hannah Hunter --- .github/workflows/website-root.yml | 109 ----------------------------- README.md | 4 +- daprdocs/config.toml | 15 ++-- 3 files changed, 11 insertions(+), 117 deletions(-) delete mode 100644 .github/workflows/website-root.yml diff --git a/.github/workflows/website-root.yml b/.github/workflows/website-root.yml deleted file mode 100644 index 17989accb7d..00000000000 --- a/.github/workflows/website-root.yml +++ /dev/null @@ -1,109 +0,0 @@ -name: Azure Static Web App Root - -on: - workflow_dispatch: - push: - branches: - - v1.12 - pull_request: - types: [opened, synchronize, reopened, closed] - branches: - - v1.12 - -concurrency: - # Cancel the previously triggered build for only PR build. - group: website-${{ github.event.pull_request.number || github.sha }} - cancel-in-progress: true - -jobs: - build_and_deploy_job: - name: Build Hugo Website - if: github.event.action != 'closed' - runs-on: ubuntu-latest - env: - SWA_BASE: 'proud-bay-0e9e0e81e' - HUGO_ENV: production - steps: - - name: Checkout docs repo - uses: actions/checkout@v3 - with: - submodules: true - - name: Setup Node - uses: actions/setup-node@v2 - with: - node-version: '14' - - name: Setup Hugo - uses: peaceiris/actions-hugo@v2.5.0 - with: - hugo-version: 0.102.3 - extended: true - - name: Setup Docsy - run: | - cd daprdocs - git submodule update --init --recursive - sudo npm install -D --save autoprefixer - sudo npm install -D --save postcss-cli - - name: Build Hugo Website - run: | - cd daprdocs - git config --global --add safe.directory /github/workspace - if [ $GITHUB_EVENT_NAME == 'pull_request' ]; then - STAGING_URL="https://${SWA_BASE}-${{github.event.number}}.westus2.azurestaticapps.net/" - fi - hugo ${STAGING_URL+-b "$STAGING_URL"} - - name: Deploy docs site - uses: Azure/static-web-apps-deploy@v1 - with: - azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_PROUD_BAY_0E9E0E81E }} - repo_token: ${{ secrets.GITHUB_TOKEN }} - action: "upload" - app_location: "daprdocs/public/" - api_location: "daprdocs/public/" - output_location: "" - skip_app_build: true - skip_deploy_on_missing_secrets: true - - name: Upload Hugo artifacts - uses: actions/upload-artifact@v3 - with: - name: hugo_build - path: ./daprdocs/public/ - if-no-files-found: error - - close_staging_site: - if: github.event_name == 'pull_request' && github.event.action == 'closed' - runs-on: ubuntu-latest - name: Close Pull Request Job - steps: - - name: Close Pull Request - id: closepullrequest - uses: Azure/static-web-apps-deploy@v1 - with: - azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_PROUD_BAY_0E9E0E81E }} - action: "close" - skip_deploy_on_missing_secrets: true - - algolia_index: - name: Index site for Algolia - if: github.event_name == 'push' - needs: ['build_and_deploy_job'] - runs-on: ubuntu-latest - env: - ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} - ALGOLIA_API_WRITE_KEY: ${{ secrets.ALGOLIA_API_WRITE_KEY }} - ALGOLIA_INDEX_NAME: daprdocs - steps: - - name: Checkout docs repo - uses: actions/checkout@v2 - with: - submodules: false - - name: Download Hugo artifacts - uses: actions/download-artifact@v3 - with: - name: hugo_build - path: site/ - - name: Install Python packages - run: | - pip install --upgrade bs4 - pip install --upgrade 'algoliasearch>=2.0,<3.0' - - name: Index site - run: python ./.github/scripts/algolia.py ./site diff --git a/README.md b/README.md index 98bc0a4c4ff..e99d95a2590 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ The following branches are currently maintained: | Branch | Website | Description | | ------------------------------------------------------------ | -------------------------- | ------------------------------------------------------------------------------------------------ | -| [v1.12](https://github.com/dapr/docs) (primary) | https://docs.dapr.io | Latest Dapr release documentation. Typo fixes, clarifications, and most documentation goes here. | -| [v1.13](https://github.com/dapr/docs/tree/v1.13) (pre-release) | https://v1-13.docs.dapr.io/ | Pre-release documentation. Doc updates that are only applicable to v1.13+ go here. | +| [v1.13](https://github.com/dapr/docs) (primary) | https://docs.dapr.io | Latest Dapr release documentation. Typo fixes, clarifications, and most documentation goes here. | +| [v1.14](https://github.com/dapr/docs/tree/v1.14) (pre-release) | https://v1-14.docs.dapr.io/ | Pre-release documentation. Doc updates that are only applicable to v1.14+ go here. | For more information visit the [Dapr branch structure](https://docs.dapr.io/contributing/docs-contrib/contributing-docs/#branch-guidance) document. diff --git a/daprdocs/config.toml b/daprdocs/config.toml index 2d2d5f0a8ec..af155ad5129 100644 --- a/daprdocs/config.toml +++ b/daprdocs/config.toml @@ -1,5 +1,5 @@ # Site Configuration -baseURL = "https://docs.dapr.io" +baseURL = "https://v1-12.docs.dapr.io" title = "Dapr Docs" theme = "docsy" disableFastRender = true @@ -183,17 +183,20 @@ github_subdir = "daprdocs" github_branch = "v1.12" # Versioning -version_menu = "v1.12 (latest)" +version_menu = "v1.12" version = "v1.12" -archived_version = false +archived_version = true url_latest_version = "https://docs.dapr.io" [[params.versions]] - version = "v1.13 (preview)" - url = "https://v1-13.docs.dapr.io" + version = "v1.14 (preview)" + url = "https://v1-14.docs.dapr.io" [[params.versions]] - version = "v1.12 (latest)" + version = "v1.13 (latest)" url = "#" +[[params.versions]] + version = "v1.12" + url = "https://v1-12.docs.dapr.io" [[params.versions]] version = "v1.11" url = "https://v1-11.docs.dapr.io" From be69dedec3f1aae624820f683e6c2645e7d3a17c Mon Sep 17 00:00:00 2001 From: Whit Waldo Date: Thu, 25 Jan 2024 20:52:09 -0600 Subject: [PATCH 03/19] Added environment variable documentation indicating how the service name can be overridden in OTEL traces. Signed-off-by: Whit Waldo --- .../en/operations/configuration/configuration-overview.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/daprdocs/content/en/operations/configuration/configuration-overview.md b/daprdocs/content/en/operations/configuration/configuration-overview.md index f900beed05c..8732e3f998b 100644 --- a/daprdocs/content/en/operations/configuration/configuration-overview.md +++ b/daprdocs/content/en/operations/configuration/configuration-overview.md @@ -89,11 +89,12 @@ set `samplingRate : "0"` in the configuration. The valid range of samplingRate i The OpenTelemetry (otel) endpoint can also be configured via an environment variables. The presence of the OTEL_EXPORTER_OTLP_ENDPOINT environment variable turns on tracing for the sidecar. -| Environment Variable | Description | -|----------------------|-------------| +| Environment Variable | Description | +|----------------------|-----------------------------------------------------------------| | `OTEL_EXPORTER_OTLP_ENDPOINT` | Sets the Open Telemetry (OTEL) server address, turns on tracing | | `OTEL_EXPORTER_OTLP_INSECURE` | Sets the connection to the endpoint as unencrypted (true/false) | -| `OTEL_EXPORTER_OTLP_PROTOCOL` | Transport protocol (`grpc`, `http/protobuf`, `http/json`) | +| `OTEL_EXPORTER_OTLP_PROTOCOL` | Transport protocol (`grpc`, `http/protobuf`, `http/json`) | +| `OTEL_SERVICE_NAME` | Optional override to specify the service name used in traces | See [Observability distributed tracing]({{< ref "tracing-overview.md" >}}) for more information. From 1d514508bd68632f7bb70fd09226542eb2e3da64 Mon Sep 17 00:00:00 2001 From: Paul Yuknewicz Date: Wed, 29 May 2024 23:38:51 -0700 Subject: [PATCH 04/19] Enable manual trigger Enables faster testing Signed-off-by: Paul Yuknewicz --- .github/workflows/website-v1-12.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/website-v1-12.yml b/.github/workflows/website-v1-12.yml index a16d54978ef..d16d3796cf9 100644 --- a/.github/workflows/website-v1-12.yml +++ b/.github/workflows/website-v1-12.yml @@ -1,6 +1,7 @@ name: Azure Static Web App v1.12 on: + workflow_dispatch: push: branches: - v1.12 From 9707d565c9b6db34d206bebc7c5ba8c8d66d7564 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Mon, 6 Jan 2025 11:10:16 -0500 Subject: [PATCH 05/19] update python versions Signed-off-by: Hannah Hunter --- .github/workflows/link_validation.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/link_validation.yaml b/.github/workflows/link_validation.yaml index 4b7840e3cb1..350f8407a33 100644 --- a/.github/workflows/link_validation.yaml +++ b/.github/workflows/link_validation.yaml @@ -13,7 +13,7 @@ jobs: validate: runs-on: ubuntu-latest env: - PYTHON_VER: 3.7 + PYTHON_VER: 3.12 steps: - uses: actions/checkout@v2 - name: Check Microsoft URLs do not pin localized versions @@ -27,7 +27,7 @@ jobs: exit 1 fi - name: Set up Python ${{ env.PYTHON_VER }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ env.PYTHON_VER }} - name: Install dependencies From c52b0e66fb8db4b435845a23e5559a56cd5ebfe7 Mon Sep 17 00:00:00 2001 From: Yaron Schneider Date: Wed, 8 Jan 2025 08:58:43 -0800 Subject: [PATCH 06/19] Update daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md Co-authored-by: Mark Fussell Signed-off-by: Yaron Schneider --- .../performance-and-scalability/perf-actors-activation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md b/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md index 5b93b169cf2..9382177dd2e 100644 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md @@ -21,7 +21,7 @@ For applications using actors in Dapr there are two aspects to be considered. Fi ## Performance summary for Dapr v1.12 -The actors API in Dapr sidecar will identify which hosts are registered for a given actor type and route the request to the appropriate host for a given actor ID. The host runs an instance of the application and uses the Dapr SDK (.Net, Java, Python or PHP) to handle actors requests via HTTP. +The actors API in Dapr sidecar identifies which hosts are registered for a given actor type and routes the request to the appropriate host for a given actor ID. The host runs an instance of the application and uses the Dapr SDK (.Net, Java, Python, Go) to handle actors requests via HTTP. This test uses invokes actors via Dapr's HTTP API directly. From d43df229001200864cb9b59e8d614fbb21cce1f4 Mon Sep 17 00:00:00 2001 From: Yaron Schneider Date: Wed, 8 Jan 2025 08:58:56 -0800 Subject: [PATCH 07/19] Update daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md Co-authored-by: Mark Fussell Signed-off-by: Yaron Schneider --- .../performance-and-scalability/perf-service-invocation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md b/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md index 31d5e32a4b2..48032a143a9 100644 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md @@ -79,6 +79,7 @@ In the test setup, requests went through the Dapr sidecar both on the client sid mTLS and telemetry (tracing with a sampling rate of 0.1) and metrics were enabled on the Dapr test, and disabled for the baseline test. The Dapr sidecar uses 0.45 vCPU and 38Mb per 1000 requests per second. + End-to-end, the Dapr sidecars (client and server) add ~1.20 ms to the 90th percentile latency, and ~2.50 ms to the 99th percentile latency. End-to-end here is a call from one app to another app receiving a response. This is shown by steps 1-7 in [this diagram]({{< ref service-invocation-overview.md >}}). This performance is on par or better than commonly used service meshes. From 4057f3116c4314814d314331ec992ee9f998f1c3 Mon Sep 17 00:00:00 2001 From: Yaron Schneider Date: Wed, 8 Jan 2025 08:59:04 -0800 Subject: [PATCH 08/19] Update daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md Co-authored-by: Mark Fussell Signed-off-by: Yaron Schneider --- .../en/operations/performance-and-scalability/perf-pubsub.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md b/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md index a6e596219d9..2717bd87db2 100644 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md @@ -2,7 +2,7 @@ type: docs title: "Pub/sub performance" linkTitle: "Pub/sub performance" -weight: 20000 +weight: 30000 description: "" --- This article provides pub/sub API performance benchmarks and resource utilization in Dapr on Kubernetes. From 94bcd49e69b359d4ebf8036351ff8dc534c61740 Mon Sep 17 00:00:00 2001 From: Yaron Schneider Date: Mon, 13 Jan 2025 13:22:29 -0800 Subject: [PATCH 09/19] Update daprdocs/content/en/operations/performance-and-scalability/perf-state.md Co-authored-by: Mark Fussell Signed-off-by: Yaron Schneider --- .../en/operations/performance-and-scalability/perf-state.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-state.md b/daprdocs/content/en/operations/performance-and-scalability/perf-state.md index 82d585c26b7..8db9d1a4284 100644 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-state.md +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-state.md @@ -2,7 +2,7 @@ type: docs title: "State performance" linkTitle: "State performance" -weight: 20000 +weight: 40000 description: "" --- This article provides state API performance benchmarks and resource utilization in Dapr on Kubernetes. From 80dc3d6f147c16ae232b842f177c6977d960f73c Mon Sep 17 00:00:00 2001 From: MyMirelHub <15373565+MyMirelHub@users.noreply.github.com> Date: Wed, 17 Sep 2025 15:42:04 +0200 Subject: [PATCH 10/19] Revert "Merge remote-tracking branch 'yaron/perf-1' into perf-benchmarks-v1.16" This reverts commit 91c4eab34eb73e254dec4b7a65374ce409520db3, reversing changes made to 8de08db121bcb11fdb940b01bd3a2606c063c90b. Signed-off-by: MyMirelHub <15373565+MyMirelHub@users.noreply.github.com> --- .github/workflows/website-root.yml | 108 ++++++++++++++++++ .../configuration/configuration-overview.md | 7 +- .../perf-actors-activation.md | 19 +-- .../perf-pubsub.md | 50 -------- .../perf-service-invocation.md | 23 ++-- .../performance-and-scalability/perf-state.md | 50 -------- 6 files changed, 137 insertions(+), 120 deletions(-) create mode 100644 .github/workflows/website-root.yml delete mode 100644 daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md delete mode 100644 daprdocs/content/en/operations/performance-and-scalability/perf-state.md diff --git a/.github/workflows/website-root.yml b/.github/workflows/website-root.yml new file mode 100644 index 00000000000..dc437b1ca92 --- /dev/null +++ b/.github/workflows/website-root.yml @@ -0,0 +1,108 @@ +name: Azure Static Web App Root + +on: + workflow_dispatch: + push: + branches: + - v1.15 + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - v1.15 + +concurrency: + # Cancel the previously triggered build for only PR build. + group: website-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true + +jobs: + build_and_deploy_job: + name: Build Hugo Website + if: github.event.action != 'closed' + runs-on: ubuntu-latest + env: + SWA_BASE: 'proud-bay-0e9e0e81e' + HUGO_ENV: production + steps: + - name: Checkout docs repo + uses: actions/checkout@v4 + with: + submodules: true + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '18' + - name: Setup Hugo + uses: peaceiris/actions-hugo@v3.0.0 + with: + hugo-version: 0.147.9 + extended: true + - name: Setup Submodules + run: | + cd daprdocs + git submodule update --init --recursive + cd .. + sudo npm install -D --save autoprefixer + sudo npm install -D --save postcss-cli + - name: Build Hugo Website + run: | + git config --global --add safe.directory /github/workspace + if [ $GITHUB_EVENT_NAME == 'pull_request' ]; then + STAGING_URL="https://${SWA_BASE}-${{github.event.number}}.westus2.azurestaticapps.net/" + fi + hugo ${STAGING_URL+-b "$STAGING_URL"} + - name: Deploy docs site + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_PROUD_BAY_0E9E0E81E }} + repo_token: ${{ secrets.GITHUB_TOKEN }} + action: "upload" + app_location: "/daprdocs/public/" + output_location: "/" + skip_app_build: true + skip_deploy_on_missing_secrets: true + - name: Upload Hugo artifacts + uses: actions/upload-artifact@v4 + with: + name: hugo_build + path: ./daprdocs/public/ + if-no-files-found: error + + close_staging_site: + if: github.event_name == 'pull_request' && github.event.action == 'closed' + runs-on: ubuntu-latest + name: Close Pull Request Job + steps: + - name: Close Pull Request + id: closepullrequest + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_PROUD_BAY_0E9E0E81E }} + action: "close" + skip_deploy_on_missing_secrets: true + + algolia_index: + name: Index site for Algolia + if: github.event_name == 'push' + needs: ['build_and_deploy_job'] + runs-on: ubuntu-latest + env: + ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} + ALGOLIA_API_WRITE_KEY: ${{ secrets.ALGOLIA_API_WRITE_KEY }} + ALGOLIA_INDEX_NAME: daprdocs + steps: + - name: Checkout docs repo + uses: actions/checkout@v4 + with: + submodules: false + - name: Download Hugo artifacts + uses: actions/download-artifact@v3 + with: + name: hugo_build + path: site/ + - name: Install Python packages + run: | + pip install --upgrade bs4 + pip install --upgrade 'algoliasearch>=2.0,<3.0' + - name: Index site + run: python ./.github/scripts/algolia.py ./site diff --git a/daprdocs/content/en/operations/configuration/configuration-overview.md b/daprdocs/content/en/operations/configuration/configuration-overview.md index ff36c87f2bb..f501710405c 100644 --- a/daprdocs/content/en/operations/configuration/configuration-overview.md +++ b/daprdocs/content/en/operations/configuration/configuration-overview.md @@ -115,12 +115,11 @@ To disable the sampling rate, set `samplingRate : "0"` in the configuration. The OpenTelemetry (`otel`) endpoint can also be configured via an environment variable. The presence of the `OTEL_EXPORTER_OTLP_ENDPOINT` environment variable turns on tracing for the sidecar. -| Environment Variable | Description | -|----------------------|-----------------------------------------------------------------| +| Environment Variable | Description | +|----------------------|-------------| | `OTEL_EXPORTER_OTLP_ENDPOINT` | Sets the Open Telemetry (OTEL) server address, turns on tracing | | `OTEL_EXPORTER_OTLP_INSECURE` | Sets the connection to the endpoint as unencrypted (true/false) | -| `OTEL_EXPORTER_OTLP_PROTOCOL` | Transport protocol (`grpc`, `http/protobuf`, `http/json`) | -| `OTEL_SERVICE_NAME` | Optional override to specify the service name used in traces | +| `OTEL_EXPORTER_OTLP_PROTOCOL` | Transport protocol (`grpc`, `http/protobuf`, `http/json`) | See [Observability distributed tracing]({{% ref "tracing-overview.md" %}}) for more information. diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md b/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md index 994e8b7f94c..e463ae6c8bf 100644 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md @@ -19,9 +19,9 @@ For applications using actors in Dapr there are two aspects to be considered. Fi * Sidecar Injector (control plane) * Sentry (optional, control plane) -## Performance summary for Dapr v1.12 +## Performance summary for Dapr v1.0 -The actors API in Dapr sidecar identifies which hosts are registered for a given actor type and routes the request to the appropriate host for a given actor ID. The host runs an instance of the application and uses the Dapr SDK (.Net, Java, Python, Go) to handle actors requests via HTTP. +The actors API in Dapr sidecar will identify which hosts are registered for a given actor type and route the request to the appropriate host for a given actor ID. The host runs an instance of the application and uses the Dapr SDK (.Net, Java, Python or PHP) to handle actors requests via HTTP. This test uses invokes actors via Dapr's HTTP API directly. @@ -40,14 +40,17 @@ Test parameters: * Sidecar limited to 0.5 vCPU * mTLS enabled * Sidecar telemetry enabled (tracing with a sampling rate of 0.1) +* Payload of an empty JSON object: `{}` ### Results -* The requested throughput was 500 qps. -* The actual throughput was 500 qps. -* The tp90 latency was ~3.2ms. -* The tp99 latency was ~7ms. -* Dapr app consumed ~339m CPU and ~336Mb of Memory -* Dapr sidecar consumed 93m CPU and ~60Mb of Memory +* The actual throughput was ~500 qps. +* The tp90 latency was ~3ms. +* The tp99 latency was ~6.2ms. +* Dapr app consumed ~523m CPU and ~304.7Mb of Memory +* Dapr sidecar consumed 2m CPU and ~18.2Mb of Memory * No app restarts * No sidecar restarts + +## Related links +* For more information see [overview of Dapr on Kubernetes]({{% ref kubernetes-overview.md %}}) \ No newline at end of file diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md b/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md deleted file mode 100644 index 2717bd87db2..00000000000 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -type: docs -title: "Pub/sub performance" -linkTitle: "Pub/sub performance" -weight: 30000 -description: "" ---- -This article provides pub/sub API performance benchmarks and resource utilization in Dapr on Kubernetes. - -## System overview - -Dapr consists of a data plane, the sidecar that runs next to your app, and a control plane that configures the sidecars and provides capabilities such as cert and identity management. - -### Kubernetes components - -* Sidecar (data plane) -* Placement (required for actors, control plane mapping actor types to hosts) -* Operator (control plane) -* Sidecar Injector (control plane) -* Sentry (optional, control plane) -* Kafka cluster with 3 replicas - -## Performance summary for Dapr v1.12 - -The Pub/Sub API is used to publish messages to a message broker. Dapr accepts requests from the app via HTTP or gRPC, wraps them in a cloud event if needed, and sends the request to the message broker. - -Performance varies based on the underlying message broker. The Pub/Sub performance test measures the added latency when publishing a message with Dapr compared with the baseline latency when publishing directly to the message broker. - -### Kubernetes performance test setup - -The test was conducted on a 3 node Kubernetes cluster, using commodity hardware running 4 cores and 8GB of RAM, without any network acceleration. - -Test parameters: - -* 1000 requests per second -* 1 replica -* 1 minute duration -* Sidecar limited to 0.5 vCPU -* Sidecar telemetry enabled (tracing with a sampling rate of 0.1) -* Payload of a 1kb size - -### Results - -* The requested throughput was 1000 qps -* The actual throughput was 1000 qps -* Added latency for 90th percentile was 0.64ms for gRPC and 0.49ms for HTTP -* Added latency for 99th percentile was 1.91ms for gRPC and 1.21ms for HTTP -* Dapr app consumed ~0.2 vCPU and ~30Mb of Memory for both gRPC and HTTP -* No app restarts -* No sidecar restarts diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md b/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md index b50cc6c6174..fc0816e8620 100644 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md @@ -29,7 +29,7 @@ For more information see [overview of Dapr in self-hosted mode]({{% ref self-hos For more information see [overview of Dapr on Kubernetes]({{% ref kubernetes-overview.md %}}). -## Performance summary for Dapr v1.12 +## Performance summary for Dapr v1.0 The service invocation API is a reverse proxy with built-in service discovery to connect to other services. This includes tracing, metrics, mTLS for in-transit encryption of traffic, together with resiliency in the form of retries for network partitions and connection errors. @@ -59,10 +59,10 @@ When running in a highly available production setup, the Dapr control plane cons | Component | vCPU | Memory | ------------- | ------------- | ------------- -| Operator | 0.003 | 18 Mb -| Sentry | 0.01 | 33 Mb -| Sidecar Injector | 0.008 | 17 Mb -| Placement | 0.005 | 25 Mb +| Operator | 0.001 | 12.5 Mb +| Sentry | 0.005 | 13.6 Mb +| Sidecar Injector | 0.002 | 14.6 Mb +| Placement | 0.001 | 20.9 Mb There are a number of variants that affect the CPU and memory consumption for each of the system components. These variants are shown in the table below. @@ -75,11 +75,18 @@ There are a number of variants that affect the CPU and memory consumption for ea ### Data plane performance +The Dapr sidecar uses 0.48 vCPU and 23Mb per 1000 requests per second. +End-to-end, the Dapr sidecars (client and server) add ~1.40 ms to the 90th percentile latency, and ~2.10 ms to the 99th percentile latency. End-to-end here is a call from one app to another app receiving a response. This is shown by steps 1-7 in [this diagram]({{% ref service-invocation-overview.md %}}). + +This performance is on par or better than commonly used service meshes. + +### Latency + In the test setup, requests went through the Dapr sidecar both on the client side (serving requests from the load tester tool) and the server side (the target app). mTLS and telemetry (tracing with a sampling rate of 0.1) and metrics were enabled on the Dapr test, and disabled for the baseline test. -The Dapr sidecar uses 0.45 vCPU and 38Mb per 1000 requests per second. +Latency for 90th percentile -End-to-end, the Dapr sidecars (client and server) add ~1.20 ms to the 90th percentile latency, and ~2.50 ms to the 99th percentile latency. End-to-end here is a call from one app to another app receiving a response. This is shown by steps 1-7 in [this diagram]({{< ref service-invocation-overview.md >}}). +
-This performance is on par or better than commonly used service meshes. +Latency for 99th percentile diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-state.md b/daprdocs/content/en/operations/performance-and-scalability/perf-state.md deleted file mode 100644 index 8db9d1a4284..00000000000 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-state.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -type: docs -title: "State performance" -linkTitle: "State performance" -weight: 40000 -description: "" ---- -This article provides state API performance benchmarks and resource utilization in Dapr on Kubernetes. - -## System overview - -Dapr consists of a data plane, the sidecar that runs next to your app, and a control plane that configures the sidecars and provides capabilities such as cert and identity management. - -### Kubernetes components - -* Sidecar (data plane) -* Placement (required for actors, control plane mapping actor types to hosts) -* Operator (control plane) -* Sidecar Injector (control plane) -* Sentry (optional, control plane) -* PosgreSQL database (single node) - -## Performance summary for Dapr v1.12 - -The state API is used to persist state to a database, commonly called state store in Dapr. - -Performance varies based on the underlying state store. The state API performance test measures the added latency when using Dapr to get state compared with the baseline latency when getting state directly from the state store. - -### Kubernetes performance test setup - -The test was conducted on a 3 node Kubernetes cluster, using commodity hardware running 4 cores and 8GB of RAM, without any network acceleration. - -Test parameters: - -* 1000 requests per second -* 1 replica -* 1 minute duration -* Sidecar limited to 0.5 vCPU -* Sidecar telemetry enabled (tracing with a sampling rate of 0.1) -* Payload of a 1kb size - -### Results - -* The requested throughput was 1000 qps -* The actual throughput was 1000 qps -* Added latency for 90th percentile was 0.75ms for gRPC -* Added latency for 99th percentile was 1.52ms for gRPC -* Dapr app consumed ~0.3 vCPU and ~48 of Memory for gRPC -* No app restarts -* No sidecar restarts From 66084d51a9bab91b1217e406e898a45821ad0836 Mon Sep 17 00:00:00 2001 From: MyMirelHub <15373565+MyMirelHub@users.noreply.github.com> Date: Wed, 17 Sep 2025 15:59:29 +0200 Subject: [PATCH 11/19] git magic to resolve conflicts for perf Signed-off-by: MyMirelHub <15373565+MyMirelHub@users.noreply.github.com> --- .../perf-actors-activation.md | 19 +++---- .../perf-pubsub.md | 50 +++++++++++++++++++ .../perf-service-invocation.md | 23 +++------ .../performance-and-scalability/perf-state.md | 50 +++++++++++++++++++ 4 files changed, 116 insertions(+), 26 deletions(-) create mode 100644 daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md create mode 100644 daprdocs/content/en/operations/performance-and-scalability/perf-state.md diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md b/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md index e463ae6c8bf..994e8b7f94c 100644 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-actors-activation.md @@ -19,9 +19,9 @@ For applications using actors in Dapr there are two aspects to be considered. Fi * Sidecar Injector (control plane) * Sentry (optional, control plane) -## Performance summary for Dapr v1.0 +## Performance summary for Dapr v1.12 -The actors API in Dapr sidecar will identify which hosts are registered for a given actor type and route the request to the appropriate host for a given actor ID. The host runs an instance of the application and uses the Dapr SDK (.Net, Java, Python or PHP) to handle actors requests via HTTP. +The actors API in Dapr sidecar identifies which hosts are registered for a given actor type and routes the request to the appropriate host for a given actor ID. The host runs an instance of the application and uses the Dapr SDK (.Net, Java, Python, Go) to handle actors requests via HTTP. This test uses invokes actors via Dapr's HTTP API directly. @@ -40,17 +40,14 @@ Test parameters: * Sidecar limited to 0.5 vCPU * mTLS enabled * Sidecar telemetry enabled (tracing with a sampling rate of 0.1) -* Payload of an empty JSON object: `{}` ### Results -* The actual throughput was ~500 qps. -* The tp90 latency was ~3ms. -* The tp99 latency was ~6.2ms. -* Dapr app consumed ~523m CPU and ~304.7Mb of Memory -* Dapr sidecar consumed 2m CPU and ~18.2Mb of Memory +* The requested throughput was 500 qps. +* The actual throughput was 500 qps. +* The tp90 latency was ~3.2ms. +* The tp99 latency was ~7ms. +* Dapr app consumed ~339m CPU and ~336Mb of Memory +* Dapr sidecar consumed 93m CPU and ~60Mb of Memory * No app restarts * No sidecar restarts - -## Related links -* For more information see [overview of Dapr on Kubernetes]({{% ref kubernetes-overview.md %}}) \ No newline at end of file diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md b/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md new file mode 100644 index 00000000000..2717bd87db2 --- /dev/null +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-pubsub.md @@ -0,0 +1,50 @@ +--- +type: docs +title: "Pub/sub performance" +linkTitle: "Pub/sub performance" +weight: 30000 +description: "" +--- +This article provides pub/sub API performance benchmarks and resource utilization in Dapr on Kubernetes. + +## System overview + +Dapr consists of a data plane, the sidecar that runs next to your app, and a control plane that configures the sidecars and provides capabilities such as cert and identity management. + +### Kubernetes components + +* Sidecar (data plane) +* Placement (required for actors, control plane mapping actor types to hosts) +* Operator (control plane) +* Sidecar Injector (control plane) +* Sentry (optional, control plane) +* Kafka cluster with 3 replicas + +## Performance summary for Dapr v1.12 + +The Pub/Sub API is used to publish messages to a message broker. Dapr accepts requests from the app via HTTP or gRPC, wraps them in a cloud event if needed, and sends the request to the message broker. + +Performance varies based on the underlying message broker. The Pub/Sub performance test measures the added latency when publishing a message with Dapr compared with the baseline latency when publishing directly to the message broker. + +### Kubernetes performance test setup + +The test was conducted on a 3 node Kubernetes cluster, using commodity hardware running 4 cores and 8GB of RAM, without any network acceleration. + +Test parameters: + +* 1000 requests per second +* 1 replica +* 1 minute duration +* Sidecar limited to 0.5 vCPU +* Sidecar telemetry enabled (tracing with a sampling rate of 0.1) +* Payload of a 1kb size + +### Results + +* The requested throughput was 1000 qps +* The actual throughput was 1000 qps +* Added latency for 90th percentile was 0.64ms for gRPC and 0.49ms for HTTP +* Added latency for 99th percentile was 1.91ms for gRPC and 1.21ms for HTTP +* Dapr app consumed ~0.2 vCPU and ~30Mb of Memory for both gRPC and HTTP +* No app restarts +* No sidecar restarts diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md b/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md index fc0816e8620..b50cc6c6174 100644 --- a/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-service-invocation.md @@ -29,7 +29,7 @@ For more information see [overview of Dapr in self-hosted mode]({{% ref self-hos For more information see [overview of Dapr on Kubernetes]({{% ref kubernetes-overview.md %}}). -## Performance summary for Dapr v1.0 +## Performance summary for Dapr v1.12 The service invocation API is a reverse proxy with built-in service discovery to connect to other services. This includes tracing, metrics, mTLS for in-transit encryption of traffic, together with resiliency in the form of retries for network partitions and connection errors. @@ -59,10 +59,10 @@ When running in a highly available production setup, the Dapr control plane cons | Component | vCPU | Memory | ------------- | ------------- | ------------- -| Operator | 0.001 | 12.5 Mb -| Sentry | 0.005 | 13.6 Mb -| Sidecar Injector | 0.002 | 14.6 Mb -| Placement | 0.001 | 20.9 Mb +| Operator | 0.003 | 18 Mb +| Sentry | 0.01 | 33 Mb +| Sidecar Injector | 0.008 | 17 Mb +| Placement | 0.005 | 25 Mb There are a number of variants that affect the CPU and memory consumption for each of the system components. These variants are shown in the table below. @@ -75,18 +75,11 @@ There are a number of variants that affect the CPU and memory consumption for ea ### Data plane performance -The Dapr sidecar uses 0.48 vCPU and 23Mb per 1000 requests per second. -End-to-end, the Dapr sidecars (client and server) add ~1.40 ms to the 90th percentile latency, and ~2.10 ms to the 99th percentile latency. End-to-end here is a call from one app to another app receiving a response. This is shown by steps 1-7 in [this diagram]({{% ref service-invocation-overview.md %}}). - -This performance is on par or better than commonly used service meshes. - -### Latency - In the test setup, requests went through the Dapr sidecar both on the client side (serving requests from the load tester tool) and the server side (the target app). mTLS and telemetry (tracing with a sampling rate of 0.1) and metrics were enabled on the Dapr test, and disabled for the baseline test. -Latency for 90th percentile +The Dapr sidecar uses 0.45 vCPU and 38Mb per 1000 requests per second. -
+End-to-end, the Dapr sidecars (client and server) add ~1.20 ms to the 90th percentile latency, and ~2.50 ms to the 99th percentile latency. End-to-end here is a call from one app to another app receiving a response. This is shown by steps 1-7 in [this diagram]({{< ref service-invocation-overview.md >}}). -Latency for 99th percentile +This performance is on par or better than commonly used service meshes. diff --git a/daprdocs/content/en/operations/performance-and-scalability/perf-state.md b/daprdocs/content/en/operations/performance-and-scalability/perf-state.md new file mode 100644 index 00000000000..8db9d1a4284 --- /dev/null +++ b/daprdocs/content/en/operations/performance-and-scalability/perf-state.md @@ -0,0 +1,50 @@ +--- +type: docs +title: "State performance" +linkTitle: "State performance" +weight: 40000 +description: "" +--- +This article provides state API performance benchmarks and resource utilization in Dapr on Kubernetes. + +## System overview + +Dapr consists of a data plane, the sidecar that runs next to your app, and a control plane that configures the sidecars and provides capabilities such as cert and identity management. + +### Kubernetes components + +* Sidecar (data plane) +* Placement (required for actors, control plane mapping actor types to hosts) +* Operator (control plane) +* Sidecar Injector (control plane) +* Sentry (optional, control plane) +* PosgreSQL database (single node) + +## Performance summary for Dapr v1.12 + +The state API is used to persist state to a database, commonly called state store in Dapr. + +Performance varies based on the underlying state store. The state API performance test measures the added latency when using Dapr to get state compared with the baseline latency when getting state directly from the state store. + +### Kubernetes performance test setup + +The test was conducted on a 3 node Kubernetes cluster, using commodity hardware running 4 cores and 8GB of RAM, without any network acceleration. + +Test parameters: + +* 1000 requests per second +* 1 replica +* 1 minute duration +* Sidecar limited to 0.5 vCPU +* Sidecar telemetry enabled (tracing with a sampling rate of 0.1) +* Payload of a 1kb size + +### Results + +* The requested throughput was 1000 qps +* The actual throughput was 1000 qps +* Added latency for 90th percentile was 0.75ms for gRPC +* Added latency for 99th percentile was 1.52ms for gRPC +* Dapr app consumed ~0.3 vCPU and ~48 of Memory for gRPC +* No app restarts +* No sidecar restarts From 4a83a61a042fa370ea1200ecdbd82aca4dbcecdc Mon Sep 17 00:00:00 2001 From: Bilgin Ibryam Date: Fri, 12 Sep 2025 16:15:40 +0100 Subject: [PATCH 12/19] Updated conversation api docs to latest alpha v2, refresh sample request, add metadata, remove redundant fields like name, fixes #4687 Signed-off-by: Bilgin Ibryam --- .../conversation/conversation-overview.md | 8 +- .../en/reference/api/conversation_api.md | 270 +++++++++++------- 2 files changed, 167 insertions(+), 111 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md b/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md index 44b0396bf4f..7483a41c296 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md @@ -20,10 +20,10 @@ In addition to enabling critical performance and security functionality (like [p - **OpenAI-compatible interface** for seamless integration with existing AI workflows and tools You can also pair the conversation API with Dapr functionalities, like: -- Resiliency circuit breakers and retries to circumvent limit and token errors, or -- Middleware to authenticate requests coming to and from the LLM -Dapr provides observability by issuing metrics for your LLM interactions. +- Resiliency policies including circuit breakers to handle repeated errors, timeouts to safeguards from slow responses, and retries for temporary network failures +- Observability with metrics and distributed tracing using OpenTelemetry and Zipkin +- Middleware to authenticate requests to and from the LLM ## Features @@ -67,7 +67,7 @@ Watch the demo presented during [Diagrid's Dapr v1.15 celebration](https://www.d {{< youtube id=NTnwoDhHIcQ start=5444 >}} -## Try out conversation +## Try out conversation API ### Quickstarts and tutorials diff --git a/daprdocs/content/en/reference/api/conversation_api.md b/daprdocs/content/en/reference/api/conversation_api.md index 43c62b91f58..c3cdae4cb0a 100644 --- a/daprdocs/content/en/reference/api/conversation_api.md +++ b/daprdocs/content/en/reference/api/conversation_api.md @@ -12,7 +12,7 @@ The conversation API is currently in [alpha]({{% ref "certification-lifecycle.md Dapr provides an API to interact with Large Language Models (LLMs) and enables critical performance and security functionality with features like prompt caching, PII data obfuscation, and tool calling capabilities. -Tool calling follow's OpenAI's function calling format, making it easy to integrate with existing AI development workflows and tools. +Tool calling follows OpenAI's function calling format, making it easy to integrate with existing AI development workflows and tools. ## Converse @@ -32,32 +32,34 @@ POST http://localhost:/v1.0-alpha2/conversation//converse | Field | Description | | --------- | ----------- | -| `name` | The name of the conversation component. Required | -| `contextId` | The ID of an existing chat (like in ChatGPT). Optional | +| `context_id` | The ID of an existing chat (like in ChatGPT). Optional | | `inputs` | Inputs for the conversation. Multiple inputs at one time are supported. Required | | `parameters` | Parameters for all custom fields. Optional | -| `metadata` | [Metadata](#metadata) passed to conversation components. Optional | -| `scrubPii` | A boolean value to enable obfuscation of sensitive information returning from the LLM. Optional | +| `metadata` | Metadata passed to conversation components. Optional | +| `scrub_pii` | A boolean value to enable obfuscation of sensitive information returning from the LLM. Optional | | `temperature` | A float value to control the temperature of the model. Used to optimize for consistency (0) or creativity (1). Optional | | `tools` | Tools register the tools available to be used by the LLM during the conversation. Optional | -| `toolChoice` | Controls which (if any) tool is called by the model. Values: `auto`, `required`, or specific tool name. Defaults to `auto` if tools are present. Optional | +| `tool_choice` | Controls which (if any) tool is called by the model. Values: `auto`, `required`, or specific tool name. Defaults to `auto` if tools are present. Optional | #### Input body | Field | Description | | --------- | ----------- | | `messages` | Array of conversation messages. Required | -| `scrubPii` | A boolean value to enable obfuscation of sensitive information present in the content field. Optional | +| `scrub_pii` | A boolean value to enable obfuscation of sensitive information present in the content field. Optional | #### Message types The API supports different message types: -- **`ofDeveloper`**: Developer role messages with optional name and content -- **`ofSystem`**: System role messages with optional name and content -- **`ofUser`**: User role messages with optional name and content -- **`ofAssistant`**: Assistant role messages with optional name, content, and tool calls -- **`ofTool`**: Tool role messages with tool ID, name, and content +| Type | Description | +| ---- | ----------- | +| `of_developer` | Developer role messages with optional name and content | +| `of_system` | System role messages with optional name and content | +| `of_user` | User role messages with optional name and content | +| `of_assistant` | Assistant role messages with optional name, content, and tool calls | +| `of_tool` | Tool role messages with tool ID, name, and content | + #### Tool calling @@ -69,81 +71,136 @@ Tools can be defined using the `tools` field with function definitions: | `function.description` | A description of what the function does. Optional | | `function.parameters` | JSON Schema object describing the function parameters. Optional | + +#### Tool choice options + +The `tool_choice` is an optional parameter that controls how the model can use available tools: + +- **`auto`**: The model can pick between generating a message or calling one or more tools (default when tools are present) +- **`required`**: Requires one or more functions to be called +- **`{tool_name}`**: Forces the model to call a specific tool by name + + +#### Metadata +The `metadata` field serves as a dynamic configuration mechanism that allows you to pass additional configuration and authentication information to conversation components on a per-request basis. This metadata overrides any corresponding fields configured in the component's YAML configuration file, enabling dynamic configuration without modifying static component definitions. + +**Common metadata fields:** + +| Field | Description | Example | +| ----- | ----------- | ------- | +| `api_key` | API key for authenticating with the LLM service | `"sk-1234567890abcdef"` | +| `model` | Specific model identifier | `"gpt-4-turbo"`, `"claude-3-sonnet"` | +| `version` | API version or service version | `"1.0"`, `"2023-12-01"` | +| `endpoint` | Custom endpoint URL for the service | `"https://api.custom-llm.com/v1"` | + +{{% alert title="Note" color="primary" %}} +The exact metadata fields supported depend on the specific conversation component implementation. Refer to the component's documentation for the complete list of supported metadata fields. +{{% /alert %}} + +In addition to passing metadata in the request body, you can also pass metadata as URL query parameters without modifying the request payload. Here is the format: + +- **Prefix**: All metadata parameters must be prefixed with `metadata.` +- **Format**: `?metadata.=` +- **Multiple parameters**: Separate with `&` (e.g., `?metadata.api_key=sk-123&metadata.model=gpt-4`) + +Example of model override: +```bash +POST http://localhost:3500/v1.0-alpha2/conversation/openai/converse?metadata.model=sk-gpt-4-turbo +``` + +URL metadata parameters are merged with request body metadata, URL parameters take precedence if conflicts exist, and both override component configuration in the YAML file. + ### Request content examples #### Basic conversation ```json -REQUEST = { - "name": "openai", - "inputs": [{ - "messages": [{ - "of_user": { - "content": [{ - "text": "What is Dapr?" - }] - } - }] - }], - "parameters": {}, - "metadata": {} -} +curl -X POST http://localhost:3500/v1.0-alpha2/conversation/openai/converse \ + -H "Content-Type: application/json" \ + -d '{ + "inputs": [ + { + "messages": [ + { + "of_user": { + "content": [ + { + "text": "What is Dapr?" + } + ] + } + } + ] + } + ], + "parameters": {}, + "metadata": {} + }' ``` #### Conversation with tool calling ```json -{ - "name": "openai", - "inputs": [{ - "messages": [{ - "of_user": { - "content": [{ - "text": "What is the weather like in San Francisco in celsius?" - }] - } - }], - "scrub_pii": false - }], - "parameters": { - "max_tokens": { - "@type": "type.googleapis.com/google.protobuf.Int64Value", - "value": "100" - }, - "model": { - "@type": "type.googleapis.com/google.protobuf.StringValue", - "value": "claude-3-5-sonnet-20240620" - } - }, - "metadata": { - "api_key": "test-key", - "version": "1.0" - }, - "scrub_pii": false, - "temperature": 0.7, - "tools": [{ - "function": { - "name": "get_weather", - "description": "Get the current weather for a location", - "parameters": { - "type": "object", - "properties": { - "location": { - "type": "string", - "description": "The city and state, e.g. San Francisco, CA" +curl -X POST http://localhost:3500/v1.0-alpha2/conversation/openai/converse \ + -H "Content-Type: application/json" \ + -d '{ + "inputs": [ + { + "messages": [ + { + "of_user": { + "content": [ + { + "text": "What is the weather like in San Francisco in celsius?" + } + ] + } + } + ], + "scrub_pii": false + } + ], + "parameters": { + "max_tokens": { + "@type": "type.googleapis.com/google.protobuf.Int64Value", + "value": "100" }, - "unit": { - "type": "string", - "enum": ["celsius", "fahrenheit"], - "description": "The temperature unit to use" + "model": { + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "claude-3-5-sonnet-20240620" } }, - "required": ["location"] - } - } - }], - "tool_choice": "auto" -} + "metadata": { + "api_key": "test-key", + "version": "1.0" + }, + "scrub_pii": false, + "temperature": 0.7, + "tools": [ + { + "function": { + "name": "get_weather", + "description": "Get the current weather for a location", + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA" + }, + "unit": { + "type": "string", + "enum": ["celsius", "fahrenheit"], + "description": "The temperature unit to use" + } + }, + "required": ["location"] + } + } + } + ], + "tool_choice": "auto" + }' ``` ### HTTP response codes @@ -159,17 +216,19 @@ Code | Description #### Basic conversation response ```json -RESPONSE = { - "outputs": [{ - "choices": [{ - "finish_reason": "stop", - "index": 0, - "message": { - "content": "Dapr is a distributed application runtime that makes it easy for developers to build resilient, stateless and stateful applications that run on the cloud and edge.", - "tool_calls": [] - } - }] - }] +{ + "outputs": [ + { + "choices": [ + { + "finishReason": "stop", + "message": { + "content": "Distributed application runtime, open-source." + } + } + ] + } + ] } ``` @@ -177,32 +236,29 @@ RESPONSE = { ```json { - "outputs": [{ - "choices": [{ - "finish_reason": "tool_calls", - "index": 0, - "message": { - "content": null, - "tool_calls": [{ - "id": "call_123", - "function": { - "name": "get_weather", - "arguments": "{\"location\": \"San Francisco, CA\", \"unit\": \"celsius\"}" + "outputs": [ + { + "choices": [ + { + "finishReason": "tool_calls", + "message": { + "toolCalls": [ + { + "id": "call_Uwa41pG0UqGA2zp0Fec0KwOq", + "function": { + "name": "get_weather", + "arguments": "{\"location\":\"San Francisco, CA\",\"unit\":\"celsius\"}" + } + } + ] } - }] - } - }] - }] + } + ] + } + ] } ``` -### Tool choice options - -The `tool_choice` is an optional parameter that controls how the model can use available tools: - -- **`auto`**: The model can pick between generating a message or calling one or more tools (default when tools are present) -- **`required`**: Requires one or more functions to be called -- **`{tool_name}`**: Forces the model to call a specific tool by name ## Legacy Alpha1 API From 2eb604f42818e136a5e8842d510a4e9cb9bce1df Mon Sep 17 00:00:00 2001 From: Bilgin Ibryam Date: Mon, 15 Sep 2025 20:11:16 +0100 Subject: [PATCH 13/19] Reverting back from snake case to camel case Signed-off-by: Bilgin Ibryam --- .../en/reference/api/conversation_api.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/daprdocs/content/en/reference/api/conversation_api.md b/daprdocs/content/en/reference/api/conversation_api.md index c3cdae4cb0a..eab64dd6ed5 100644 --- a/daprdocs/content/en/reference/api/conversation_api.md +++ b/daprdocs/content/en/reference/api/conversation_api.md @@ -32,21 +32,21 @@ POST http://localhost:/v1.0-alpha2/conversation//converse | Field | Description | | --------- | ----------- | -| `context_id` | The ID of an existing chat (like in ChatGPT). Optional | +| `contextId` | The ID of an existing chat (like in ChatGPT). Optional | | `inputs` | Inputs for the conversation. Multiple inputs at one time are supported. Required | | `parameters` | Parameters for all custom fields. Optional | | `metadata` | Metadata passed to conversation components. Optional | -| `scrub_pii` | A boolean value to enable obfuscation of sensitive information returning from the LLM. Optional | +| `scrubPii` | A boolean value to enable obfuscation of sensitive information returning from the LLM. Optional | | `temperature` | A float value to control the temperature of the model. Used to optimize for consistency (0) or creativity (1). Optional | | `tools` | Tools register the tools available to be used by the LLM during the conversation. Optional | -| `tool_choice` | Controls which (if any) tool is called by the model. Values: `auto`, `required`, or specific tool name. Defaults to `auto` if tools are present. Optional | +| `toolChoice` | Controls which (if any) tool is called by the model. Values: `auto`, `required`, or specific tool name. Defaults to `auto` if tools are present. Optional | #### Input body | Field | Description | | --------- | ----------- | | `messages` | Array of conversation messages. Required | -| `scrub_pii` | A boolean value to enable obfuscation of sensitive information present in the content field. Optional | +| `scrubPii` | A boolean value to enable obfuscation of sensitive information present in the content field. Optional | #### Message types @@ -54,11 +54,11 @@ The API supports different message types: | Type | Description | | ---- | ----------- | -| `of_developer` | Developer role messages with optional name and content | -| `of_system` | System role messages with optional name and content | -| `of_user` | User role messages with optional name and content | -| `of_assistant` | Assistant role messages with optional name, content, and tool calls | -| `of_tool` | Tool role messages with tool ID, name, and content | +| `ofDeveloper` | Developer role messages with optional name and content | +| `ofSystem` | System role messages with optional name and content | +| `ofUser` | User role messages with optional name and content | +| `ofAssistant` | Assistant role messages with optional name, content, and tool calls | +| `ofTool` | Tool role messages with tool ID, name, and content | #### Tool calling @@ -74,7 +74,7 @@ Tools can be defined using the `tools` field with function definitions: #### Tool choice options -The `tool_choice` is an optional parameter that controls how the model can use available tools: +The `toolChoice` is an optional parameter that controls how the model can use available tools: - **`auto`**: The model can pick between generating a message or calling one or more tools (default when tools are present) - **`required`**: Requires one or more functions to be called @@ -122,7 +122,7 @@ curl -X POST http://localhost:3500/v1.0-alpha2/conversation/openai/converse \ { "messages": [ { - "of_user": { + "ofUser": { "content": [ { "text": "What is Dapr?" @@ -148,7 +148,7 @@ curl -X POST http://localhost:3500/v1.0-alpha2/conversation/openai/converse \ { "messages": [ { - "of_user": { + "ofUser": { "content": [ { "text": "What is the weather like in San Francisco in celsius?" @@ -157,7 +157,7 @@ curl -X POST http://localhost:3500/v1.0-alpha2/conversation/openai/converse \ } } ], - "scrub_pii": false + "scrubPii": false } ], "parameters": { @@ -174,7 +174,7 @@ curl -X POST http://localhost:3500/v1.0-alpha2/conversation/openai/converse \ "api_key": "test-key", "version": "1.0" }, - "scrub_pii": false, + "scrubPii": false, "temperature": 0.7, "tools": [ { @@ -199,7 +199,7 @@ curl -X POST http://localhost:3500/v1.0-alpha2/conversation/openai/converse \ } } ], - "tool_choice": "auto" + "toolChoice": "auto" }' ``` From c08077d602c3b66b2270b4e4403af91ca7010eaf Mon Sep 17 00:00:00 2001 From: Cassie Coyle Date: Tue, 16 Sep 2025 09:33:02 -0500 Subject: [PATCH 14/19] Multi-app workflows: improve docs and images (#4878) * add complex wf illustration and fix other image Signed-off-by: Cassandra Coyle * cleanup Signed-off-by: Cassandra Coyle * update howto author wfs Signed-off-by: Cassandra Coyle * update go code to use vanity client Signed-off-by: Cassandra Coyle * Apply suggestions from code review Co-authored-by: Mark Fussell Signed-off-by: Cassie Coyle * add scheduleworkflow note Signed-off-by: Cassandra Coyle * update images Signed-off-by: Cassandra Coyle --------- Signed-off-by: Cassandra Coyle Signed-off-by: Cassie Coyle Co-authored-by: Mark Fussell Co-authored-by: Marc Duiker --- .../workflow/howto-author-workflow.md | 120 +++++++++++++++--- .../workflow/workflow-multi-app.md | 59 +++++++-- .../workflow-multi-app-child-workflow.png | Bin 83374 -> 33812 bytes .../workflow-multi-app-complex.png | Bin 0 -> 84376 bytes 4 files changed, 149 insertions(+), 30 deletions(-) create mode 100644 daprdocs/static/images/workflow-overview/workflow-multi-app-complex.png diff --git a/daprdocs/content/en/developing-applications/building-blocks/workflow/howto-author-workflow.md b/daprdocs/content/en/developing-applications/building-blocks/workflow/howto-author-workflow.md index 36d2df7b3bb..a054393cf56 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/workflow/howto-author-workflow.md +++ b/daprdocs/content/en/developing-applications/building-blocks/workflow/howto-author-workflow.md @@ -197,10 +197,12 @@ public class DemoWorkflowActivity implements WorkflowActivity { +### Define workflow activities + Define each workflow activity you'd like your workflow to perform. The Activity input can be unmarshalled from the context with `ctx.GetInput`. Activities should be defined as taking a `ctx workflow.ActivityContext` parameter and returning an interface and error. ```go -func TestActivity(ctx workflow.ActivityContext) (any, error) { +func BusinessActivity(ctx workflow.ActivityContext) (any, error) { var input int if err := ctx.GetInput(&input); err != nil { return "", err @@ -211,6 +213,87 @@ func TestActivity(ctx workflow.ActivityContext) (any, error) { } ``` +### Define the workflow + +Define your workflow function with the parameter `ctx *workflow.WorkflowContext` and return any and error. Invoke your defined activities from within your workflow. + +```go +func BusinessWorkflow(ctx *workflow.WorkflowContext) (any, error) { + var input int + if err := ctx.GetInput(&input); err != nil { + return nil, err + } + var output string + if err := ctx.CallActivity(BusinessActivity, workflow.ActivityInput(input)).Await(&output); err != nil { + return nil, err + } + if err := ctx.WaitForExternalEvent("businessEvent", time.Second*60).Await(&output); err != nil { + return nil, err + } + + if err := ctx.CreateTimer(time.Second).Await(nil); err != nil { + return nil, nil + } + return output, nil +} +``` + +### Register workflows and activities + +Before your application can execute workflows, you must register both the workflow orchestrator and its activities with a workflow registry. This ensures Dapr knows which functions to call when executing your workflow. + +```go +func main() { + // Create a workflow registry + r := workflow.NewRegistry() + + // Register the workflow orchestrator + if err := r.AddWorkflow(BusinessWorkflow); err != nil { + log.Fatal(err) + } + fmt.Println("BusinessWorkflow registered") + + // Register the workflow activities + if err := r.AddActivity(BusinessActivity); err != nil { + log.Fatal(err) + } + fmt.Println("BusinessActivity registered") + + // Create workflow client and start worker + wclient, err := client.NewWorkflowClient() + if err != nil { + log.Fatal(err) + } + fmt.Println("Worker initialized") + + ctx, cancel := context.WithCancel(context.Background()) + if err = wclient.StartWorker(ctx, r); err != nil { + log.Fatal(err) + } + fmt.Println("runner started") + + // Your application logic continues here... + // Example: Start a workflow + instanceID, err := wclient.ScheduleWorkflow(ctx, "BusinessWorkflow", workflow.WithInput(1)) + if err != nil { + log.Fatalf("failed to start workflow: %v", err) + } + fmt.Printf("workflow started with id: %v\n", instanceID) + + // Stop workflow worker when done + cancel() + fmt.Println("workflow worker successfully shutdown") +} +``` + +**Key points about registration:** +- Use `workflow.NewRegistry()` to create a workflow registry +- Use `r.AddWorkflow()` to register workflow functions +- Use `r.AddActivity()` to register activity functions +- Use `client.NewWorkflowClient()` to create a workflow client +- Call `wclient.StartWorker()` to begin processing workflows +- Use `wclient.ScheduleWorkflow` to schedule a named instance of a workflow + [See the Go SDK workflow activity example in context.](https://github.com/dapr/go-sdk/tree/main/examples/workflow/README.md) {{% /tab %}} @@ -383,16 +466,16 @@ public class DemoWorkflowWorker { Define your workflow function with the parameter `ctx *workflow.WorkflowContext` and return any and error. Invoke your defined activities from within your workflow. ```go -func TestWorkflow(ctx *workflow.WorkflowContext) (any, error) { +func BusinessWorkflow(ctx *workflow.WorkflowContext) (any, error) { var input int if err := ctx.GetInput(&input); err != nil { return nil, err } var output string - if err := ctx.CallActivity(TestActivity, workflow.ActivityInput(input)).Await(&output); err != nil { + if err := ctx.CallActivity(BusinessActivity, workflow.ActivityInput(input)).Await(&output); err != nil { return nil, err } - if err := ctx.WaitForExternalEvent("testEvent", time.Second*60).Await(&output); err != nil { + if err := ctx.WaitForExternalEvent("businessEvent", time.Second*60).Await(&output); err != nil { return nil, err } @@ -864,7 +947,7 @@ public class DemoWorkflow extends Workflow { [As in the following example](https://github.com/dapr/go-sdk/tree/main/examples/workflow/README.md), a hello-world application using the Go SDK and Dapr Workflow would include: - A Go package called `client` to receive the Go SDK client capabilities. -- The `TestWorkflow` method +- The `BusinessWorkflow` method - Creating the workflow with input and output. - API calls. In the example below, these calls start and call the workflow activities. @@ -889,15 +972,15 @@ var failActivityTries = 0 func main() { r := workflow.NewRegistry() - if err := r.AddWorkflow(TestWorkflow); err != nil { + if err := r.AddWorkflow(BusinessWorkflow); err != nil { log.Fatal(err) } - fmt.Println("TestWorkflow registered") + fmt.Println("BusinessWorkflow registered") - if err := r.AddActivity(TestActivity); err != nil { + if err := r.AddActivity(BusinessActivity); err != nil { log.Fatal(err) } - fmt.Println("TestActivity registered") + fmt.Println("BusinessActivity registered") if err := r.AddActivity(FailActivity); err != nil { log.Fatal(err) @@ -921,7 +1004,7 @@ func main() { // "start". This is useful for increasing the throughput of creating // workflows. // workflow.WithStartTime(time.Now()) - instanceID, err := wclient.ScheduleWorkflow(ctx, "TestWorkflow", workflow.WithInstanceID("a7a4168d-3a1c-41da-8a4f-e7f6d9c718d9"), workflow.WithInput(1)) + instanceID, err := wclient.ScheduleWorkflow(ctx, "BusinessWorkflow", workflow.WithInstanceID("a7a4168d-3a1c-41da-8a4f-e7f6d9c718d9"), workflow.WithInput(1)) if err != nil { log.Fatalf("failed to start workflow: %v", err) } @@ -963,9 +1046,8 @@ func main() { fmt.Printf("stage: %d\n", stage) - // Raise Event Test - - err = wclient.RaiseEvent(ctx, instanceID, "testEvent", workflow.WithEventPayload("testData")) + // Raise Event + err = wclient.RaiseEvent(ctx, instanceID, "businessEvent", workflow.WithEventPayload("testData")) if err != nil { fmt.Printf("failed to raise event: %v", err) } @@ -1008,7 +1090,7 @@ func main() { fmt.Printf("stage: %d\n", stage) // Terminate workflow test - id, err := wclient.ScheduleWorkflow(ctx, "TestWorkflow", workflow.WithInstanceID("a7a4168d-3a1c-41da-8a4f-e7f6d9c718d9"), workflow.WithInput(1)) + id, err := wclient.ScheduleWorkflow(ctx, "BusinessWorkflow", workflow.WithInstanceID("a7a4168d-3a1c-41da-8a4f-e7f6d9c718d9"), workflow.WithInput(1)) if err != nil { log.Fatalf("failed to start workflow: %v", err) } @@ -1037,22 +1119,22 @@ func main() { fmt.Println("workflow worker successfully shutdown") } -func TestWorkflow(ctx *workflow.WorkflowContext) (any, error) { +func BusinessWorkflow(ctx *workflow.WorkflowContext) (any, error) { var input int if err := ctx.GetInput(&input); err != nil { return nil, err } var output string - if err := ctx.CallActivity(TestActivity, workflow.WithActivityInput(input)).Await(&output); err != nil { + if err := ctx.CallActivity(BusinessActivity, task.WithActivityInput(input)).Await(&output); err != nil { return nil, err } - err := ctx.WaitForExternalEvent("testEvent", time.Second*60).Await(&output) + err := ctx.WaitForSingleEvent("businessEvent", time.Second*60).Await(&output) if err != nil { return nil, err } - if err := ctx.CallActivity(TestActivity, workflow.WithActivityInput(input)).Await(&output); err != nil { + if err := ctx.CallActivity(BusinessActivity, task.WithActivityInput(input)).Await(&output); err != nil { return nil, err } @@ -1068,7 +1150,7 @@ func TestWorkflow(ctx *workflow.WorkflowContext) (any, error) { return output, nil } -func TestActivity(ctx workflow.ActivityContext) (any, error) { +func BusinessActivity(ctx task.ActivityContext) (any, error) { var input int if err := ctx.GetInput(&input); err != nil { return "", err diff --git a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-multi-app.md b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-multi-app.md index 410b4fc91cd..64f112c7018 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-multi-app.md +++ b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-multi-app.md @@ -19,28 +19,65 @@ Some scenarios where this is useful include: - Implementation of a workflow spans different programming languages based on team expertise or existing codebases. - Different team boundaries or microservice ownership. +Diagram showing multi-application complex workflow + +The diagram below shows an example scenario of a complex workflow that orchestrates across multiple applications that are written in different languages. Each applications' main steps and activities are: + +• **App1: Main Workflow Service** - Top-level orchestrator that coordinates the entire ML pipeline +- Starts the process +- Calls data processing activities on App2 +- Calls ML training child workflow on App3 +- Calls model deployment on App4 +- Ends the complete workflow +- **Language: Java** + +• **App2: Data Processing Pipeline** - **GPU activities** only +- Data Ingesting Activity (GPU-accelerated) +- Feature Engineering Activity (GPU-accelerated) +- Returns completion signal to Main Workflow +- **Language: Go** + +• **App3: ML Training Child Workflow** - Contains a child workflow and activities +- Child workflow orchestrates: + - Data Processing Activity + - Model Training Activity (GPU-intensive) + - Model Validation Activity +- Triggered by App2's activities completing +- Returns completion signal to Main Workflow +- **Language: Java** + +• **App4: Model Serving Service** - **Beefy GPU app** with activities only +- Model Loading Activity (GPU memory intensive) +- Inference Setup Activity (GPU-accelerated inference) +- Triggered by App3's workflow completing +- Returns completion signal to Main Workflow +- **Language: Go** ## Multi-application workflows -Like all building blocks in Dapr, workflow execution routing is based on the [App ID of the hosting Dapr application]({{% ref "security-concept.md#application-identity" %}}). +Workflow execution routing is based on the [App ID of the hosting Dapr application]({{% ref "security-concept.md#application-identity" %}}). By default, the full workflow execution is hosted on the app ID that started the workflow. This workflow can be executed across any replicas of that app ID, not just the single replica which scheduled the workflow. -It is possible to execute activities or child workflows on different app IDs by specifying the target app ID parameter, inside the workflow execution code. -Upon execution, the target app ID will execute the activity or child workflow, and return the result to the parent workflow of the originating app ID. +It is possible to execute activities and child workflows on different app IDs by specifying the target app ID parameter, inside the workflow execution code. +Upon execution, the target app ID executes the activity or child workflow, and returns the result to the parent workflow of the originating app ID. The entire Workflow execution may be distributed across multiple app IDs with no limit, with each activity or child workflow specifying the target app ID. The final history of the workflow will be saved by the app ID that hosts the very parent (or can consider it the root) workflow. {{% alert title="Restrictions" color="primary" %}} -Like other building blocks and resources in Dapr, workflows are scoped to a single namespace. +Like other API building blocks and resources in Dapr, workflows are scoped to a single namespace. This means that all app IDs involved in a multi-application workflow must be in the same namespace. -Similarly, all app IDs must use the same actor state store. -Finally, the target app ID must have the activity or child workflow defined, otherwise the parent workflow will retry indefinitely. +Similarly, all app IDs must use the same workflow (or actor) state store. +Finally, the target app ID must have the activity or child workflow defined and registered, otherwise the parent workflow retries indefinitely. {{% /alert %}} {{% alert title="Important Limitations" color="warning" %}} -- **SDKs supporting multi-application workflows** - Multi-application workflows are used via the SDKs. Currently Java (activities calling) and Go (both activities and child workflows calling) SDKs are supported. The SDKs (Python, .NET, JavaScript) are planned for future releases. +**SDKs supporting multi-application workflows** - Multi-application workflows are used via the SDKs. +Currently the following are supported: +- **Java** (**only** activity calls) +- **Go** (**both** activities and child workflows calls) +- The Python, .NET, JavaScript SDKs support are planned for future releases {{% /alert %}} ## Error handling @@ -63,7 +100,7 @@ The following example shows how to execute the activity `ActivityA` on the targe {{% tab "Go" %}} ```go -func TestWorkflow(ctx *workflow.WorkflowContext) (any, error) { +func BusinessWorkflow(ctx *workflow.WorkflowContext) (any, error) { var output string err := ctx.CallActivity("ActivityA", workflow.WithActivityInput("my-input"), @@ -83,12 +120,12 @@ func TestWorkflow(ctx *workflow.WorkflowContext) (any, error) { {{% tab "Java" %}} ```java -public class CrossAppWorkflow implements Workflow { +public class BusinessWorkflow implements Workflow { @Override public WorkflowStub create() { return ctx -> { String output = ctx.callActivity( - "ActivityA", + ActivityA.class.getName(), "my-input", new WorkflowTaskOptions("App2"), // Here we set the target app ID which will execute this activity. String.class @@ -115,7 +152,7 @@ The following example shows how to execute the child workflow `Workflow2` on the {{% tab "Go" %}} ```go -func TestWorkflow(ctx *workflow.WorkflowContext) (any, error) { +func BusinessWorkflow(ctx *workflow.WorkflowContext) (any, error) { var output string err := ctx.CallChildWorkflow("Workflow2", workflow.WithChildWorkflowInput("my-input"), diff --git a/daprdocs/static/images/workflow-overview/workflow-multi-app-child-workflow.png b/daprdocs/static/images/workflow-overview/workflow-multi-app-child-workflow.png index 5d5cec79b38507d6a461a852fc48f02eb6730fe4..388fcc8cf27f717956ec7cd3b638aa9f0d3ad2ae 100644 GIT binary patch literal 33812 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�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 literal 83374 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 Q3;5Hzrhm2M%H7BR1)bF4VE_OC diff --git a/daprdocs/static/images/workflow-overview/workflow-multi-app-complex.png b/daprdocs/static/images/workflow-overview/workflow-multi-app-complex.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2c401f89a880c099233db361dade9a289b86ab GIT binary patch literal 84376 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 QfC))nTKQ#(q=C=>0>_x)!2kdN literal 0 HcmV?d00001 From bbb5516fa2666213013df66486d7e23cbc4fa3fd Mon Sep 17 00:00:00 2001 From: Marc Duiker Date: Tue, 16 Sep 2025 16:54:03 +0200 Subject: [PATCH 15/19] Prepare branch 1.16 to be latest (#4858) Signed-off-by: Marc Duiker Co-authored-by: Mark Fussell --- .github/workflows/website-root.yml | 14 ++-- README.md | 4 +- .../docs-contrib/maintainer-guide.md | 69 +++++++++---------- .../_shortcodes/dapr-latest-version.html | 2 +- hugo.yaml | 25 ++++--- 5 files changed, 54 insertions(+), 60 deletions(-) diff --git a/.github/workflows/website-root.yml b/.github/workflows/website-root.yml index dc437b1ca92..a42578916c4 100644 --- a/.github/workflows/website-root.yml +++ b/.github/workflows/website-root.yml @@ -4,11 +4,11 @@ on: workflow_dispatch: push: branches: - - v1.15 + - v1.16 pull_request: types: [opened, synchronize, reopened, closed] branches: - - v1.15 + - v1.16 concurrency: # Cancel the previously triggered build for only PR build. @@ -50,23 +50,17 @@ jobs: if [ $GITHUB_EVENT_NAME == 'pull_request' ]; then STAGING_URL="https://${SWA_BASE}-${{github.event.number}}.westus2.azurestaticapps.net/" fi - hugo ${STAGING_URL+-b "$STAGING_URL"} + hugo ${STAGING_URL+-b "$STAGING_URL"} --minify - name: Deploy docs site uses: Azure/static-web-apps-deploy@v1 with: azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_PROUD_BAY_0E9E0E81E }} repo_token: ${{ secrets.GITHUB_TOKEN }} action: "upload" - app_location: "/daprdocs/public/" + app_location: "/daprdocs/public" output_location: "/" skip_app_build: true skip_deploy_on_missing_secrets: true - - name: Upload Hugo artifacts - uses: actions/upload-artifact@v4 - with: - name: hugo_build - path: ./daprdocs/public/ - if-no-files-found: error close_staging_site: if: github.event_name == 'pull_request' && github.event.action == 'closed' diff --git a/README.md b/README.md index 075cc139434..18d2f53b41f 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ The following branches are currently maintained: | Branch | Website | Description | | ------------------------------------------------------------ | -------------------------- | ------------------------------------------------------------------------------------------------ | -| [v1.15](https://github.com/dapr/docs) (primary) | https://docs.dapr.io | Latest Dapr release documentation. Typo fixes, clarifications, and most documentation goes here. | -| [v1.16](https://github.com/dapr/docs/tree/v1.16) (pre-release) | https://v1-16.docs.dapr.io/ | Pre-release documentation. Doc updates that are only applicable to v1.15+ go here. | +| [v1.16](https://github.com/dapr/docs) (primary) | https://docs.dapr.io | Latest Dapr release documentation. Typo fixes, clarifications, and most documentation goes here. | +| [v1.17](https://github.com/dapr/docs/tree/v1.16) (pre-release) | https://v1-17.docs.dapr.io/ | Pre-release documentation. Doc updates that are only applicable to v1.16+ go here. | For more information visit the [Dapr branch structure](https://docs.dapr.io/contributing/docs-contrib/contributing-docs/#branch-guidance) document. diff --git a/daprdocs/content/en/contributing/docs-contrib/maintainer-guide.md b/daprdocs/content/en/contributing/docs-contrib/maintainer-guide.md index 1ebdfb88172..227e590a95e 100644 --- a/daprdocs/content/en/contributing/docs-contrib/maintainer-guide.md +++ b/daprdocs/content/en/contributing/docs-contrib/maintainer-guide.md @@ -103,24 +103,22 @@ These steps will prepare the latest release branch for archival. git checkout -b release_v1.0 ``` -1. In VS Code, navigate to `/daprdocs/config.toml`. -1. Add the following TOML to the `# Versioning` section (around line 154): - - ```toml - version_menu = "v1.0" - version = "v1.0" - archived_version = true - url_latest_version = "https://docs.dapr.io" - - [[params.versions]] - version = "v1.2 (preview)" - url = "v1-2.docs.dapr.io" - [[params.versions]] - version = "v1.1 (latest)" - url = "#" - [[params.versions]] - version = "v1.0" - url = "https://v1-0.docs.dapr.io" +1. In VS Code, navigate to `hugo.yaml` located in the root. +1. Add the following configuration to the `# Versioning` section (around line 121 and onwards): + + ```yaml + version_menu: "v1.0" + version: "v1.0" + archived_version: true + url_latest_version: "https://docs.dapr.io" + + versions: + - version: v1.2 (preview) + url: https://v1-2.docs.dapr.io + - version: v1.1 (latest) + url: "#" + - version: v1.0 + url: https://v1-0.docs.dapr.io ``` 1. Delete `.github/workflows/website-root.yml`. @@ -146,26 +144,25 @@ These steps will prepare the upcoming release branch for promotion to latest rel git checkout -b release_v1.1 ``` -1. In VS Code, navigate to `/daprdocs/config.toml`. -1. Update line 1 to `baseURL - https://docs.dapr.io/`. -1. Update the `# Versioning` section (around line 154) to display the correct versions and tags: +1. In VS Code, navigate to `hugo.yaml` located in the root. +1. Update line 1 to `baseURL: https://docs.dapr.io/`. +1. Update the `# Versioning` section (around line 121 and onwards) to display the correct versions and tags: - ```toml + ```yaml # Versioning - version_menu = "v1.1 (latest)" - version = "v1.1" - archived_version = false - url_latest_version = "https://docs.dapr.io" - - [[params.versions]] - version = "v1.2 (preview)" - url = "v1-2.docs.dapr.io" - [[params.versions]] - version = "v1.1 (latest)" - url = "#" - [[params.versions]] - version = "v1.0" - url = "https://v1-0.docs.dapr.io" + version_menu: "v1.1 (latest)" + version: "v1.1" + archived_version: false + url_latest_version: https://docs.dapr.io + github_branch: v1.1 + + versions: + - version: v1.2 (preview) + url: https://v1-2.docs.dapr.io + - version: v1.1 (latest) + url: "#" + - version: v1.0 + url: https://v1-0.docs.dapr.io ``` 1. Navigate to `.github/workflows/website-root.yml`. diff --git a/daprdocs/layouts/_shortcodes/dapr-latest-version.html b/daprdocs/layouts/_shortcodes/dapr-latest-version.html index a085fd0e6f5..bdd712552d8 100644 --- a/daprdocs/layouts/_shortcodes/dapr-latest-version.html +++ b/daprdocs/layouts/_shortcodes/dapr-latest-version.html @@ -1 +1 @@ -{{- if .Get "short" }}1.15{{ else if .Get "long" }}1.15.5{{ else if .Get "cli" }}1.15.1{{ else }}1.15.1{{ end -}} +{{- if .Get "short" }}1.16{{ else if .Get "long" }}1.16.0{{ else if .Get "cli" }}1.16.0{{ else }}1.16.0{{ end -}} diff --git a/hugo.yaml b/hugo.yaml index a6e206f75ee..980529773db 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -1,4 +1,4 @@ -baseURL: https://v1-16.docs.dapr.io +baseURL: https://docs.dapr.io title: Dapr Docs # Output directory for generated site @@ -117,21 +117,22 @@ params: # First one is picked as the Twitter card image if not set on page. # images: [images/project-illustration.png] - + + # Versioning # Menu title if your navbar has a versions selector to access old versions of your site. # This menu appears only if you have at least one [params.versions] set. - version_menu: v1.16 (preview) - - # Flag used in the "version-banner" partial to decide whether to display a - # banner on every page indicating that this is an archived version of the docs. - # Set this flag to "true" if you want to display the banner. - archived_version: false + version_menu: v1.16 (latest) # The version number for the version of the docs represented in this doc set. # Used in the "version-banner" partial to display a version number for the # current doc set. version: v1.16 + # Flag used in the "version-banner" partial to decide whether to display a + # banner on every page indicating that this is an archived version of the docs. + # Set this flag to "true" if you want to display the banner. + archived_version: false + # A link to latest version of the docs. Used in the "version-banner" partial to # point people to the main doc site. url_latest_version: https://docs.dapr.io @@ -150,10 +151,12 @@ params: github_branch: v1.16 versions: - - version: v1.16 (preview) + - version: v1.17 (preview) + url: https://v1-17.docs.dapr.io + - version: v1.16 (latest) url: "#" - - version: v1.15 (latest) - url: "https://docs.dapr.io" + - version: v1.15 + url: https://v1-15.docs.dapr.io - version: v1.14 url: https://v1-14.docs.dapr.io - version: v1.13 From c6a130cf3730279baeb91349fa21609e44393cb3 Mon Sep 17 00:00:00 2001 From: Marc Duiker Date: Tue, 16 Sep 2025 19:19:19 +0000 Subject: [PATCH 16/19] Update to download-artifact@v4 Signed-off-by: Marc Duiker --- .github/workflows/website-root.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/website-root.yml b/.github/workflows/website-root.yml index a42578916c4..c9a5f85edad 100644 --- a/.github/workflows/website-root.yml +++ b/.github/workflows/website-root.yml @@ -90,7 +90,7 @@ jobs: with: submodules: false - name: Download Hugo artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: hugo_build path: site/ From 81b09674d016ac4d7d6aa81643dfc258be89bdba Mon Sep 17 00:00:00 2001 From: Marc Duiker Date: Tue, 16 Sep 2025 21:07:59 +0200 Subject: [PATCH 17/19] Update supported version table (+ procedure) (#4890) Signed-off-by: Marc Duiker --- .../docs-contrib/maintainer-guide.md | 1 + .../support/support-release-policy.md | 29 ++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/daprdocs/content/en/contributing/docs-contrib/maintainer-guide.md b/daprdocs/content/en/contributing/docs-contrib/maintainer-guide.md index 227e590a95e..7c72665b2f0 100644 --- a/daprdocs/content/en/contributing/docs-contrib/maintainer-guide.md +++ b/daprdocs/content/en/contributing/docs-contrib/maintainer-guide.md @@ -191,6 +191,7 @@ These steps will prepare the upcoming release branch for promotion to latest rel | [v1.2](https://github.com/dapr/docs/tree/v1.2) (pre-release) | https://v1-2.docs.dapr.io/ | Pre-release documentation. Doc updates that are only applicable to v1.2+ go here. | ``` +1. Update the _Supported versions_ table in `support-release-policy.md`; add a new line at the top of the table with the new version of the runtime and SDKs. Change the releases which are older than n-2 to be `Unsupported`. 1. Update the `dapr-latest-version.html` shortcode partial to the new minor/patch version (in this example, `1.1.0` and `1.1`). 1. Commit the staged changes and push to your branch (`release_v1.1`). 1. Open a PR from `release/v1.1` to `v1.1`. diff --git a/daprdocs/content/en/operations/support/support-release-policy.md b/daprdocs/content/en/operations/support/support-release-policy.md index 579008b70e0..ff1cd0abe05 100644 --- a/daprdocs/content/en/operations/support/support-release-policy.md +++ b/daprdocs/content/en/operations/support/support-release-policy.md @@ -45,26 +45,27 @@ The table below shows the versions of Dapr releases that have been tested togeth | Release date | Runtime | CLI | SDKs | Dashboard | Status | Release notes | |--------------------|:--------:|:--------|---------|---------|---------|------------| -| July 31st 2025 | 1.15.9
| 1.15.0 | Java 1.14.2, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported (current) | [v1.15.9 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.9) | -| July 18th 2025 | 1.15.8
| 1.15.0 | Java 1.14.2, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported (current) | [v1.15.8 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.8) | -| July 16th 2025 | 1.15.7
| 1.15.0 | Java 1.14.1, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported (current) | [v1.15.7 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.7) | -| June 20th 2025 | 1.15.6
| 1.15.0 | Java 1.14.1, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported (current) | [v1.15.6 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.6) | -| May 5th 2025 | 1.15.5
| 1.15.0 | Java 1.14.1, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported (current) | [v1.15.5 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.5) | -| April 4th 2025 | 1.15.4
| 1.15.0 | Java 1.14.0, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported (current) | [v1.15.4 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.4) | -| March 5rd 2025 | 1.15.3
| 1.15.0 | Java 1.14.0, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported (current) | [v1.15.3 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.3) | -| March 3rd 2025 | 1.15.2
| 1.15.0 | Java 1.14.0, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.0
JS 3.5.0
Rust 0.16 | 0.15.0 | Supported (current) | [v1.15.2 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.2) | -| February 28th 2025 | 1.15.1
| 1.15.0 | Java 1.14.0, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.0
JS 3.5.0
Rust 0.16 | 0.15.0 | Supported (current) | [v1.15.1 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.1) | +| Sep 16th 2025 | 1.16.0
| 1.16.0 | Java 1.15.0
Go 1.13.0
PHP 1.2.0
Python 1.16.0
.NET 1.16.0
JS 3.6.0
Rust 0.17.0 | 0.15.0 | Supported (current) | [v1.16.0 release notes](https://github.com/dapr/dapr/releases/tag/v1.16.0) | +| July 31st 2025 | 1.15.9
| 1.15.0 | Java 1.14.2, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported | [v1.15.9 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.9) | +| July 18th 2025 | 1.15.8
| 1.15.0 | Java 1.14.2, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported | [v1.15.8 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.8) | +| July 16th 2025 | 1.15.7
| 1.15.0 | Java 1.14.1, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported | [v1.15.7 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.7) | +| June 20th 2025 | 1.15.6
| 1.15.0 | Java 1.14.1, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported | [v1.15.6 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.6) | +| May 5th 2025 | 1.15.5
| 1.15.0 | Java 1.14.1, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported | [v1.15.5 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.5) | +| April 4th 2025 | 1.15.4
| 1.15.0 | Java 1.14.0, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported | [v1.15.4 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.4) | +| March 5rd 2025 | 1.15.3
| 1.15.0 | Java 1.14.0, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.4
JS 3.5.2
Rust 0.16.1 | 0.15.0 | Supported | [v1.15.3 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.3) | +| March 3rd 2025 | 1.15.2
| 1.15.0 | Java 1.14.0, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.0
JS 3.5.0
Rust 0.16 | 0.15.0 | Supported | [v1.15.2 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.2) | +| February 28th 2025 | 1.15.1
| 1.15.0 | Java 1.14.0, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.0
JS 3.5.0
Rust 0.16 | 0.15.0 | Supported | [v1.15.1 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.1) | | February 27th 2025 | 1.15.0
| 1.15.0 | Java 1.14.0, 1.15.0
Go 1.12.0
PHP 1.2.0
Python 1.15.0
.NET 1.15.0
JS 3.5.0
Rust 0.16 | 0.15.0 | Supported | [v1.15.0 release notes](https://github.com/dapr/dapr/releases/tag/v1.15.0) | | September 16th 2024 | 1.14.4
| 1.14.1 | Java 1.12.0
Go 1.11.0
PHP 1.2.0
Python 1.14.0
.NET 1.14.0
JS 3.3.1 | 0.15.0 | Supported | [v1.14.4 release notes](https://github.com/dapr/dapr/releases/tag/v1.14.4) | | September 13th 2024 | 1.14.3
| 1.14.1 | Java 1.12.0
Go 1.11.0
PHP 1.2.0
Python 1.14.0
.NET 1.14.0
JS 3.3.1 | 0.15.0 | ⚠️ Recalled | [v1.14.3 release notes](https://github.com/dapr/dapr/releases/tag/v1.14.3) | | September 6th 2024 | 1.14.2
| 1.14.1 | Java 1.12.0
Go 1.11.0
PHP 1.2.0
Python 1.14.0
.NET 1.14.0
JS 3.3.1 | 0.15.0 | Supported | [v1.14.2 release notes](https://github.com/dapr/dapr/releases/tag/v1.14.2) | | August 14th 2024 | 1.14.1
| 1.14.1 | Java 1.12.0
Go 1.11.0
PHP 1.2.0
Python 1.14.0
.NET 1.14.0
JS 3.3.1 | 0.15.0 | Supported | [v1.14.1 release notes](https://github.com/dapr/dapr/releases/tag/v1.14.1) | | August 14th 2024 | 1.14.0
| 1.14.0 | Java 1.12.0
Go 1.11.0
PHP 1.2.0
Python 1.14.0
.NET 1.14.0
JS 3.3.1 | 0.15.0 | Supported | [v1.14.0 release notes](https://github.com/dapr/dapr/releases/tag/v1.14.0) | -| May 29th 2024 | 1.13.4
| 1.13.0 | Java 1.11.0
Go 1.10.0
PHP 1.2.0
Python 1.13.0
.NET 1.13.0
JS 3.3.0 | 0.14.0 | Supported | [v1.13.4 release notes](https://github.com/dapr/dapr/releases/tag/v1.13.4) | -| May 21st 2024 | 1.13.3
| 1.13.0 | Java 1.11.0
Go 1.10.0
PHP 1.2.0
Python 1.13.0
.NET 1.13.0
JS 3.3.0 | 0.14.0 | Supported | [v1.13.3 release notes](https://github.com/dapr/dapr/releases/tag/v1.13.3) | -| April 3rd 2024 | 1.13.2
| 1.13.0 | Java 1.11.0
Go 1.10.0
PHP 1.2.0
Python 1.13.0
.NET 1.13.0
JS 3.3.0 | 0.14.0 | Supported | [v1.13.2 release notes](https://github.com/dapr/dapr/releases/tag/v1.13.2) | -| March 26th 2024 | 1.13.1
| 1.13.0 | Java 1.11.0
Go 1.10.0
PHP 1.2.0
Python 1.13.0
.NET 1.13.0
JS 3.3.0 | 0.14.0 | Supported | [v1.13.1 release notes](https://github.com/dapr/dapr/releases/tag/v1.13.1) | -| March 6th 2024 | 1.13.0
| 1.13.0 | Java 1.11.0
Go 1.10.0
PHP 1.2.0
Python 1.13.0
.NET 1.13.0
JS 3.3.0 | 0.14.0 | Supported | [v1.13.0 release notes](https://github.com/dapr/dapr/releases/tag/v1.13.0) | +| May 29th 2024 | 1.13.4
| 1.13.0 | Java 1.11.0
Go 1.10.0
PHP 1.2.0
Python 1.13.0
.NET 1.13.0
JS 3.3.0 | 0.14.0 | Unsupported | [v1.13.4 release notes](https://github.com/dapr/dapr/releases/tag/v1.13.4) | +| May 21st 2024 | 1.13.3
| 1.13.0 | Java 1.11.0
Go 1.10.0
PHP 1.2.0
Python 1.13.0
.NET 1.13.0
JS 3.3.0 | 0.14.0 | Unsupported | [v1.13.3 release notes](https://github.com/dapr/dapr/releases/tag/v1.13.3) | +| April 3rd 2024 | 1.13.2
| 1.13.0 | Java 1.11.0
Go 1.10.0
PHP 1.2.0
Python 1.13.0
.NET 1.13.0
JS 3.3.0 | 0.14.0 | Unsupported | [v1.13.2 release notes](https://github.com/dapr/dapr/releases/tag/v1.13.2) | +| March 26th 2024 | 1.13.1
| 1.13.0 | Java 1.11.0
Go 1.10.0
PHP 1.2.0
Python 1.13.0
.NET 1.13.0
JS 3.3.0 | 0.14.0 | Unsupported | [v1.13.1 release notes](https://github.com/dapr/dapr/releases/tag/v1.13.1) | +| March 6th 2024 | 1.13.0
| 1.13.0 | Java 1.11.0
Go 1.10.0
PHP 1.2.0
Python 1.13.0
.NET 1.13.0
JS 3.3.0 | 0.14.0 | Unsupported | [v1.13.0 release notes](https://github.com/dapr/dapr/releases/tag/v1.13.0) | | January 17th 2024 | 1.12.4
| 1.12.0 | Java 1.10.0
Go 1.9.1
PHP 1.2.0
Python 1.12.0
.NET 1.12.0
JS 3.2.0 | 0.14.0 | Unsupported | [v1.12.4 release notes](https://github.com/dapr/dapr/releases/tag/v1.12.4) | | January 2nd 2024 | 1.12.3
| 1.12.0 | Java 1.10.0
Go 1.9.1
PHP 1.2.0
Python 1.12.0
.NET 1.12.0
JS 3.2.0 | 0.14.0 | Unsupported | [v1.12.3 release notes](https://github.com/dapr/dapr/releases/tag/v1.12.3) | | November 18th 2023 | 1.12.2
| 1.12.0 | Java 1.10.0
Go 1.9.1
PHP 1.2.0
Python 1.12.0
.NET 1.12.0
JS 3.2.0 | 0.14.0 | Unsupported | [v1.12.2 release notes](https://github.com/dapr/dapr/releases/tag/v1.12.2) | From a93b3a4fd7a33ea87fa80b7b70e786ff61a5e366 Mon Sep 17 00:00:00 2001 From: Josh van Leeuwen Date: Tue, 16 Sep 2025 15:25:16 -0400 Subject: [PATCH 18/19] [1.16] Adds configuration-overview.md section on Workflow (#4889) * [1.16] Adds configuration-overview.md section on Workflow Fixes https://github.com/dapr/docs/issues/4884 Signed-off-by: joshvanl * Update configuration-overview.md Moving workflow section and adding link in the index Signed-off-by: Mark Fussell --------- Signed-off-by: joshvanl Signed-off-by: Mark Fussell Co-authored-by: Mark Fussell --- .../configuration/configuration-overview.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/configuration/configuration-overview.md b/daprdocs/content/en/operations/configuration/configuration-overview.md index f501710405c..33cc11d8e31 100644 --- a/daprdocs/content/en/operations/configuration/configuration-overview.md +++ b/daprdocs/content/en/operations/configuration/configuration-overview.md @@ -62,13 +62,14 @@ A Dapr sidecar can apply a specific configuration by using a `dapr.io/config` an ### Application configuration settings -The following menu includes all of the configuration settings you can set on the sidecar. +The following menu includes all of the configuration settings you can set: - [Tracing](#tracing) - [Metrics](#metrics) - [Logging](#logging) - [Middleware](#middleware) - [Name resolution](#name-resolution) +- [Workflow](#workflow) - [Scope secret store access](#scope-secret-store-access) - [Access Control allow lists for building block APIs](#access-control-allow-lists-for-building-block-apis) - [Access Control allow lists for service invocation API](#access-control-allow-lists-for-service-invocation-api) @@ -255,6 +256,15 @@ For more information, see: - [The name resolution component documentation]({{% ref supported-name-resolution %}}) for more examples. - [The Configuration file documentation]({{% ref configuration-schema.md %}}) to learn more about how to configure name resolution per component. +#### Workflow + +The `workflow` section contains properties for configuring [Workflows]({{% ref "workflow-overview.md" %}}). + +| Property | Type | Description | +|------------------|--------|-----| +| `maxConcurrentWorkflowInvocations` | int32 | Maximum number of concurrent workflow executions per Dapr sidecar. Default is infinite. | +| `maxConcurrentActivityInvocations` | int32 | Maximum number of concurrent activity executions per Dapr sidecar. Default is infinite. | + #### Scope secret store access See the [Scoping secrets]({{% ref "secret-scope.md" %}}) guide for information and examples on how to scope secrets to an application. @@ -334,6 +344,9 @@ spec: deny: - bindings.smtp - secretstores.local.file + workflow: + maxConcurrentWorkflowInvocations: 100 + maxConcurrentActivityInvocations: 1000 accessControl: defaultAction: deny trustDomain: "public" From 464a54d8ff0e91cc08754a8c343c6ce0755996fa Mon Sep 17 00:00:00 2001 From: Bilgin Ibryam Date: Tue, 16 Sep 2025 22:35:14 +0100 Subject: [PATCH 19/19] Enhanced the OpenAI conversation component docs to include Azure seciton (#4887) * Enhanced the OpenAI conversation component documentation to include Azure OpenAI configuration guidance. Signed-off-by: Bilgin Ibryam * Update daprdocs/content/en/reference/components-reference/supported-conversation/openai.md Signed-off-by: Mark Fussell --------- Signed-off-by: Bilgin Ibryam Signed-off-by: Mark Fussell Co-authored-by: Mark Fussell --- .../supported-conversation/openai.md | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/daprdocs/content/en/reference/components-reference/supported-conversation/openai.md b/daprdocs/content/en/reference/components-reference/supported-conversation/openai.md index 795f9877909..f1c29e2b5f3 100644 --- a/daprdocs/content/en/reference/components-reference/supported-conversation/openai.md +++ b/daprdocs/content/en/reference/components-reference/supported-conversation/openai.md @@ -46,6 +46,48 @@ The above example uses secrets as plain strings. It is recommended to use a secr | `apiType` | N | Specifies the API provider type. Required when using a provider that does not follow the default OpenAI API endpoint conventions. | `azure` | | `apiVersion`| N | The API version to use. Required when the `apiType` is set to `azure`. | `2025-04-01-preview` | +## Azure OpenAI Configuration + +To configure the OpenAI component to connect to Azure OpenAI, you need to set the following metadata fields which are required for Azure's API format. + +### Required fields for Azure OpenAI + +When connecting to Azure OpenAI, the following fields are **required**: + +- `apiType`: Must be set to `azure` to enable Azure OpenAI compatibility +- `endpoint`: Your Azure OpenAI resource endpoint URL (e.g., `https://your-resource.openai.azure.com/`) +- `apiVersion`: The API version for your Azure OpenAI deployment (e.g., `2025-01-01-preview`) +- `key`: Your Azure OpenAI API key + +Get your configuration values from: https://ai.azure.com/ + +### Azure OpenAI component example + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: azure-openai +spec: + type: conversation.openai + metadata: + - name: key + value: "your-azure-openai-api-key" + - name: model + value: "gpt-4.1-nano" # Default: gpt-4.1-nano + - name: endpoint + value: "https://your-resource.openai.azure.com/" + - name: apiType + value: "azure" + - name: apiVersion + value: "2025-01-01-preview" +``` + + +{{% alert title="Note" color="primary" %}} +When using Azure OpenAI, both `endpoint` and `apiVersion` are mandatory fields. The component returns an error if either field is missing when `apiType` is set to `azure`. +{{% /alert %}} + ## Related links - [Conversation API overview]({{% ref conversation-overview.md %}})