@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.
Files changed (233) hide show
  1. package/Cargo.lock +794 -650
  2. package/bridge-macros/src/derive_tryintojs.rs +40 -0
  3. package/lib/native.d.ts +24 -3
  4. package/package.json +4 -4
  5. package/releases/aarch64-apple-darwin/index.node +0 -0
  6. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  7. package/releases/x86_64-apple-darwin/index.node +0 -0
  8. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  9. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  10. package/sdk-core/.github/workflows/per-pr.yml +6 -6
  11. package/sdk-core/AGENTS.md +42 -31
  12. package/sdk-core/Cargo.toml +4 -1
  13. package/sdk-core/README.md +19 -13
  14. package/sdk-core/crates/client/Cargo.toml +4 -0
  15. package/sdk-core/crates/client/README.md +139 -0
  16. package/sdk-core/crates/client/src/async_activity_handle.rs +297 -0
  17. package/sdk-core/crates/client/src/callback_based.rs +7 -0
  18. package/sdk-core/crates/client/src/errors.rs +294 -0
  19. package/sdk-core/crates/client/src/{raw.rs → grpc.rs} +370 -159
  20. package/sdk-core/crates/client/src/lib.rs +920 -1326
  21. package/sdk-core/crates/client/src/metrics.rs +24 -33
  22. package/sdk-core/crates/client/src/options_structs.rs +457 -0
  23. package/sdk-core/crates/client/src/replaceable.rs +5 -4
  24. package/sdk-core/crates/client/src/request_extensions.rs +8 -9
  25. package/sdk-core/crates/client/src/retry.rs +99 -54
  26. package/sdk-core/crates/client/src/{worker/mod.rs → worker.rs} +104 -29
  27. package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
  28. package/sdk-core/crates/common/Cargo.toml +62 -3
  29. package/sdk-core/crates/common/build.rs +742 -12
  30. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/ci.yml +2 -0
  31. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/create-release.yml +0 -5
  32. package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
  33. package/sdk-core/crates/common/protos/api_upstream/README.md +8 -0
  34. package/sdk-core/crates/common/protos/api_upstream/cmd/check-path-conflicts/main.go +137 -0
  35. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv2.json +3329 -2647
  36. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +2734 -708
  37. package/sdk-core/crates/common/protos/api_upstream/temporal/api/activity/v1/message.proto +155 -3
  38. package/sdk-core/crates/common/protos/api_upstream/temporal/api/command/v1/message.proto +26 -0
  39. package/sdk-core/crates/common/protos/api_upstream/temporal/api/common/v1/message.proto +8 -1
  40. package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +27 -1
  41. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/activity.proto +81 -0
  42. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/event_type.proto +4 -0
  43. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +4 -0
  44. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +15 -0
  45. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +63 -15
  46. package/sdk-core/crates/common/protos/api_upstream/temporal/api/errordetails/v1/message.proto +8 -0
  47. package/sdk-core/crates/common/protos/api_upstream/temporal/api/failure/v1/message.proto +1 -0
  48. package/sdk-core/crates/common/protos/api_upstream/temporal/api/history/v1/message.proto +111 -17
  49. package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +21 -0
  50. package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +20 -1
  51. package/sdk-core/crates/common/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +4 -0
  52. package/sdk-core/crates/common/protos/api_upstream/temporal/api/schedule/v1/message.proto +2 -2
  53. package/sdk-core/crates/common/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -0
  54. package/sdk-core/crates/common/protos/api_upstream/temporal/api/worker/v1/message.proto +4 -7
  55. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflow/v1/message.proto +80 -22
  56. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +347 -23
  57. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +242 -43
  58. package/sdk-core/crates/common/protos/local/temporal/sdk/core/core_interface.proto +15 -0
  59. package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +9 -2
  60. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +8 -0
  61. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +22 -5
  62. package/sdk-core/crates/common/src/activity_definition.rs +20 -0
  63. package/sdk-core/crates/common/src/data_converters.rs +770 -0
  64. package/sdk-core/crates/common/src/envconfig.rs +5 -0
  65. package/sdk-core/crates/common/src/lib.rs +15 -211
  66. package/sdk-core/crates/common/src/payload_visitor.rs +648 -0
  67. package/sdk-core/crates/common/src/priority.rs +110 -0
  68. package/sdk-core/crates/common/src/protos/canned_histories.rs +19 -0
  69. package/sdk-core/crates/common/src/protos/history_builder.rs +45 -0
  70. package/sdk-core/crates/common/src/protos/history_info.rs +2 -0
  71. package/sdk-core/crates/common/src/protos/mod.rs +134 -27
  72. package/sdk-core/crates/common/src/protos/task_token.rs +3 -3
  73. package/sdk-core/crates/common/src/protos/utilities.rs +11 -0
  74. package/sdk-core/crates/{sdk-core → common}/src/telemetry/log_export.rs +11 -16
  75. package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
  76. package/sdk-core/crates/common/src/telemetry/metrics.rs +272 -225
  77. package/sdk-core/crates/{sdk-core → common}/src/telemetry/otel.rs +8 -13
  78. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_meter.rs +49 -50
  79. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_server.rs +2 -3
  80. package/sdk-core/crates/common/src/telemetry.rs +278 -19
  81. package/sdk-core/crates/common/src/worker.rs +68 -636
  82. package/sdk-core/crates/common/src/workflow_definition.rs +60 -0
  83. package/sdk-core/crates/macros/Cargo.toml +5 -1
  84. package/sdk-core/crates/macros/src/activities_definitions.rs +585 -0
  85. package/sdk-core/crates/macros/src/fsm_impl.rs +507 -0
  86. package/sdk-core/crates/macros/src/lib.rs +138 -512
  87. package/sdk-core/crates/macros/src/macro_utils.rs +106 -0
  88. package/sdk-core/crates/macros/src/workflow_definitions.rs +1224 -0
  89. package/sdk-core/crates/sdk/Cargo.toml +19 -6
  90. package/sdk-core/crates/sdk/README.md +415 -0
  91. package/sdk-core/crates/sdk/src/activities.rs +417 -0
  92. package/sdk-core/crates/sdk/src/interceptors.rs +1 -1
  93. package/sdk-core/crates/sdk/src/lib.rs +759 -442
  94. package/sdk-core/crates/sdk/src/workflow_context/options.rs +64 -35
  95. package/sdk-core/crates/sdk/src/workflow_context.rs +1033 -289
  96. package/sdk-core/crates/sdk/src/workflow_future.rs +277 -213
  97. package/sdk-core/crates/sdk/src/workflows.rs +711 -0
  98. package/sdk-core/crates/sdk-core/Cargo.toml +59 -65
  99. package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +45 -54
  100. package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +1 -1
  101. package/sdk-core/crates/sdk-core/src/abstractions.rs +6 -10
  102. package/sdk-core/crates/sdk-core/src/core_tests/activity_tasks.rs +6 -5
  103. package/sdk-core/crates/sdk-core/src/core_tests/mod.rs +22 -21
  104. package/sdk-core/crates/sdk-core/src/core_tests/queries.rs +21 -25
  105. package/sdk-core/crates/sdk-core/src/core_tests/replay_flag.rs +7 -10
  106. package/sdk-core/crates/sdk-core/src/core_tests/updates.rs +14 -17
  107. package/sdk-core/crates/sdk-core/src/core_tests/workers.rs +647 -27
  108. package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +46 -41
  109. package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +13 -16
  110. package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
  111. package/sdk-core/crates/sdk-core/src/lib.rs +60 -123
  112. package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
  113. package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +411 -32
  114. package/sdk-core/crates/sdk-core/src/protosext/mod.rs +2 -2
  115. package/sdk-core/crates/sdk-core/src/replay/mod.rs +14 -5
  116. package/sdk-core/crates/sdk-core/src/telemetry/metrics.rs +183 -198
  117. package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -281
  118. package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +35 -16
  119. package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
  120. package/sdk-core/crates/sdk-core/src/worker/activities/activity_heartbeat_manager.rs +1 -0
  121. package/sdk-core/crates/sdk-core/src/worker/activities/local_activities.rs +11 -14
  122. package/sdk-core/crates/sdk-core/src/worker/activities.rs +16 -19
  123. package/sdk-core/crates/sdk-core/src/worker/client/mocks.rs +11 -5
  124. package/sdk-core/crates/sdk-core/src/worker/client.rs +104 -86
  125. package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +10 -14
  126. package/sdk-core/crates/sdk-core/src/worker/mod.rs +1175 -241
  127. package/sdk-core/crates/sdk-core/src/worker/nexus.rs +150 -23
  128. package/sdk-core/crates/sdk-core/src/worker/slot_provider.rs +2 -2
  129. package/sdk-core/crates/sdk-core/src/worker/tuner/fixed_size.rs +2 -2
  130. package/sdk-core/crates/sdk-core/src/worker/tuner/resource_based.rs +25 -27
  131. package/sdk-core/crates/sdk-core/src/worker/tuner.rs +64 -44
  132. package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
  133. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/patch_state_machine.rs +5 -8
  134. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +21 -22
  135. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/workflow_machines.rs +28 -4
  136. package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +20 -41
  137. package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +50 -9
  138. package/sdk-core/crates/sdk-core/src/worker/workflow/run_cache.rs +4 -7
  139. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_extraction.rs +2 -4
  140. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_poller.rs +8 -9
  141. package/sdk-core/crates/sdk-core/src/worker/workflow/workflow_stream.rs +1 -3
  142. package/sdk-core/crates/sdk-core/tests/activities_procmacro.rs +6 -0
  143. package/sdk-core/crates/sdk-core/tests/activities_trybuild/basic_pass.rs +54 -0
  144. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.rs +18 -0
  145. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.stderr +5 -0
  146. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.rs +14 -0
  147. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.stderr +5 -0
  148. package/sdk-core/crates/sdk-core/tests/activities_trybuild/multi_arg_pass.rs +48 -0
  149. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_input_pass.rs +14 -0
  150. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_return_type_pass.rs +19 -0
  151. package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +14 -5
  152. package/sdk-core/crates/sdk-core/tests/common/activity_functions.rs +55 -0
  153. package/sdk-core/crates/sdk-core/tests/common/mod.rs +281 -236
  154. package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
  155. package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +9 -14
  156. package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -66
  157. package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +306 -268
  158. package/sdk-core/crates/sdk-core/tests/integ_tests/async_activity_client_tests.rs +230 -0
  159. package/sdk-core/crates/sdk-core/tests/integ_tests/client_tests.rs +94 -57
  160. package/sdk-core/crates/sdk-core/tests/integ_tests/data_converter_tests.rs +381 -0
  161. package/sdk-core/crates/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +37 -38
  162. package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +49 -40
  163. package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +447 -300
  164. package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +50 -45
  165. package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +157 -157
  166. package/sdk-core/crates/sdk-core/tests/integ_tests/queries_tests.rs +103 -89
  167. package/sdk-core/crates/sdk-core/tests/integ_tests/update_tests.rs +609 -463
  168. package/sdk-core/crates/sdk-core/tests/integ_tests/visibility_tests.rs +80 -62
  169. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +389 -265
  170. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +250 -185
  171. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -49
  172. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_client_tests.rs +180 -0
  173. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/activities.rs +437 -327
  174. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -58
  175. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -30
  176. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -251
  177. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/client_interactions.rs +552 -0
  178. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +110 -46
  179. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -149
  180. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -32
  181. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1040
  182. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -43
  183. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +402 -245
  184. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +343 -207
  185. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/queries.rs +415 -0
  186. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/replay.rs +96 -36
  187. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/resets.rs +155 -140
  188. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -113
  189. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -44
  190. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -48
  191. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -56
  192. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +365 -242
  193. package/sdk-core/crates/sdk-core/tests/main.rs +22 -16
  194. package/sdk-core/crates/sdk-core/tests/manual_tests.rs +233 -187
  195. package/sdk-core/crates/sdk-core/tests/runner.rs +4 -6
  196. package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +73 -27
  197. package/sdk-core/crates/sdk-core/tests/shared_tests/priority.rs +107 -84
  198. package/sdk-core/crates/sdk-core/tests/workflows_procmacro.rs +6 -0
  199. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.rs +26 -0
  200. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.stderr +5 -0
  201. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/basic_pass.rs +49 -0
  202. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/minimal_pass.rs +21 -0
  203. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.rs +26 -0
  204. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.stderr +5 -0
  205. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.rs +21 -0
  206. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.stderr +5 -0
  207. package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +8 -1
  208. package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +37 -26
  209. package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +180 -87
  210. package/sdk-core/crates/sdk-core-c-bridge/src/lib.rs +89 -5
  211. package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +10 -16
  212. package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +59 -67
  213. package/sdk-core/crates/sdk-core-c-bridge/src/testing.rs +10 -10
  214. package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +57 -22
  215. package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +108 -12
  216. package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +9 -52
  217. package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +74 -91
  218. package/sdk-core/rustfmt.toml +2 -1
  219. package/src/client.rs +206 -289
  220. package/src/helpers/try_into_js.rs +88 -2
  221. package/src/metrics.rs +277 -35
  222. package/src/runtime.rs +94 -45
  223. package/src/testing.rs +9 -16
  224. package/src/worker.rs +86 -68
  225. package/ts/native.ts +39 -3
  226. package/sdk-core/crates/client/src/workflow_handle/mod.rs +0 -212
  227. package/sdk-core/crates/common/src/errors.rs +0 -85
  228. package/sdk-core/crates/common/tests/worker_task_types_test.rs +0 -129
  229. package/sdk-core/crates/macros/LICENSE.txt +0 -21
  230. package/sdk-core/crates/sdk/src/activity_context.rs +0 -238
  231. package/sdk-core/crates/sdk/src/app_data.rs +0 -37
  232. package/sdk-core/crates/sdk-core/tests/integ_tests/activity_functions.rs +0 -5
  233. 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 {
@@ -28,31 +59,30 @@ pub trait CoreTelemetry {
28
59
  fn fetch_buffered_logs(&self) -> Vec<CoreLog>;
29
60
  }
30
61
 
31
- /// Telemetry configuration options. Construct with [TelemetryOptionsBuilder]
32
- #[derive(Clone, derive_builder::Builder)]
62
+ /// Telemetry configuration options. Construct with [TelemetryOptions::builder]
63
+ #[derive(Clone, bon::Builder)]
33
64
  #[non_exhaustive]
34
65
  pub struct TelemetryOptions {
35
66
  /// Optional logger - set as None to disable.
36
- #[builder(setter(into, strip_option), default)]
67
+ #[builder(into)]
37
68
  pub logging: Option<Logger>,
38
69
  /// Optional metrics exporter - set as None to disable.
39
- #[builder(setter(into, strip_option), default)]
70
+ #[builder(into)]
40
71
  pub metrics: Option<Arc<dyn CoreMeter>>,
41
72
  /// If set true (the default) explicitly attach a `service_name` label to all metrics. Turn this
42
73
  /// off if your collection system supports the `target_info` metric from the OpenMetrics spec.
43
74
  /// For more, see
44
75
  /// [here](https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#supporting-target-metadata-in-both-push-based-and-pull-based-systems)
45
- #[builder(default = "true")]
76
+ #[builder(default = true)]
46
77
  pub attach_service_name: bool,
47
78
  /// A prefix to be applied to all core-created metrics. Defaults to "temporal_".
48
- #[builder(default = "METRIC_PREFIX.to_string()")]
79
+ #[builder(default = METRIC_PREFIX.to_string())]
49
80
  pub metric_prefix: String,
50
81
  /// If provided, logging config will be ignored and this explicit subscriber will be used for
51
82
  /// all logging and traces.
52
- #[builder(setter(strip_option), default)]
53
83
  pub subscriber_override: Option<Arc<dyn Subscriber + Send + Sync>>,
54
84
  /// See [TaskQueueLabelStrategy].
55
- #[builder(default = "TaskQueueLabelStrategy::UseNormal")]
85
+ #[builder(default = TaskQueueLabelStrategy::UseNormal)]
56
86
  pub task_queue_label_strategy: TaskQueueLabelStrategy,
57
87
  }
58
88
  impl Debug for TelemetryOptions {
@@ -96,19 +126,19 @@ pub enum TaskQueueLabelStrategy {
96
126
  }
97
127
 
98
128
  /// Options for exporting to an OpenTelemetry Collector
99
- #[derive(Debug, Clone, derive_builder::Builder)]
129
+ #[derive(Debug, Clone, bon::Builder)]
100
130
  pub struct OtelCollectorOptions {
101
131
  /// The url of the OTel collector to export telemetry and metrics to. Lang SDK should also
102
132
  /// export to this same collector.
103
133
  pub url: Url,
104
134
  /// Optional set of HTTP headers to send to the Collector, e.g for authentication.
105
- #[builder(default = "HashMap::new()")]
135
+ #[builder(default = HashMap::new())]
106
136
  pub headers: HashMap<String, String>,
107
137
  /// Optionally specify how frequently metrics should be exported. Defaults to 1 second.
108
- #[builder(default = "Duration::from_secs(1)")]
138
+ #[builder(default = Duration::from_secs(1))]
109
139
  pub metric_periodicity: Duration,
110
140
  /// Specifies the aggregation temporality for metric export. Defaults to cumulative.
111
- #[builder(default = "MetricTemporality::Cumulative")]
141
+ #[builder(default = MetricTemporality::Cumulative)]
112
142
  pub metric_temporality: MetricTemporality,
113
143
  /// A map of tags to be applied to all metrics
114
144
  #[builder(default)]
@@ -120,15 +150,16 @@ pub struct OtelCollectorOptions {
120
150
  #[builder(default)]
121
151
  pub histogram_bucket_overrides: HistogramBucketOverrides,
122
152
  /// Protocol to use for communication with the collector
123
- #[builder(default = "OtlpProtocol::Grpc")]
153
+ #[builder(default = OtlpProtocol::Grpc)]
124
154
  pub protocol: OtlpProtocol,
125
155
  }
126
156
 
127
157
  /// Options for exporting metrics to Prometheus
128
- #[derive(Debug, Clone, derive_builder::Builder)]
158
+ #[derive(Debug, Clone, bon::Builder)]
129
159
  pub struct PrometheusExporterOptions {
160
+ /// The address the Prometheus exporter HTTP server will bind to.
130
161
  pub socket_addr: SocketAddr,
131
- // A map of tags to be applied to all metrics
162
+ /// A map of tags to be applied to all metrics
132
163
  #[builder(default)]
133
164
  pub global_tags: HashMap<String, String>,
134
165
  /// If set true, all counters will include a "_total" suffix
@@ -169,11 +200,13 @@ pub enum Logger {
169
200
  /// An [EnvFilter](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/struct.EnvFilter.html) filter string.
170
201
  filter: String,
171
202
  },
203
+ #[cfg(feature = "core-based-sdk")]
172
204
  /// Forward logs to Lang - collectable with `fetch_global_buffered_logs`.
173
205
  Forward {
174
206
  /// An [EnvFilter](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/struct.EnvFilter.html) filter string.
175
207
  filter: String,
176
208
  },
209
+ #[cfg(feature = "core-based-sdk")]
177
210
  /// Push logs to Lang. Can be used with
178
211
  /// temporalio_sdk_core::telemetry::log_export::CoreLogBufferedConsumer to buffer.
179
212
  Push {
@@ -205,7 +238,7 @@ pub enum OtlpProtocol {
205
238
 
206
239
  impl Default for TelemetryOptions {
207
240
  fn default() -> Self {
208
- TelemetryOptionsBuilder::default().build().unwrap()
241
+ TelemetryOptions::builder().build()
209
242
  }
210
243
  }
211
244
 
@@ -243,3 +276,229 @@ pub trait CoreLogConsumer: Send + Sync + Debug {
243
276
  /// Invoked synchronously for every single log.
244
277
  fn on_log(&self, log: CoreLog);
245
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
+ }