-
Couldn't load subscription status.
- Fork 209
Workflow #1560
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Workflow #1560
Conversation
JoshVanL
commented
Oct 9, 2025
Based on dapr/cli#1560 Signed-off-by: joshvanl <[email protected]>
|
Great change. I've tried to purge some of the workflows with relative success. The major problem was the scheduler got stuck on some activities (I plan to raise an issue in the main repo) and I did manage to remove all the workflows with the |
pkg/workflow/db/sql.go
Outdated
| } | ||
|
|
||
| func ListSQL(ctx context.Context, db *sql.DB, table string, opts ListOptions) ([]string, error) { | ||
| query := fmt.Sprintf("SELECT key FROM '%s' WHERE key LIKE ?;", table) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In my eagerness to use the workflow list functionality, I found a SQL syntax error here.
| query := fmt.Sprintf("SELECT key FROM '%s' WHERE key LIKE ?;", table) | |
| query := fmt.Sprintf("SELECT key FROM \"%s\" WHERE key LIKE $1;", table) |
```
Workflow management commands. Use -k to target a Kubernetes Dapr cluster.
Usage:
dapr workflow [command]
Aliases:
workflow, work
Available Commands:
history Get the history of a workflow instance.
list List workflows for the given app ID.
purge Purge one or more workflow instances with a terminal state. Accepts a workflow instance ID argument or flags to purge multiple/all terminal instances.
raise-event Raise an event for a workflow waiting for an external event. Expects a single argument '<instance-id>/<event-name>'.
rerun ReRun a workflow instance from the beginning or a specific event. Optionally, a new instance ID and input to the starting event can be provided.
resume Resume a workflow that is suspended.
run Run a workflow instance based on a given workflow name. Accepts a single argument, the workflow name.
suspend Suspend a workflow in progress.
terminate Terminate a workflow in progress.
Flags:
-a, --app-id string The app ID owner of the workflow instance
-h, --help help for workflow
-k, --kubernetes Target a Kubernetes dapr installation
-n, --namespace string Namespace to perform workflow operation on (default "default")
Global Flags:
--log-as-json Log output in JSON format
--runtime-path string The path to the dapr runtime installation directory
Get the history of a workflow instance.
Usage:
dapr workflow history [flags]
Flags:
-h, --help help for history
-o, --output string Output format. One of short, wide, yaml, json (default "short")
Global Flags:
-a, --app-id string The app ID owner of the workflow instance
-k, --kubernetes Target a Kubernetes dapr installation
--log-as-json Log output in JSON format
-n, --namespace string Namespace to perform workflow operation on (default "default")
--runtime-path string The path to the dapr runtime installation directory
List workflows for the given app ID.
Usage:
dapr workflow list [flags]
Aliases:
list, ls
Flags:
-c, --connection-string string The connection string used to connect and authenticate to the actor state store
-m, --filter-max-age string Filter only the workflows started within the given duration or timestamp. Examples: 300ms, 1.5h or 2h45m, 2023-01-02T15:04:05 or 2023-01-02
-w, --filter-name string Filter only the workflows with the given name
-s, --filter-status string Filter only the workflows with the given runtime status. One of RUNNING, COMPLETED, CONTINUED_AS_NEW, FAILED, CANCELED, TERMINATED, PENDING, SUSPENDED
-h, --help help for list
-o, --output string Output format. One of short, wide, yaml, json (default "short")
-t, --table-name string The name of the table or collection which is used as the actor state store
Global Flags:
-a, --app-id string The app ID owner of the workflow instance
-k, --kubernetes Target a Kubernetes dapr installation
--log-as-json Log output in JSON format
-n, --namespace string Namespace to perform workflow operation on (default "default")
--runtime-path string The path to the dapr runtime installation directory
Purge one or more workflow instances with a terminal state. Accepts a workflow instance ID argument or flags to purge multiple/all terminal instances.
Usage:
dapr workflow purge [flags]
Flags:
--all Purge all workflow instances in a terminal state. Use with caution.
--all-older-than string Purge workflow instances older than the specified Go duration or timestamp, e.g., '24h' or '2023-01-02T15:04:05Z'.
-c, --connection-string string The connection string used to connect and authenticate to the actor state store
-h, --help help for purge
-t, --table-name string The name of the table or collection which is used as the actor state store
Global Flags:
-a, --app-id string The app ID owner of the workflow instance
-k, --kubernetes Target a Kubernetes dapr installation
--log-as-json Log output in JSON format
-n, --namespace string Namespace to perform workflow operation on (default "default")
--runtime-path string The path to the dapr runtime installation directory
Raise an event for a workflow waiting for an external event. Expects a single argument '<instance-id>/<event-name>'.
Usage:
dapr workflow raise-event [flags]
Flags:
-h, --help help for raise-event
-x, --input string Optional input data for the new workflow instance. Accepts a JSON string.
Global Flags:
-a, --app-id string The app ID owner of the workflow instance
-k, --kubernetes Target a Kubernetes dapr installation
--log-as-json Log output in JSON format
-n, --namespace string Namespace to perform workflow operation on (default "default")
--runtime-path string The path to the dapr runtime installation directory
ReRun a workflow instance from the beginning or a specific event. Optionally, a new instance ID and input to the starting event can be provided.
Usage:
dapr workflow rerun [instance ID] [flags]
Flags:
-e, --event-id uint32 The event ID from which to re-run the workflow. If not provided, the workflow will re-run from the beginning.
-h, --help help for rerun
-x, --input string Optional input data for the new workflow instance. Accepts a JSON string.
--new-instance-id string Optional new ID for the re-run workflow instance. If not provided, a new ID will be generated.
Global Flags:
-a, --app-id string The app ID owner of the workflow instance
-k, --kubernetes Target a Kubernetes dapr installation
--log-as-json Log output in JSON format
-n, --namespace string Namespace to perform workflow operation on (default "default")
--runtime-path string The path to the dapr runtime installation directory
Resume a workflow that is suspended.
Usage:
dapr workflow resume [flags]
Flags:
-h, --help help for resume
-r, --reason string Reason for resuming the workflow
Global Flags:
-a, --app-id string The app ID owner of the workflow instance
-k, --kubernetes Target a Kubernetes dapr installation
--log-as-json Log output in JSON format
-n, --namespace string Namespace to perform workflow operation on (default "default")
--runtime-path string The path to the dapr runtime installation directory
Run a workflow instance based on a given workflow name. Accepts a single argument, the workflow name.
Usage:
dapr workflow run [flags]
Flags:
-h, --help help for run
-x, --input string Optional input data for the new workflow instance. Accepts a JSON string.
-i, --instance-id string The target workflow instance ID.
-s, --start-time string Optional start time for the workflow in RFC3339 or Go duration string format. If not provided, the workflow starts immediately. A duration of '0s', or any start time, will cause the command to not wait for the command to start
Global Flags:
-a, --app-id string The app ID owner of the workflow instance
-k, --kubernetes Target a Kubernetes dapr installation
--log-as-json Log output in JSON format
-n, --namespace string Namespace to perform workflow operation on (default "default")
--runtime-path string The path to the dapr runtime installation directory
Suspend a workflow in progress.
Usage:
dapr workflow suspend [flags]
Flags:
-h, --help help for suspend
-r, --reason string Reason for resuming the workflow
Global Flags:
-a, --app-id string The app ID owner of the workflow instance
-k, --kubernetes Target a Kubernetes dapr installation
--log-as-json Log output in JSON format
-n, --namespace string Namespace to perform workflow operation on (default "default")
--runtime-path string The path to the dapr runtime installation directory
Terminate a workflow in progress.
Usage:
dapr workflow terminate [flags]
Flags:
-h, --help help for terminate
-o, --output string Optional output data for the workflow in JSON string format.
Global Flags:
-a, --app-id string The app ID owner of the workflow instance
-k, --kubernetes Target a Kubernetes dapr installation
--log-as-json Log output in JSON format
-n, --namespace string Namespace to perform workflow operation on (default "default")
--runtime-path string The path to the dapr runtime installation directory
```
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Thanks @yevgen-el8! The db connection string is necessary because we need to do a key list operation in order to discover the workflow keys which are in the database, which is not currently available in Dapr itself. In an effort to get the CLI functionality out sooner, a middle group is for the CLI to do it itself, then add this functionality in Dapr in the next release. It is expected no connection string will be required for Dapr 1.17 |
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Signed-off-by: joshvanl <[email protected]>
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #1560 +/- ##
==========================================
- Coverage 18.17% 15.70% -2.48%
==========================================
Files 53 64 +11
Lines 6141 7108 +967
==========================================
Hits 1116 1116
- Misses 4939 5906 +967
Partials 86 86 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Signed-off-by: joshvanl <[email protected]>
* Author(s): @JoshVanL This proposal adds two new RPCs to the durabletask framework which are used to support observability and discoverability of running and completed workflows in Dapr. Specifically, adding a `ListInstances` and `GetInstanceHistory` RPC to the durabletask gRPC service. Today, there is no ways of discovering the list of workflow instances that are currently running or have completed in the past without using external storage queries. The Dapr CLI [introduced list and workflow history commands](dapr/cli#1560) to get information about running and completed workflows, however these commands rely on direct queries to the underlying storage provider. By introducing this functionality into the durabletask framework itself, these commands need only talk to Daprd, removing the requirement for direct access to the storage provider as well as authentication. Daprd can make these queries itself, and use the Actor State Store component to access the underlying storage. Two new RPCs will be added to the durabletask gRPC service, which will be available to both the application client, as well as the dapr CLI. The list RPC will be used to discover the workflow instance IDs, which their metadatda can then be fetched. The workflow history RPC will be used to fetch the full history of a given workflow instance. ```proto service TaskHubSidecarService { rpc ListInstances (ListInstancesRequest) returns (ListInstancesResponse); rpc GetInstanceHistory (GetInstanceHistoryRequest) returns (GetInstanceHistoryResponse); } // ListInstancesRequest is used to list all orchestration instances. message ListInstancesRequest { // continuationToken is the continuation token to use for pagination. This // is the index which the next page should start from. If not given, the first // page will be returned. optional uint32 continuationToken = 1; // pageSize is the maximum number of instances to return for this page. If // not given, all instances will be attempted to be returned. optional uint32 pageSize = 2; } // ListInstancesResponse is the response to executing ListInstances. message ListInstancesResponse { // instanceIds is the list of instance IDs returned. repeated string instanceIds = 1; } // GetInstanceHistoryRequest is used to get the full history of an // orchestration instance. message GetInstanceHistoryRequest { string instanceId = 1; } // GetInstanceHistoryResponse is the response to executing GetInstanceHistory. message GetInstanceHistoryResponse { repeated HistoryEvent events = 1; } ``` Signed-off-by: joshvanl <[email protected]>
* Author(s): @JoshVanL This proposal adds two new RPCs to the durabletask framework which are used to support observability and discoverability of running and completed workflows in Dapr. Specifically, adding a `ListInstances` and `GetInstanceHistory` RPC to the durabletask gRPC service. Today, there is no ways of discovering the list of workflow instances that are currently running or have completed in the past without using external storage queries. The Dapr CLI [introduced list and workflow history commands](dapr/cli#1560) to get information about running and completed workflows, however these commands rely on direct queries to the underlying storage provider. By introducing this functionality into the durabletask framework itself, these commands need only talk to Daprd, removing the requirement for direct access to the storage provider as well as authentication. Daprd can make these queries itself, and use the Actor State Store component to access the underlying storage. Two new RPCs will be added to the durabletask gRPC service, which will be available to both the application client, as well as the dapr CLI. The list RPC will be used to discover the workflow instance IDs, which their metadatda can then be fetched. The workflow history RPC will be used to fetch the full history of a given workflow instance. ```proto service TaskHubSidecarService { rpc ListInstances (ListInstancesRequest) returns (ListInstancesResponse); rpc GetInstanceHistory (GetInstanceHistoryRequest) returns (GetInstanceHistoryResponse); } // ListInstancesRequest is used to list all orchestration instances. message ListInstancesRequest { // continuationToken is the continuation token to use for pagination. This // is the index which the next page should start from. If not given, the first // page will be returned. optional uint32 continuationToken = 1; // pageSize is the maximum number of instances to return for this page. If // not given, all instances will be attempted to be returned. optional uint32 pageSize = 2; } // ListInstancesResponse is the response to executing ListInstances. message ListInstancesResponse { // instanceIds is the list of instance IDs returned. repeated string instanceIds = 1; } // GetInstanceHistoryRequest is used to get the full history of an // orchestration instance. message GetInstanceHistoryRequest { string instanceId = 1; } // GetInstanceHistoryResponse is the response to executing GetInstanceHistory. message GetInstanceHistoryResponse { repeated HistoryEvent events = 1; } ``` Signed-off-by: joshvanl <[email protected]>
* Author(s): @JoshVanL This proposal adds two new RPCs to the durabletask framework which are used to support observability and discoverability of running and completed workflows in Dapr. Specifically, adding a `ListInstances` and `GetInstanceHistory` RPC to the durabletask gRPC service. Today, there is no ways of discovering the list of workflow instances that are currently running or have completed in the past without using external storage queries. The Dapr CLI [introduced list and workflow history commands](dapr/cli#1560) to get information about running and completed workflows, however these commands rely on direct queries to the underlying storage provider. By introducing this functionality into the durabletask framework itself, these commands need only talk to Daprd, removing the requirement for direct access to the storage provider as well as authentication. Daprd can make these queries itself, and use the Actor State Store component to access the underlying storage. Two new RPCs will be added to the durabletask gRPC service, which will be available to both the application client, as well as the dapr CLI. The list RPC will be used to discover the workflow instance IDs, which their metadatda can then be fetched. The workflow history RPC will be used to fetch the full history of a given workflow instance. ```proto service TaskHubSidecarService { rpc ListInstances (ListInstancesRequest) returns (ListInstancesResponse); rpc GetInstanceHistory (GetInstanceHistoryRequest) returns (GetInstanceHistoryResponse); } // ListInstancesRequest is used to list all orchestration instances. message ListInstancesRequest { // continuationToken is the continuation token to use for pagination. This // is the index which the next page should start from. If not given, the first // page will be returned. optional uint32 continuationToken = 1; // pageSize is the maximum number of instances to return for this page. If // not given, all instances will be attempted to be returned. optional uint32 pageSize = 2; } // ListInstancesResponse is the response to executing ListInstances. message ListInstancesResponse { // instanceIds is the list of instance IDs returned. repeated string instanceIds = 1; } // GetInstanceHistoryRequest is used to get the full history of an // orchestration instance. message GetInstanceHistoryRequest { string instanceId = 1; } // GetInstanceHistoryResponse is the response to executing GetInstanceHistory. message GetInstanceHistoryResponse { repeated HistoryEvent events = 1; } ``` Signed-off-by: joshvanl <[email protected]>