@temporalio/core-bridge 1.15.0 → 1.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/Cargo.lock +172 -70
  2. package/lib/native.d.ts +1 -1
  3. package/package.json +2 -2
  4. package/releases/aarch64-apple-darwin/index.node +0 -0
  5. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  6. package/releases/x86_64-apple-darwin/index.node +0 -0
  7. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  8. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  9. package/sdk-core/.github/workflows/per-pr.yml +6 -6
  10. package/sdk-core/AGENTS.md +41 -30
  11. package/sdk-core/Cargo.toml +3 -0
  12. package/sdk-core/README.md +15 -9
  13. package/sdk-core/crates/client/Cargo.toml +4 -0
  14. package/sdk-core/crates/client/README.md +139 -0
  15. package/sdk-core/crates/client/src/async_activity_handle.rs +297 -0
  16. package/sdk-core/crates/client/src/callback_based.rs +7 -0
  17. package/sdk-core/crates/client/src/errors.rs +294 -0
  18. package/sdk-core/crates/client/src/{raw.rs → grpc.rs} +280 -159
  19. package/sdk-core/crates/client/src/lib.rs +920 -1326
  20. package/sdk-core/crates/client/src/metrics.rs +24 -33
  21. package/sdk-core/crates/client/src/options_structs.rs +457 -0
  22. package/sdk-core/crates/client/src/replaceable.rs +5 -4
  23. package/sdk-core/crates/client/src/request_extensions.rs +8 -9
  24. package/sdk-core/crates/client/src/retry.rs +99 -54
  25. package/sdk-core/crates/client/src/{worker/mod.rs → worker.rs} +1 -1
  26. package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
  27. package/sdk-core/crates/common/Cargo.toml +61 -2
  28. package/sdk-core/crates/common/build.rs +742 -12
  29. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/ci.yml +2 -0
  30. package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
  31. package/sdk-core/crates/common/protos/api_upstream/buf.yaml +0 -3
  32. package/sdk-core/crates/common/protos/api_upstream/cmd/check-path-conflicts/main.go +137 -0
  33. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv2.json +1166 -770
  34. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +1243 -750
  35. package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +2 -2
  36. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +4 -3
  37. package/sdk-core/crates/common/protos/api_upstream/temporal/api/failure/v1/message.proto +1 -0
  38. package/sdk-core/crates/common/protos/api_upstream/temporal/api/history/v1/message.proto +4 -0
  39. package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +6 -0
  40. package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +16 -1
  41. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +64 -6
  42. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +88 -33
  43. package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +4 -2
  44. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +4 -0
  45. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +5 -5
  46. package/sdk-core/crates/common/src/activity_definition.rs +20 -0
  47. package/sdk-core/crates/common/src/data_converters.rs +770 -0
  48. package/sdk-core/crates/common/src/envconfig.rs +5 -0
  49. package/sdk-core/crates/common/src/lib.rs +15 -211
  50. package/sdk-core/crates/common/src/payload_visitor.rs +648 -0
  51. package/sdk-core/crates/common/src/priority.rs +110 -0
  52. package/sdk-core/crates/common/src/protos/canned_histories.rs +3 -0
  53. package/sdk-core/crates/common/src/protos/history_builder.rs +45 -0
  54. package/sdk-core/crates/common/src/protos/history_info.rs +2 -0
  55. package/sdk-core/crates/common/src/protos/mod.rs +122 -27
  56. package/sdk-core/crates/common/src/protos/task_token.rs +3 -3
  57. package/sdk-core/crates/common/src/protos/utilities.rs +11 -0
  58. package/sdk-core/crates/{sdk-core → common}/src/telemetry/log_export.rs +5 -7
  59. package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
  60. package/sdk-core/crates/common/src/telemetry/metrics.rs +268 -223
  61. package/sdk-core/crates/{sdk-core → common}/src/telemetry/otel.rs +8 -13
  62. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_meter.rs +49 -50
  63. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_server.rs +2 -3
  64. package/sdk-core/crates/common/src/telemetry.rs +264 -4
  65. package/sdk-core/crates/common/src/worker.rs +68 -603
  66. package/sdk-core/crates/common/src/workflow_definition.rs +60 -0
  67. package/sdk-core/crates/macros/Cargo.toml +5 -1
  68. package/sdk-core/crates/macros/src/activities_definitions.rs +585 -0
  69. package/sdk-core/crates/macros/src/fsm_impl.rs +507 -0
  70. package/sdk-core/crates/macros/src/lib.rs +138 -512
  71. package/sdk-core/crates/macros/src/macro_utils.rs +106 -0
  72. package/sdk-core/crates/macros/src/workflow_definitions.rs +1224 -0
  73. package/sdk-core/crates/sdk/Cargo.toml +19 -6
  74. package/sdk-core/crates/sdk/README.md +415 -0
  75. package/sdk-core/crates/sdk/src/activities.rs +417 -0
  76. package/sdk-core/crates/sdk/src/interceptors.rs +1 -1
  77. package/sdk-core/crates/sdk/src/lib.rs +757 -442
  78. package/sdk-core/crates/sdk/src/workflow_context/options.rs +45 -35
  79. package/sdk-core/crates/sdk/src/workflow_context.rs +1033 -289
  80. package/sdk-core/crates/sdk/src/workflow_future.rs +277 -213
  81. package/sdk-core/crates/sdk/src/workflows.rs +711 -0
  82. package/sdk-core/crates/sdk-core/Cargo.toml +57 -64
  83. package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +41 -35
  84. package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +1 -1
  85. package/sdk-core/crates/sdk-core/src/abstractions.rs +6 -10
  86. package/sdk-core/crates/sdk-core/src/core_tests/activity_tasks.rs +6 -5
  87. package/sdk-core/crates/sdk-core/src/core_tests/mod.rs +13 -15
  88. package/sdk-core/crates/sdk-core/src/core_tests/queries.rs +21 -25
  89. package/sdk-core/crates/sdk-core/src/core_tests/replay_flag.rs +7 -10
  90. package/sdk-core/crates/sdk-core/src/core_tests/updates.rs +14 -17
  91. package/sdk-core/crates/sdk-core/src/core_tests/workers.rs +493 -26
  92. package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +4 -8
  93. package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +7 -7
  94. package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
  95. package/sdk-core/crates/sdk-core/src/lib.rs +41 -111
  96. package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
  97. package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +118 -19
  98. package/sdk-core/crates/sdk-core/src/protosext/mod.rs +2 -2
  99. package/sdk-core/crates/sdk-core/src/replay/mod.rs +14 -5
  100. package/sdk-core/crates/sdk-core/src/telemetry/metrics.rs +179 -196
  101. package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -280
  102. package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +6 -9
  103. package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
  104. package/sdk-core/crates/sdk-core/src/worker/activities/local_activities.rs +11 -14
  105. package/sdk-core/crates/sdk-core/src/worker/activities.rs +16 -19
  106. package/sdk-core/crates/sdk-core/src/worker/client/mocks.rs +9 -5
  107. package/sdk-core/crates/sdk-core/src/worker/client.rs +103 -81
  108. package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +7 -11
  109. package/sdk-core/crates/sdk-core/src/worker/mod.rs +1124 -229
  110. package/sdk-core/crates/sdk-core/src/worker/nexus.rs +145 -23
  111. package/sdk-core/crates/sdk-core/src/worker/slot_provider.rs +2 -2
  112. package/sdk-core/crates/sdk-core/src/worker/tuner/fixed_size.rs +2 -2
  113. package/sdk-core/crates/sdk-core/src/worker/tuner/resource_based.rs +13 -13
  114. package/sdk-core/crates/sdk-core/src/worker/tuner.rs +28 -8
  115. package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
  116. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +21 -22
  117. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/workflow_machines.rs +19 -4
  118. package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +14 -18
  119. package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +4 -6
  120. package/sdk-core/crates/sdk-core/src/worker/workflow/run_cache.rs +4 -7
  121. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_extraction.rs +2 -4
  122. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_poller.rs +8 -9
  123. package/sdk-core/crates/sdk-core/src/worker/workflow/workflow_stream.rs +1 -3
  124. package/sdk-core/crates/sdk-core/tests/activities_procmacro.rs +6 -0
  125. package/sdk-core/crates/sdk-core/tests/activities_trybuild/basic_pass.rs +54 -0
  126. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.rs +18 -0
  127. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.stderr +5 -0
  128. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.rs +14 -0
  129. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.stderr +5 -0
  130. package/sdk-core/crates/sdk-core/tests/activities_trybuild/multi_arg_pass.rs +48 -0
  131. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_input_pass.rs +14 -0
  132. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_return_type_pass.rs +19 -0
  133. package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +14 -5
  134. package/sdk-core/crates/sdk-core/tests/common/activity_functions.rs +55 -0
  135. package/sdk-core/crates/sdk-core/tests/common/mod.rs +241 -196
  136. package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
  137. package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +3 -5
  138. package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -64
  139. package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +298 -252
  140. package/sdk-core/crates/sdk-core/tests/integ_tests/async_activity_client_tests.rs +230 -0
  141. package/sdk-core/crates/sdk-core/tests/integ_tests/client_tests.rs +94 -57
  142. package/sdk-core/crates/sdk-core/tests/integ_tests/data_converter_tests.rs +381 -0
  143. package/sdk-core/crates/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +16 -12
  144. package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +48 -40
  145. package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +327 -255
  146. package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +50 -45
  147. package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +147 -126
  148. package/sdk-core/crates/sdk-core/tests/integ_tests/queries_tests.rs +103 -89
  149. package/sdk-core/crates/sdk-core/tests/integ_tests/update_tests.rs +609 -453
  150. package/sdk-core/crates/sdk-core/tests/integ_tests/visibility_tests.rs +80 -62
  151. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +360 -231
  152. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +248 -185
  153. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -43
  154. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_client_tests.rs +180 -0
  155. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/activities.rs +428 -315
  156. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -56
  157. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -28
  158. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -243
  159. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/client_interactions.rs +552 -0
  160. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +101 -42
  161. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -147
  162. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -28
  163. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1036
  164. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -41
  165. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +397 -238
  166. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +414 -189
  167. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/queries.rs +415 -0
  168. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/replay.rs +96 -36
  169. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/resets.rs +154 -137
  170. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -105
  171. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -38
  172. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -40
  173. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -54
  174. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +363 -226
  175. package/sdk-core/crates/sdk-core/tests/main.rs +17 -15
  176. package/sdk-core/crates/sdk-core/tests/manual_tests.rs +207 -152
  177. package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +65 -34
  178. package/sdk-core/crates/sdk-core/tests/shared_tests/priority.rs +107 -84
  179. package/sdk-core/crates/sdk-core/tests/workflows_procmacro.rs +6 -0
  180. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.rs +26 -0
  181. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.stderr +5 -0
  182. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/basic_pass.rs +49 -0
  183. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/minimal_pass.rs +21 -0
  184. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.rs +26 -0
  185. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.stderr +5 -0
  186. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.rs +21 -0
  187. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.stderr +5 -0
  188. package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +7 -1
  189. package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +14 -14
  190. package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +83 -74
  191. package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +9 -14
  192. package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +1 -2
  193. package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +13 -13
  194. package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +6 -6
  195. package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +3 -4
  196. package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +62 -75
  197. package/sdk-core/rustfmt.toml +2 -1
  198. package/src/client.rs +205 -318
  199. package/src/metrics.rs +22 -30
  200. package/src/runtime.rs +4 -5
  201. package/src/worker.rs +16 -19
  202. package/ts/native.ts +1 -1
  203. package/sdk-core/crates/client/src/workflow_handle/mod.rs +0 -212
  204. package/sdk-core/crates/common/src/errors.rs +0 -85
  205. package/sdk-core/crates/common/tests/worker_task_types_test.rs +0 -129
  206. package/sdk-core/crates/sdk/src/activity_context.rs +0 -238
  207. package/sdk-core/crates/sdk/src/app_data.rs +0 -37
  208. package/sdk-core/crates/sdk-core/tests/integ_tests/activity_functions.rs +0 -5
  209. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
