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