@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.
Files changed (209) hide show
  1. package/Cargo.lock +172 -70
  2. package/lib/native.d.ts +1 -1
  3. package/package.json +2 -2
  4. package/releases/aarch64-apple-darwin/index.node +0 -0
  5. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  6. package/releases/x86_64-apple-darwin/index.node +0 -0
  7. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  8. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  9. package/sdk-core/.github/workflows/per-pr.yml +6 -6
  10. package/sdk-core/AGENTS.md +41 -30
  11. package/sdk-core/Cargo.toml +3 -0
  12. package/sdk-core/README.md +15 -9
  13. package/sdk-core/crates/client/Cargo.toml +4 -0
  14. package/sdk-core/crates/client/README.md +139 -0
  15. package/sdk-core/crates/client/src/async_activity_handle.rs +297 -0
  16. package/sdk-core/crates/client/src/callback_based.rs +7 -0
  17. package/sdk-core/crates/client/src/errors.rs +294 -0
  18. package/sdk-core/crates/client/src/{raw.rs → grpc.rs} +280 -159
  19. package/sdk-core/crates/client/src/lib.rs +920 -1326
  20. package/sdk-core/crates/client/src/metrics.rs +24 -33
  21. package/sdk-core/crates/client/src/options_structs.rs +457 -0
  22. package/sdk-core/crates/client/src/replaceable.rs +5 -4
  23. package/sdk-core/crates/client/src/request_extensions.rs +8 -9
  24. package/sdk-core/crates/client/src/retry.rs +99 -54
  25. package/sdk-core/crates/client/src/{worker/mod.rs → worker.rs} +1 -1
  26. package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
  27. package/sdk-core/crates/common/Cargo.toml +61 -2
  28. package/sdk-core/crates/common/build.rs +742 -12
  29. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/ci.yml +2 -0
  30. package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
  31. package/sdk-core/crates/common/protos/api_upstream/buf.yaml +0 -3
  32. package/sdk-core/crates/common/protos/api_upstream/cmd/check-path-conflicts/main.go +137 -0
  33. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv2.json +1166 -770
  34. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +1243 -750
  35. package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +2 -2
  36. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +4 -3
  37. package/sdk-core/crates/common/protos/api_upstream/temporal/api/failure/v1/message.proto +1 -0
  38. package/sdk-core/crates/common/protos/api_upstream/temporal/api/history/v1/message.proto +4 -0
  39. package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +6 -0
  40. package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +16 -1
  41. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +64 -6
  42. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +88 -33
  43. package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +4 -2
  44. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +4 -0
  45. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +5 -5
  46. package/sdk-core/crates/common/src/activity_definition.rs +20 -0
  47. package/sdk-core/crates/common/src/data_converters.rs +770 -0
  48. package/sdk-core/crates/common/src/envconfig.rs +5 -0
  49. package/sdk-core/crates/common/src/lib.rs +15 -211
  50. package/sdk-core/crates/common/src/payload_visitor.rs +648 -0
  51. package/sdk-core/crates/common/src/priority.rs +110 -0
  52. package/sdk-core/crates/common/src/protos/canned_histories.rs +3 -0
  53. package/sdk-core/crates/common/src/protos/history_builder.rs +45 -0
  54. package/sdk-core/crates/common/src/protos/history_info.rs +2 -0
  55. package/sdk-core/crates/common/src/protos/mod.rs +122 -27
  56. package/sdk-core/crates/common/src/protos/task_token.rs +3 -3
  57. package/sdk-core/crates/common/src/protos/utilities.rs +11 -0
  58. package/sdk-core/crates/{sdk-core → common}/src/telemetry/log_export.rs +5 -7
  59. package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
  60. package/sdk-core/crates/common/src/telemetry/metrics.rs +268 -223
  61. package/sdk-core/crates/{sdk-core → common}/src/telemetry/otel.rs +8 -13
  62. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_meter.rs +49 -50
  63. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_server.rs +2 -3
  64. package/sdk-core/crates/common/src/telemetry.rs +264 -4
  65. package/sdk-core/crates/common/src/worker.rs +68 -603
  66. package/sdk-core/crates/common/src/workflow_definition.rs +60 -0
  67. package/sdk-core/crates/macros/Cargo.toml +5 -1
  68. package/sdk-core/crates/macros/src/activities_definitions.rs +585 -0
  69. package/sdk-core/crates/macros/src/fsm_impl.rs +507 -0
  70. package/sdk-core/crates/macros/src/lib.rs +138 -512
  71. package/sdk-core/crates/macros/src/macro_utils.rs +106 -0
  72. package/sdk-core/crates/macros/src/workflow_definitions.rs +1224 -0
  73. package/sdk-core/crates/sdk/Cargo.toml +19 -6
  74. package/sdk-core/crates/sdk/README.md +415 -0
  75. package/sdk-core/crates/sdk/src/activities.rs +417 -0
  76. package/sdk-core/crates/sdk/src/interceptors.rs +1 -1
  77. package/sdk-core/crates/sdk/src/lib.rs +757 -442
  78. package/sdk-core/crates/sdk/src/workflow_context/options.rs +45 -35
  79. package/sdk-core/crates/sdk/src/workflow_context.rs +1033 -289
  80. package/sdk-core/crates/sdk/src/workflow_future.rs +277 -213
  81. package/sdk-core/crates/sdk/src/workflows.rs +711 -0
  82. package/sdk-core/crates/sdk-core/Cargo.toml +57 -64
  83. package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +41 -35
  84. package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +1 -1
  85. package/sdk-core/crates/sdk-core/src/abstractions.rs +6 -10
  86. package/sdk-core/crates/sdk-core/src/core_tests/activity_tasks.rs +6 -5
  87. package/sdk-core/crates/sdk-core/src/core_tests/mod.rs +13 -15
  88. package/sdk-core/crates/sdk-core/src/core_tests/queries.rs +21 -25
  89. package/sdk-core/crates/sdk-core/src/core_tests/replay_flag.rs +7 -10
  90. package/sdk-core/crates/sdk-core/src/core_tests/updates.rs +14 -17
  91. package/sdk-core/crates/sdk-core/src/core_tests/workers.rs +493 -26
  92. package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +4 -8
  93. package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +7 -7
  94. package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
  95. package/sdk-core/crates/sdk-core/src/lib.rs +41 -111
  96. package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
  97. package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +118 -19
  98. package/sdk-core/crates/sdk-core/src/protosext/mod.rs +2 -2
  99. package/sdk-core/crates/sdk-core/src/replay/mod.rs +14 -5
  100. package/sdk-core/crates/sdk-core/src/telemetry/metrics.rs +179 -196
  101. package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -280
  102. package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +6 -9
  103. package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
  104. package/sdk-core/crates/sdk-core/src/worker/activities/local_activities.rs +11 -14
  105. package/sdk-core/crates/sdk-core/src/worker/activities.rs +16 -19
  106. package/sdk-core/crates/sdk-core/src/worker/client/mocks.rs +9 -5
  107. package/sdk-core/crates/sdk-core/src/worker/client.rs +103 -81
  108. package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +7 -11
  109. package/sdk-core/crates/sdk-core/src/worker/mod.rs +1124 -229
  110. package/sdk-core/crates/sdk-core/src/worker/nexus.rs +145 -23
  111. package/sdk-core/crates/sdk-core/src/worker/slot_provider.rs +2 -2
  112. package/sdk-core/crates/sdk-core/src/worker/tuner/fixed_size.rs +2 -2
  113. package/sdk-core/crates/sdk-core/src/worker/tuner/resource_based.rs +13 -13
  114. package/sdk-core/crates/sdk-core/src/worker/tuner.rs +28 -8
  115. package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
  116. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +21 -22
  117. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/workflow_machines.rs +19 -4
  118. package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +14 -18
  119. package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +4 -6
  120. package/sdk-core/crates/sdk-core/src/worker/workflow/run_cache.rs +4 -7
  121. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_extraction.rs +2 -4
  122. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_poller.rs +8 -9
  123. package/sdk-core/crates/sdk-core/src/worker/workflow/workflow_stream.rs +1 -3
  124. package/sdk-core/crates/sdk-core/tests/activities_procmacro.rs +6 -0
  125. package/sdk-core/crates/sdk-core/tests/activities_trybuild/basic_pass.rs +54 -0
  126. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.rs +18 -0
  127. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.stderr +5 -0
  128. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.rs +14 -0
  129. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.stderr +5 -0
  130. package/sdk-core/crates/sdk-core/tests/activities_trybuild/multi_arg_pass.rs +48 -0
  131. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_input_pass.rs +14 -0
  132. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_return_type_pass.rs +19 -0
  133. package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +14 -5
  134. package/sdk-core/crates/sdk-core/tests/common/activity_functions.rs +55 -0
  135. package/sdk-core/crates/sdk-core/tests/common/mod.rs +241 -196
  136. package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
  137. package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +3 -5
  138. package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -64
  139. package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +298 -252
  140. package/sdk-core/crates/sdk-core/tests/integ_tests/async_activity_client_tests.rs +230 -0
  141. package/sdk-core/crates/sdk-core/tests/integ_tests/client_tests.rs +94 -57
  142. package/sdk-core/crates/sdk-core/tests/integ_tests/data_converter_tests.rs +381 -0
  143. package/sdk-core/crates/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +16 -12
  144. package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +48 -40
  145. package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +327 -255
  146. package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +50 -45
  147. package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +147 -126
  148. package/sdk-core/crates/sdk-core/tests/integ_tests/queries_tests.rs +103 -89
  149. package/sdk-core/crates/sdk-core/tests/integ_tests/update_tests.rs +609 -453
  150. package/sdk-core/crates/sdk-core/tests/integ_tests/visibility_tests.rs +80 -62
  151. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +360 -231
  152. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +248 -185
  153. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -43
  154. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_client_tests.rs +180 -0
  155. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/activities.rs +428 -315
  156. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -56
  157. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -28
  158. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -243
  159. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/client_interactions.rs +552 -0
  160. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +101 -42
  161. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -147
  162. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -28
  163. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1036
  164. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -41
  165. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +397 -238
  166. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +414 -189
  167. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/queries.rs +415 -0
  168. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/replay.rs +96 -36
  169. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/resets.rs +154 -137
  170. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -105
  171. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -38
  172. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -40
  173. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -54
  174. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +363 -226
  175. package/sdk-core/crates/sdk-core/tests/main.rs +17 -15
  176. package/sdk-core/crates/sdk-core/tests/manual_tests.rs +207 -152
  177. package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +65 -34
  178. package/sdk-core/crates/sdk-core/tests/shared_tests/priority.rs +107 -84
  179. package/sdk-core/crates/sdk-core/tests/workflows_procmacro.rs +6 -0
  180. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.rs +26 -0
  181. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.stderr +5 -0
  182. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/basic_pass.rs +49 -0
  183. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/minimal_pass.rs +21 -0
  184. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.rs +26 -0
  185. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.stderr +5 -0
  186. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.rs +21 -0
  187. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.stderr +5 -0
  188. package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +7 -1
  189. package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +14 -14
  190. package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +83 -74
  191. package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +9 -14
  192. package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +1 -2
  193. package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +13 -13
  194. package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +6 -6
  195. package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +3 -4
  196. package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +62 -75
  197. package/sdk-core/rustfmt.toml +2 -1
  198. package/src/client.rs +205 -318
  199. package/src/metrics.rs +22 -30
  200. package/src/runtime.rs +4 -5
  201. package/src/worker.rs +16 -19
  202. package/ts/native.ts +1 -1
  203. package/sdk-core/crates/client/src/workflow_handle/mod.rs +0 -212
  204. package/sdk-core/crates/common/src/errors.rs +0 -85
  205. package/sdk-core/crates/common/tests/worker_task_types_test.rs +0 -129
  206. package/sdk-core/crates/sdk/src/activity_context.rs +0 -238
  207. package/sdk-core/crates/sdk/src/app_data.rs +0 -37
  208. package/sdk-core/crates/sdk-core/tests/integ_tests/activity_functions.rs +0 -5
  209. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
