@temporalio/core-bridge 1.14.2-canary-release-testing.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cargo.lock +794 -650
- package/bridge-macros/src/derive_tryintojs.rs +40 -0
- package/lib/native.d.ts +24 -3
- 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/sdk-core/.github/workflows/per-pr.yml +6 -6
- package/sdk-core/AGENTS.md +42 -31
- package/sdk-core/Cargo.toml +4 -1
- package/sdk-core/README.md +19 -13
- 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} +370 -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} +104 -29
- package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
- package/sdk-core/crates/common/Cargo.toml +62 -3
- 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/.github/workflows/create-release.yml +0 -5
- package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
- package/sdk-core/crates/common/protos/api_upstream/README.md +8 -0
- 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 +3329 -2647
- package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +2734 -708
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/activity/v1/message.proto +155 -3
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/command/v1/message.proto +26 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/common/v1/message.proto +8 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +27 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/activity.proto +81 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/event_type.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +15 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +63 -15
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/errordetails/v1/message.proto +8 -0
- 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 +111 -17
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +21 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +20 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/schedule/v1/message.proto +2 -2
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/worker/v1/message.proto +4 -7
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflow/v1/message.proto +80 -22
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +347 -23
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +242 -43
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/core_interface.proto +15 -0
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +9 -2
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +8 -0
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +22 -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 +19 -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 +134 -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 +11 -16
- package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
- package/sdk-core/crates/common/src/telemetry/metrics.rs +272 -225
- 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 +278 -19
- package/sdk-core/crates/common/src/worker.rs +68 -636
- 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 +759 -442
- package/sdk-core/crates/sdk/src/workflow_context/options.rs +64 -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 +59 -65
- package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +45 -54
- 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 +22 -21
- 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 +647 -27
- package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +46 -41
- package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +13 -16
- package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
- package/sdk-core/crates/sdk-core/src/lib.rs +60 -123
- package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
- package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +411 -32
- 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 +183 -198
- package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -281
- package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +35 -16
- package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
- package/sdk-core/crates/sdk-core/src/worker/activities/activity_heartbeat_manager.rs +1 -0
- 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 +11 -5
- package/sdk-core/crates/sdk-core/src/worker/client.rs +104 -86
- package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +10 -14
- package/sdk-core/crates/sdk-core/src/worker/mod.rs +1175 -241
- package/sdk-core/crates/sdk-core/src/worker/nexus.rs +150 -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 +25 -27
- package/sdk-core/crates/sdk-core/src/worker/tuner.rs +64 -44
- package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/patch_state_machine.rs +5 -8
- 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 +28 -4
- package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +20 -41
- package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +50 -9
- 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 +281 -236
- package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
- package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +9 -14
- package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -66
- package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +306 -268
- 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 +37 -38
- package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +49 -40
- package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +447 -300
- 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 +157 -157
- 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 -463
- 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 +389 -265
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +250 -185
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -49
- 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 +437 -327
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -58
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -30
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -251
- 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 +110 -46
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -149
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -32
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1040
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -43
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +402 -245
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +343 -207
- 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 +155 -140
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -113
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -44
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -48
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -56
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +365 -242
- package/sdk-core/crates/sdk-core/tests/main.rs +22 -16
- package/sdk-core/crates/sdk-core/tests/manual_tests.rs +233 -187
- package/sdk-core/crates/sdk-core/tests/runner.rs +4 -6
- package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +73 -27
- 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 +8 -1
- package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +37 -26
- package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +180 -87
- package/sdk-core/crates/sdk-core-c-bridge/src/lib.rs +89 -5
- package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +10 -16
- package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +59 -67
- package/sdk-core/crates/sdk-core-c-bridge/src/testing.rs +10 -10
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +57 -22
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +108 -12
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +9 -52
- package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +74 -91
- package/sdk-core/rustfmt.toml +2 -1
- package/src/client.rs +206 -289
- package/src/helpers/try_into_js.rs +88 -2
- package/src/metrics.rs +277 -35
- package/src/runtime.rs +94 -45
- package/src/testing.rs +9 -16
- package/src/worker.rs +86 -68
- package/ts/native.ts +39 -3
- 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/macros/LICENSE.txt +0 -21
- 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,290 +1,12 @@
|
|
|
1
1
|
//! This module helps with the initialization and management of telemetry. IE: Metrics and tracing.
|
|
2
2
|
//! Logs from core are all traces, which may be exported to the console, in memory, or externally.
|
|
3
3
|
|
|
4
|
-
mod log_export;
|
|
5
|
-
pub(crate) mod metrics;
|
|
6
|
-
#[cfg(feature = "otel")]
|
|
7
|
-
mod otel;
|
|
8
|
-
#[cfg(feature = "prom")]
|
|
9
|
-
mod prometheus_meter;
|
|
10
|
-
#[cfg(feature = "prom")]
|
|
11
|
-
mod prometheus_server;
|
|
12
|
-
|
|
13
|
-
// Always export bucket configuration function since it's used by both OTel and Prometheus
|
|
14
|
-
pub use metrics::default_buckets_for;
|
|
15
|
-
|
|
16
|
-
#[cfg(feature = "otel")]
|
|
17
|
-
pub use metrics::{
|
|
18
|
-
ACTIVITY_EXEC_LATENCY_HISTOGRAM_NAME, ACTIVITY_SCHED_TO_START_LATENCY_HISTOGRAM_NAME,
|
|
19
|
-
MetricsCallBuffer, WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME,
|
|
20
|
-
WORKFLOW_TASK_EXECUTION_LATENCY_HISTOGRAM_NAME, WORKFLOW_TASK_REPLAY_LATENCY_HISTOGRAM_NAME,
|
|
21
|
-
WORKFLOW_TASK_SCHED_TO_START_LATENCY_HISTOGRAM_NAME,
|
|
22
|
-
};
|
|
23
|
-
#[cfg(feature = "otel")]
|
|
24
|
-
pub use otel::build_otlp_metric_exporter;
|
|
25
|
-
#[cfg(feature = "prom")]
|
|
26
|
-
pub use prometheus_server::start_prometheus_metric_exporter;
|
|
27
|
-
|
|
28
|
-
pub use log_export::{CoreLogBuffer, CoreLogBufferedConsumer, CoreLogStreamConsumer};
|
|
29
|
-
|
|
30
|
-
use crate::telemetry::{log_export::CoreLogConsumerLayer, metrics::PrefixedMetricsMeter};
|
|
31
4
|
use itertools::Itertools;
|
|
32
|
-
use
|
|
33
|
-
use std::{
|
|
34
|
-
cell::RefCell,
|
|
35
|
-
collections::VecDeque,
|
|
36
|
-
env,
|
|
37
|
-
sync::{
|
|
38
|
-
Arc,
|
|
39
|
-
atomic::{AtomicBool, Ordering},
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
use temporalio_common::telemetry::{
|
|
43
|
-
CoreLog, CoreTelemetry, Logger, TaskQueueLabelStrategy, TelemetryOptions,
|
|
44
|
-
TelemetryOptionsBuilder,
|
|
45
|
-
metrics::{CoreMeter, MetricKeyValue, NewAttributes, TemporalMeter},
|
|
46
|
-
};
|
|
47
|
-
use tracing::{Level, Subscriber};
|
|
48
|
-
use tracing_subscriber::{EnvFilter, Layer, layer::SubscriberExt};
|
|
49
|
-
|
|
50
|
-
const TELEM_SERVICE_NAME: &str = "temporal-core-sdk";
|
|
51
|
-
|
|
52
|
-
const FORWARD_LOG_BUFFER_SIZE: usize = 2048;
|
|
53
|
-
|
|
54
|
-
/// Help you construct an [EnvFilter] compatible filter string which will forward all core module
|
|
55
|
-
/// traces at `core_level` and all others (from 3rd party modules, etc) at `other_level`.
|
|
56
|
-
pub fn construct_filter_string(core_level: Level, other_level: Level) -> String {
|
|
57
|
-
format!(
|
|
58
|
-
"{other_level},temporalio_sdk_core={core_level},temporalio_client={core_level},temporalio_sdk={core_level}"
|
|
59
|
-
)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/// Holds initialized tracing/metrics exporters, etc
|
|
63
|
-
pub struct TelemetryInstance {
|
|
64
|
-
metric_prefix: String,
|
|
65
|
-
logs_out: Option<Mutex<CoreLogBuffer>>,
|
|
66
|
-
metrics: Option<Arc<dyn CoreMeter + 'static>>,
|
|
67
|
-
/// The tracing subscriber which is associated with this telemetry instance. May be `None` if
|
|
68
|
-
/// the user has not opted into any tracing configuration.
|
|
69
|
-
trace_subscriber: Option<Arc<dyn Subscriber + Send + Sync>>,
|
|
70
|
-
attach_service_name: bool,
|
|
71
|
-
task_queue_label_strategy: TaskQueueLabelStrategy,
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
impl TelemetryInstance {
|
|
75
|
-
fn new(
|
|
76
|
-
trace_subscriber: Option<Arc<dyn Subscriber + Send + Sync>>,
|
|
77
|
-
logs_out: Option<Mutex<CoreLogBuffer>>,
|
|
78
|
-
metric_prefix: String,
|
|
79
|
-
metrics: Option<Arc<dyn CoreMeter + 'static>>,
|
|
80
|
-
attach_service_name: bool,
|
|
81
|
-
task_queue_label_strategy: TaskQueueLabelStrategy,
|
|
82
|
-
) -> Self {
|
|
83
|
-
Self {
|
|
84
|
-
metric_prefix,
|
|
85
|
-
logs_out,
|
|
86
|
-
metrics,
|
|
87
|
-
trace_subscriber,
|
|
88
|
-
attach_service_name,
|
|
89
|
-
task_queue_label_strategy,
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/// Return the trace subscriber associated with the telemetry options/instance. Can be used
|
|
94
|
-
/// to manually set the default for a thread or globally using the `tracing` crate, or with
|
|
95
|
-
/// [set_trace_subscriber_for_current_thread].
|
|
96
|
-
pub fn trace_subscriber(&self) -> Option<Arc<dyn Subscriber + Send + Sync>> {
|
|
97
|
-
self.trace_subscriber.clone()
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/// Some metric meters cannot be initialized until after a tokio runtime has started and after
|
|
101
|
-
/// other telemetry has initted (ex: prometheus). They can be attached here.
|
|
102
|
-
pub fn attach_late_init_metrics(&mut self, meter: Arc<dyn CoreMeter + 'static>) {
|
|
103
|
-
self.metrics = Some(meter);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/// Returns our wrapper for metric meters, including the `metric_prefix` from
|
|
107
|
-
/// [TelemetryOptions]. This should be used to initialize clients or for any other
|
|
108
|
-
/// temporal-owned metrics. User defined metrics should use [Self::get_metric_meter].
|
|
109
|
-
pub fn get_temporal_metric_meter(&self) -> Option<TemporalMeter> {
|
|
110
|
-
self.metrics.clone().map(|m| {
|
|
111
|
-
let kvs = self.default_kvs();
|
|
112
|
-
let attribs = NewAttributes::new(kvs);
|
|
113
|
-
TemporalMeter::new(
|
|
114
|
-
Arc::new(PrefixedMetricsMeter::new(self.metric_prefix.clone(), m))
|
|
115
|
-
as Arc<dyn CoreMeter>,
|
|
116
|
-
attribs,
|
|
117
|
-
self.task_queue_label_strategy,
|
|
118
|
-
)
|
|
119
|
-
})
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/// Returns our wrapper for metric meters, including attaching the service name if enabled.
|
|
123
|
-
pub fn get_metric_meter(&self) -> Option<TemporalMeter> {
|
|
124
|
-
self.metrics.clone().map(|m| {
|
|
125
|
-
let kvs = self.default_kvs();
|
|
126
|
-
let attribs = NewAttributes::new(kvs);
|
|
127
|
-
TemporalMeter::new(m, attribs, self.task_queue_label_strategy)
|
|
128
|
-
})
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
fn default_kvs(&self) -> Vec<MetricKeyValue> {
|
|
132
|
-
if self.attach_service_name {
|
|
133
|
-
vec![MetricKeyValue::new("service_name", TELEM_SERVICE_NAME)]
|
|
134
|
-
} else {
|
|
135
|
-
vec![]
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
thread_local! {
|
|
141
|
-
static SUB_GUARD: RefCell<Option<tracing::subscriber::DefaultGuard>> =
|
|
142
|
-
const { RefCell::new(None) };
|
|
143
|
-
}
|
|
144
|
-
/// Set the trace subscriber for the current thread. This must be done in every thread which uses
|
|
145
|
-
/// core stuff, otherwise traces/logs will not be collected on that thread. For example, if using
|
|
146
|
-
/// a multithreaded Tokio runtime, you should ensure that said runtime uses
|
|
147
|
-
/// [on_thread_start](https://docs.rs/tokio/latest/tokio/runtime/struct.Builder.html#method.on_thread_start)
|
|
148
|
-
/// or a similar mechanism to call this for each thread within the runtime.
|
|
149
|
-
pub fn set_trace_subscriber_for_current_thread(sub: impl Subscriber + Send + Sync + 'static) {
|
|
150
|
-
SUB_GUARD.with(|sg| {
|
|
151
|
-
if sg.borrow().is_none() {
|
|
152
|
-
let g = tracing::subscriber::set_default(sub);
|
|
153
|
-
*sg.borrow_mut() = Some(g);
|
|
154
|
-
}
|
|
155
|
-
})
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/// Undoes [set_trace_subscriber_for_current_thread]
|
|
159
|
-
pub fn remove_trace_subscriber_for_current_thread() {
|
|
160
|
-
SUB_GUARD.take();
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
impl CoreTelemetry for TelemetryInstance {
|
|
164
|
-
fn fetch_buffered_logs(&self) -> Vec<CoreLog> {
|
|
165
|
-
if let Some(logs_out) = self.logs_out.as_ref() {
|
|
166
|
-
logs_out.lock().drain()
|
|
167
|
-
} else {
|
|
168
|
-
vec![]
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/// Initialize tracing subscribers/output and logging export, returning a [TelemetryInstance]
|
|
174
|
-
/// which can be used to register default / global tracing subscribers.
|
|
175
|
-
///
|
|
176
|
-
/// You should only call this once per unique [TelemetryOptions]
|
|
177
|
-
///
|
|
178
|
-
/// See [TelemetryOptions] docs for more on configuration.
|
|
179
|
-
pub fn telemetry_init(opts: TelemetryOptions) -> Result<TelemetryInstance, anyhow::Error> {
|
|
180
|
-
let mut logs_out = None;
|
|
5
|
+
use std::collections::VecDeque;
|
|
181
6
|
|
|
182
|
-
|
|
183
|
-
let mut console_pretty_layer = None;
|
|
184
|
-
let mut console_compact_layer = None;
|
|
185
|
-
let mut forward_layer = None;
|
|
186
|
-
// ===================================
|
|
187
|
-
|
|
188
|
-
let tracing_sub = if let Some(ts) = opts.subscriber_override {
|
|
189
|
-
Some(ts)
|
|
190
|
-
} else {
|
|
191
|
-
opts.logging.map(|logger| {
|
|
192
|
-
match logger {
|
|
193
|
-
Logger::Console { filter } => {
|
|
194
|
-
// This is silly dupe but can't be avoided without boxing.
|
|
195
|
-
if env::var("TEMPORAL_CORE_PRETTY_LOGS").is_ok() {
|
|
196
|
-
console_pretty_layer = Some(
|
|
197
|
-
tracing_subscriber::fmt::layer()
|
|
198
|
-
.with_target(false)
|
|
199
|
-
.event_format(
|
|
200
|
-
tracing_subscriber::fmt::format()
|
|
201
|
-
.pretty()
|
|
202
|
-
.with_source_location(false),
|
|
203
|
-
)
|
|
204
|
-
.with_filter(EnvFilter::new(filter)),
|
|
205
|
-
)
|
|
206
|
-
} else {
|
|
207
|
-
console_compact_layer = Some(
|
|
208
|
-
tracing_subscriber::fmt::layer()
|
|
209
|
-
.with_target(false)
|
|
210
|
-
.event_format(
|
|
211
|
-
tracing_subscriber::fmt::format()
|
|
212
|
-
.compact()
|
|
213
|
-
.with_source_location(false),
|
|
214
|
-
)
|
|
215
|
-
.with_filter(EnvFilter::new(filter)),
|
|
216
|
-
)
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
Logger::Forward { filter } => {
|
|
220
|
-
let (export_layer, lo) =
|
|
221
|
-
CoreLogConsumerLayer::new_buffered(FORWARD_LOG_BUFFER_SIZE);
|
|
222
|
-
logs_out = Some(Mutex::new(lo));
|
|
223
|
-
forward_layer = Some(export_layer.with_filter(EnvFilter::new(filter)));
|
|
224
|
-
}
|
|
225
|
-
Logger::Push { filter, consumer } => {
|
|
226
|
-
forward_layer = Some(
|
|
227
|
-
CoreLogConsumerLayer::new(consumer).with_filter(EnvFilter::new(filter)),
|
|
228
|
-
);
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
let reg = tracing_subscriber::registry()
|
|
232
|
-
.with(console_pretty_layer)
|
|
233
|
-
.with(console_compact_layer)
|
|
234
|
-
.with(forward_layer);
|
|
235
|
-
|
|
236
|
-
#[cfg(feature = "tokio-console")]
|
|
237
|
-
let reg = reg.with(console_subscriber::spawn());
|
|
238
|
-
Arc::new(reg) as Arc<dyn Subscriber + Send + Sync>
|
|
239
|
-
})
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
Ok(TelemetryInstance::new(
|
|
243
|
-
tracing_sub,
|
|
244
|
-
logs_out,
|
|
245
|
-
opts.metric_prefix,
|
|
246
|
-
opts.metrics,
|
|
247
|
-
opts.attach_service_name,
|
|
248
|
-
opts.task_queue_label_strategy,
|
|
249
|
-
))
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/// WARNING: Calling can cause panics because of <https://github.com/tokio-rs/tracing/issues/1656>
|
|
253
|
-
/// Lang must not start using until resolved
|
|
254
|
-
///
|
|
255
|
-
/// Initialize telemetry/tracing globally. Useful for testing. Only takes affect when called
|
|
256
|
-
/// the first time. Subsequent calls are ignored.
|
|
257
|
-
pub fn telemetry_init_global(opts: TelemetryOptions) -> Result<(), anyhow::Error> {
|
|
258
|
-
static INITTED: AtomicBool = AtomicBool::new(false);
|
|
259
|
-
if INITTED
|
|
260
|
-
.compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)
|
|
261
|
-
.is_ok()
|
|
262
|
-
{
|
|
263
|
-
let ti = telemetry_init(opts)?;
|
|
264
|
-
if let Some(ts) = ti.trace_subscriber() {
|
|
265
|
-
tracing::subscriber::set_global_default(ts)?;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
Ok(())
|
|
269
|
-
}
|
|
7
|
+
pub(crate) mod metrics;
|
|
270
8
|
|
|
271
|
-
|
|
272
|
-
/// Lang must not start using until resolved
|
|
273
|
-
///
|
|
274
|
-
/// Initialize the fallback global handler. All lang SDKs should call this somewhere, once, at
|
|
275
|
-
/// startup, as it initializes a fallback handler for any dependencies (looking at you, otel) that
|
|
276
|
-
/// don't provide good ways to customize their tracing usage. It sets a WARN-level global filter
|
|
277
|
-
/// that uses the default console logger.
|
|
278
|
-
pub fn telemetry_init_fallback() -> Result<(), anyhow::Error> {
|
|
279
|
-
telemetry_init_global(
|
|
280
|
-
TelemetryOptionsBuilder::default()
|
|
281
|
-
.logging(Logger::Console {
|
|
282
|
-
filter: construct_filter_string(Level::DEBUG, Level::WARN),
|
|
283
|
-
})
|
|
284
|
-
.build()?,
|
|
285
|
-
)?;
|
|
286
|
-
Ok(())
|
|
287
|
-
}
|
|
9
|
+
pub use metrics::MetricsCallBuffer;
|
|
288
10
|
|
|
289
11
|
/// A trait for using [Display] on the contents of vecs, etc, which don't implement it.
|
|
290
12
|
///
|
|
@@ -8,14 +8,16 @@ pub use crate::{
|
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
use crate::{
|
|
11
|
-
TaskToken, Worker, WorkerConfig, WorkerConfigBuilder,
|
|
11
|
+
PollError, PollerBehavior, TaskToken, Worker, WorkerConfig, WorkerConfigBuilder,
|
|
12
|
+
WorkerVersioningStrategy,
|
|
12
13
|
pollers::{BoxedPoller, MockManualPoller},
|
|
13
14
|
protosext::ValidPollWFTQResponse,
|
|
14
15
|
replay::TestHistoryBuilder,
|
|
15
16
|
sticky_q_name_for_worker,
|
|
16
17
|
worker::{
|
|
17
|
-
TaskPollers,
|
|
18
|
+
TaskPollers, WorkerTelemetry,
|
|
18
19
|
client::{LegacyQueryResult, MockWorkerClient, WorkerClient, WorkflowTaskCompletion},
|
|
20
|
+
worker_config_builder,
|
|
19
21
|
},
|
|
20
22
|
};
|
|
21
23
|
use assert_matches::assert_matches;
|
|
@@ -36,9 +38,8 @@ use std::{
|
|
|
36
38
|
task::{Context, Poll},
|
|
37
39
|
time::Duration,
|
|
38
40
|
};
|
|
41
|
+
pub use temporalio_common::telemetry::metrics::TemporalMeter;
|
|
39
42
|
use temporalio_common::{
|
|
40
|
-
Worker as WorkerTrait,
|
|
41
|
-
errors::PollError,
|
|
42
43
|
protos::{
|
|
43
44
|
coresdk::{
|
|
44
45
|
workflow_activation::{WorkflowActivationJob, workflow_activation_job},
|
|
@@ -58,7 +59,7 @@ use temporalio_common::{
|
|
|
58
59
|
},
|
|
59
60
|
utilities::pack_any,
|
|
60
61
|
},
|
|
61
|
-
worker::
|
|
62
|
+
worker::WorkerTaskTypes,
|
|
62
63
|
};
|
|
63
64
|
use tokio::sync::{Notify, mpsc::unbounded_channel};
|
|
64
65
|
use tokio_stream::wrappers::UnboundedReceiverStream;
|
|
@@ -68,7 +69,7 @@ use uuid::Uuid;
|
|
|
68
69
|
pub const NAMESPACE: &str = "default";
|
|
69
70
|
|
|
70
71
|
/// Initiate shutdown, drain the pollers (handling evictions), and wait for shutdown to complete.
|
|
71
|
-
pub async fn drain_pollers_and_shutdown(worker: &
|
|
72
|
+
pub async fn drain_pollers_and_shutdown(worker: &Worker) {
|
|
72
73
|
worker.initiate_shutdown();
|
|
73
74
|
tokio::join!(
|
|
74
75
|
async {
|
|
@@ -97,9 +98,20 @@ pub async fn drain_pollers_and_shutdown(worker: &dyn WorkerTrait) {
|
|
|
97
98
|
worker.shutdown().await;
|
|
98
99
|
}
|
|
99
100
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
#[allow(clippy::type_complexity)]
|
|
102
|
+
pub fn test_worker_cfg() -> WorkerConfigBuilder<
|
|
103
|
+
worker_config_builder::SetWorkflowTaskPollerBehavior<
|
|
104
|
+
worker_config_builder::SetTaskTypes<
|
|
105
|
+
worker_config_builder::SetIgnoreEvictsOnShutdown<
|
|
106
|
+
worker_config_builder::SetVersioningStrategy<
|
|
107
|
+
worker_config_builder::SetTaskQueue<worker_config_builder::SetNamespace>,
|
|
108
|
+
>,
|
|
109
|
+
>,
|
|
110
|
+
>,
|
|
111
|
+
>,
|
|
112
|
+
> {
|
|
113
|
+
WorkerConfig::builder()
|
|
114
|
+
.namespace(NAMESPACE)
|
|
103
115
|
.task_queue(Uuid::new_v4().to_string())
|
|
104
116
|
.versioning_strategy(WorkerVersioningStrategy::None {
|
|
105
117
|
build_id: "test_bin_id".to_string(),
|
|
@@ -107,8 +119,7 @@ pub fn test_worker_cfg() -> WorkerConfigBuilder {
|
|
|
107
119
|
.ignore_evicts_on_shutdown(true)
|
|
108
120
|
.task_types(WorkerTaskTypes::all())
|
|
109
121
|
// Serial polling since it makes mocking much easier.
|
|
110
|
-
.workflow_task_poller_behavior(PollerBehavior::SimpleMaximum(1_usize))
|
|
111
|
-
wcb
|
|
122
|
+
.workflow_task_poller_behavior(PollerBehavior::SimpleMaximum(1_usize))
|
|
112
123
|
}
|
|
113
124
|
|
|
114
125
|
/// When constructing responses for mocks, indicates how a given response should be built
|
|
@@ -204,7 +215,7 @@ pub fn mock_worker(mocks: MocksHolder) -> Worker {
|
|
|
204
215
|
act_poller,
|
|
205
216
|
nexus_poller,
|
|
206
217
|
},
|
|
207
|
-
|
|
218
|
+
mocks.worker_telemetry,
|
|
208
219
|
None,
|
|
209
220
|
false,
|
|
210
221
|
)
|
|
@@ -222,6 +233,7 @@ pub struct MocksHolder {
|
|
|
222
233
|
client: Arc<dyn WorkerClient>,
|
|
223
234
|
inputs: MockWorkerInputs,
|
|
224
235
|
pub outstanding_task_map: Option<OutstandingWFTMap>,
|
|
236
|
+
worker_telemetry: Option<WorkerTelemetry>,
|
|
225
237
|
}
|
|
226
238
|
|
|
227
239
|
impl MocksHolder {
|
|
@@ -255,6 +267,10 @@ impl MocksHolder {
|
|
|
255
267
|
self.inputs.nexus_poller = Some(nexus_poller);
|
|
256
268
|
}
|
|
257
269
|
|
|
270
|
+
pub fn set_temporal_meter(&mut self, meter: TemporalMeter) {
|
|
271
|
+
self.worker_telemetry = Some(WorkerTelemetry::from_meter(meter));
|
|
272
|
+
}
|
|
273
|
+
|
|
258
274
|
/// Can be used for tests that need to avoid auto-shutdown due to running out of mock responses
|
|
259
275
|
pub fn make_wft_stream_interminable(&mut self) {
|
|
260
276
|
if let Some(old_stream) = self.inputs.wft_stream.take() {
|
|
@@ -298,6 +314,7 @@ impl MocksHolder {
|
|
|
298
314
|
client: Arc::new(client),
|
|
299
315
|
inputs: mock_worker,
|
|
300
316
|
outstanding_task_map: None,
|
|
317
|
+
worker_telemetry: None,
|
|
301
318
|
}
|
|
302
319
|
}
|
|
303
320
|
|
|
@@ -321,6 +338,7 @@ impl MocksHolder {
|
|
|
321
338
|
client: Arc::new(client),
|
|
322
339
|
inputs: mock_worker,
|
|
323
340
|
outstanding_task_map: None,
|
|
341
|
+
worker_telemetry: None,
|
|
324
342
|
}
|
|
325
343
|
}
|
|
326
344
|
|
|
@@ -344,6 +362,7 @@ impl MocksHolder {
|
|
|
344
362
|
client: Arc::new(client),
|
|
345
363
|
inputs: mock_worker,
|
|
346
364
|
outstanding_task_map: None,
|
|
365
|
+
worker_telemetry: None,
|
|
347
366
|
}
|
|
348
367
|
}
|
|
349
368
|
|
|
@@ -381,6 +400,7 @@ impl MocksHolder {
|
|
|
381
400
|
client: Arc::new(client),
|
|
382
401
|
inputs: mock_worker,
|
|
383
402
|
outstanding_task_map: None,
|
|
403
|
+
worker_telemetry: None,
|
|
384
404
|
}
|
|
385
405
|
}
|
|
386
406
|
|
|
@@ -406,6 +426,7 @@ impl MocksHolder {
|
|
|
406
426
|
client: Arc::new(client),
|
|
407
427
|
inputs: mock_worker,
|
|
408
428
|
outstanding_task_map: None,
|
|
429
|
+
worker_telemetry: None,
|
|
409
430
|
}
|
|
410
431
|
}
|
|
411
432
|
}
|
|
@@ -816,6 +837,7 @@ pub fn build_mock_pollers(mut cfg: MockPollCfg) -> MocksHolder {
|
|
|
816
837
|
client: Arc::new(cfg.mock_client),
|
|
817
838
|
inputs: mock_worker,
|
|
818
839
|
outstanding_task_map: Some(outstanding_wf_task_tokens),
|
|
840
|
+
worker_telemetry: None,
|
|
819
841
|
};
|
|
820
842
|
if let Some(activity_responses) = cfg.activity_responses {
|
|
821
843
|
let act_poller = mock_poller_from_resps(activity_responses);
|
|
@@ -1015,10 +1037,7 @@ pub trait WorkerTestHelpers {
|
|
|
1015
1037
|
}
|
|
1016
1038
|
|
|
1017
1039
|
#[async_trait::async_trait]
|
|
1018
|
-
impl
|
|
1019
|
-
where
|
|
1020
|
-
T: WorkerTrait + ?Sized,
|
|
1021
|
-
{
|
|
1040
|
+
impl WorkerTestHelpers for Worker {
|
|
1022
1041
|
async fn complete_execution(&self, run_id: &str) {
|
|
1023
1042
|
self.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
|
|
1024
1043
|
run_id.to_string(),
|
|
@@ -2,12 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
use futures_util::{StreamExt, stream::FuturesUnordered};
|
|
4
4
|
use std::{collections::HashSet, future::Future};
|
|
5
|
-
use temporalio_common::{
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
workflow_activation::workflow_activation_job,
|
|
9
|
-
workflow_completion::{WorkflowActivationCompletion, workflow_activation_completion},
|
|
10
|
-
},
|
|
5
|
+
use temporalio_common::protos::coresdk::{
|
|
6
|
+
workflow_activation::workflow_activation_job,
|
|
7
|
+
workflow_completion::{WorkflowActivationCompletion, workflow_activation_completion},
|
|
11
8
|
};
|
|
12
9
|
|
|
13
10
|
/// Given a desired number of concurrent executions and a provided function that produces a future,
|
|
@@ -3,7 +3,7 @@ use crate::{
|
|
|
3
3
|
abstractions::{MeteredPermitDealer, OwnedMeteredSemPermit, UsedMeteredSemPermit, dbg_panic},
|
|
4
4
|
protosext::ValidScheduleLA,
|
|
5
5
|
telemetry::metrics::{activity_type, should_record_failure_metric, workflow_type},
|
|
6
|
-
worker::workflow::HeartbeatTimeoutMsg,
|
|
6
|
+
worker::{LocalActivitySlotKind, workflow::HeartbeatTimeoutMsg},
|
|
7
7
|
};
|
|
8
8
|
use futures_util::{
|
|
9
9
|
Stream, StreamExt, future, future::AbortRegistration, stream, stream::BoxStream,
|
|
@@ -17,20 +17,17 @@ use std::{
|
|
|
17
17
|
task::{Context, Poll},
|
|
18
18
|
time::{Duration, Instant, SystemTime},
|
|
19
19
|
};
|
|
20
|
-
use temporalio_common::{
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
failure::v1::{Failure as APIFailure, TimeoutFailureInfo, failure},
|
|
31
|
-
},
|
|
20
|
+
use temporalio_common::protos::{
|
|
21
|
+
coresdk::{
|
|
22
|
+
LocalActivitySlotInfo,
|
|
23
|
+
activity_result::{Cancellation, Failure as ActFail, Success},
|
|
24
|
+
activity_task::{ActivityCancelReason, ActivityTask, Start, activity_task},
|
|
25
|
+
},
|
|
26
|
+
temporal::api::{
|
|
27
|
+
common::v1::WorkflowExecution,
|
|
28
|
+
enums::v1::TimeoutType,
|
|
29
|
+
failure::v1::{Failure as APIFailure, TimeoutFailureInfo, failure},
|
|
32
30
|
},
|
|
33
|
-
worker::LocalActivitySlotKind,
|
|
34
31
|
};
|
|
35
32
|
use tokio::{
|
|
36
33
|
sync::{
|
|
@@ -7,7 +7,7 @@ pub(crate) use local_activities::{
|
|
|
7
7
|
};
|
|
8
8
|
|
|
9
9
|
use crate::{
|
|
10
|
-
|
|
10
|
+
TaskToken,
|
|
11
11
|
abstractions::{
|
|
12
12
|
ClosableMeteredPermitDealer, MeteredPermitDealer, TrackedOwnedMeteredSemPermit,
|
|
13
13
|
UsedMeteredSemPermit,
|
|
@@ -17,6 +17,7 @@ use crate::{
|
|
|
17
17
|
MetricsContext, activity_type, eager, should_record_failure_metric, workflow_type,
|
|
18
18
|
},
|
|
19
19
|
worker::{
|
|
20
|
+
ActivitySlotKind, PollError,
|
|
20
21
|
activities::activity_heartbeat_manager::ActivityHeartbeatError, client::WorkerClient,
|
|
21
22
|
},
|
|
22
23
|
};
|
|
@@ -35,21 +36,16 @@ use std::{
|
|
|
35
36
|
},
|
|
36
37
|
time::{Duration, Instant, SystemTime},
|
|
37
38
|
};
|
|
38
|
-
use temporalio_common::{
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
ApplicationFailureInfo, CanceledFailureInfo, Failure, failure::FailureInfo,
|
|
48
|
-
},
|
|
49
|
-
workflowservice::v1::PollActivityTaskQueueResponse,
|
|
50
|
-
},
|
|
39
|
+
use temporalio_common::protos::{
|
|
40
|
+
coresdk::{
|
|
41
|
+
ActivityHeartbeat, ActivitySlotInfo,
|
|
42
|
+
activity_result::{self as ar, activity_execution_result as aer},
|
|
43
|
+
activity_task::{ActivityCancelReason, ActivityCancellationDetails, ActivityTask},
|
|
44
|
+
},
|
|
45
|
+
temporal::api::{
|
|
46
|
+
failure::v1::{ApplicationFailureInfo, CanceledFailureInfo, Failure, failure::FailureInfo},
|
|
47
|
+
workflowservice::v1::PollActivityTaskQueueResponse,
|
|
51
48
|
},
|
|
52
|
-
worker::ActivitySlotKind,
|
|
53
49
|
};
|
|
54
50
|
use tokio::{
|
|
55
51
|
join,
|
|
@@ -737,12 +733,10 @@ mod tests {
|
|
|
737
733
|
abstractions::tests::fixed_size_permit_dealer,
|
|
738
734
|
pollers::{ActivityTaskOptions, LongPollBuffer},
|
|
739
735
|
prost_dur,
|
|
740
|
-
worker::client::mocks::mock_worker_client,
|
|
736
|
+
worker::{PollerBehavior, client::mocks::mock_worker_client},
|
|
741
737
|
};
|
|
742
738
|
use crossbeam_utils::atomic::AtomicCell;
|
|
743
|
-
use temporalio_common::
|
|
744
|
-
protos::coresdk::activity_result::ActivityExecutionResult, worker::PollerBehavior,
|
|
745
|
-
};
|
|
739
|
+
use temporalio_common::protos::coresdk::activity_result::ActivityExecutionResult;
|
|
746
740
|
|
|
747
741
|
#[tokio::test]
|
|
748
742
|
async fn per_worker_ratelimit() {
|
|
@@ -787,6 +781,7 @@ mod tests {
|
|
|
787
781
|
max_tps: None,
|
|
788
782
|
},
|
|
789
783
|
Arc::new(AtomicCell::new(None)),
|
|
784
|
+
Arc::new(AtomicBool::new(false)),
|
|
790
785
|
);
|
|
791
786
|
let atm = WorkerActivityTasks::new(
|
|
792
787
|
sem.clone(),
|
|
@@ -879,6 +874,7 @@ mod tests {
|
|
|
879
874
|
max_tps: None,
|
|
880
875
|
},
|
|
881
876
|
Arc::new(AtomicCell::new(None)),
|
|
877
|
+
Arc::new(AtomicBool::new(false)),
|
|
882
878
|
);
|
|
883
879
|
let atm = WorkerActivityTasks::new(
|
|
884
880
|
sem.clone(),
|
|
@@ -953,6 +949,7 @@ mod tests {
|
|
|
953
949
|
max_tps: None,
|
|
954
950
|
},
|
|
955
951
|
Arc::new(AtomicCell::new(None)),
|
|
952
|
+
Arc::new(AtomicBool::new(false)),
|
|
956
953
|
);
|
|
957
954
|
let atm = WorkerActivityTasks::new(
|
|
958
955
|
sem.clone(),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
use super::*;
|
|
2
|
-
use futures_util::Future;
|
|
2
|
+
use futures_util::{Future, FutureExt};
|
|
3
3
|
use std::sync::{Arc, LazyLock};
|
|
4
4
|
use temporalio_client::worker::ClientWorkerSet;
|
|
5
5
|
|
|
@@ -30,12 +30,13 @@ pub fn mock_worker_client() -> MockWorkerClient {
|
|
|
30
30
|
.returning(|| DEFAULT_WORKERS_REGISTRY.clone());
|
|
31
31
|
r.expect_is_mock().returning(|| true);
|
|
32
32
|
r.expect_shutdown_worker()
|
|
33
|
-
.returning(|_, _| Ok(ShutdownWorkerResponse {}));
|
|
33
|
+
.returning(|_, _, _, _| Ok(ShutdownWorkerResponse {}));
|
|
34
34
|
r.expect_sdk_name_and_version()
|
|
35
35
|
.returning(|| ("test-core".to_string(), "0.0.0".to_string()));
|
|
36
36
|
r.expect_identity()
|
|
37
37
|
.returning(|| "test-identity".to_string());
|
|
38
38
|
r.expect_worker_grouping_key().returning(Uuid::new_v4);
|
|
39
|
+
r.expect_worker_instance_key().returning(Uuid::new_v4);
|
|
39
40
|
r.expect_set_heartbeat_client_fields().returning(|hb| {
|
|
40
41
|
hb.sdk_name = "test-core".to_string();
|
|
41
42
|
hb.sdk_version = "0.0.0".to_string();
|
|
@@ -53,10 +54,14 @@ pub(crate) fn mock_manual_worker_client() -> MockManualWorkerClient {
|
|
|
53
54
|
r.expect_workers()
|
|
54
55
|
.returning(|| DEFAULT_WORKERS_REGISTRY.clone());
|
|
55
56
|
r.expect_is_mock().returning(|| true);
|
|
57
|
+
r.expect_shutdown_worker()
|
|
58
|
+
.returning(|_, _, _, _| async { Ok(ShutdownWorkerResponse {}) }.boxed());
|
|
56
59
|
r.expect_sdk_name_and_version()
|
|
57
60
|
.returning(|| ("test-core".to_string(), "0.0.0".to_string()));
|
|
58
61
|
r.expect_identity()
|
|
59
62
|
.returning(|| "test-identity".to_string());
|
|
63
|
+
r.expect_worker_grouping_key().returning(Uuid::new_v4);
|
|
64
|
+
r.expect_worker_instance_key().returning(Uuid::new_v4);
|
|
60
65
|
r
|
|
61
66
|
}
|
|
62
67
|
|
|
@@ -124,7 +129,7 @@ mockall::mock! {
|
|
|
124
129
|
fn fail_nexus_task<'a, 'b>(
|
|
125
130
|
&self,
|
|
126
131
|
task_token: TaskToken,
|
|
127
|
-
error:
|
|
132
|
+
error: NexusTaskFailure,
|
|
128
133
|
) -> impl Future<Output = Result<RespondNexusTaskFailedResponse>> + Send + 'b
|
|
129
134
|
where 'a: 'b, Self: 'b;
|
|
130
135
|
|
|
@@ -154,7 +159,7 @@ mockall::mock! {
|
|
|
154
159
|
impl Future<Output = Result<DescribeNamespaceResponse>> + Send + 'b
|
|
155
160
|
where 'a: 'b, Self: 'b;
|
|
156
161
|
|
|
157
|
-
fn shutdown_worker<'a, 'b>(&self, sticky_task_queue: String, worker_heartbeat: Option<WorkerHeartbeat>) -> impl Future<Output = Result<ShutdownWorkerResponse>> + Send + 'b
|
|
162
|
+
fn shutdown_worker<'a, 'b>(&self, sticky_task_queue: String, task_queue: String, task_queue_types: Vec<TaskQueueType>, worker_heartbeat: Option<WorkerHeartbeat>) -> impl Future<Output = Result<ShutdownWorkerResponse>> + Send + 'b
|
|
158
163
|
where 'a: 'b, Self: 'b;
|
|
159
164
|
|
|
160
165
|
fn record_worker_heartbeat<'a, 'b>(
|
|
@@ -163,13 +168,14 @@ mockall::mock! {
|
|
|
163
168
|
heartbeat: Vec<WorkerHeartbeat>
|
|
164
169
|
) -> impl Future<Output = Result<RecordWorkerHeartbeatResponse>> + Send + 'b where 'a: 'b, Self: 'b;
|
|
165
170
|
|
|
166
|
-
fn
|
|
171
|
+
fn replace_connection(&self, new_connection: Connection);
|
|
167
172
|
fn capabilities(&self) -> Option<Capabilities>;
|
|
168
173
|
fn workers(&self) -> Arc<ClientWorkerSet>;
|
|
169
174
|
fn is_mock(&self) -> bool;
|
|
170
175
|
fn sdk_name_and_version(&self) -> (String, String);
|
|
171
176
|
fn identity(&self) -> String;
|
|
172
177
|
fn worker_grouping_key(&self) -> Uuid;
|
|
178
|
+
fn worker_instance_key(&self) -> Uuid;
|
|
173
179
|
fn set_heartbeat_client_fields(&self, heartbeat: &mut WorkerHeartbeat);
|
|
174
180
|
}
|
|
175
181
|
}
|