@temporalio/core-bridge 1.3.0 → 1.4.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 +117 -212
- package/index.d.ts +8 -2
- package/package.json +2 -3
- 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/sdk-core/.buildkite/pipeline.yml +2 -0
- package/sdk-core/.cargo/config.toml +1 -1
- package/sdk-core/bridge-ffi/src/lib.rs +2 -2
- package/sdk-core/client/Cargo.toml +1 -1
- package/sdk-core/client/src/lib.rs +16 -11
- package/sdk-core/client/src/metrics.rs +13 -11
- package/sdk-core/client/src/raw.rs +1 -2
- package/sdk-core/client/src/retry.rs +57 -42
- package/sdk-core/core/Cargo.toml +12 -8
- package/sdk-core/core/src/core_tests/activity_tasks.rs +65 -40
- package/sdk-core/core/src/ephemeral_server/mod.rs +19 -3
- package/sdk-core/core/src/lib.rs +2 -2
- package/sdk-core/core/src/pollers/mod.rs +2 -0
- package/sdk-core/core/src/telemetry/metrics.rs +48 -39
- package/sdk-core/core/src/telemetry/mod.rs +53 -22
- package/sdk-core/core/src/telemetry/prometheus_server.rs +17 -13
- package/sdk-core/core/src/worker/client/mocks.rs +1 -0
- package/sdk-core/core/src/worker/workflow/mod.rs +4 -1
- package/sdk-core/core-api/Cargo.toml +1 -1
- package/sdk-core/test-utils/src/lib.rs +21 -2
- package/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +27 -40
- package/sdk-core/tests/integ_tests/polling_tests.rs +1 -0
- package/sdk-core/tests/integ_tests/queries_tests.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +1 -5
- package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +8 -2
- package/sdk-core/tests/main.rs +7 -0
- package/sdk-core/tests/runner.rs +93 -0
- package/src/conversions.rs +19 -3
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
use assert_matches::assert_matches;
|
|
2
2
|
use std::time::Duration;
|
|
3
3
|
use temporal_sdk::{WfContext, Worker, WorkflowFunction};
|
|
4
|
-
use temporal_sdk_core::telemetry_init;
|
|
5
4
|
use temporal_sdk_core_api::errors::{PollActivityError, PollWfError};
|
|
6
5
|
use temporal_sdk_core_protos::{
|
|
7
6
|
coresdk::{
|
|
@@ -12,8 +11,7 @@ use temporal_sdk_core_protos::{
|
|
|
12
11
|
DEFAULT_WORKFLOW_TYPE,
|
|
13
12
|
};
|
|
14
13
|
use temporal_sdk_core_test_utils::{
|
|
15
|
-
canned_histories,
|
|
16
|
-
init_core_replay_preloaded, WorkerTestHelpers,
|
|
14
|
+
canned_histories, history_from_proto_binary, init_core_replay_preloaded, WorkerTestHelpers,
|
|
17
15
|
};
|
|
18
16
|
use tokio::join;
|
|
19
17
|
|
|
@@ -101,7 +99,6 @@ async fn workflow_nondeterministic_replay() {
|
|
|
101
99
|
|
|
102
100
|
#[tokio::test]
|
|
103
101
|
async fn replay_using_wf_function() {
|
|
104
|
-
telemetry_init(&get_integ_telem_options()).unwrap();
|
|
105
102
|
let num_timers = 10;
|
|
106
103
|
let t = canned_histories::long_sequential_timers(num_timers as usize);
|
|
107
104
|
let func = timers_wf(num_timers);
|
|
@@ -118,7 +115,6 @@ async fn replay_ok_ending_with_terminated_or_timed_out() {
|
|
|
118
115
|
t1.add_workflow_execution_terminated();
|
|
119
116
|
let mut t2 = canned_histories::single_timer("1");
|
|
120
117
|
t2.add_workflow_execution_timed_out();
|
|
121
|
-
telemetry_init(&get_integ_telem_options()).unwrap();
|
|
122
118
|
for t in [t1, t2] {
|
|
123
119
|
let func = timers_wf(1);
|
|
124
120
|
let (worker, _) = init_core_replay_preloaded(
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
use
|
|
1
|
+
use log::warn;
|
|
2
|
+
use std::{collections::HashMap, env};
|
|
2
3
|
use temporal_client::{WorkflowClientTrait, WorkflowOptions};
|
|
3
4
|
use temporal_sdk::{WfContext, WorkflowResult};
|
|
4
5
|
use temporal_sdk_core_protos::coresdk::{AsJsonPayloadExt, FromJsonPayloadExt};
|
|
5
|
-
use temporal_sdk_core_test_utils::CoreWfStarter;
|
|
6
|
+
use temporal_sdk_core_test_utils::{CoreWfStarter, INTEG_TEMPORALITE_USED_ENV_VAR};
|
|
6
7
|
use uuid::Uuid;
|
|
7
8
|
|
|
8
9
|
// These are initialized on the server as part of the autosetup container which we
|
|
@@ -24,6 +25,11 @@ async fn sends_upsert() {
|
|
|
24
25
|
let wf_id = Uuid::new_v4();
|
|
25
26
|
let mut starter = CoreWfStarter::new(wf_name);
|
|
26
27
|
let mut worker = starter.worker().await;
|
|
28
|
+
if env::var(INTEG_TEMPORALITE_USED_ENV_VAR).is_ok() {
|
|
29
|
+
warn!("skipping sends_upsert -- does not work on temporalite");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
27
33
|
worker.register_wf(wf_name, search_attr_updater);
|
|
28
34
|
let run_id = worker
|
|
29
35
|
.submit_wf(
|
package/sdk-core/tests/main.rs
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
//! Integration tests
|
|
2
|
+
//!
|
|
3
|
+
//! Note that integ tests which want to use the server (nearly all of them) *need* to use the
|
|
4
|
+
//! `#[rstest]` macro and accept the TODO fixture to support auto setup & teardown of ephemeral
|
|
5
|
+
//! local servers.
|
|
6
|
+
|
|
7
|
+
#[macro_use]
|
|
8
|
+
extern crate rstest;
|
|
2
9
|
|
|
3
10
|
#[cfg(test)]
|
|
4
11
|
mod integ_tests {
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
use anyhow::{anyhow, bail};
|
|
2
|
+
use std::{
|
|
3
|
+
env,
|
|
4
|
+
env::args,
|
|
5
|
+
path::{Path, PathBuf},
|
|
6
|
+
process::Stdio,
|
|
7
|
+
};
|
|
8
|
+
use temporal_sdk_core::ephemeral_server::{TemporaliteConfigBuilder, TestServerConfigBuilder};
|
|
9
|
+
use temporal_sdk_core_test_utils::{
|
|
10
|
+
default_cached_download, INTEG_SERVER_TARGET_ENV_VAR, INTEG_TEMPORALITE_USED_ENV_VAR,
|
|
11
|
+
INTEG_TEST_SERVER_USED_ENV_VAR,
|
|
12
|
+
};
|
|
13
|
+
use tokio::{self, process::Command};
|
|
14
|
+
|
|
15
|
+
#[tokio::main]
|
|
16
|
+
async fn main() -> Result<(), anyhow::Error> {
|
|
17
|
+
let cargo = env::var("CARGO").unwrap_or_else(|_| "cargo".to_string());
|
|
18
|
+
let server_type = env::var("INTEG_SERVER_TYPE")
|
|
19
|
+
.unwrap_or_else(|_| "temporalite".to_string())
|
|
20
|
+
.to_lowercase();
|
|
21
|
+
// Try building first, so that we error early on build failures & don't start server
|
|
22
|
+
let status = Command::new(&cargo)
|
|
23
|
+
.args(["test", "--test", "integ_tests", "--no-run"])
|
|
24
|
+
.status()
|
|
25
|
+
.await?;
|
|
26
|
+
if !status.success() {
|
|
27
|
+
bail!("Building integration tests failed!");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Move to clap if we start doing any more complicated input
|
|
31
|
+
let (server, envs) = if server_type == "test-server" {
|
|
32
|
+
let config = TestServerConfigBuilder::default()
|
|
33
|
+
.exe(default_cached_download())
|
|
34
|
+
.build()?;
|
|
35
|
+
println!("Using java test server");
|
|
36
|
+
(
|
|
37
|
+
Some(config.start_server_with_output(Stdio::null()).await?),
|
|
38
|
+
vec![(INTEG_TEST_SERVER_USED_ENV_VAR, "true")],
|
|
39
|
+
)
|
|
40
|
+
} else if server_type == "temporalite" {
|
|
41
|
+
let config = TemporaliteConfigBuilder::default()
|
|
42
|
+
.exe(default_cached_download())
|
|
43
|
+
.build()?;
|
|
44
|
+
println!("Using temporalite");
|
|
45
|
+
(
|
|
46
|
+
Some(config.start_server_with_output(Stdio::null()).await?),
|
|
47
|
+
vec![(INTEG_TEMPORALITE_USED_ENV_VAR, "true")],
|
|
48
|
+
)
|
|
49
|
+
} else {
|
|
50
|
+
println!("Not starting up a server. One should be running already.");
|
|
51
|
+
(None, vec![])
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// Run the integ tests, passing through arguments
|
|
55
|
+
let mut args = args();
|
|
56
|
+
// Shift off binary name
|
|
57
|
+
args.next();
|
|
58
|
+
let mut cmd = Command::new(&cargo);
|
|
59
|
+
if let Some(srv) = server.as_ref() {
|
|
60
|
+
cmd.env(
|
|
61
|
+
INTEG_SERVER_TARGET_ENV_VAR,
|
|
62
|
+
format!("http://{}", &srv.target),
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
let status = cmd
|
|
66
|
+
.envs(envs)
|
|
67
|
+
.current_dir(project_root())
|
|
68
|
+
.args(
|
|
69
|
+
["test", "--test", "integ_tests"]
|
|
70
|
+
.into_iter()
|
|
71
|
+
.map(ToString::to_string)
|
|
72
|
+
.chain(args),
|
|
73
|
+
)
|
|
74
|
+
.status()
|
|
75
|
+
.await?;
|
|
76
|
+
|
|
77
|
+
if let Some(mut srv) = server {
|
|
78
|
+
srv.shutdown().await?;
|
|
79
|
+
}
|
|
80
|
+
if status.success() {
|
|
81
|
+
Ok(())
|
|
82
|
+
} else {
|
|
83
|
+
Err(anyhow!("Integ tests failed!"))
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
fn project_root() -> PathBuf {
|
|
88
|
+
Path::new(&env!("CARGO_MANIFEST_DIR"))
|
|
89
|
+
.ancestors()
|
|
90
|
+
.nth(1)
|
|
91
|
+
.unwrap()
|
|
92
|
+
.to_path_buf()
|
|
93
|
+
}
|
package/src/conversions.rs
CHANGED
|
@@ -13,9 +13,9 @@ use temporal_sdk_core::{
|
|
|
13
13
|
ephemeral_server::{
|
|
14
14
|
TemporaliteConfig, TemporaliteConfigBuilder, TestServerConfig, TestServerConfigBuilder,
|
|
15
15
|
},
|
|
16
|
-
ClientOptions, ClientOptionsBuilder, ClientTlsConfig, Logger,
|
|
17
|
-
OtelCollectorOptions, RetryConfig, TelemetryOptions, TelemetryOptionsBuilder,
|
|
18
|
-
TraceExporter, Url,
|
|
16
|
+
ClientOptions, ClientOptionsBuilder, ClientTlsConfig, Logger, MetricTemporality,
|
|
17
|
+
MetricsExporter, OtelCollectorOptions, RetryConfig, TelemetryOptions, TelemetryOptionsBuilder,
|
|
18
|
+
TlsConfig, TraceExporter, Url,
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
pub enum EphemeralServerConfig {
|
|
@@ -206,6 +206,22 @@ impl ObjectHandleConversionsExt for Handle<'_, JsObject> {
|
|
|
206
206
|
}
|
|
207
207
|
}
|
|
208
208
|
if let Some(metrics) = js_optional_getter!(cx, self, "metrics", JsObject) {
|
|
209
|
+
if let Some(temporality) =
|
|
210
|
+
js_optional_value_getter!(cx, &metrics, "temporality", JsString)
|
|
211
|
+
{
|
|
212
|
+
match temporality.as_str() {
|
|
213
|
+
"cumulative" => {
|
|
214
|
+
telemetry_opts.metric_temporality(MetricTemporality::Cumulative);
|
|
215
|
+
}
|
|
216
|
+
"delta" => {
|
|
217
|
+
telemetry_opts.metric_temporality(MetricTemporality::Delta);
|
|
218
|
+
}
|
|
219
|
+
_ => {
|
|
220
|
+
cx.throw_type_error("Invalid telemetryOptions.metrics.temporality, expected 'cumulative' or 'delta'")?;
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
209
225
|
if let Some(ref prom) = js_optional_getter!(cx, &metrics, "prometheus", JsObject) {
|
|
210
226
|
let addr = js_value_getter!(cx, prom, "bindAddress", JsString);
|
|
211
227
|
match addr.parse::<SocketAddr>() {
|