@temporalio/core-bridge 1.15.0 → 1.16.0

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 +16 -3
  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 +340 -188
  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 +15 -18
  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,289 +1,12 @@
1
1
  //! This module helps with the initialization and management of telemetry. IE: Metrics and tracing.
2
2
  //! Logs from core are all traces, which may be exported to the console, in memory, or externally.
3
3
 
4
- mod log_export;
5
- pub(crate) mod metrics;
6
- #[cfg(feature = "otel")]
7
- mod otel;
8
- #[cfg(feature = "prom")]
9
- mod prometheus_meter;
10
- #[cfg(feature = "prom")]
11
- mod prometheus_server;
12
-
13
- // Always export bucket configuration function since it's used by both OTel and Prometheus
14
- pub use metrics::default_buckets_for;
15
-
16
- #[cfg(feature = "otel")]
17
- pub use metrics::{
18
- ACTIVITY_EXEC_LATENCY_HISTOGRAM_NAME, ACTIVITY_SCHED_TO_START_LATENCY_HISTOGRAM_NAME,
19
- MetricsCallBuffer, WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME,
20
- WORKFLOW_TASK_EXECUTION_LATENCY_HISTOGRAM_NAME, WORKFLOW_TASK_REPLAY_LATENCY_HISTOGRAM_NAME,
21
- WORKFLOW_TASK_SCHED_TO_START_LATENCY_HISTOGRAM_NAME,
22
- };
23
- #[cfg(feature = "otel")]
24
- pub use otel::build_otlp_metric_exporter;
25
- #[cfg(feature = "prom")]
26
- pub use prometheus_server::start_prometheus_metric_exporter;
27
-
28
- pub use log_export::{CoreLogBuffer, CoreLogBufferedConsumer, CoreLogStreamConsumer};
29
-
30
- use crate::telemetry::{log_export::CoreLogConsumerLayer, metrics::PrefixedMetricsMeter};
31
4
  use itertools::Itertools;
