@temporalio/core-bridge 1.9.2 → 1.10.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 (177) hide show
  1. package/Cargo.lock +754 -473
  2. package/Cargo.toml +3 -3
  3. package/lib/index.d.ts +33 -2
  4. package/lib/index.js.map +1 -1
  5. package/package.json +4 -4
  6. package/releases/aarch64-apple-darwin/index.node +0 -0
  7. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  8. package/releases/x86_64-apple-darwin/index.node +0 -0
  9. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  10. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  11. package/scripts/build.js +4 -3
  12. package/sdk-core/.cargo/config.toml +2 -4
  13. package/sdk-core/.github/workflows/heavy.yml +1 -1
  14. package/sdk-core/.github/workflows/per-pr.yml +6 -4
  15. package/sdk-core/Cargo.toml +10 -3
  16. package/sdk-core/README.md +4 -6
  17. package/sdk-core/client/Cargo.toml +13 -5
  18. package/sdk-core/client/src/lib.rs +123 -34
  19. package/sdk-core/client/src/metrics.rs +70 -18
  20. package/sdk-core/client/src/proxy.rs +85 -0
  21. package/sdk-core/client/src/raw.rs +67 -5
  22. package/sdk-core/client/src/worker_registry/mod.rs +5 -3
  23. package/sdk-core/client/src/workflow_handle/mod.rs +3 -1
  24. package/sdk-core/core/Cargo.toml +31 -37
  25. package/sdk-core/core/src/abstractions/take_cell.rs +3 -3
  26. package/sdk-core/core/src/abstractions.rs +176 -108
  27. package/sdk-core/core/src/core_tests/activity_tasks.rs +4 -13
  28. package/sdk-core/core/src/core_tests/determinism.rs +2 -1
  29. package/sdk-core/core/src/core_tests/local_activities.rs +3 -3
  30. package/sdk-core/core/src/core_tests/mod.rs +3 -3
  31. package/sdk-core/core/src/core_tests/queries.rs +42 -5
  32. package/sdk-core/core/src/core_tests/workers.rs +2 -3
  33. package/sdk-core/core/src/core_tests/workflow_tasks.rs +115 -15
  34. package/sdk-core/core/src/ephemeral_server/mod.rs +109 -136
  35. package/sdk-core/core/src/internal_flags.rs +8 -8
  36. package/sdk-core/core/src/lib.rs +16 -11
  37. package/sdk-core/core/src/pollers/mod.rs +11 -5
  38. package/sdk-core/core/src/pollers/poll_buffer.rs +48 -29
  39. package/sdk-core/core/src/protosext/mod.rs +32 -32
  40. package/sdk-core/core/src/protosext/protocol_messages.rs +14 -24
  41. package/sdk-core/core/src/retry_logic.rs +2 -2
  42. package/sdk-core/core/src/telemetry/log_export.rs +10 -9
  43. package/sdk-core/core/src/telemetry/metrics.rs +233 -330
  44. package/sdk-core/core/src/telemetry/mod.rs +11 -38
  45. package/sdk-core/core/src/telemetry/otel.rs +355 -0
  46. package/sdk-core/core/src/telemetry/prometheus_server.rs +36 -23
  47. package/sdk-core/core/src/test_help/mod.rs +80 -59
  48. package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +6 -6
  49. package/sdk-core/core/src/worker/activities/local_activities.rs +46 -43
  50. package/sdk-core/core/src/worker/activities.rs +45 -46
  51. package/sdk-core/core/src/worker/client/mocks.rs +8 -7
  52. package/sdk-core/core/src/worker/client.rs +40 -39
  53. package/sdk-core/core/src/worker/mod.rs +72 -42
  54. package/sdk-core/core/src/worker/slot_provider.rs +28 -28
  55. package/sdk-core/core/src/worker/slot_supplier.rs +1 -0
  56. package/sdk-core/core/src/worker/tuner/fixed_size.rs +52 -0
  57. package/sdk-core/core/src/worker/tuner/resource_based.rs +561 -0
  58. package/sdk-core/core/src/worker/tuner.rs +122 -0
  59. package/sdk-core/core/src/worker/workflow/driven_workflow.rs +6 -6
  60. package/sdk-core/core/src/worker/workflow/history_update.rs +27 -53
  61. package/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +4 -17
  62. package/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +1 -10
  63. package/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +4 -11
  64. package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +17 -35
  65. package/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +0 -8
  66. package/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +1 -5
  67. package/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +0 -5
  68. package/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +0 -5
  69. package/sdk-core/core/src/worker/workflow/machines/mod.rs +0 -14
  70. package/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +0 -5
  71. package/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +0 -5
  72. package/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +1 -10
  73. package/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +3 -10
  74. package/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +12 -8
  75. package/sdk-core/core/src/worker/workflow/machines/update_state_machine.rs +0 -10
  76. package/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +6 -13
  77. package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +27 -37
  78. package/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +3 -14
  79. package/sdk-core/core/src/worker/workflow/managed_run.rs +84 -54
  80. package/sdk-core/core/src/worker/workflow/mod.rs +63 -160
  81. package/sdk-core/core/src/worker/workflow/run_cache.rs +22 -13
  82. package/sdk-core/core/src/worker/workflow/wft_extraction.rs +16 -3
  83. package/sdk-core/core/src/worker/workflow/wft_poller.rs +15 -12
  84. package/sdk-core/core/src/worker/workflow/workflow_stream.rs +39 -78
  85. package/sdk-core/core-api/Cargo.toml +6 -5
  86. package/sdk-core/core-api/src/errors.rs +8 -0
  87. package/sdk-core/core-api/src/telemetry/metrics.rs +75 -4
  88. package/sdk-core/core-api/src/telemetry.rs +7 -1
  89. package/sdk-core/core-api/src/worker.rs +212 -56
  90. package/sdk-core/fsm/Cargo.toml +3 -0
  91. package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +1 -1
  92. package/sdk-core/sdk/Cargo.toml +5 -7
  93. package/sdk-core/sdk/src/app_data.rs +3 -3
  94. package/sdk-core/sdk/src/lib.rs +5 -3
  95. package/sdk-core/sdk/src/workflow_context/options.rs +1 -1
  96. package/sdk-core/sdk/src/workflow_context.rs +10 -9
  97. package/sdk-core/sdk/src/workflow_future.rs +1 -1
  98. package/sdk-core/sdk-core-protos/Cargo.toml +8 -6
  99. package/sdk-core/sdk-core-protos/build.rs +1 -10
  100. package/sdk-core/sdk-core-protos/protos/api_upstream/.github/PULL_REQUEST_TEMPLATE.md +3 -0
  101. package/sdk-core/sdk-core-protos/protos/api_upstream/.github/workflows/ci.yml +26 -0
  102. package/sdk-core/sdk-core-protos/protos/api_upstream/Makefile +42 -20
  103. package/sdk-core/sdk-core-protos/protos/api_upstream/README.md +2 -0
  104. package/sdk-core/sdk-core-protos/protos/api_upstream/api-linter.yaml +36 -26
  105. package/sdk-core/sdk-core-protos/protos/api_upstream/buf.lock +2 -0
  106. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/struct.proto +95 -0
  107. package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv2.json +9632 -0
  108. package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv3.yaml +7337 -0
  109. package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/payload_description.txt +2 -0
  110. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/command/v1/message.proto +45 -11
  111. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/common/v1/message.proto +22 -4
  112. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/command_type.proto +2 -0
  113. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/common.proto +44 -0
  114. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/event_type.proto +18 -3
  115. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +20 -0
  116. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +30 -0
  117. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/update.proto +7 -8
  118. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/workflow.proto +23 -5
  119. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/errordetails/v1/message.proto +20 -0
  120. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/failure/v1/message.proto +25 -0
  121. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/history/v1/message.proto +141 -15
  122. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/namespace/v1/message.proto +12 -0
  123. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/nexus/v1/message.proto +193 -0
  124. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +73 -6
  125. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +46 -4
  126. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/schedule/v1/message.proto +4 -0
  127. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/sdk/v1/workflow_metadata.proto +2 -2
  128. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +116 -0
  129. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflow/v1/message.proto +134 -0
  130. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +274 -29
  131. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +57 -1
  132. package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +10 -12
  133. package/sdk-core/sdk-core-protos/src/history_builder.rs +1 -1
  134. package/sdk-core/sdk-core-protos/src/lib.rs +54 -51
  135. package/sdk-core/sdk-core-protos/src/task_token.rs +11 -2
  136. package/sdk-core/test-utils/Cargo.toml +7 -4
  137. package/sdk-core/test-utils/src/histfetch.rs +1 -1
  138. package/sdk-core/test-utils/src/lib.rs +44 -62
  139. package/sdk-core/tests/fuzzy_workflow.rs +5 -2
  140. package/sdk-core/tests/heavy_tests.rs +114 -17
  141. package/sdk-core/tests/integ_tests/activity_functions.rs +1 -1
  142. package/sdk-core/tests/integ_tests/client_tests.rs +2 -2
  143. package/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +38 -26
  144. package/sdk-core/tests/integ_tests/metrics_tests.rs +126 -17
  145. package/sdk-core/tests/integ_tests/polling_tests.rs +118 -2
  146. package/sdk-core/tests/integ_tests/update_tests.rs +3 -5
  147. package/sdk-core/tests/integ_tests/visibility_tests.rs +3 -3
  148. package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +1 -1
  149. package/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +1 -1
  150. package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +1 -1
  151. package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +1 -1
  152. package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +3 -3
  153. package/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +5 -4
  154. package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +3 -2
  155. package/sdk-core/tests/integ_tests/workflow_tests/eager.rs +6 -10
  156. package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +9 -7
  157. package/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +1 -1
  158. package/sdk-core/tests/integ_tests/workflow_tests/patches.rs +14 -9
  159. package/sdk-core/tests/integ_tests/workflow_tests/resets.rs +1 -1
  160. package/sdk-core/tests/integ_tests/workflow_tests/signals.rs +6 -13
  161. package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +9 -6
  162. package/sdk-core/tests/integ_tests/workflow_tests/timers.rs +5 -5
  163. package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +1 -1
  164. package/sdk-core/tests/integ_tests/workflow_tests.rs +115 -11
  165. package/sdk-core/tests/main.rs +2 -2
  166. package/src/conversions.rs +57 -0
  167. package/src/lib.rs +1 -0
  168. package/src/runtime.rs +51 -35
  169. package/ts/index.ts +67 -3
  170. package/sdk-core/core/src/worker/workflow/workflow_stream/saved_wf_inputs.rs +0 -117
  171. package/sdk-core/core/src/worker/workflow/workflow_stream/tonic_status_serde.rs +0 -24
  172. package/sdk-core/sdk/src/payload_converter.rs +0 -11
  173. package/sdk-core/sdk-core-protos/protos/api_upstream/.buildkite/Dockerfile +0 -2
  174. package/sdk-core/sdk-core-protos/protos/api_upstream/.buildkite/docker-compose.yml +0 -15
  175. package/sdk-core/sdk-core-protos/protos/api_upstream/.buildkite/pipeline.yml +0 -10
  176. package/sdk-core/test-utils/src/wf_input_saver.rs +0 -50
  177. package/sdk-core/tests/wf_input_replay.rs +0 -32