@@ -1,14 +1,17 @@
1
1
  use super::{
2
- TELEM_SERVICE_NAME, default_buckets_for,
2
+ HistogramBucketOverrides, MetricTemporality, OtelCollectorOptions, OtlpProtocol,
3
+ TELEM_SERVICE_NAME,
3
4
  metrics::{
4
5
  ACTIVITY_EXEC_LATENCY_HISTOGRAM_NAME, ACTIVITY_SCHED_TO_START_LATENCY_HISTOGRAM_NAME,
5
- DEFAULT_MS_BUCKETS, WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME,
6
- WORKFLOW_TASK_EXECUTION_LATENCY_HISTOGRAM_NAME,
6
+ CoreMeter, Counter, DEFAULT_MS_BUCKETS, DEFAULT_S_BUCKETS, Gauge, GaugeF64, Histogram,
7
+ HistogramBase, HistogramDuration, HistogramDurationBase, HistogramF64, HistogramF64Base,
8
+ MetricAttributable, MetricAttributes, MetricParameters, NewAttributes,
9
+ WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME, WORKFLOW_TASK_EXECUTION_LATENCY_HISTOGRAM_NAME,
7
10
  WORKFLOW_TASK_REPLAY_LATENCY_HISTOGRAM_NAME,
8
- WORKFLOW_TASK_SCHED_TO_START_LATENCY_HISTOGRAM_NAME,
11
+ WORKFLOW_TASK_SCHED_TO_START_LATENCY_HISTOGRAM_NAME, default_buckets_for,
9
12
  },
10
13
  };