32
- use parking_lot::Mutex;
33
- use std::{
34
- cell::RefCell,
35
- collections::VecDeque,
36
- env,
37
- sync::{
38
- Arc,
39
- atomic::{AtomicBool, Ordering},
40
- },
41
- };
42
- use temporalio_common::telemetry::{
43
- CoreLog, CoreTelemetry, Logger, TaskQueueLabelStrategy, TelemetryOptions,
44
- metrics::{CoreMeter, MetricKeyValue, NewAttributes, TemporalMeter},
45
- };
46
- use tracing::{Level, Subscriber};
47
- use tracing_subscriber::{EnvFilter, Layer, layer::SubscriberExt};
48
-
49
- const TELEM_SERVICE_NAME: &str = "temporal-core-sdk";
50
-
51
- const FORWARD_LOG_BUFFER_SIZE: usize = 2048;
52
-
53
- /// Help you construct an [EnvFilter] compatible filter string which will forward all core module
54
- /// traces at `core_level` and all others (from 3rd party modules, etc) at `other_level`.
55
- pub fn construct_filter_string(core_level: Level, other_level: Level) -> String {
56
- format!(
57
- "{other_level},temporalio_sdk_core={core_level},temporalio_client={core_level},temporalio_sdk={core_level}"
58
- )
59
- }
60
-
61
- /// Holds initialized tracing/metrics exporters, etc
62
- pub struct TelemetryInstance {
63
- metric_prefix: String,
64
- logs_out: Option<Mutex<CoreLogBuffer>>,
65
- metrics: Option<Arc<dyn CoreMeter + 'static>>,
66
- /// The tracing subscriber which is associated with this telemetry instance. May be `None` if
67
- /// the user has not opted into any tracing configuration.
68
- trace_subscriber: Option<Arc<dyn Subscriber + Send + Sync>>,
69
- attach_service_name: bool,
70
- task_queue_label_strategy: TaskQueueLabelStrategy,
71
- }
72
-
73
- impl TelemetryInstance {
74
- fn new(
75
- trace_subscriber: Option<Arc<dyn Subscriber + Send + Sync>>,
76
- logs_out: Option<Mutex<CoreLogBuffer>>,
77
- metric_prefix: String,
78
- metrics: Option<Arc<dyn CoreMeter + 'static>>,
79
- attach_service_name: bool,
80
- task_queue_label_strategy: TaskQueueLabelStrategy,
81
- ) -> Self {
82
- Self {
83
- metric_prefix,
84
- logs_out,
85
- metrics,
86
- trace_subscriber,
87
- attach_service_name,
88
- task_queue_label_strategy,
89
- }
90
- }
91
-
92
- /// Return the trace subscriber associated with the telemetry options/instance. Can be used
93
- /// to manually set the default for a thread or globally using the `tracing` crate, or with
94
- /// [set_trace_subscriber_for_current_thread].
95
- pub fn trace_subscriber(&self) -> Option<Arc<dyn Subscriber + Send + Sync>> {
96
- self.trace_subscriber.clone()
97
- }
98
-
99
- /// Some metric meters cannot be initialized until after a tokio runtime has started and after
100
- /// other telemetry has initted (ex: prometheus). They can be attached here.
101
- pub fn attach_late_init_metrics(&mut self, meter: Arc<dyn CoreMeter + 'static>) {
102
- self.metrics = Some(meter);
103
- }
104
-
105
- /// Returns our wrapper for metric meters, including the `metric_prefix` from
106
- /// [TelemetryOptions]. This should be used to initialize clients or for any other
107
- /// temporal-owned metrics. User defined metrics should use [Self::get_metric_meter].
108
- pub fn get_temporal_metric_meter(&self) -> Option<TemporalMeter> {
109
- self.metrics.clone().map(|m| {
110
- let kvs = self.default_kvs();
111
- let attribs = NewAttributes::new(kvs);
112
- TemporalMeter::new(
113
- Arc::new(PrefixedMetricsMeter::new(self.metric_prefix.clone(), m))
114
- as Arc<dyn CoreMeter>,
115
- attribs,
116
- self.task_queue_label_strategy,
117
- )
118
- })
119
- }
120
-
121
- /// Returns our wrapper for metric meters, including attaching the service name if enabled.
122
- pub fn get_metric_meter(&self) -> Option<TemporalMeter> {
123
- self.metrics.clone().map(|m| {
124
- let kvs = self.default_kvs();
125
- let attribs = NewAttributes::new(kvs);
126
- TemporalMeter::new(m, attribs, self.task_queue_label_strategy)
127
- })
128
- }
129
-
130
- fn default_kvs(&self) -> Vec<MetricKeyValue> {
131
- if self.attach_service_name {
132
- vec![MetricKeyValue::new("service_name", TELEM_SERVICE_NAME)]
133
- } else {
134
- vec![]
135
- }
136
- }
137
- }
138
-
139
- thread_local! {
140
- static SUB_GUARD: RefCell<Option<tracing::subscriber::DefaultGuard>> =
141
- const { RefCell::new(None) };
142
- }
143
- /// Set the trace subscriber for the current thread. This must be done in every thread which uses
144
- /// core stuff, otherwise traces/logs will not be collected on that thread. For example, if using
145
- /// a multithreaded Tokio runtime, you should ensure that said runtime uses
146
- /// [on_thread_start](https://docs.rs/tokio/latest/tokio/runtime/struct.Builder.html#method.on_thread_start)
147
- /// or a similar mechanism to call this for each thread within the runtime.
148
- pub fn set_trace_subscriber_for_current_thread(sub: impl Subscriber + Send + Sync + 'static) {
149
- SUB_GUARD.with(|sg| {
150
- if sg.borrow().is_none() {
151
- let g = tracing::subscriber::set_default(sub);
152
- *sg.borrow_mut() = Some(g);
153
- }
154
- })
155
- }
156
-
157
- /// Undoes [set_trace_subscriber_for_current_thread]
158
- pub fn remove_trace_subscriber_for_current_thread() {
159
- SUB_GUARD.take();
160
- }
161
-
162
- impl CoreTelemetry for TelemetryInstance {
163
- fn fetch_buffered_logs(&self) -> Vec<CoreLog> {
164
- if let Some(logs_out) = self.logs_out.as_ref() {
165
- logs_out.lock().drain()
166
- } else {
167
- vec![]
168
- }
169
- }
170
- }
171
-
172
- /// Initialize tracing subscribers/output and logging export, returning a [TelemetryInstance]
173
- /// which can be used to register default / global tracing subscribers.
174
- ///
175
- /// You should only call this once per unique [TelemetryOptions]
176
- ///
177
- /// See [TelemetryOptions] docs for more on configuration.
178
- pub fn telemetry_init(opts: TelemetryOptions) -> Result<TelemetryInstance, anyhow::Error> {
179
- let mut logs_out = None;
5
+ use std::collections::VecDeque;
180
6
 
181
- // Tracing subscriber layers =========
182
- let mut console_pretty_layer = None;
183
- let mut console_compact_layer = None;
184
- let mut forward_layer = None;
185
- // ===================================
186
-
187
- let tracing_sub = if let Some(ts) = opts.subscriber_override {
188
- Some(ts)
189
- } else {
190
- opts.logging.map(|logger| {
191
- match logger {
192
- Logger::Console { filter } => {
193
- // This is silly dupe but can't be avoided without boxing.
194
- if env::var("TEMPORAL_CORE_PRETTY_LOGS").is_ok() {
195
- console_pretty_layer = Some(
196
- tracing_subscriber::fmt::layer()
197
- .with_target(false)
198
- .event_format(
199
- tracing_subscriber::fmt::format()
200
- .pretty()
201
- .with_source_location(false),
202
- )
203
- .with_filter(EnvFilter::new(filter)),
204
- )
205
- } else {
206
- console_compact_layer = Some(
207
- tracing_subscriber::fmt::layer()
208
- .with_target(false)
209
- .event_format(
210
- tracing_subscriber::fmt::format()
211
- .compact()
212
- .with_source_location(false),
213
- )
214
- .with_filter(EnvFilter::new(filter)),
215
- )
216
- }
217
- }
218
- Logger::Forward { filter } => {
219
- let (export_layer, lo) =
220
- CoreLogConsumerLayer::new_buffered(FORWARD_LOG_BUFFER_SIZE);
221
- logs_out = Some(Mutex::new(lo));
222
- forward_layer = Some(export_layer.with_filter(EnvFilter::new(filter)));
223
- }
224
- Logger::Push { filter, consumer } => {
225
- forward_layer = Some(
226
- CoreLogConsumerLayer::new(consumer).with_filter(EnvFilter::new(filter)),
227
- );
228
- }
229
- };
230
- let reg = tracing_subscriber::registry()
231
- .with(console_pretty_layer)
232
- .with(console_compact_layer)
233
- .with(forward_layer);
234
-
235
- #[cfg(feature = "tokio-console")]
236
- let reg = reg.with(console_subscriber::spawn());
237
- Arc::new(reg) as Arc<dyn Subscriber + Send + Sync>
238
- })
239
- };
240
-
241
- Ok(TelemetryInstance::new(
242
- tracing_sub,
243
- logs_out,
244
- opts.metric_prefix,
245
- opts.metrics,
246
- opts.attach_service_name,
247
- opts.task_queue_label_strategy,
248
- ))
249
- }
250
-
251
- /// WARNING: Calling can cause panics because of <https://github.com/tokio-rs/tracing/issues/1656>
252
- /// Lang must not start using until resolved
253
- ///
254
- /// Initialize telemetry/tracing globally. Useful for testing. Only takes affect when called
255
- /// the first time. Subsequent calls are ignored.
256
- pub fn telemetry_init_global(opts: TelemetryOptions) -> Result<(), anyhow::Error> {
257
- static INITTED: AtomicBool = AtomicBool::new(false);
258
- if INITTED
259
- .compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)
260
- .is_ok()
261
- {
262
- let ti = telemetry_init(opts)?;
263
- if let Some(ts) = ti.trace_subscriber() {
264
- tracing::subscriber::set_global_default(ts)?;
265
- }
266
- }
267
- Ok(())
268
- }
7
+ pub(crate) mod metrics;
269
8
 
