@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.
- package/Cargo.lock +754 -473
- package/Cargo.toml +3 -3
- package/lib/index.d.ts +33 -2
- package/lib/index.js.map +1 -1
- package/package.json +4 -4
- package/releases/aarch64-apple-darwin/index.node +0 -0
- package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
- package/releases/x86_64-apple-darwin/index.node +0 -0
- package/releases/x86_64-pc-windows-msvc/index.node +0 -0
- package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
- package/scripts/build.js +4 -3
- package/sdk-core/.cargo/config.toml +2 -4
- package/sdk-core/.github/workflows/heavy.yml +1 -1
- package/sdk-core/.github/workflows/per-pr.yml +6 -4
- package/sdk-core/Cargo.toml +10 -3
- package/sdk-core/README.md +4 -6
- package/sdk-core/client/Cargo.toml +13 -5
- package/sdk-core/client/src/lib.rs +123 -34
- package/sdk-core/client/src/metrics.rs +70 -18
- package/sdk-core/client/src/proxy.rs +85 -0
- package/sdk-core/client/src/raw.rs +67 -5
- package/sdk-core/client/src/worker_registry/mod.rs +5 -3
- package/sdk-core/client/src/workflow_handle/mod.rs +3 -1
- package/sdk-core/core/Cargo.toml +31 -37
- package/sdk-core/core/src/abstractions/take_cell.rs +3 -3
- package/sdk-core/core/src/abstractions.rs +176 -108
- package/sdk-core/core/src/core_tests/activity_tasks.rs +4 -13
- package/sdk-core/core/src/core_tests/determinism.rs +2 -1
- package/sdk-core/core/src/core_tests/local_activities.rs +3 -3
- package/sdk-core/core/src/core_tests/mod.rs +3 -3
- package/sdk-core/core/src/core_tests/queries.rs +42 -5
- package/sdk-core/core/src/core_tests/workers.rs +2 -3
- package/sdk-core/core/src/core_tests/workflow_tasks.rs +115 -15
- package/sdk-core/core/src/ephemeral_server/mod.rs +109 -136
- package/sdk-core/core/src/internal_flags.rs +8 -8
- package/sdk-core/core/src/lib.rs +16 -11
- package/sdk-core/core/src/pollers/mod.rs +11 -5
- package/sdk-core/core/src/pollers/poll_buffer.rs +48 -29
- package/sdk-core/core/src/protosext/mod.rs +32 -32
- package/sdk-core/core/src/protosext/protocol_messages.rs +14 -24
- package/sdk-core/core/src/retry_logic.rs +2 -2
- package/sdk-core/core/src/telemetry/log_export.rs +10 -9
- package/sdk-core/core/src/telemetry/metrics.rs +233 -330
- package/sdk-core/core/src/telemetry/mod.rs +11 -38
- package/sdk-core/core/src/telemetry/otel.rs +355 -0
- package/sdk-core/core/src/telemetry/prometheus_server.rs +36 -23
- package/sdk-core/core/src/test_help/mod.rs +80 -59
- package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +6 -6
- package/sdk-core/core/src/worker/activities/local_activities.rs +46 -43
- package/sdk-core/core/src/worker/activities.rs +45 -46
- package/sdk-core/core/src/worker/client/mocks.rs +8 -7
- package/sdk-core/core/src/worker/client.rs +40 -39
- package/sdk-core/core/src/worker/mod.rs +72 -42
- package/sdk-core/core/src/worker/slot_provider.rs +28 -28
- package/sdk-core/core/src/worker/slot_supplier.rs +1 -0
- package/sdk-core/core/src/worker/tuner/fixed_size.rs +52 -0
- package/sdk-core/core/src/worker/tuner/resource_based.rs +561 -0
- package/sdk-core/core/src/worker/tuner.rs +122 -0
- package/sdk-core/core/src/worker/workflow/driven_workflow.rs +6 -6
- package/sdk-core/core/src/worker/workflow/history_update.rs +27 -53
- package/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +4 -17
- package/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +1 -10
- package/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +4 -11
- package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +17 -35
- package/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +0 -8
- package/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +1 -5
- package/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +0 -5
- package/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +0 -5
- package/sdk-core/core/src/worker/workflow/machines/mod.rs +0 -14
- package/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +0 -5
- package/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +0 -5
- package/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +1 -10
- package/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +3 -10
- package/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +12 -8
- package/sdk-core/core/src/worker/workflow/machines/update_state_machine.rs +0 -10
- package/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +6 -13
- package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +27 -37
- package/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +3 -14
- package/sdk-core/core/src/worker/workflow/managed_run.rs +84 -54
- package/sdk-core/core/src/worker/workflow/mod.rs +63 -160
- package/sdk-core/core/src/worker/workflow/run_cache.rs +22 -13
- package/sdk-core/core/src/worker/workflow/wft_extraction.rs +16 -3
- package/sdk-core/core/src/worker/workflow/wft_poller.rs +15 -12
- package/sdk-core/core/src/worker/workflow/workflow_stream.rs +39 -78
- package/sdk-core/core-api/Cargo.toml +6 -5
- package/sdk-core/core-api/src/errors.rs +8 -0
- package/sdk-core/core-api/src/telemetry/metrics.rs +75 -4
- package/sdk-core/core-api/src/telemetry.rs +7 -1
- package/sdk-core/core-api/src/worker.rs +212 -56
- package/sdk-core/fsm/Cargo.toml +3 -0
- package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +1 -1
- package/sdk-core/sdk/Cargo.toml +5 -7
- package/sdk-core/sdk/src/app_data.rs +3 -3
- package/sdk-core/sdk/src/lib.rs +5 -3
- package/sdk-core/sdk/src/workflow_context/options.rs +1 -1
- package/sdk-core/sdk/src/workflow_context.rs +10 -9
- package/sdk-core/sdk/src/workflow_future.rs +1 -1
- package/sdk-core/sdk-core-protos/Cargo.toml +8 -6
- package/sdk-core/sdk-core-protos/build.rs +1 -10
- package/sdk-core/sdk-core-protos/protos/api_upstream/.github/PULL_REQUEST_TEMPLATE.md +3 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/.github/workflows/ci.yml +26 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/Makefile +42 -20
- package/sdk-core/sdk-core-protos/protos/api_upstream/README.md +2 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/api-linter.yaml +36 -26
- package/sdk-core/sdk-core-protos/protos/api_upstream/buf.lock +2 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/struct.proto +95 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv2.json +9632 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv3.yaml +7337 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/payload_description.txt +2 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/command/v1/message.proto +45 -11
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/common/v1/message.proto +22 -4
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/command_type.proto +2 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/common.proto +44 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/event_type.proto +18 -3
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +20 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +30 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/update.proto +7 -8
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/workflow.proto +23 -5
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/errordetails/v1/message.proto +20 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/failure/v1/message.proto +25 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/history/v1/message.proto +141 -15
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/namespace/v1/message.proto +12 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/nexus/v1/message.proto +193 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +73 -6
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +46 -4
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/schedule/v1/message.proto +4 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/sdk/v1/workflow_metadata.proto +2 -2
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +116 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflow/v1/message.proto +134 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +274 -29
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +57 -1
- package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +10 -12
- package/sdk-core/sdk-core-protos/src/history_builder.rs +1 -1
- package/sdk-core/sdk-core-protos/src/lib.rs +54 -51
- package/sdk-core/sdk-core-protos/src/task_token.rs +11 -2
- package/sdk-core/test-utils/Cargo.toml +7 -4
- package/sdk-core/test-utils/src/histfetch.rs +1 -1
- package/sdk-core/test-utils/src/lib.rs +44 -62
- package/sdk-core/tests/fuzzy_workflow.rs +5 -2
- package/sdk-core/tests/heavy_tests.rs +114 -17
- package/sdk-core/tests/integ_tests/activity_functions.rs +1 -1
- package/sdk-core/tests/integ_tests/client_tests.rs +2 -2
- package/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +38 -26
- package/sdk-core/tests/integ_tests/metrics_tests.rs +126 -17
- package/sdk-core/tests/integ_tests/polling_tests.rs +118 -2
- package/sdk-core/tests/integ_tests/update_tests.rs +3 -5
- package/sdk-core/tests/integ_tests/visibility_tests.rs +3 -3
- package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +3 -3
- package/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +5 -4
- package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +3 -2
- package/sdk-core/tests/integ_tests/workflow_tests/eager.rs +6 -10
- package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +9 -7
- package/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests/patches.rs +14 -9
- package/sdk-core/tests/integ_tests/workflow_tests/resets.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests/signals.rs +6 -13
- package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +9 -6
- package/sdk-core/tests/integ_tests/workflow_tests/timers.rs +5 -5
- package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests.rs +115 -11
- package/sdk-core/tests/main.rs +2 -2
- package/src/conversions.rs +57 -0
- package/src/lib.rs +1 -0
- package/src/runtime.rs +51 -35
- package/ts/index.ts +67 -3
- package/sdk-core/core/src/worker/workflow/workflow_stream/saved_wf_inputs.rs +0 -117
- package/sdk-core/core/src/worker/workflow/workflow_stream/tonic_status_serde.rs +0 -24
- package/sdk-core/sdk/src/payload_converter.rs +0 -11
- package/sdk-core/sdk-core-protos/protos/api_upstream/.buildkite/Dockerfile +0 -2
- package/sdk-core/sdk-core-protos/protos/api_upstream/.buildkite/docker-compose.yml +0 -15
- package/sdk-core/sdk-core-protos/protos/api_upstream/.buildkite/pipeline.yml +0 -10
- package/sdk-core/test-utils/src/wf_input_saver.rs +0 -50
- 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,
|
|
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
|
|
31
|
-
long_svc_request_latency: Arc<dyn
|
|
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.
|
|
60
|
+
svc_request_latency: meter.histogram_duration(MetricParameters {
|
|
61
61
|
name: "request_latency".into(),
|
|
62
|
-
unit: "
|
|
62
|
+
unit: "duration".into(),
|
|
63
63
|
description: "Histogram of client request latencies".into(),
|
|
64
64
|
}),
|
|
65
|
-
long_svc_request_latency: meter.
|
|
65
|
+
long_svc_request_latency: meter.histogram_duration(MetricParameters {
|
|
66
66
|
name: "long_request_latency".into(),
|
|
67
|
-
unit: "
|
|
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,
|
|
106
|
+
self.long_svc_request_failed.add(1, kvs);
|
|
98
107
|
} else {
|
|
99
|
-
self.svc_request_failed.add(1,
|
|
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
|
|
178
|
-
|
|
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
|
|
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,
|
package/sdk-core/core/Cargo.toml
CHANGED
|
@@ -13,69 +13,65 @@ categories = ["development-tools"]
|
|
|
13
13
|
[lib]
|
|
14
14
|
|
|
15
15
|
[features]
|
|
16
|
-
default = []
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
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 =
|
|
30
|
+
derive_builder = { workspace = true }
|
|
34
31
|
derive_more = { workspace = true }
|
|
35
32
|
enum_dispatch = "0.3"
|
|
36
|
-
enum-iterator = "
|
|
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.
|
|
42
|
-
hyper = "
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
lru = "0.
|
|
46
|
-
mockall = "0.
|
|
47
|
-
nix = { version = "0.
|
|
48
|
-
once_cell =
|
|
49
|
-
opentelemetry = { workspace = true, features = ["metrics"] }
|
|
50
|
-
opentelemetry_sdk = { version = "0.
|
|
51
|
-
opentelemetry-otlp = { version = "0.
|
|
52
|
-
opentelemetry-prometheus = "0.
|
|
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 =
|
|
57
|
-
prost-types = { version = "0.
|
|
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"
|
|
60
|
-
ringbuf = "0.
|
|
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.
|
|
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 = "
|
|
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.
|
|
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
|
-
[
|
|
131
|
-
|
|
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
|
}
|