@@ -6,10 +6,10 @@ use std::{
6
6
  time::{Duration, Instant},
7
7
  };
8
8
  use temporal_sdk_core_api::telemetry::metrics::{
9
- CoreMeter, Counter, Histogram, MetricAttributes, MetricKeyValue, MetricParameters,
9
+ CoreMeter, Counter, HistogramDuration, MetricAttributes, MetricKeyValue, MetricParameters,
10
10
  TemporalMeter,
11
11
  };
12
- use tonic::{body::BoxBody, transport::Channel};
12
+ use tonic::{body::BoxBody, transport::Channel, Code};
13
13
  use tower::Service;
14
14
 
15
15
  /// Used to track context associated with metrics, and record/update them
@@ -17,7 +17,7 @@ use tower::Service;
17
17
  // appropriate k/vs have already been set.
18
18
  #[derive(Clone, derive_more::DebugCustom)]
19
19
  #[debug(fmt = "MetricsContext {{ attribs: {kvs:?}, poll_is_long: {poll_is_long} }}")]
20
- pub struct MetricsContext {
20
+ pub(crate) struct MetricsContext {
21
21
  meter: Arc<dyn CoreMeter>,
22
22
  kvs: MetricAttributes,
23
23
  poll_is_long: bool,
@@ -27,8 +27,8 @@ pub struct MetricsContext {
27
27
  long_svc_request: Arc<dyn Counter>,
28
28
  long_svc_request_failed: Arc<dyn Counter>,
29
29
 
30
- svc_request_latency: Arc<dyn Histogram>,
31
- long_svc_request_latency: Arc<dyn Histogram>,
30
+ svc_request_latency: Arc<dyn HistogramDuration>,
31
+ long_svc_request_latency: Arc<dyn HistogramDuration>,
32
32
  }
33
33
 
34
34
  impl MetricsContext {
@@ -57,14 +57,14 @@ impl MetricsContext {
57
57
  description: "Count of long-poll request failures by rpc name".into(),
58
58
  unit: "".into(),
59
59
  }),
60
- svc_request_latency: meter.histogram(MetricParameters {
60
+ svc_request_latency: meter.histogram_duration(MetricParameters {
61
61
  name: "request_latency".into(),
62
- unit: "ms".into(),
62
+ unit: "duration".into(),
63
63
  description: "Histogram of client request latencies".into(),
64
64
  }),
65
- long_svc_request_latency: meter.histogram(MetricParameters {
65
+ long_svc_request_latency: meter.histogram_duration(MetricParameters {
66
66
  name: "long_request_latency".into(),
67
- unit: "ms".into(),
67
+ unit: "duration".into(),
68
68
  description: "Histogram of client long-poll request latencies".into(),
69
69
  }),
70
70
  meter,
@@ -92,22 +92,29 @@ impl MetricsContext {
92
92
  }
93
93
 
94
94
  /// A request to the temporal service failed
95
- pub(crate) fn svc_request_failed(&self) {
95
+ pub(crate) fn svc_request_failed(&self, code: Option<Code>) {
96
+ let refme: MetricAttributes;
97
+ let kvs = if let Some(c) = code {
98
+ refme = self
99
+ .meter
100
+ .extend_attributes(self.kvs.clone(), [status_code_kv(c)].into());
101
+ &refme
102
+ } else {
103
+ &self.kvs
104
+ };
96
105
  if self.poll_is_long {
97
- self.long_svc_request_failed.add(1, &self.kvs);
106
+ self.long_svc_request_failed.add(1, kvs);
98
107
  } else {
99
- self.svc_request_failed.add(1, &self.kvs);
108
+ self.svc_request_failed.add(1, kvs);
100
109
  }
101
110
  }
102
111
 
103
112
  /// Record service request latency
104
113
  pub(crate) fn record_svc_req_latency(&self, dur: Duration) {
105
114
  if self.poll_is_long {
106
- self.long_svc_request_latency
107
- .record(dur.as_millis() as u64, &self.kvs);
115
+ self.long_svc_request_latency.record(dur, &self.kvs);
108
116
  } else {
109
- self.svc_request_latency
110
- .record(dur.as_millis() as u64, &self.kvs);
117
+ self.svc_request_latency.record(dur, &self.kvs);
111
118
  }
112
119
  }
113
120
  }
@@ -115,6 +122,7 @@ impl MetricsContext {
115
122
  const KEY_NAMESPACE: &str = "namespace";
116
123
  const KEY_SVC_METHOD: &str = "operation";
117
124
  const KEY_TASK_QUEUE: &str = "task_queue";
125
+ const KEY_STATUS_CODE: &str = "status_code";
118
126
 
119
127
  pub(crate) fn namespace_kv(ns: String) -> MetricKeyValue {
120
128
  MetricKeyValue::new(KEY_NAMESPACE, ns)
@@ -128,12 +136,40 @@ pub(crate) fn svc_operation(op: String) -> MetricKeyValue {
128
136
  MetricKeyValue::new(KEY_SVC_METHOD, op)
129
137
  }
130
138
 
139
+ pub(crate) fn status_code_kv(code: Code) -> MetricKeyValue {
140
+ MetricKeyValue::new(KEY_STATUS_CODE, code_as_screaming_snake(&code))
141
+ }
142
+
143
+ /// This is done to match the way Java sdk labels these codes (and also matches gRPC spec)
144
+ fn code_as_screaming_snake(code: &Code) -> &'static str {
145
+ match code {
146
+ Code::Ok => "OK",
147
+ Code::Cancelled => "CANCELLED",
148
+ Code::Unknown => "UNKNOWN",
149
+ Code::InvalidArgument => "INVALID_ARGUMENT",
150
+ Code::DeadlineExceeded => "DEADLINE_EXCEEDED",
151
+ Code::NotFound => "NOT_FOUND",
152
+ Code::AlreadyExists => "ALREADY_EXISTS",
153
+ Code::PermissionDenied => "PERMISSION_DENIED",
154
+ Code::ResourceExhausted => "RESOURCE_EXHAUSTED",
155
+ Code::FailedPrecondition => "FAILED_PRECONDITION",
156
+ Code::Aborted => "ABORTED",
157
+ Code::OutOfRange => "OUT_OF_RANGE",
158
+ Code::Unimplemented => "UNIMPLEMENTED",
159
+ Code::Internal => "INTERNAL",
160
+ Code::Unavailable => "UNAVAILABLE",
161
+ Code::DataLoss => "DATA_LOSS",
162
+ Code::Unauthenticated => "UNAUTHENTICATED",
163
+ }
164
+ }
165
+
131
166
  /// Implements metrics functionality for gRPC (really, any http) calls
132
167
  #[derive(Debug, Clone)]
133
168
  pub struct GrpcMetricSvc {
134
169
  pub(crate) inner: Channel,
135
170
  // If set to none, metrics are a no-op
136
171
  pub(crate) metrics: Option<MetricsContext>,
172
+ pub(crate) disable_errcode_label: bool,
137
173
  }
138
174
 
139
175
  impl Service<http::Request<BoxBody>> for GrpcMetricSvc {
@@ -169,13 +205,29 @@ impl Service<http::Request<BoxBody>> for GrpcMetricSvc {
169
205
  })
170
206
  });
171
207
  let callfut = self.inner.call(req);
208
+ let errcode_label_disabled = self.disable_errcode_label;
172
209
  async move {
173
210
  let started = Instant::now();
174
211
  let res = callfut.await;
175
212
  if let Some(metrics) = metrics {
176
213
  metrics.record_svc_req_latency(started.elapsed());
177
- if res.is_err() {
178
- metrics.svc_request_failed();
214
+ if let Ok(ref ok_res) = res {
215
+ if let Some(number) = ok_res
216
+ .headers()
217
+ .get("grpc-status")
218
+ .and_then(|s| s.to_str().ok())
219
+ .and_then(|s| s.parse::<i32>().ok())
220
+ {
221
+ let code = Code::from(number);
222
+ if code != Code::Ok {
223
+ let code = if errcode_label_disabled {
224
+ None
225
+ } else {
226
+ Some(code)
227
+ };
228
+ metrics.svc_request_failed(code);
229
+ }
230
+ }
179
231
  }
180
232
  }
181
233
  res
@@ -0,0 +1,85 @@
1
+ use base64::prelude::*;
2
+ use hyper::header;
3
+ use std::future::Future;
4
+ use std::pin::Pin;
5
+ use std::task::Context;
6
+ use std::task::Poll;
7
+ use tokio::net::TcpStream;
8
+ use tonic::transport::Channel;
9
+ use tonic::transport::Endpoint;
10
+ use tower::{service_fn, Service};
11
+
12
+ /// Options for HTTP CONNECT proxy.
13
+ #[derive(Clone, Debug)]
14
+ pub struct HttpConnectProxyOptions {
15
+ /// The host:port to proxy through.
16
+ pub target_addr: String,
17
+ /// Optional HTTP basic auth for the proxy as user/pass tuple.
18
+ pub basic_auth: Option<(String, String)>,
19
+ }
20
+
21
+ impl HttpConnectProxyOptions {
22
+ /// Create a channel from the given endpoint that uses the HTTP CONNECT proxy.
23
+ pub async fn connect_endpoint(
24
+ &self,
25
+ endpoint: &Endpoint,
26
+ ) -> Result<Channel, tonic::transport::Error> {
27
+ let proxy_options = self.clone();
28
+ let svc_fn = service_fn(move |uri: tonic::transport::Uri| {
29
+ let proxy_options = proxy_options.clone();
30
+ async move { proxy_options.connect(uri).await }
31
+ });
32
+ endpoint.connect_with_connector(svc_fn).await
33
+ }
34
+
35
+ async fn connect(
36
+ &self,
37
+ uri: tonic::transport::Uri,
38
+ ) -> anyhow::Result<hyper::upgrade::Upgraded> {
39
+ debug!("Connecting to {} via proxy at {}", uri, self.target_addr);
40
+ // Create CONNECT request
41
+ let mut req_build = hyper::Request::builder().method("CONNECT").uri(uri);
42
+ if let Some((user, pass)) = &self.basic_auth {
43
+ let creds = BASE64_STANDARD.encode(format!("{}:{}", user, pass));
44
+ req_build = req_build.header(header::PROXY_AUTHORIZATION, format!("Basic {}", creds));
45
+ }
46
+ let req = req_build.body(hyper::Body::empty())?;
47
+
48
+ // We have to create a client with a specific connector because Hyper is
49
+ // not letting us change the HTTP/2 authority
50
+ let client =
51
+ hyper::Client::builder().build(OverrideAddrConnector(self.target_addr.clone()));
52
+
53
+ // Send request
54
+ let res = client.request(req).await?;
55
+ if res.status().is_success() {
56
+ Ok(hyper::upgrade::on(res).await?)
57
+ } else {
58
+ Err(anyhow::anyhow!(
59
+ "CONNECT call failed with status: {}",
60
+ res.status()
61
+ ))
62
+ }
63
+ }
64
+ }
65
+
66
+ #[derive(Clone)]
67
+ struct OverrideAddrConnector(String);
68
+
69
+ impl Service<hyper::Uri> for OverrideAddrConnector {
70
+ type Response = TcpStream;
71
+
72
+ type Error = anyhow::Error;
73
+
74
+ type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send>>;
75
+
76
+ fn poll_ready(&mut self, _ctx: &mut Context<'_>) -> Poll<anyhow::Result<()>> {
77
+ Poll::Ready(Ok(()))
78
+ }
79
+
80
+ fn call(&mut self, _uri: hyper::Uri) -> Self::Future {
81
+ let target_addr = self.0.clone();
82
+ let fut = async move { Ok(TcpStream::connect(target_addr).await?) };
83
+ Box::pin(fut)
84
+ }
85
+ }
@@ -299,19 +299,19 @@ pub(super) struct AttachMetricLabels {
299
299
  pub(super) labels: Vec<MetricKeyValue>,
300
300
  }
301
301
  impl AttachMetricLabels {
302
- pub fn new(kvs: impl Into<Vec<MetricKeyValue>>) -> Self {
302
+ pub(super) fn new(kvs: impl Into<Vec<MetricKeyValue>>) -> Self {
303
303
  Self { labels: kvs.into() }
304
304
  }
305
- pub fn namespace(ns: impl Into<String>) -> Self {
305
+ pub(super) fn namespace(ns: impl Into<String>) -> Self {
306
306
  AttachMetricLabels::new(vec![namespace_kv(ns.into())])
307
307
  }
308
- pub fn task_q(&mut self, tq: Option<TaskQueue>) -> &mut Self {
308
+ pub(super) fn task_q(&mut self, tq: Option<TaskQueue>) -> &mut Self {
309
309
  if let Some(tq) = tq {
310
310
  self.task_q_str(tq.name);
311
311
  }
312
312
  self
313
313
  }
314
- pub fn task_q_str(&mut self, tq: impl Into<String>) -> &mut Self {
314
+ pub(super) fn task_q_str(&mut self, tq: impl Into<String>) -> &mut Self {
315
315
  self.labels.push(task_queue_kv(tq.into()));
316
316
  self
317
317
  }
@@ -968,6 +968,63 @@ proxier! {
968
968
  r.extensions_mut().insert(labels);
969
969
  }
970
970
  );
971
+ (
972
+ execute_multi_operation,
973
+ ExecuteMultiOperationRequest,
974
+ ExecuteMultiOperationResponse,
975
+ |r| {
976
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
977
+ r.extensions_mut().insert(labels);
978
+ }
979
+ );
980
+ (
981
+ get_worker_versioning_rules,
982
+ GetWorkerVersioningRulesRequest,
983
+ GetWorkerVersioningRulesResponse,
984
+ |r| {
985
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
986
+ labels.task_q_str(&r.get_ref().task_queue);
987
+ r.extensions_mut().insert(labels);
988
+ }
989
+ );
990
+ (
991
+ update_worker_versioning_rules,
992
+ UpdateWorkerVersioningRulesRequest,
993
+ UpdateWorkerVersioningRulesResponse,
994
+ |r| {
995
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
996
+ labels.task_q_str(&r.get_ref().task_queue);
997
+ r.extensions_mut().insert(labels);
998
+ }
999
+ );
1000
+ (
1001
+ poll_nexus_task_queue,
1002
+ PollNexusTaskQueueRequest,
1003
+ PollNexusTaskQueueResponse,
1004
+ |r| {
1005
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
1006
+ labels.task_q(r.get_ref().task_queue.clone());
1007
+ r.extensions_mut().insert(labels);
1008
+ }
1009
+ );
1010
+ (
1011
+ respond_nexus_task_completed,
1012
+ RespondNexusTaskCompletedRequest,
1013
+ RespondNexusTaskCompletedResponse,
1014
+ |r| {
1015
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
1016
+ r.extensions_mut().insert(labels);
1017
+ }
1018
+ );
1019
+ (
1020
+ respond_nexus_task_failed,
1021
+ RespondNexusTaskFailedRequest,
1022
+ RespondNexusTaskFailedResponse,
1023
+ |r| {
1024
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
1025
+ r.extensions_mut().insert(labels);
1026
+ }
1027
+ );
971
1028
  }
972
1029
 
973
1030
  proxier! {
@@ -984,6 +1041,11 @@ proxier! {
984
1041
  (add_or_update_remote_cluster, AddOrUpdateRemoteClusterRequest, AddOrUpdateRemoteClusterResponse);
985
1042
  (remove_remote_cluster, RemoveRemoteClusterRequest, RemoveRemoteClusterResponse);
986
1043
  (list_clusters, ListClustersRequest, ListClustersResponse);
1044
+ (get_nexus_endpoint, GetNexusEndpointRequest, GetNexusEndpointResponse);
1045
+ (create_nexus_endpoint, CreateNexusEndpointRequest, CreateNexusEndpointResponse);
1046
+ (update_nexus_endpoint, UpdateNexusEndpointRequest, UpdateNexusEndpointResponse);
1047
+ (delete_nexus_endpoint, DeleteNexusEndpointRequest, DeleteNexusEndpointResponse);
1048
+ (list_nexus_endpoints, ListNexusEndpointsRequest, ListNexusEndpointsResponse);
987
1049
  }
988
1050
 
989
1051
  proxier! {
@@ -1015,7 +1077,7 @@ mod tests {
1015
1077
  #[allow(dead_code)]
1016
1078
  async fn raw_client_retry_compiles() {
1017
1079
  let opts = ClientOptionsBuilder::default().build().unwrap();
1018
- let raw_client = opts.connect_no_namespace(None, None).await.unwrap();
1080
+ let raw_client = opts.connect_no_namespace(None).await.unwrap();
1019
1081
  let mut retry_client = RetryClient::new(raw_client, opts.retry_config);
1020
1082
 
1021
1083
  let list_ns_req = ListNamespacesRequest::default();
@@ -95,9 +95,11 @@ impl SlotManagerImpl {
95
95
  }
96
96
  }
97
97
 
98
- fn unregister(&mut self, id: WorkerKey) {
98
+ fn unregister(&mut self, id: WorkerKey) -> Option<Box<dyn SlotProvider + Send + Sync>> {
99
99
  if let Some(key) = self.index.remove(id) {
100
- self.providers.remove(&key);
100
+ self.providers.remove(&key)
101
+ } else {
102
+ None
101
103
  }
102
104
  }
103
105
 
@@ -140,7 +142,7 @@ impl SlotManager {
140
142
  }
141
143
 
142
144
  /// Unregister a provider, typically when its worker starts shutdown.
143
- pub fn unregister(&self, id: WorkerKey) {
145
+ pub fn unregister(&self, id: WorkerKey) -> Option<Box<dyn SlotProvider + Send + Sync>> {
144
146
  self.manager.write().unregister(id)
145
147
  }
146
148
 
@@ -75,7 +75,7 @@ impl WorkflowExecutionInfo {
75
75
  }
76
76
 
77
77
  /// A workflow handle to a workflow with unknown types. Uses raw payloads.
78
- pub type UntypedWorkflowHandle<CT> = WorkflowHandle<CT, Vec<Payload>>;
78
+ pub(crate) type UntypedWorkflowHandle<CT> = WorkflowHandle<CT, Vec<Payload>>;
79
79
 
80
80
  impl<CT, RT> WorkflowHandle<CT, RT>
81
81
  where
@@ -91,10 +91,12 @@ where
91
91
  }
92
92
  }
93
93
 
94
+ /// Get the workflow execution info
94
95
  pub fn info(&self) -> &WorkflowExecutionInfo {
95
96
  &self.info
96
97
  }
97
98
 
99
+ /// Await the result of the workflow execution
98
100
  pub async fn get_workflow_result(
99
101
  &self,
100
102
  opts: GetWorkflowResultOpts,
@@ -13,69 +13,65 @@ categories = ["development-tools"]
13
13
  [lib]
14
14
 
15
15
  [features]
16
- default = []
17
- # Do not enable this feature when building production SDKs. If we ever want a user in the field to
18
- # record WF input data, we can build them a custom SDK or they can build - it adds significant extra
19
- # code size in the form of [de]serializers.
20
- save_wf_inputs = ["rmp-serde", "temporal-sdk-core-protos/serde_serialize"]
16
+ default = ["otel"]
17
+ otel = ["dep:opentelemetry", "dep:opentelemetry_sdk", "dep:opentelemetry-otlp",
18
+ "dep:opentelemetry-prometheus", "dep:hyper", "dep:hyper-util", "dep:http-body-util"]
21
19
  tokio-console = ["console-subscriber"]
22
20
  ephemeral-server = ["dep:flate2", "dep:nix", "dep:reqwest", "dep:tar", "dep:zip"]
23
21
 
24
22
  [dependencies]
25
23
  anyhow = "1.0"
26
- arc-swap = "1.3"
27
24
  async-trait = "0.1"
28
- base64 = "0.21"
29
- console-subscriber = { version = "0.1", optional = true }
25
+ console-subscriber = { version = "0.2", optional = true }
30
26
  crossbeam-channel = "0.5"
31
27
  crossbeam-queue = "0.3"
28
+ crossbeam-utils = "0.8"
32
29
  dashmap = "5.5"
33
- derive_builder = "0.12"
30
+ derive_builder = { workspace = true }
34
31
  derive_more = { workspace = true }
35
32
  enum_dispatch = "0.3"
36
- enum-iterator = "1.4"
33
+ enum-iterator = "2"
37
34
  flate2 = { version = "1.0", optional = true }
38
35
  futures = "0.3"
39
36
  futures-util = "0.3"
40
37
  governor = "0.6"
41
- http = "0.2"
42
- hyper = "0.14"
43
- itertools = "0.11"
44
- lazy_static = "1.4"
45
- lru = "0.11"
46
- mockall = "0.11"
47
- nix = { version = "0.27", optional = true, features = ["process", "signal"] }
48
- once_cell = "1.5"
49
- opentelemetry = { workspace = true, features = ["metrics"] }
50
- opentelemetry_sdk = { version = "0.21", features = ["rt-tokio", "metrics"] }
51
- opentelemetry-otlp = { version = "0.14", features = ["tokio", "metrics"] }
52
- opentelemetry-prometheus = "0.14"
38
+ http-body-util = { version = "0.1", optional = true }
39
+ hyper = { version = "1.2", optional = true }
40
+ hyper-util = { version = "0.1", features = ["server", "http1", "http2", "tokio"], optional = true }
41
+ itertools = "0.12"
42
+ lru = "0.12"
43
+ mockall = "0.12"
44
+ nix = { version = "0.28", optional = true, features = ["process", "signal"] }
45
+ once_cell = { workspace = true }
46
+ opentelemetry = { workspace = true, features = ["metrics"], optional = true }
47
+ opentelemetry_sdk = { version = "0.22", features = ["rt-tokio", "metrics"], optional = true }
48
+ opentelemetry-otlp = { version = "0.15", features = ["tokio", "metrics"], optional = true }
49
+ opentelemetry-prometheus = { version = "0.15", optional = true }
53
50
  parking_lot = { version = "0.12", features = ["send_guard"] }
51
+ pid = "4.0"
54
52
  pin-project = "1.0"
55
53
  prometheus = "0.13"
56
- prost = "0.11"
57
- prost-types = { version = "0.4", package = "prost-wkt-types" }
54
+ prost = { workspace = true }
55
+ prost-types = { version = "0.5", package = "prost-wkt-types" }
58
56
  rand = "0.8.3"
59
- reqwest = { version = "0.11", features = ["json", "stream", "rustls-tls", "tokio-rustls"], default-features = false, optional = true }
60
- ringbuf = "0.3"
61
- rmp-serde = { version = "1.1", optional = true }
57
+ reqwest = { version = "0.11", features = ["json", "stream", "rustls-tls"], default-features = false, optional = true }
58
+ ringbuf = "0.4"
62
59
  serde = "1.0"
63
60
  serde_json = "1.0"
64
61
  siphasher = "1.0"
65
62
  slotmap = "1.0"
63
+ sysinfo = "0.30"
66
64
  tar = { version = "0.4", optional = true }
67
65
  thiserror = "1.0"
68
- tokio = { version = "1.26", features = ["rt", "rt-multi-thread", "parking_lot", "time", "fs", "process"] }
66
+ tokio = { version = "1.37", features = ["rt", "rt-multi-thread", "parking_lot", "time", "fs", "process"] }
69
67
  tokio-util = { version = "0.7", features = ["io", "io-util"] }
70
68
  tokio-stream = "0.1"
71
69
  tonic = { workspace = true, features = ["tls", "tls-roots"] }
72
70
  tracing = "0.1"
73
- tracing-futures = "0.2"
74
71
  tracing-subscriber = { version = "0.3", features = ["parking_lot", "env-filter", "registry"] }
75
72
  url = "2.2"
76
73
  uuid = { version = "1.1", features = ["v4"] }
77
- zip = { version = "0.6.3", optional = true }
78
- log = "0.4.20"
74
+ zip = { version = "1.2", optional = true }
79
75
 
80
76
  # 1st party local deps
81
77
  [dependencies.temporal-sdk-core-api]
@@ -97,7 +93,8 @@ assert_matches = "1.4"
97
93
  bimap = "0.6.1"
98
94
  clap = { version = "4.0", features = ["derive"] }
99
95
  criterion = "0.5"
100
- rstest = "0.18"
96
+ rstest = "0.19.0"
97
+ sysinfo = "0.30"
101
98
  temporal-sdk-core-test-utils = { path = "../test-utils" }
102
99
  temporal-sdk = { path = "../sdk" }
103
100
 
@@ -115,7 +112,6 @@ test = false
115
112
  name = "heavy_tests"
116
113
  path = "../tests/heavy_tests.rs"
117
114
  test = false
118
- required-features = ["save_wf_inputs"]
119
115
 
120
116
  [[bench]]
121
117
  name = "workflow_replay"
@@ -127,7 +123,5 @@ harness = false
127
123
  name = "integ_runner"
128
124
  path = "../tests/runner.rs"
129
125
 
130
- [[example]]
131
- name = "wf_input_replay"
132
- path = "../tests/wf_input_replay.rs"
133
- required-features = ["save_wf_inputs"]
126
+ [lints]
127
+ workspace = true
@@ -4,13 +4,13 @@ use std::sync::atomic::{AtomicBool, Ordering};
4
4
  /// Implements something a bit like a `OnceCell`, but starts already initialized and allows you
5
5
  /// to take everything out of it only once in a thread-safe way. This isn't optimized for super
6
6
  /// fast-path usage.
7
- pub struct TakeCell<T> {
7
+ pub(crate) struct TakeCell<T> {
8
8
  taken: AtomicBool,
9
9
  data: Mutex<Option<T>>,
10
10
  }
11
11
 
12
12
  impl<T> TakeCell<T> {
13
- pub fn new(val: T) -> Self {
13
+ pub(crate) fn new(val: T) -> Self {
14
14
  Self {
15
15
  taken: AtomicBool::new(false),
16
16
  data: Mutex::new(Some(val)),
@@ -18,7 +18,7 @@ impl<T> TakeCell<T> {
18
18
  }
19
19
 
20
20
  /// If the cell has not already been taken from, takes the value and returns it
21
- pub fn take_once(&self) -> Option<T> {
21
+ pub(crate) fn take_once(&self) -> Option<T> {
22
22
  if self.taken.load(Ordering::Acquire) {
23
23
  return None;
24
24
  }