@@ -1,11 +1,12 @@
1
1
  use crate::{
2
2
  common::{
3
- ANY_PORT, CoreWfStarter, NAMESPACE, OTEL_URL_ENV_VAR, PROMETHEUS_QUERY_API,
4
- get_integ_runtime_options, get_integ_server_options, get_integ_telem_options, prom_metrics,
3
+ ANY_PORT, CoreWfStarter, NAMESPACE, OTEL_URL_ENV_VAR, PROMETHEUS_QUERY_API, eventually,
4
+ get_integ_client, get_integ_connection, get_integ_runtime_options,
5
+ get_integ_server_options, get_integ_telem_options, prom_metrics,
5
6
  },
6
7
  integ_tests::mk_nexus_endpoint,
7
8
  };
8
- use anyhow::anyhow;
9
+ use anyhow::{anyhow, bail};
9
10
  use assert_matches::assert_matches;
10
11
  use std::{
11
12
  collections::HashMap,
@@ -15,15 +16,15 @@ use std::{
15
16
  time::Duration,
16
17
  };
17
18
  use temporalio_client::{
18
- REQUEST_LATENCY_HISTOGRAM_NAME, WorkflowClientTrait, WorkflowOptions, WorkflowService,
19
+ Connection, NamespacedClient, REQUEST_LATENCY_HISTOGRAM_NAME, UntypedQuery, UntypedWorkflow,
20
+ WorkflowExecutionInfo, WorkflowQueryOptions, WorkflowStartOptions, grpc::WorkflowService,
19
21
  };
20
22
  use temporalio_common::{
21
- Worker,
22
- errors::PollError,
23
+ data_converters::RawValue,
23
24
  prost_dur,
24
25
  protos::{
25
26
  coresdk::{
26
- ActivityTaskCompletion, AsJsonPayloadExt,
27
+ ActivityTaskCompletion,
27
28
  activity_result::ActivityExecutionResult,
28
29
  nexus::{NexusTaskCompletion, nexus_task, nexus_task_completion},
29
30
  workflow_activation::{WorkflowActivationJob, workflow_activation_job},
@@ -36,42 +37,43 @@ use temporalio_common::{
36
37
  },
37
38
  temporal::api::{
38
39
  common::v1::RetryPolicy,
39
- enums::v1::{NexusHandlerErrorRetryBehavior, WorkflowIdReusePolicy},
40
+ enums::v1::{
41
+ NexusHandlerErrorRetryBehavior, WorkflowIdConflictPolicy, WorkflowIdReusePolicy,
42
+ },
40
43
  failure::v1::Failure,
41
- nexus,
42
- nexus::v1::{
43
- HandlerError, StartOperationResponse, UnsuccessfulOperationError, request::Variant,
44
- start_operation_response,
44
+ nexus::{
45
+ self,
46
+ v1::{
47
+ HandlerError, StartOperationResponse, UnsuccessfulOperationError,
48
+ request::Variant, start_operation_response,
49
+ },
45
50
  },
46
- query::v1::WorkflowQuery,
47
51
  workflowservice::v1::{DescribeNamespaceRequest, ListNamespacesRequest},
48
52
  },
49
53
  },
50
54
  telemetry::{
51
55
  HistogramBucketOverrides, OtelCollectorOptions, OtlpProtocol, PrometheusExporterOptions,
52
- TaskQueueLabelStrategy, TelemetryOptions,
56
+ TaskQueueLabelStrategy, TelemetryOptions, build_otlp_metric_exporter,
53
57
  metrics::{
54
58
  CoreMeter, CounterBase, Gauge, GaugeBase, HistogramBase, MetricKeyValue,
55
- MetricParameters, NewAttributes,
59
+ MetricParameters, NewAttributes, WORKFLOW_TASK_EXECUTION_LATENCY_HISTOGRAM_NAME,
56
60
  },
61
+ start_prometheus_metric_exporter,
57
62
  },
58
- worker::{
59
- PollerBehavior, SlotKind, SlotMarkUsedContext, SlotReleaseContext, SlotReservationContext,
60
- SlotSupplier, SlotSupplierPermit, WorkerConfig, WorkerTaskTypes, WorkerVersioningStrategy,
61
- WorkflowSlotKind,
62
- },
63
+ worker::WorkerTaskTypes,
63
64
  };
65
+ use temporalio_macros::{activities, workflow, workflow_methods};
64
66
  use temporalio_sdk::{
65
- ActContext, ActivityError, ActivityOptions, CancellableFuture, LocalActivityOptions,
66
- NexusOperationOptions, WfContext,
67
+ ActivityOptions, CancellableFuture, LocalActivityOptions, NexusOperationOptions,
68
+ WorkflowContext, WorkflowResult,
69
+ activities::{ActivityContext, ActivityError},
67
70
  };
68
71
  use temporalio_sdk_core::{
69
- CoreRuntime, FixedSizeSlotSupplier, TokioRuntimeBuilder, TunerBuilder, init_worker,
72
+ CoreRuntime, FixedSizeSlotSupplier, PollError, PollerBehavior, SlotKind, SlotMarkUsedContext,
73
+ SlotReleaseContext, SlotReservationContext, SlotSupplier, SlotSupplierPermit,
74
+ TokioRuntimeBuilder, TunerBuilder, WorkerConfig, WorkerVersioningStrategy, WorkflowSlotKind,
75
+ init_worker,
70
76
  replay::TestHistoryBuilder,
71
- telemetry::{
72
- WORKFLOW_TASK_EXECUTION_LATENCY_HISTOGRAM_NAME, build_otlp_metric_exporter,
73
- start_prometheus_metric_exporter,
74
- },
75
77
  test_help::{
76
78
  MockPollCfg, ResponseType, TemporalMeter, WorkerExt, WorkerTestHelpers, build_mock_pollers,
77
79
  mock_worker, mock_worker_client,
@@ -109,14 +111,12 @@ async fn prometheus_metrics_exported(
109
111
  .build();
110
112
  let (telemopts, addr, _aborter) = prom_metrics(Some(opts));
111
113
  let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
112
- let opts = get_integ_server_options();
113
- let mut raw_client = opts
114
- .connect_no_namespace(rt.telemetry().get_temporal_metric_meter())
115
- .await
116
- .unwrap();
117
- assert!(raw_client.get_client().capabilities().is_some());
114
+ let mut opts = get_integ_server_options();
115
+ opts.metrics_meter = rt.telemetry().get_temporal_metric_meter();
116
+ let mut connection = Connection::connect(opts).await.unwrap();
117
+ assert!(connection.capabilities().is_some());
118
118
 
119
- let _ = raw_client
119
+ let _ = connection
120
120
  .list_namespaces(ListNamespacesRequest::default().into_request())
121
121
  .await
122
122
  .unwrap();
@@ -148,8 +148,8 @@ async fn prometheus_metrics_exported(
148
148
  assert!(body.contains("temporal_request{"));
149
149
  // Verify non-temporal metrics meter does not prefix
150
150
  let mm = rt.telemetry().get_metric_meter().unwrap();
151
- let g = mm.inner.gauge(MetricParameters::from("mygauge"));
152
- let attrs = mm.inner.new_attributes(NewAttributes::new(vec![]));
151
+ let g = mm.gauge(MetricParameters::from("mygauge"));
152
+ let attrs = mm.new_attributes(NewAttributes::new(vec![]));
153
153
  g.record(42, &attrs);
154
154
  let body = get_text(format!("http://{addr}/metrics")).await;
155
155
  assert!(body.contains("\nmygauge{global=\"hi!\"} 42"));
@@ -178,13 +178,9 @@ async fn one_slot_worker_reports_available_slot() {
178
178
  .build()
179
179
  .unwrap();
180
180
 
181
- let client = Arc::new(
182
- get_integ_server_options()
183
- .connect(worker_cfg.namespace.clone(), None)
184
- .await
185
- .expect("Must connect"),
186
- );
187
- let worker = init_worker(&rt, worker_cfg, client.clone()).expect("Worker inits cleanly");
181
+ let connection = get_integ_connection(None).await;
182
+ let client = Arc::new(get_integ_client(worker_cfg.namespace.clone(), None).await);
183
+ let worker = init_worker(&rt, worker_cfg, connection).expect("Worker inits cleanly");
188
184
  let wf_task_barr = Barrier::new(2);
189
185
  let act_task_barr = Barrier::new(2);
190
186
 
@@ -283,17 +279,13 @@ async fn one_slot_worker_reports_available_slot() {
283
279
  // Start a workflow so that a task will get delivered
284
280
  client
285
281
  .start_workflow(
286
- vec![],
287
- tq.to_owned(),
288
- "one_slot_metric_test".to_owned(),
289
- "whatever".to_string(),
290
- None,
291
- WorkflowOptions {
292
- #[allow(deprecated)]
293
- id_reuse_policy: WorkflowIdReusePolicy::TerminateIfRunning,
294
- execution_timeout: Some(Duration::from_secs(5)),
295
- ..Default::default()
296
- },
282
+ UntypedWorkflow::new("whatever"),
283
+ RawValue::default(),
284
+ WorkflowStartOptions::new(tq.to_owned(), "one_slot_metric_test".to_owned())
285
+ .id_conflict_policy(WorkflowIdConflictPolicy::TerminateExisting)
286
+ .id_reuse_policy(WorkflowIdReusePolicy::AllowDuplicate)
287
+ .execution_timeout(Duration::from_secs(5))
288
+ .build(),
297
289
  )
298
290
  .await
299
291
  .unwrap();
@@ -418,7 +410,7 @@ async fn query_of_closed_workflow_doesnt_tick_terminal_metric(
418
410
  let mut starter =
419
411
  CoreWfStarter::new_with_runtime("query_of_closed_workflow_doesnt_tick_terminal_metric", rt);
420
412
  // Disable cache to ensure replay happens completely
421
- starter.worker_config.max_cached_workflows = 0_usize;
413
+ starter.sdk_config.max_cached_workflows = 0_usize;
422
414
  let worker = starter.get_worker().await;
423
415
  let run_id = starter.start_wf().await;
424
416
  let task = worker.poll_workflow_activation().await.unwrap();
@@ -475,18 +467,20 @@ async fn query_of_closed_workflow_doesnt_tick_terminal_metric(
475
467
  // Query the now-closed workflow
476
468
  let client = starter.get_client().await;
477
469
  let queryer = async {
478
- client
479
- .query_workflow_execution(
480
- starter.get_wf_id().to_string(),
481
- run_id,
482
- WorkflowQuery {
483
- query_type: "fake_query".to_string(),
484
- query_args: None,
485
- header: None,
486
- },
487
- )
488
- .await
489
- .unwrap();
470
+ WorkflowExecutionInfo {
471
+ namespace: client.namespace(),
472
+ workflow_id: starter.get_wf_id().to_string(),
473
+ run_id: Some(run_id),
474
+ first_execution_run_id: None,
475
+ }
476
+ .bind_untyped(client.clone())
477
+ .query(
478
+ UntypedQuery::new("fake_query"),
479
+ RawValue::empty(),
480
+ WorkflowQueryOptions::default(),
481
+ )
482
+ .await
483
+ .unwrap();
490
484
  };
491
485
  let query_reply = async {
492
486
  // Need to re-complete b/c replay
@@ -546,13 +540,11 @@ fn runtime_new() {
546
540
  let (telemopts, addr, _aborter) = prom_metrics(None);
547
541
  rt.telemetry_mut()
548
542
  .attach_late_init_metrics(telemopts.metrics.unwrap());
549
- let opts = get_integ_server_options();
543
+ let mut opts = get_integ_server_options();
544
+ opts.metrics_meter = rt.telemetry().get_temporal_metric_meter();
550
545
  handle.block_on(async {
551
- let mut raw_client = opts
552
- .connect_no_namespace(rt.telemetry().get_temporal_metric_meter())
553
- .await
554
- .unwrap();
555
- assert!(raw_client.get_client().capabilities().is_some());
546
+ let mut raw_client = Connection::connect(opts).await.unwrap();
547
+ assert!(raw_client.capabilities().is_some());
556
548
  let _ = raw_client
557
549
  .list_namespaces(ListNamespacesRequest::default().into_request())
558
550
  .await
@@ -640,11 +632,11 @@ async fn latency_metrics(
640
632
  async fn request_fail_codes() {
641
633
  let (telemopts, addr, _aborter) = prom_metrics(None);
642
634
  let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
643
- let opts = get_integ_server_options();
644
- let mut client = opts
645
- .connect(NAMESPACE, rt.telemetry().get_temporal_metric_meter())
646
- .await
647
- .unwrap();
635
+ let mut client = get_integ_client(
636
+ NAMESPACE.to_string(),
637
+ rt.telemetry().get_temporal_metric_meter(),
638
+ )
639
+ .await;
648
640
 
649
641
  // Describe namespace w/ invalid argument (unset namespace field)
650
642
  WorkflowService::describe_namespace(
@@ -682,11 +674,11 @@ async fn request_fail_codes_otel() {
682
674
  let exporter = Arc::new(exporter);
683
675
  let telemopts = TelemetryOptions::builder().metrics(exporter as Arc<dyn CoreMeter>);
684
676
  let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts.build())).unwrap();
685
- let opts = get_integ_server_options();
686
- let mut client = opts
687
- .connect(NAMESPACE, rt.telemetry().get_temporal_metric_meter())
688
- .await
689
- .unwrap();
677
+ let mut client = get_integ_client(
678
+ NAMESPACE.to_string(),
679
+ rt.telemetry().get_temporal_metric_meter(),
680
+ )
681
+ .await;
690
682
 
691
683
  for _ in 0..10 {
692
684
  // Describe namespace w/ invalid argument (unset namespace field)
@@ -749,38 +741,48 @@ async fn docker_metrics_with_prometheus(
749
741
  .unwrap();
750
742
 
751
743
  let client = starter.get_client().await;
752
- client.list_namespaces().await.unwrap();
753
-
754
- // Give Prometheus time to scrape metrics
755
- tokio::time::sleep(Duration::from_secs(2)).await;
756
-
757
- // Query Prometheus API for metrics
758
- let client = reqwest::Client::new();
759
- let query = format!("temporal_sdk_{}num_pollers", test_uid.clone());
760
- let response = client
761
- .get(PROMETHEUS_QUERY_API)
762
- .query(&[("query", query)])
763
- .send()
764
- .await
765
- .unwrap()
766
- .json::<serde_json::Value>()
767
- .await
768
- .unwrap();
744
+ WorkflowService::list_namespaces(
745
+ &mut client.clone(),
746
+ ListNamespacesRequest::default().into_request(),
747
+ )
748
+ .await
749
+ .unwrap();
769
750
 
770
- // Validate the Prometheus response
771
- if let Some(data) = response["data"]["result"].as_array() {
772
- assert!(!data.is_empty(), "No metrics found for query: {test_uid}");
773
- assert_eq!(data[0]["metric"]["exported_job"], "temporal-core-sdk");
774
- assert_eq!(data[0]["metric"]["job"], "otel-collector");
775
- assert!(
776
- data[0]["metric"]["task_queue"]
777
- .as_str()
778
- .unwrap()
779
- .starts_with(test_name)
780
- );
781
- } else {
782
- panic!("Invalid Prometheus response: {response:?}");
783
- }
751
+ eventually(
752
+ || async {
753
+ // Query Prometheus API for metrics
754
+ let client = reqwest::Client::new();
755
+ let query = format!("temporal_sdk_{}num_pollers", test_uid.clone());
756
+ let response = client
757
+ .get(PROMETHEUS_QUERY_API)
758
+ .query(&[("query", query.clone())])
759
+ .send()
760
+ .await?
761
+ .json::<serde_json::Value>()
762
+ .await?;
763
+
764
+ // Validate the Prometheus response
765
+ if let Some(data) = response["data"]["result"].as_array() {
766
+ if data.is_empty() {
767
+ bail!("No metrics found for query: {query}");
768
+ }
769
+ assert_eq!(data[0]["metric"]["exported_job"], "temporal-core-sdk");
770
+ assert_eq!(data[0]["metric"]["job"], "otel-collector");
771
+ assert!(
772
+ data[0]["metric"]["task_queue"]
773
+ .as_str()
774
+ .unwrap()
775
+ .starts_with(test_name)
776
+ );
777
+ } else {
778
+ bail!("Invalid Prometheus response: {response:?}");
779
+ }
780
+ Ok(())
781
+ },
782
+ Duration::from_secs(45),
783
+ )
784
+ .await
785
+ .unwrap();
784
786
  }
785
787
 
786
788
  #[tokio::test]
@@ -789,84 +791,110 @@ async fn activity_metrics() {
789
791
  let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
790
792
  let wf_name = "activity_metrics";
791
793
  let mut starter = CoreWfStarter::new_with_runtime(wf_name, rt);
792
- starter.worker_config.graceful_shutdown_period = Some(Duration::from_secs(1));
793
- let task_queue = starter.get_task_queue().to_owned();
794
+ starter.sdk_config.graceful_shutdown_period = Some(Duration::from_secs(1));
795
+
796
+ struct PassFailActivities;
797
+ #[activities]
798
+ impl PassFailActivities {
799
+ #[activity(name = "pass_fail_act")]
800
+ async fn pass_fail_act(ctx: ActivityContext, i: String) -> Result<String, ActivityError> {
801
+ match i.as_str() {
802
+ "pass" => Ok("pass".to_string()),
803
+ "cancel" => {
804
+ ctx.cancelled().await;
805
+ Err(ActivityError::cancelled())
806
+ }
807
+ _ => Err(anyhow!("fail").into()),
808
+ }
809
+ }
810
+ }
811
+
812
+ starter.sdk_config.register_activities(PassFailActivities);
794
813
  let mut worker = starter.worker().await;
795
814
 
796
- worker.register_wf(wf_name.to_string(), |ctx: WfContext| async move {
797
- let normal_act_pass = ctx.activity(ActivityOptions {
798
- activity_type: "pass_fail_act".to_string(),
799
- input: "pass".as_json_payload().expect("serializes fine"),
800
- start_to_close_timeout: Some(Duration::from_secs(1)),
801
- ..Default::default()
802
- });
803
- let normal_act_fail = ctx.activity(ActivityOptions {
804
- activity_type: "pass_fail_act".to_string(),
805
- input: "fail".as_json_payload().expect("serializes fine"),
806
- start_to_close_timeout: Some(Duration::from_secs(1)),
807
- retry_policy: Some(RetryPolicy {
808
- maximum_attempts: 1,
809
- ..Default::default()
810
- }),
811
- ..Default::default()
812
- });
813
- join!(normal_act_pass, normal_act_fail);
814
- let local_act_pass = ctx.local_activity(LocalActivityOptions {
815
- activity_type: "pass_fail_act".to_string(),
816
- input: "pass".as_json_payload().expect("serializes fine"),
817
- ..Default::default()
818
- });
819
- let local_act_fail = ctx.local_activity(LocalActivityOptions {
820
- activity_type: "pass_fail_act".to_string(),
821
- input: "fail".as_json_payload().expect("serializes fine"),
822
- retry_policy: RetryPolicy {
823
- maximum_attempts: 1,
824
- ..Default::default()
825
- },
826
- ..Default::default()
827
- });
828
- let local_act_cancel = ctx.local_activity(LocalActivityOptions {
829
- activity_type: "pass_fail_act".to_string(),
830
- input: "cancel".as_json_payload().expect("serializes fine"),
831
- retry_policy: RetryPolicy {
832
- maximum_attempts: 1,
833
- ..Default::default()
834
- },
835
- ..Default::default()
836
- });
837
- join!(local_act_pass, local_act_fail);
838
- // TODO: Currently takes a WFT b/c of https://github.com/temporalio/sdk-core/issues/856
839
- local_act_cancel.cancel(&ctx);
840
- local_act_cancel.await;
841
- Ok(().into())
842
- });
843
- worker.register_activity("pass_fail_act", |ctx: ActContext, i: String| async move {
844
- match i.as_str() {
845
- "pass" => Ok("pass"),
846
- "cancel" => {
847
- ctx.cancelled().await;
848
- Err(ActivityError::cancelled())
849
- }
850
- _ => Err(anyhow!("fail").into()),
815
+ #[workflow]
816
+ #[derive(Default)]
817
+ struct ActivityMetricsWf;
818
+
819
+ #[workflow_methods]
820
+ impl ActivityMetricsWf {
821
+ #[run]
822
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
823
+ let normal_act_pass = ctx.start_activity(
824
+ PassFailActivities::pass_fail_act,
825
+ "pass".to_string(),
826
+ ActivityOptions {
827
+ start_to_close_timeout: Some(Duration::from_secs(1)),
828
+ ..Default::default()
829
+ },
830
+ );
831
+ let normal_act_fail = ctx.start_activity(
832
+ PassFailActivities::pass_fail_act,
833
+ "fail".to_string(),
834
+ ActivityOptions {
835
+ start_to_close_timeout: Some(Duration::from_secs(1)),
836
+ retry_policy: Some(RetryPolicy {
837
+ maximum_attempts: 1,
838
+ ..Default::default()
839
+ }),
840
+ ..Default::default()
841
+ },
842
+ );
843
+ let _ = join!(normal_act_pass, normal_act_fail);
844
+ let local_act_pass = ctx.start_local_activity(
845
+ PassFailActivities::pass_fail_act,
846
+ "pass".to_string(),
847
+ LocalActivityOptions::default(),
848
+ );
849
+ let local_act_fail = ctx.start_local_activity(
850
+ PassFailActivities::pass_fail_act,
851
+ "fail".to_string(),
852
+ LocalActivityOptions {
853
+ retry_policy: RetryPolicy {
854
+ maximum_attempts: 1,
855
+ ..Default::default()
856
+ },
857
+ ..Default::default()
858
+ },
859
+ );
860
+ let local_act_cancel = ctx.start_local_activity(
861
+ PassFailActivities::pass_fail_act,
862
+ "cancel".to_string(),
863
+ LocalActivityOptions {
864
+ retry_policy: RetryPolicy {
865
+ maximum_attempts: 1,
866
+ ..Default::default()
867
+ },
868
+ ..Default::default()
869
+ },
870
+ );
871
+ let _ = join!(local_act_pass, local_act_fail);
872
+ // TODO: Currently takes a WFT b/c of https://github.com/temporalio/sdk-core/issues/856
873
+ local_act_cancel.cancel();
874
+ let _ = local_act_cancel.await;
875
+ Ok(())
851
876
  }
852
- });
877
+ }
853
878
 
879
+ worker.register_workflow::<ActivityMetricsWf>();
880
+ let task_queue = starter.get_task_queue().to_owned();
881
+ let workflow_id = wf_name.to_owned();
854
882
  worker
855
- .submit_wf(
856
- wf_name.to_owned(),
857
- wf_name.to_owned(),
858
- vec![],
859
- WorkflowOptions::default(),
883
+ .submit_workflow(
884
+ ActivityMetricsWf::run,
885
+ (),
886
+ WorkflowStartOptions::new(task_queue.clone(), workflow_id).build(),
860
887
  )
861
888
  .await
862
889
  .unwrap();
863
890
  worker.run_until_done().await.unwrap();
864
891
 
865
892
  let body = get_text(format!("http://{addr}/metrics")).await;
893
+ let wf_type = ActivityMetricsWf::name();
866
894
  assert!(body.contains(&format!(
867
895
  "temporal_activity_execution_failed{{activity_type=\"pass_fail_act\",\
868
896
  namespace=\"{NAMESPACE}\",service_name=\"temporal-core-sdk\",\
869
- task_queue=\"{task_queue}\",workflow_type=\"{wf_name}\"}} 1"
897
+ task_queue=\"{task_queue}\",workflow_type=\"{wf_type}\"}} 1"
870
898
  )));
871
899
  assert!(body.contains(&format!(
872
900
  "temporal_activity_schedule_to_start_latency_count{{\
@@ -876,42 +904,42 @@ async fn activity_metrics() {
876
904
  assert!(body.contains(&format!(
877
905
  "temporal_activity_execution_latency_count{{activity_type=\"pass_fail_act\",\
878
906
  namespace=\"{NAMESPACE}\",service_name=\"temporal-core-sdk\",\
879
- task_queue=\"{task_queue}\",workflow_type=\"{wf_name}\"}} 2"
907
+ task_queue=\"{task_queue}\",workflow_type=\"{wf_type}\"}} 2"
880
908
  )));
881
909
  assert!(body.contains(&format!(
882
910
  "temporal_activity_succeed_endtoend_latency_count{{activity_type=\"pass_fail_act\",\
883
911
  namespace=\"{NAMESPACE}\",service_name=\"temporal-core-sdk\",\
884
- task_queue=\"{task_queue}\",workflow_type=\"{wf_name}\"}} 1"
912
+ task_queue=\"{task_queue}\",workflow_type=\"{wf_type}\"}} 1"
885
913
  )));
886
914
 
887
915
  assert!(body.contains(&format!(
888
916
  "temporal_local_activity_total{{activity_type=\"pass_fail_act\",namespace=\"{NAMESPACE}\",\
889
917
  service_name=\"temporal-core-sdk\",task_queue=\"{task_queue}\",\
890
- workflow_type=\"{wf_name}\"}} 3"
918
+ workflow_type=\"{wf_type}\"}} 3"
891
919
  )));
892
920
  assert!(body.contains(&format!(
893
921
  "temporal_local_activity_execution_failed{{activity_type=\"pass_fail_act\",\
894
922
  namespace=\"{NAMESPACE}\",service_name=\"temporal-core-sdk\",\
895
923
  task_queue=\"{task_queue}\",\
896
- workflow_type=\"{wf_name}\"}} 1"
924
+ workflow_type=\"{wf_type}\"}} 1"
897
925
  )));
898
926
  assert!(body.contains(&format!(
899
927
  "temporal_local_activity_execution_cancelled{{activity_type=\"pass_fail_act\",\
900
928
  namespace=\"{NAMESPACE}\",service_name=\"temporal-core-sdk\",\
901
929
  task_queue=\"{task_queue}\",\
902
- workflow_type=\"{wf_name}\"}} 1"
930
+ workflow_type=\"{wf_type}\"}} 1"
903
931
  )));
904
932
  assert!(body.contains(&format!(
905
933
  "temporal_local_activity_execution_latency_count{{activity_type=\"pass_fail_act\",\
906
934
  namespace=\"{NAMESPACE}\",service_name=\"temporal-core-sdk\",\
907
935
  task_queue=\"{task_queue}\",\
908
- workflow_type=\"{wf_name}\"}} 3"
936
+ workflow_type=\"{wf_type}\"}} 3"
909
937
  )));
910
938
  assert!(body.contains(&format!(
911
939
  "temporal_local_activity_succeed_endtoend_latency_count{{activity_type=\"pass_fail_act\",\
912
940
  namespace=\"{NAMESPACE}\",service_name=\"temporal-core-sdk\",\
913
941
  task_queue=\"{task_queue}\",\
914
- workflow_type=\"{wf_name}\"}} 1"
942
+ workflow_type=\"{wf_type}\"}} 1"
915
943
  )));
916
944
  }
917
945
 
@@ -921,25 +949,30 @@ async fn nexus_metrics() {
921
949
  let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
922
950
  let wf_name = "nexus_metrics";
923
951
  let mut starter = CoreWfStarter::new_with_runtime(wf_name, rt);
924
- starter.worker_config.task_types = WorkerTaskTypes {
952
+ starter.sdk_config.task_types = WorkerTaskTypes {
925
953
  enable_workflows: true,
926
954
  enable_local_activities: false,
927
955
  enable_remote_activities: false,
928
956
  enable_nexus: true,
929
957
  };
930
- let task_queue = starter.get_task_queue().to_owned();
931
958
  let mut worker = starter.worker().await;
932
959
  let core_worker = starter.get_worker().await;
933
960
  let endpoint = mk_nexus_endpoint(&mut starter).await;
934
961
 
935
- worker.register_wf(wf_name.to_string(), move |ctx: WfContext| {
936
- let partial_op = NexusOperationOptions {
937
- endpoint: endpoint.clone(),
938
- service: "mysvc".to_string(),
939
- operation: "myop".to_string(),
940
- ..Default::default()
941
- };
942
- async move {
962
+ #[workflow]
963
+ #[derive(Default)]
964
+ struct NexusMetricsWf;
965
+
966
+ #[workflow_methods]
967
+ impl NexusMetricsWf {
968
+ #[run]
969
+ async fn run(ctx: &mut WorkflowContext<Self>, endpoint: String) -> WorkflowResult<()> {
970
+ let partial_op = NexusOperationOptions {
971
+ endpoint: endpoint.clone(),
972
+ service: "mysvc".to_string(),
973
+ operation: "myop".to_string(),
974
+ ..Default::default()
975
+ };
943
976
  join!(
944
977
  async {
945
978
  ctx.start_nexus_operation(partial_op.clone())
@@ -974,11 +1007,21 @@ async fn nexus_metrics() {
974
1007
  .await;
975
1008
  }
976
1009
  );
977
- Ok(().into())
1010
+ Ok(())
978
1011
  }
979
- });
1012
+ }
980
1013
 
981
- starter.start_with_worker(wf_name, &mut worker).await;
1014
+ worker.register_workflow::<NexusMetricsWf>();
1015
+ let task_queue = starter.get_task_queue().to_owned();
1016
+ let workflow_id = wf_name.to_owned();
1017
+ worker
1018
+ .submit_workflow(
1019
+ NexusMetricsWf::run,
1020
+ endpoint,
1021
+ WorkflowStartOptions::new(task_queue.clone(), workflow_id).build(),
1022
+ )
1023
+ .await
1024
+ .unwrap();
982
1025
 
983
1026
  let nexus_polling = async {
984
1027
  for _ in 0..5 {
@@ -1011,6 +1054,7 @@ async fn nexus_metrics() {
1011
1054
  variant: Some(nexus::v1::response::Variant::StartOperation(
1012
1055
  StartOperationResponse {
1013
1056
  variant: Some(
1057
+ #[allow(deprecated)]
1014
1058
  start_operation_response::Variant::OperationError(
1015
1059
  UnsuccessfulOperationError {
1016
1060
  operation_state: "failed".to_string(),
@@ -1025,7 +1069,9 @@ async fn nexus_metrics() {
1025
1069
  )),
1026
1070
  })
1027
1071
  }
1028
- Some(p) if p == "handler-fail".into() => {
1072
+ Some(p) if p == "handler-fail".into() =>
1073
+ {
1074
+ #[allow(deprecated)]
1029
1075
  nexus_task_completion::Status::Error(HandlerError {
1030
1076
  error_type: "BAD_REQUEST".to_string(),
1031
1077
  failure: Some(nexus::v1::Failure {
@@ -1103,20 +1149,29 @@ async fn evict_on_complete_does_not_count_as_forced_eviction() {
1103
1149
  let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
1104
1150
  let wf_name = "evict_on_complete_does_not_count_as_forced_eviction";
1105
1151
  let mut starter = CoreWfStarter::new_with_runtime(wf_name, rt);
1106
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
1152
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
1107
1153
  let mut worker = starter.worker().await;
1108
1154
 
1109
- worker.register_wf(
1110
- wf_name.to_string(),
1111
- |_: WfContext| async move { Ok(().into()) },
1112
- );
1155
+ #[workflow]
1156
+ #[derive(Default)]
1157
+ struct EvictOnCompleteWf;
1158
+
1159
+ #[workflow_methods]
1160
+ impl EvictOnCompleteWf {
1161
+ #[run]
1162
+ async fn run(_ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
1163
+ Ok(())
1164
+ }
1165
+ }
1113
1166
 
1167
+ worker.register_workflow::<EvictOnCompleteWf>();
1168
+ let task_queue = starter.get_task_queue().to_owned();
1169
+ let workflow_id = wf_name.to_owned();
1114
1170
  worker
1115
- .submit_wf(
1116
- wf_name.to_owned(),
1117
- wf_name.to_owned(),
1118
- vec![],
1119
- WorkflowOptions::default(),
1171
+ .submit_workflow(
1172
+ EvictOnCompleteWf::run,
1173
+ (),
1174
+ WorkflowStartOptions::new(task_queue, workflow_id).build(),
1120
1175
  )
1121
1176
  .await
1122
1177
  .unwrap();
@@ -1186,30 +1241,34 @@ async fn metrics_available_from_custom_slot_supplier() {
1186
1241
  let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
1187
1242
  let mut starter =
1188
1243
  CoreWfStarter::new_with_runtime("metrics_available_from_custom_slot_supplier", rt);
1189
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
1190
- starter.worker_config.max_outstanding_workflow_tasks = None;
1191
- starter.worker_config.max_outstanding_local_activities = None;
1192
- starter.worker_config.max_outstanding_activities = None;
1193
- starter.worker_config.max_outstanding_nexus_tasks = None;
1244
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
1194
1245
  let mut tb = TunerBuilder::default();
1195
1246
  tb.workflow_slot_supplier(Arc::new(MetricRecordingSlotSupplier::<WorkflowSlotKind> {
1196
1247
  inner: FixedSizeSlotSupplier::new(5),
1197
1248
  metrics: OnceLock::new(),
1198
1249
  }));
1199
- starter.worker_config.tuner = Some(Arc::new(tb.build()));
1250
+ starter.sdk_config.tuner = Arc::new(tb.build());
1200
1251
  let mut worker = starter.worker().await;
1201
1252
 
1202
- worker.register_wf(
1203
- "s_wf".to_string(),
1204
- |_: WfContext| async move { Ok(().into()) },
1205
- );
1253
+ #[workflow]
1254
+ #[derive(Default)]
1255
+ struct CustomSlotSupplierWf;
1206
1256
 
1257
+ #[workflow_methods]
1258
+ impl CustomSlotSupplierWf {
1259
+ #[run]
1260
+ async fn run(_ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
1261
+ Ok(())
1262
+ }
1263
+ }
1264
+
1265
+ worker.register_workflow::<CustomSlotSupplierWf>();
1266
+ let task_queue = starter.get_task_queue().to_owned();
1207
1267
  worker
1208
- .submit_wf(
1209
- "s_wf".to_owned(),
1210
- "s_wf".to_owned(),
1211
- vec![],
1212
- WorkflowOptions::default(),
1268
+ .submit_workflow(
1269
+ CustomSlotSupplierWf::run,
1270
+ (),
1271
+ WorkflowStartOptions::new(task_queue, "s_wf".to_owned()).build(),
1213
1272
  )
1214
1273
  .await
1215
1274
  .unwrap();
@@ -1350,24 +1409,32 @@ async fn sticky_queue_label_strategy(
1350
1409
  let wf_name = format!("sticky_queue_label_strategy_{strategy:?}");
1351
1410
  let mut starter = CoreWfStarter::new_with_runtime(&wf_name, rt);
1352
1411
  // Enable sticky queues by setting a reasonable cache size
1353
- starter.worker_config.max_cached_workflows = 10_usize;
1354
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
1355
- let task_queue = starter.get_task_queue().to_owned();
1412
+ starter.sdk_config.max_cached_workflows = 10_usize;
1413
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
1356
1414
  let mut worker = starter.worker().await;
1357
1415
 
1358
- worker.register_wf(wf_name.clone(), |ctx: WfContext| async move {
1359
- ctx.timer(Duration::from_millis(1)).await;
1360
- Ok(().into())
1361
- });
1416
+ #[workflow]
1417
+ #[derive(Default)]
1418
+ struct StickyQueueLabelStrategyWf;
1419
+
1420
+ #[workflow_methods]
1421
+ impl StickyQueueLabelStrategyWf {
1422
+ #[run]
1423
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
1424
+ ctx.timer(Duration::from_millis(1)).await;
1425
+ Ok(())
1426
+ }
1427
+ }
1428
+
1429
+ worker.register_workflow::<StickyQueueLabelStrategyWf>();
1430
+ let task_queue = starter.get_task_queue().to_owned();
1362
1431
  worker
1363
- .submit_wf(
1364
- wf_name.clone(),
1365
- wf_name,
1366
- vec![],
1367
- WorkflowOptions {
1368
- enable_eager_workflow_start: false,
1369
- ..Default::default()
1370
- },
1432
+ .submit_workflow(
1433
+ StickyQueueLabelStrategyWf::run,
1434
+ (),
1435
+ WorkflowStartOptions::new(task_queue.clone(), wf_name.clone())
1436
+ .enable_eager_workflow_start(false)
1437
+ .build(),
1371
1438
  )
1372
1439
  .await
1373
1440
  .unwrap();
@@ -1427,29 +1494,34 @@ async fn resource_based_tuner_metrics() {
1427
1494
  let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
1428
1495
  let wf_name = "resource_based_tuner_metrics";
1429
1496
  let mut starter = CoreWfStarter::new_with_runtime(wf_name, rt);
1430
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
1431
- starter.worker_config.max_outstanding_workflow_tasks = None;
1432
- starter.worker_config.max_outstanding_local_activities = None;
1433
- starter.worker_config.max_outstanding_activities = None;
1434
- starter.worker_config.max_outstanding_nexus_tasks = None;
1435
-
1497
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
1436
1498
  // Create a resource-based tuner with reasonable thresholds
1437
1499
  let tuner = ResourceBasedTuner::new(0.8, 0.8);
1438
- starter.worker_config.tuner = Some(Arc::new(tuner));
1500
+ starter.sdk_config.tuner = Arc::new(tuner);
1439
1501
 
1440
1502
  let mut worker = starter.worker().await;
1441
1503
 
1442
- worker.register_wf(wf_name.to_string(), |ctx: WfContext| async move {
1443
- ctx.timer(Duration::from_millis(100)).await;
1444
- Ok(().into())
1445
- });
1504
+ #[workflow]
1505
+ #[derive(Default)]
1506
+ struct ResourceBasedTunerMetricsWf;
1446
1507
 
1508
+ #[workflow_methods]
1509
+ impl ResourceBasedTunerMetricsWf {
1510
+ #[run]
1511
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
1512
+ ctx.timer(Duration::from_millis(100)).await;
1513
+ Ok(())
1514
+ }
1515
+ }
1516
+
1517
+ worker.register_workflow::<ResourceBasedTunerMetricsWf>();
1518
+ let task_queue = starter.get_task_queue().to_owned();
1519
+ let workflow_id = wf_name.to_owned();
1447
1520
  worker
1448
- .submit_wf(
1449
- wf_name.to_owned(),
1450
- wf_name.to_owned(),
1451
- vec![],
1452
- WorkflowOptions::default(),
1521
+ .submit_workflow(
1522
+ ResourceBasedTunerMetricsWf::run,
1523
+ (),
1524
+ WorkflowStartOptions::new(task_queue, workflow_id).build(),
1453
1525
  )
1454
1526
  .await
1455
1527
  .unwrap();