270
- /// WARNING: Calling can cause panics because of <https://github.com/tokio-rs/tracing/issues/1656>
271
- /// Lang must not start using until resolved
272
- ///
273
- /// Initialize the fallback global handler. All lang SDKs should call this somewhere, once, at
274
- /// startup, as it initializes a fallback handler for any dependencies (looking at you, otel) that
275
- /// don't provide good ways to customize their tracing usage. It sets a WARN-level global filter
276
- /// that uses the default console logger.
277
- pub fn telemetry_init_fallback() -> Result<(), anyhow::Error> {
278
- telemetry_init_global(
279
- TelemetryOptions::builder()
280
- .logging(Logger::Console {
281
- filter: construct_filter_string(Level::DEBUG, Level::WARN),
282
- })
283
- .build(),
284
- )?;
285
- Ok(())
286
- }
9
+ pub use metrics::MetricsCallBuffer;
287
10
 
288
11
  /// A trait for using [Display] on the contents of vecs, etc, which don't implement it.
289
12
  ///
@@ -8,7 +8,8 @@ pub use crate::{
8
8
  };
9
9
 
10
10
  use crate::{
11
- TaskToken, Worker, WorkerConfig, WorkerConfigBuilder,
11
+ PollError, PollerBehavior, TaskToken, Worker, WorkerConfig, WorkerConfigBuilder,
12
+ WorkerVersioningStrategy,
12
13
  pollers::{BoxedPoller, MockManualPoller},
13
14
  protosext::ValidPollWFTQResponse,
14
15
  replay::TestHistoryBuilder,
@@ -16,6 +17,7 @@ use crate::{
16
17
  worker::{
17
18
  TaskPollers, WorkerTelemetry,
18
19
  client::{LegacyQueryResult, MockWorkerClient, WorkerClient, WorkflowTaskCompletion},
20
+ worker_config_builder,
19
21
  },
20
22
  };
21
23
  use assert_matches::assert_matches;
@@ -38,8 +40,6 @@ use std::{
38
40
  };
39
41
  pub use temporalio_common::telemetry::metrics::TemporalMeter;
40
42
  use temporalio_common::{
41
- Worker as WorkerTrait,
42
- errors::PollError,
43
43
  protos::{
44
44
  coresdk::{
45
45
  workflow_activation::{WorkflowActivationJob, workflow_activation_job},
@@ -59,7 +59,7 @@ use temporalio_common::{
59
59
  },
60
60
  utilities::pack_any,
61
61
  },
62
- worker::{PollerBehavior, WorkerTaskTypes, WorkerVersioningStrategy, worker_config_builder},
62
+ worker::WorkerTaskTypes,
63
63
  };
64
64
  use tokio::sync::{Notify, mpsc::unbounded_channel};
65
65
  use tokio_stream::wrappers::UnboundedReceiverStream;
@@ -69,7 +69,7 @@ use uuid::Uuid;
69
69
  pub const NAMESPACE: &str = "default";
70
70
 
71
71
  /// Initiate shutdown, drain the pollers (handling evictions), and wait for shutdown to complete.
72
- pub async fn drain_pollers_and_shutdown(worker: &dyn WorkerTrait) {
72
+ pub async fn drain_pollers_and_shutdown(worker: &Worker) {
73
73
  worker.initiate_shutdown();
74
74
  tokio::join!(
75
75
  async {
@@ -1037,10 +1037,7 @@ pub trait WorkerTestHelpers {
1037
1037
  }
1038
1038
 
1039
1039
  #[async_trait::async_trait]
1040
- impl<T> WorkerTestHelpers for T
1041
- where
1042
- T: WorkerTrait + ?Sized,
1043
- {
1040
+ impl WorkerTestHelpers for Worker {
1044
1041
  async fn complete_execution(&self, run_id: &str) {
1045
1042
  self.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
1046
1043
  run_id.to_string(),
@@ -2,12 +2,9 @@
2
2
 
3
3
  use futures_util::{StreamExt, stream::FuturesUnordered};
4
4
  use std::{collections::HashSet, future::Future};
5
- use temporalio_common::{
6
- Worker as CoreWorker,
7
- protos::coresdk::{
8
- workflow_activation::workflow_activation_job,
9
- workflow_completion::{WorkflowActivationCompletion, workflow_activation_completion},
10
- },
5
+ use temporalio_common::protos::coresdk::{
6
+ workflow_activation::workflow_activation_job,
7
+ workflow_completion::{WorkflowActivationCompletion, workflow_activation_completion},
11
8
  };
12
9
 
13
10
  /// Given a desired number of concurrent executions and a provided function that produces a future,
@@ -3,7 +3,7 @@ use crate::{
3
3
  abstractions::{MeteredPermitDealer, OwnedMeteredSemPermit, UsedMeteredSemPermit, dbg_panic},
4
4
  protosext::ValidScheduleLA,
5
5
  telemetry::metrics::{activity_type, should_record_failure_metric, workflow_type},
6
- worker::workflow::HeartbeatTimeoutMsg,
6
+ worker::{LocalActivitySlotKind, workflow::HeartbeatTimeoutMsg},
7
7
  };
8
8
  use futures_util::{
9
9
  Stream, StreamExt, future, future::AbortRegistration, stream, stream::BoxStream,
@@ -17,20 +17,17 @@ use std::{
17
17
  task::{Context, Poll},
18
18
  time::{Duration, Instant, SystemTime},
19
19
  };
20
- use temporalio_common::{
21
- protos::{
22
- coresdk::{
23
- LocalActivitySlotInfo,
24
- activity_result::{Cancellation, Failure as ActFail, Success},
25
- activity_task::{ActivityCancelReason, ActivityTask, Start, activity_task},
26
- },
27
- temporal::api::{
28
- common::v1::WorkflowExecution,
29
- enums::v1::TimeoutType,
30
- failure::v1::{Failure as APIFailure, TimeoutFailureInfo, failure},
31
- },
20
+ use temporalio_common::protos::{
21
+ coresdk::{
22
+ LocalActivitySlotInfo,
23
+ activity_result::{Cancellation, Failure as ActFail, Success},
24
+ activity_task::{ActivityCancelReason, ActivityTask, Start, activity_task},
25
+ },
26
+ temporal::api::{
27
+ common::v1::WorkflowExecution,
28
+ enums::v1::TimeoutType,
29
+ failure::v1::{Failure as APIFailure, TimeoutFailureInfo, failure},
32
30
  },
33
- worker::LocalActivitySlotKind,
34
31
  };
35
32
  use tokio::{
36
33
  sync::{
@@ -7,7 +7,7 @@ pub(crate) use local_activities::{
7
7
  };
8
8
 
9
9
  use crate::{
10
- PollError, TaskToken,
10
+ TaskToken,
11
11
  abstractions::{
12
12
  ClosableMeteredPermitDealer, MeteredPermitDealer, TrackedOwnedMeteredSemPermit,
13
13
  UsedMeteredSemPermit,
@@ -17,6 +17,7 @@ use crate::{
17
17
  MetricsContext, activity_type, eager, should_record_failure_metric, workflow_type,
18
18
  },
19
19
  worker::{
20
+ ActivitySlotKind, PollError,
20
21
  activities::activity_heartbeat_manager::ActivityHeartbeatError, client::WorkerClient,
21
22
  },
22
23
  };
@@ -35,21 +36,16 @@ use std::{
35
36
  },
36
37
  time::{Duration, Instant, SystemTime},
37
38
  };
38
- use temporalio_common::{
39
- protos::{
40
- coresdk::{
41
- ActivityHeartbeat, ActivitySlotInfo,
42
- activity_result::{self as ar, activity_execution_result as aer},
43
- activity_task::{ActivityCancelReason, ActivityCancellationDetails, ActivityTask},
44
- },
45
- temporal::api::{
46
- failure::v1::{
47
- ApplicationFailureInfo, CanceledFailureInfo, Failure, failure::FailureInfo,
48
- },
49
- workflowservice::v1::PollActivityTaskQueueResponse,
50
- },
39
+ use temporalio_common::protos::{
40
+ coresdk::{
41
+ ActivityHeartbeat, ActivitySlotInfo,
42
+ activity_result::{self as ar, activity_execution_result as aer},
43
+ activity_task::{ActivityCancelReason, ActivityCancellationDetails, ActivityTask},
44
+ },
45
+ temporal::api::{
46
+ failure::v1::{ApplicationFailureInfo, CanceledFailureInfo, Failure, failure::FailureInfo},
47
+ workflowservice::v1::PollActivityTaskQueueResponse,
51
48
  },
52
- worker::ActivitySlotKind,
53
49
  };
54
50
  use tokio::{
55
51
  join,
@@ -737,12 +733,10 @@ mod tests {
737
733
  abstractions::tests::fixed_size_permit_dealer,
738
734
  pollers::{ActivityTaskOptions, LongPollBuffer},
739
735
  prost_dur,
740
- worker::client::mocks::mock_worker_client,
736
+ worker::{PollerBehavior, client::mocks::mock_worker_client},
741
737
  };
742
738
  use crossbeam_utils::atomic::AtomicCell;
743
- use temporalio_common::{
744
- protos::coresdk::activity_result::ActivityExecutionResult, worker::PollerBehavior,
745
- };
739
+ use temporalio_common::protos::coresdk::activity_result::ActivityExecutionResult;
746
740
 
747
741
  #[tokio::test]
748
742
  async fn per_worker_ratelimit() {
@@ -787,6 +781,7 @@ mod tests {
787
781
  max_tps: None,
788
782
  },
789
783
  Arc::new(AtomicCell::new(None)),
784
+ Arc::new(AtomicBool::new(false)),
790
785
  );
791
786
  let atm = WorkerActivityTasks::new(
792
787
  sem.clone(),
@@ -879,6 +874,7 @@ mod tests {
879
874
  max_tps: None,
880
875
  },
881
876
  Arc::new(AtomicCell::new(None)),
877
+ Arc::new(AtomicBool::new(false)),
882
878
  );
883
879
  let atm = WorkerActivityTasks::new(
884
880
  sem.clone(),
@@ -953,6 +949,7 @@ mod tests {
953
949
  max_tps: None,
954
950
  },
955
951
  Arc::new(AtomicCell::new(None)),
952
+ Arc::new(AtomicBool::new(false)),
956
953
  );
957
954
  let atm = WorkerActivityTasks::new(
958
955
  sem.clone(),
@@ -30,12 +30,13 @@ pub fn mock_worker_client() -> MockWorkerClient {
30
30
  .returning(|| DEFAULT_WORKERS_REGISTRY.clone());
31
31
  r.expect_is_mock().returning(|| true);
32
32
  r.expect_shutdown_worker()
33
- .returning(|_, _| Ok(ShutdownWorkerResponse {}));
33
+ .returning(|_, _, _, _| Ok(ShutdownWorkerResponse {}));
34
34
  r.expect_sdk_name_and_version()
35
35
  .returning(|| ("test-core".to_string(), "0.0.0".to_string()));
36
36
  r.expect_identity()
37
37
  .returning(|| "test-identity".to_string());
38
38
  r.expect_worker_grouping_key().returning(Uuid::new_v4);
39
+ r.expect_worker_instance_key().returning(Uuid::new_v4);
39
40
  r.expect_set_heartbeat_client_fields().returning(|hb| {
40
41
  hb.sdk_name = "test-core".to_string();
41
42
  hb.sdk_version = "0.0.0".to_string();
@@ -54,11 +55,13 @@ pub(crate) fn mock_manual_worker_client() -> MockManualWorkerClient {
54
55
  .returning(|| DEFAULT_WORKERS_REGISTRY.clone());
55
56
  r.expect_is_mock().returning(|| true);
56
57
  r.expect_shutdown_worker()
57
- .returning(|_, _| async { Ok(ShutdownWorkerResponse {}) }.boxed());
58
+ .returning(|_, _, _, _| async { Ok(ShutdownWorkerResponse {}) }.boxed());
58
59
  r.expect_sdk_name_and_version()
59
60
  .returning(|| ("test-core".to_string(), "0.0.0".to_string()));
60
61
  r.expect_identity()
61
62
  .returning(|| "test-identity".to_string());
63
+ r.expect_worker_grouping_key().returning(Uuid::new_v4);
64
+ r.expect_worker_instance_key().returning(Uuid::new_v4);
62
65
  r
63
66
  }
64
67
 
@@ -126,7 +129,7 @@ mockall::mock! {
126
129
  fn fail_nexus_task<'a, 'b>(
127
130
  &self,
128
131
  task_token: TaskToken,
129
- error: nexus::v1::HandlerError,
132
+ error: NexusTaskFailure,
130
133
  ) -> impl Future<Output = Result<RespondNexusTaskFailedResponse>> + Send + 'b
131
134
  where 'a: 'b, Self: 'b;
132
135
 
@@ -156,7 +159,7 @@ mockall::mock! {
156
159
  impl Future<Output = Result<DescribeNamespaceResponse>> + Send + 'b
157
160
  where 'a: 'b, Self: 'b;
158
161
 
159
- fn shutdown_worker<'a, 'b>(&self, sticky_task_queue: String, worker_heartbeat: Option<WorkerHeartbeat>) -> impl Future<Output = Result<ShutdownWorkerResponse>> + Send + 'b
162
+ fn shutdown_worker<'a, 'b>(&self, sticky_task_queue: String, task_queue: String, task_queue_types: Vec<TaskQueueType>, worker_heartbeat: Option<WorkerHeartbeat>) -> impl Future<Output = Result<ShutdownWorkerResponse>> + Send + 'b
160
163
  where 'a: 'b, Self: 'b;
161
164
 
162
165
  fn record_worker_heartbeat<'a, 'b>(
@@ -165,13 +168,14 @@ mockall::mock! {
165
168
  heartbeat: Vec<WorkerHeartbeat>
166
169
  ) -> impl Future<Output = Result<RecordWorkerHeartbeatResponse>> + Send + 'b where 'a: 'b, Self: 'b;
167
170
 
168
- fn replace_client(&self, new_client: Client);
171
+ fn replace_connection(&self, new_connection: Connection);
169
172
  fn capabilities(&self) -> Option<Capabilities>;
170
173
  fn workers(&self) -> Arc<ClientWorkerSet>;
171
174
  fn is_mock(&self) -> bool;
172
175
  fn sdk_name_and_version(&self) -> (String, String);
173
176
  fn identity(&self) -> String;
174
177
  fn worker_grouping_key(&self) -> Uuid;
178
+ fn worker_instance_key(&self) -> Uuid;
175
179
  fn set_heartbeat_client_fields(&self, heartbeat: &mut WorkerHeartbeat);
176
180
  }
177
181
  }