11
- use crate::{abstractions::dbg_panic, telemetry::metrics::DEFAULT_S_BUCKETS};
14
+ use crate::dbg_panic;
12
15
  use opentelemetry::{
13
16
  self, Key, KeyValue, Value,
14
17
  metrics::{Meter, MeterProvider as MeterProviderT},
@@ -22,14 +25,6 @@ use opentelemetry_sdk::{
22
25
  },
23
26
  };
24
27
  use std::{collections::HashMap, sync::Arc, time::Duration};
25
- use temporalio_common::telemetry::{
26
- HistogramBucketOverrides, MetricTemporality, OtelCollectorOptions, OtlpProtocol,
27
- metrics::{
28
- CoreMeter, Counter, Gauge, GaugeF64, Histogram, HistogramBase, HistogramDuration,
29
- HistogramDurationBase, HistogramF64, HistogramF64Base, MetricAttributable,
30
- MetricAttributes, MetricParameters, NewAttributes,
31
- },
32
- };
33
28
  use tonic::{metadata::MetadataMap, transport::ClientTlsConfig};
34
29
 
35
30
  fn histo_view(
@@ -1,4 +1,12 @@
1
- use crate::{abstractions::dbg_panic, telemetry::default_buckets_for};
1
+ use crate::{
2
+ dbg_panic,
3
+ telemetry::metrics::{
4
+ CoreMeter, Counter, CounterBase, Gauge, GaugeBase, GaugeF64, GaugeF64Base, Histogram,
5
+ HistogramBase, HistogramDuration, HistogramDurationBase, HistogramF64, HistogramF64Base,
6
+ MetricAttributable, MetricAttributes, MetricParameters, NewAttributes, OrderedPromLabelSet,
7
+ default_buckets_for,
8
+ },
9
+ };
2
10
  use anyhow::anyhow;
3
11
  use parking_lot::RwLock;
4
12
  use prometheus::{
@@ -12,11 +20,6 @@ use std::{
12
20
  sync::Arc,
13
21
  time::Duration,
14
22
  };
15
- use temporalio_common::telemetry::metrics::{
16
- CoreMeter, Counter, CounterBase, Gauge, GaugeBase, GaugeF64, GaugeF64Base, Histogram,
17
- HistogramBase, HistogramDuration, HistogramDurationBase, HistogramF64, HistogramF64Base,
18
- MetricAttributable, MetricAttributes, MetricParameters, NewAttributes, OrderedPromLabelSet,
19
- };
20
23
 
21
24
  #[derive(derive_more::From, derive_more::TryInto, Debug, Clone)]
22
25
  enum PromCollector {
@@ -459,7 +462,7 @@ pub struct CorePrometheusMeter {
459
462
  registry: Registry,
460
463
  use_seconds_for_durations: bool,
461
464
  unit_suffix: bool,
462
- bucket_overrides: temporalio_common::telemetry::HistogramBucketOverrides,
465
+ bucket_overrides: crate::telemetry::HistogramBucketOverrides,
463
466
  }
464
467
 
465
468
  impl CorePrometheusMeter {
@@ -467,7 +470,7 @@ impl CorePrometheusMeter {
467
470
  registry: Registry,
468
471
  use_seconds_for_durations: bool,
469
472
  unit_suffix: bool,
470
- bucket_overrides: temporalio_common::telemetry::HistogramBucketOverrides,
473
+ bucket_overrides: crate::telemetry::HistogramBucketOverrides,
471
474
  ) -> Self {
472
475
  Self {
473
476
  registry,
@@ -636,12 +639,11 @@ impl MetricAttributable<Box<dyn HistogramDurationBase>> for DurationHistogram {
636
639
  #[cfg(test)]
637
640
  mod tests {
638
641
  use super::*;
639
- use crate::telemetry::{TelemetryInstance, metrics::MetricsContext};
640
- use prometheus::{Encoder, TextEncoder};
641
- use temporalio_common::telemetry::{
642
- METRIC_PREFIX,
643
- metrics::{MetricKeyValue, NewAttributes},
642
+ use crate::telemetry::{
643
+ HistogramBucketOverrides, TELEM_SERVICE_NAME,
644
+ metrics::{MetricKeyValue, NewAttributes, WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME},
644
645
  };
646
+ use prometheus::{Encoder, TextEncoder};
645
647
 
646
648
  #[test]
647
649
  fn test_prometheus_meter_dynamic_labels() {
@@ -650,7 +652,7 @@ mod tests {
650
652
  registry.clone(),
651
653
  false,
652
654
  false,
653
- temporalio_common::telemetry::HistogramBucketOverrides::default(),
655
+ HistogramBucketOverrides::default(),
654
656
  );
655
657
 
656
658
  let counter = meter.counter(MetricParameters {
@@ -690,7 +692,7 @@ mod tests {
690
692
  registry.clone(),
691
693
  false,
692
694
  false,
693
- temporalio_common::telemetry::HistogramBucketOverrides::default(),
695
+ HistogramBucketOverrides::default(),
694
696
  );
695
697
 
696
698
  let base_attrs = meter.new_attributes(NewAttributes::new(vec![
@@ -729,15 +731,11 @@ mod tests {
729
731
  registry.clone(),
730
732
  false,
731
733
  false,
732
- temporalio_common::telemetry::HistogramBucketOverrides::default(),
734
+ HistogramBucketOverrides::default(),
733
735
  );
734
736
 
735
737
  let histogram_ms = meter_ms.histogram_duration(MetricParameters {
736
- name: format!(
737
- "temporal_{}",
738
- crate::telemetry::WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME
739
- )
740
- .into(),
738
+ name: format!("temporal_{}", WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME).into(),
741
739
  description: "Test workflow e2e latency".into(),
742
740
  unit: "duration".into(),
743
741
  });
@@ -759,15 +757,11 @@ mod tests {
759
757
  registry_s.clone(),
760
758
  true,
761
759
  false,
762
- temporalio_common::telemetry::HistogramBucketOverrides::default(),
760
+ HistogramBucketOverrides::default(),
763
761
  );
764
762
 
765
763
  let histogram_s = meter_s.histogram_duration(MetricParameters {
766
- name: format!(
767
- "temporal_{}",
768
- crate::telemetry::WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME
769
- )
770
- .into(),
764
+ name: format!("temporal_{}", WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME).into(),
771
765
  description: "Test workflow e2e latency".into(),
772
766
  unit: "duration".into(),
773
767
  });
@@ -791,7 +785,7 @@ mod tests {
791
785
  registry.clone(),
792
786
  false,
793
787
  false,
794
- temporalio_common::telemetry::HistogramBucketOverrides::default(),
788
+ HistogramBucketOverrides::default(),
795
789
  );
796
790
  let counter = meter.counter(MetricParameters {
797
791
  name: "no_labels".into(),
@@ -806,35 +800,40 @@ mod tests {
806
800
  }
807
801
 
808
802
  #[test]
809
- fn works_with_recreated_metrics_context() {
810
- let registry = Registry::new(HashMap::new());
803
+ fn test_overlapping_fields() {
804
+ let registry = Registry::new(HashMap::from([(
805
+ "service_name".to_string(),
806
+ TELEM_SERVICE_NAME.to_string(),
807
+ )]));
811
808
  let meter = CorePrometheusMeter::new(
812
809
  registry.clone(),
813
810
  false,
814
811
  false,
815
- temporalio_common::telemetry::HistogramBucketOverrides::default(),
816
- );
817
- let telem_instance = TelemetryInstance::new(
818
- None,
819
- None,
820
- METRIC_PREFIX.to_string(),
821
- Some(Arc::new(meter)),
822
- true,
823
- temporalio_common::telemetry::TaskQueueLabelStrategy::UseNormal,
812
+ HistogramBucketOverrides::default(),
824
813
  );
825
- let mc = MetricsContext::top_level("foo".to_string(), "q".to_string(), &telem_instance);
826
- mc.worker_registered();
827
- drop(mc);
828
814
 
829
- let mc = MetricsContext::top_level("foo".to_string(), "q".to_string(), &telem_instance);
830
- mc.worker_registered();
815
+ let counter = meter.counter(MetricParameters {
816
+ name: "temporal_worker_start".into(),
817
+ description: "".into(),
818
+ unit: "".into(),
819
+ });
820
+
821
+ let attrs1 = meter.new_attributes(NewAttributes::new(vec![
822
+ MetricKeyValue::new("namespace", "foo"),
823
+ MetricKeyValue::new("task_queue", "q"),
824
+ ]));
825
+ counter.add(2, &attrs1);
831
826
 
832
- let mc = MetricsContext::top_level("foo".to_string(), "q2".to_string(), &telem_instance);
833
- mc.worker_registered();
827
+ let attrs2 = meter.new_attributes(NewAttributes::new(vec![
828
+ MetricKeyValue::new("namespace", "foo"),
829
+ MetricKeyValue::new("task_queue", "q2"),
830
+ ]));
831
+ counter.add(1, &attrs2);
834
832
 
835
833
  let output = output_string(&registry);
836
- assert!(output.contains("temporal_worker_start{namespace=\"foo\",service_name=\"temporal-core-sdk\",task_queue=\"q\"} 2"));
837
- assert!(output.contains("temporal_worker_start{namespace=\"foo\",service_name=\"temporal-core-sdk\",task_queue=\"q2\"} 1"));
834
+
835
+ assert!(output.contains("temporal_worker_start{namespace=\"foo\",task_queue=\"q\",service_name=\"temporal-core-sdk\"} 2"));
836
+ assert!(output.contains("temporal_worker_start{namespace=\"foo\",task_queue=\"q2\",service_name=\"temporal-core-sdk\"} 1"));
838
837
  }
839
838
 
840
839
  #[test]
@@ -844,7 +843,7 @@ mod tests {
844
843
  registry.clone(),
845
844
  false,
846
845
  false,
847
- temporalio_common::telemetry::HistogramBucketOverrides::default(),
846
+ HistogramBucketOverrides::default(),
848
847
  );
849
848
  let dashes = meter.counter(MetricParameters {
850
849
  name: "dash-in-name".into(),
@@ -865,7 +864,7 @@ mod tests {
865
864
  registry.clone(),
866
865
  false,
867
866
  false,
868
- temporalio_common::telemetry::HistogramBucketOverrides::default(),
867
+ HistogramBucketOverrides::default(),
869
868
  );
870
869
  let dashes = meter.counter(MetricParameters {
871
870
  name: "not@permitted:symbols".into(),
@@ -1,4 +1,4 @@
1
- use crate::telemetry::prometheus_meter::Registry;
1
+ use crate::telemetry::{PrometheusExporterOptions, prometheus_meter::Registry};
2
2
  use http_body_util::Full;
3
3
  use hyper::{Method, Request, Response, body::Bytes, header::CONTENT_TYPE, service::service_fn};
4
4
  use hyper_util::{
@@ -10,7 +10,6 @@ use std::{
10
10
  net::{SocketAddr, TcpListener},
11
11
  sync::Arc,
12
12
  };
13
- use temporalio_common::telemetry::PrometheusExporterOptions;
14
13
  use tokio::{io, task::AbortHandle};
15
14
 
16
15
  pub struct StartedPromServer {
@@ -20,7 +19,7 @@ pub struct StartedPromServer {
20
19
  }
21
20
 
22
21
  /// Builds and runs a prometheus endpoint which can be scraped by prom instances for metrics export.
23
- /// Returns the meter that can be used as a [`CoreMeter`](temporalio_common::telemetry::metrics::CoreMeter).
22
+ /// Returns the meter that can be used as a [`CoreMeter`](crate::telemetry::metrics::CoreMeter).
24
23
  ///
25
24
  /// Requires a Tokio runtime to exist, and will block briefly while binding the server endpoint.
26
25
  pub fn start_prometheus_metric_exporter(
@@ -1,20 +1,51 @@
1
1
  //! Contains tracing/logging and metrics related functionality
2
2
 
3
+ /// Metric instrument types and the [`CoreMeter`] trait.
3
4
  pub mod metrics;
4
5
 
5
- use crate::telemetry::metrics::CoreMeter;
6
+ #[cfg(feature = "core-based-sdk")]
7
+ mod log_export;
8
+ #[cfg(feature = "otel")]
9
+ mod otel;
10
+ #[cfg(feature = "prometheus")]
11
+ mod prometheus_meter;
12
+ #[cfg(feature = "prometheus")]
13
+ mod prometheus_server;
14
+
15
+ use crate::telemetry::metrics::{
16
+ CoreMeter, MetricKeyValue, NewAttributes, PrefixedMetricsMeter, TemporalMeter,
17
+ };
6
18
  use std::{
19
+ cell::RefCell,
7
20
  collections::HashMap,
21
+ env,
8
22
  fmt::{Debug, Formatter},
9
23
  net::SocketAddr,
10
- sync::Arc,
24
+ sync::{
25
+ Arc,
26
+ atomic::{AtomicBool, Ordering},
27
+ },
11
28
  time::{Duration, SystemTime, UNIX_EPOCH},
12
29
  };
13
- use tracing_core::{Level, Subscriber};
30
+ use tracing::{Level, Subscriber};
31
+ use tracing_subscriber::{EnvFilter, Layer, layer::SubscriberExt};
14
32
  use url::Url;
15
33
 
34
+ #[cfg(feature = "core-based-sdk")]
35
+ use crate::telemetry::log_export::CoreLogConsumerLayer;
36
+
37
+ #[cfg(feature = "core-based-sdk")]
38
+ pub use log_export::{CoreLogBuffer, CoreLogBufferedConsumer, CoreLogStreamConsumer};
39
+ #[cfg(feature = "otel")]
40
+ pub use otel::build_otlp_metric_exporter;
41
+ #[cfg(feature = "prometheus")]
42
+ pub use prometheus_server::start_prometheus_metric_exporter;
43
+
44
+ /// The default prefix applied to all Temporal metric names.
16
45
  pub static METRIC_PREFIX: &str = "temporal_";
17
46
 
47
+ const TELEM_SERVICE_NAME: &str = "temporal-core-sdk";
48
+
18
49
  /// Each core runtime instance has a telemetry subsystem associated with it, this trait defines the
19
50
  /// operations that lang might want to perform on that telemetry after it's initialized.
20
51
  pub trait CoreTelemetry {
@@ -126,8 +157,9 @@ pub struct OtelCollectorOptions {
126
157
  /// Options for exporting metrics to Prometheus
127
158
  #[derive(Debug, Clone, bon::Builder)]
128
159
  pub struct PrometheusExporterOptions {
160
+ /// The address the Prometheus exporter HTTP server will bind to.
129
161
  pub socket_addr: SocketAddr,
130
- // A map of tags to be applied to all metrics
162
+ /// A map of tags to be applied to all metrics
131
163
  #[builder(default)]
132
164
  pub global_tags: HashMap<String, String>,
133
165
  /// If set true, all counters will include a "_total" suffix
@@ -168,11 +200,13 @@ pub enum Logger {
168
200
  /// An [EnvFilter](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/struct.EnvFilter.html) filter string.
169
201
  filter: String,
170
202
  },
203
+ #[cfg(feature = "core-based-sdk")]
171
204
  /// Forward logs to Lang - collectable with `fetch_global_buffered_logs`.
172
205
  Forward {
173
206
  /// An [EnvFilter](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/struct.EnvFilter.html) filter string.
174
207
  filter: String,
175
208
  },
209
+ #[cfg(feature = "core-based-sdk")]
176
210
  /// Push logs to Lang. Can be used with
177
211
  /// temporalio_sdk_core::telemetry::log_export::CoreLogBufferedConsumer to buffer.
178
212
  Push {
@@ -242,3 +276,229 @@ pub trait CoreLogConsumer: Send + Sync + Debug {
242
276
  /// Invoked synchronously for every single log.
243
277
  fn on_log(&self, log: CoreLog);
244
278
  }
279
+
280
+ #[cfg(feature = "core-based-sdk")]
281
+ const FORWARD_LOG_BUFFER_SIZE: usize = 2048;
282
+
283
+ /// Help you construct an [EnvFilter] compatible filter string which will forward all core module
284
+ /// traces at `core_level` and all others (from 3rd party modules, etc) at `other_level`.
285
+ pub fn construct_filter_string(core_level: Level, other_level: Level) -> String {
286
+ format!(
287
+ "{other_level},temporalio_common={core_level},temporalio_sdk_core={core_level},temporalio_client={core_level},temporalio_sdk={core_level}"
288
+ )
289
+ }
290
+
291
+ /// Holds initialized tracing/metrics exporters, etc
292
+ pub struct TelemetryInstance {
293
+ metric_prefix: String,
294
+ #[cfg(feature = "core-based-sdk")]
295
+ logs_out: Option<parking_lot::Mutex<CoreLogBuffer>>,
296
+ metrics: Option<Arc<dyn CoreMeter + 'static>>,
297
+ /// The tracing subscriber which is associated with this telemetry instance. May be `None` if
298
+ /// the user has not opted into any tracing configuration.
299
+ trace_subscriber: Option<Arc<dyn Subscriber + Send + Sync>>,
300
+ attach_service_name: bool,
301
+ task_queue_label_strategy: TaskQueueLabelStrategy,
302
+ }
303
+
304
+ impl TelemetryInstance {
305
+ /// Return the trace subscriber associated with the telemetry options/instance. Can be used
306
+ /// to manually set the default for a thread or globally using the `tracing` crate, or with
307
+ /// [set_trace_subscriber_for_current_thread].
308
+ pub fn trace_subscriber(&self) -> Option<Arc<dyn Subscriber + Send + Sync>> {
309
+ self.trace_subscriber.clone()
310
+ }
311
+
312
+ /// Some metric meters cannot be initialized until after a tokio runtime has started and after
313
+ /// other telemetry has initted (ex: prometheus). They can be attached here.
314
+ pub fn attach_late_init_metrics(&mut self, meter: Arc<dyn CoreMeter + 'static>) {
315
+ self.metrics = Some(meter);
316
+ }
317
+
318
+ /// Returns our wrapper for metric meters, including the `metric_prefix` from
319
+ /// [TelemetryOptions]. This should be used to initialize clients or for any other
320
+ /// temporal-owned metrics. User defined metrics should use [Self::get_metric_meter].
321
+ pub fn get_temporal_metric_meter(&self) -> Option<TemporalMeter> {
322
+ self.metrics.clone().map(|m| {
323
+ let kvs = self.default_kvs();
324
+ let attribs = NewAttributes::new(kvs);
325
+ TemporalMeter::new(
326
+ Arc::new(PrefixedMetricsMeter::new(self.metric_prefix.clone(), m))
327
+ as Arc<dyn CoreMeter>,
328
+ attribs,
329
+ self.task_queue_label_strategy,
330
+ )
331
+ })
332
+ }
333
+
334
+ /// Returns our wrapper for metric meters, including attaching the service name if enabled.
335
+ pub fn get_metric_meter(&self) -> Option<TemporalMeter> {
336
+ self.metrics.clone().map(|m| {
337
+ let kvs = self.default_kvs();
338
+ let attribs = NewAttributes::new(kvs);
339
+ TemporalMeter::new(m, attribs, self.task_queue_label_strategy)
340
+ })
341
+ }
342
+
343
+ fn default_kvs(&self) -> Vec<MetricKeyValue> {
344
+ if self.attach_service_name {
345
+ vec![MetricKeyValue::new("service_name", TELEM_SERVICE_NAME)]
346
+ } else {
347
+ vec![]
348
+ }
349
+ }
350
+ }
351
+
352
+ thread_local! {
353
+ static SUB_GUARD: RefCell<Option<tracing::subscriber::DefaultGuard>> =
354
+ const { RefCell::new(None) };
355
+ }
356
+ /// Set the trace subscriber for the current thread. This must be done in every thread which uses
357
+ /// core stuff, otherwise traces/logs will not be collected on that thread. For example, if using
358
+ /// a multithreaded Tokio runtime, you should ensure that said runtime uses
359
+ /// [on_thread_start](https://docs.rs/tokio/latest/tokio/runtime/struct.Builder.html#method.on_thread_start)
360
+ /// or a similar mechanism to call this for each thread within the runtime.
361
+ pub fn set_trace_subscriber_for_current_thread(sub: impl Subscriber + Send + Sync + 'static) {
362
+ SUB_GUARD.with(|sg| {
363
+ if sg.borrow().is_none() {
364
+ let g = tracing::subscriber::set_default(sub);
365
+ *sg.borrow_mut() = Some(g);
366
+ }
367
+ })
368
+ }
369
+
370
+ /// Undoes [set_trace_subscriber_for_current_thread]
371
+ pub fn remove_trace_subscriber_for_current_thread() {
372
+ SUB_GUARD.take();
373
+ }
374
+
375
+ #[cfg(feature = "core-based-sdk")]
376
+ impl CoreTelemetry for TelemetryInstance {
377
+ fn fetch_buffered_logs(&self) -> Vec<CoreLog> {
378
+ if let Some(logs_out) = self.logs_out.as_ref() {
379
+ logs_out.lock().drain()
380
+ } else {
381
+ vec![]
382
+ }
383
+ }
384
+ }
385
+
386
+ /// Initialize tracing subscribers/output and logging export, returning a [TelemetryInstance]
387
+ /// which can be used to register default / global tracing subscribers.
388
+ ///
389
+ /// You should only call this once per unique [TelemetryOptions]
390
+ ///
391
+ /// See [TelemetryOptions] docs for more on configuration.
392
+ pub fn telemetry_init(opts: TelemetryOptions) -> Result<TelemetryInstance, anyhow::Error> {
393
+ #[cfg(feature = "core-based-sdk")]
394
+ let mut logs_out = None;
395
+
396
+ // Tracing subscriber layers =========
397
+ let mut console_pretty_layer = None;
398
+ let mut console_compact_layer = None;
399
+ #[cfg(feature = "core-based-sdk")]
400
+ let mut forward_layer = None;
401
+ // ===================================
402
+
403
+ let tracing_sub = if let Some(ts) = opts.subscriber_override {
404
+ Some(ts)
405
+ } else {
406
+ opts.logging.map(|logger| {
407
+ match logger {
408
+ Logger::Console { filter } => {
409
+ // This is silly dupe but can't be avoided without boxing.
410
+ if env::var("TEMPORAL_CORE_PRETTY_LOGS").is_ok() {
411
+ console_pretty_layer = Some(
412
+ tracing_subscriber::fmt::layer()
413
+ .with_target(false)
414
+ .event_format(
415
+ tracing_subscriber::fmt::format()
416
+ .pretty()
417
+ .with_source_location(false),
418
+ )
419
+ .with_filter(EnvFilter::new(filter)),
420
+ )
421
+ } else {
422
+ console_compact_layer = Some(
423
+ tracing_subscriber::fmt::layer()
424
+ .with_target(false)
425
+ .event_format(
426
+ tracing_subscriber::fmt::format()
427
+ .compact()
428
+ .with_source_location(false),
429
+ )
430
+ .with_filter(EnvFilter::new(filter)),
431
+ )
432
+ }
433
+ }
434
+ #[cfg(feature = "core-based-sdk")]
435
+ Logger::Forward { filter } => {
436
+ let (export_layer, lo) =
437
+ CoreLogConsumerLayer::new_buffered(FORWARD_LOG_BUFFER_SIZE);
438
+ logs_out = Some(parking_lot::Mutex::new(lo));
439
+ forward_layer = Some(export_layer.with_filter(EnvFilter::new(filter)));
440
+ }
441
+ #[cfg(feature = "core-based-sdk")]
442
+ Logger::Push { filter, consumer } => {
443
+ forward_layer = Some(
444
+ CoreLogConsumerLayer::new(consumer).with_filter(EnvFilter::new(filter)),
445
+ );
446
+ }
447
+ };
448
+ let reg = tracing_subscriber::registry()
449
+ .with(console_pretty_layer)
450
+ .with(console_compact_layer);
451
+ #[cfg(feature = "core-based-sdk")]
452
+ let reg = reg.with(forward_layer);
453
+
454
+ Arc::new(reg) as Arc<dyn Subscriber + Send + Sync>
455
+ })
456
+ };
457
+
458
+ Ok(TelemetryInstance {
459
+ metric_prefix: opts.metric_prefix,
460
+ #[cfg(feature = "core-based-sdk")]
461
+ logs_out,
462
+ metrics: opts.metrics,
463
+ trace_subscriber: tracing_sub,
464
+ attach_service_name: opts.attach_service_name,
465
+ task_queue_label_strategy: opts.task_queue_label_strategy,
466
+ })
467
+ }
468
+
469
+ /// WARNING: Calling can cause panics because of <https://github.com/tokio-rs/tracing/issues/1656>
470
+ /// Lang must not start using until resolved
471
+ ///
472
+ /// Initialize telemetry/tracing globally. Useful for testing. Only takes affect when called
473
+ /// the first time. Subsequent calls are ignored.
474
+ pub fn telemetry_init_global(opts: TelemetryOptions) -> Result<(), anyhow::Error> {
475
+ static INITTED: AtomicBool = AtomicBool::new(false);
476
+ if INITTED
477
+ .compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)
478
+ .is_ok()
479
+ {
480
+ let ti = telemetry_init(opts)?;
481
+ if let Some(ts) = ti.trace_subscriber() {
482
+ tracing::subscriber::set_global_default(ts)?;
483
+ }
484
+ }
485
+ Ok(())
486
+ }
487
+
488
+ /// WARNING: Calling can cause panics because of <https://github.com/tokio-rs/tracing/issues/1656>
489
+ /// Lang must not start using until resolved
490
+ ///
491
+ /// Initialize the fallback global handler. All lang SDKs should call this somewhere, once, at
492
+ /// startup, as it initializes a fallback handler for any dependencies (looking at you, otel) that
493
+ /// don't provide good ways to customize their tracing usage. It sets a WARN-level global filter
494
+ /// that uses the default console logger.
495
+ pub fn telemetry_init_fallback() -> Result<(), anyhow::Error> {
496
+ telemetry_init_global(
497
+ TelemetryOptions::builder()
498
+ .logging(Logger::Console {
499
+ filter: construct_filter_string(Level::DEBUG, Level::WARN),
500
+ })
501
+ .build(),
502
+ )?;
503
+ Ok(())
504
+ }