@temporalio/core-bridge 1.8.5 → 1.9.0-rc.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 (196) hide show
  1. package/Cargo.lock +189 -152
  2. package/Cargo.toml +1 -0
  3. package/lib/index.d.ts +17 -44
  4. package/lib/index.js.map +1 -1
  5. package/package.json +3 -4
  6. package/releases/aarch64-apple-darwin/index.node +0 -0
  7. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  8. package/releases/x86_64-apple-darwin/index.node +0 -0
  9. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  10. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  11. package/sdk-core/.github/workflows/heavy.yml +4 -0
  12. package/sdk-core/.github/workflows/per-pr.yml +96 -0
  13. package/sdk-core/ARCHITECTURE.md +1 -1
  14. package/sdk-core/Cargo.toml +6 -0
  15. package/sdk-core/README.md +37 -21
  16. package/sdk-core/client/Cargo.toml +6 -3
  17. package/sdk-core/client/src/lib.rs +272 -138
  18. package/sdk-core/client/src/metrics.rs +68 -57
  19. package/sdk-core/client/src/raw.rs +191 -45
  20. package/sdk-core/client/src/retry.rs +20 -0
  21. package/sdk-core/client/src/worker_registry/mod.rs +264 -0
  22. package/sdk-core/client/src/workflow_handle/mod.rs +2 -1
  23. package/sdk-core/core/Cargo.toml +16 -18
  24. package/sdk-core/core/src/core_tests/child_workflows.rs +7 -7
  25. package/sdk-core/core/src/core_tests/mod.rs +1 -0
  26. package/sdk-core/core/src/core_tests/replay_flag.rs +29 -39
  27. package/sdk-core/core/src/core_tests/updates.rs +73 -0
  28. package/sdk-core/core/src/core_tests/workflow_tasks.rs +52 -1
  29. package/sdk-core/core/src/ephemeral_server/mod.rs +34 -11
  30. package/sdk-core/core/src/internal_flags.rs +7 -1
  31. package/sdk-core/core/src/lib.rs +19 -36
  32. package/sdk-core/core/src/protosext/mod.rs +11 -3
  33. package/sdk-core/core/src/protosext/protocol_messages.rs +102 -0
  34. package/sdk-core/core/src/replay/mod.rs +100 -48
  35. package/sdk-core/core/src/telemetry/log_export.rs +161 -28
  36. package/sdk-core/core/src/telemetry/metrics.rs +869 -248
  37. package/sdk-core/core/src/telemetry/mod.rs +135 -239
  38. package/sdk-core/core/src/telemetry/prometheus_server.rs +36 -31
  39. package/sdk-core/core/src/test_help/mod.rs +63 -4
  40. package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +12 -2
  41. package/sdk-core/core/src/worker/activities.rs +276 -10
  42. package/sdk-core/core/src/worker/client/mocks.rs +18 -0
  43. package/sdk-core/core/src/worker/client.rs +16 -3
  44. package/sdk-core/core/src/worker/mod.rs +50 -19
  45. package/sdk-core/core/src/worker/slot_provider.rs +175 -0
  46. package/sdk-core/core/src/worker/workflow/driven_workflow.rs +27 -34
  47. package/sdk-core/core/src/worker/workflow/history_update.rs +4 -1
  48. package/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +36 -94
  49. package/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +34 -22
  50. package/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +50 -34
  51. package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +106 -92
  52. package/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +22 -21
  53. package/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +386 -499
  54. package/sdk-core/core/src/worker/workflow/machines/mod.rs +12 -2
  55. package/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +33 -26
  56. package/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +198 -215
  57. package/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +66 -62
  58. package/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +88 -119
  59. package/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +3 -1
  60. package/sdk-core/core/src/worker/workflow/machines/update_state_machine.rs +411 -0
  61. package/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +26 -25
  62. package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +302 -85
  63. package/sdk-core/core/src/worker/workflow/managed_run.rs +179 -132
  64. package/sdk-core/core/src/worker/workflow/mod.rs +121 -46
  65. package/sdk-core/core/src/worker/workflow/run_cache.rs +8 -12
  66. package/sdk-core/core/src/worker/workflow/workflow_stream.rs +45 -38
  67. package/sdk-core/core-api/Cargo.toml +7 -6
  68. package/sdk-core/core-api/src/lib.rs +4 -12
  69. package/sdk-core/core-api/src/telemetry/metrics.rs +334 -0
  70. package/sdk-core/core-api/src/telemetry.rs +53 -42
  71. package/sdk-core/core-api/src/worker.rs +7 -0
  72. package/sdk-core/{.buildkite/docker → docker}/docker-compose.yaml +1 -1
  73. package/sdk-core/etc/dynamic-config.yaml +11 -1
  74. package/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +1 -1
  75. package/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +1 -3
  76. package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +2 -2
  77. package/sdk-core/sdk/Cargo.toml +1 -1
  78. package/sdk-core/sdk/src/lib.rs +85 -7
  79. package/sdk-core/sdk/src/workflow_context/options.rs +4 -0
  80. package/sdk-core/sdk/src/workflow_context.rs +43 -15
  81. package/sdk-core/sdk/src/workflow_future.rs +334 -204
  82. package/sdk-core/sdk-core-protos/Cargo.toml +2 -2
  83. package/sdk-core/sdk-core-protos/build.rs +14 -14
  84. package/sdk-core/sdk-core-protos/protos/api_upstream/.buildkite/Dockerfile +2 -0
  85. package/sdk-core/sdk-core-protos/protos/api_upstream/Makefile +99 -0
  86. package/sdk-core/sdk-core-protos/protos/api_upstream/api-linter.yaml +56 -0
  87. package/sdk-core/sdk-core-protos/protos/api_upstream/buf.gen.yaml +20 -0
  88. package/sdk-core/sdk-core-protos/protos/api_upstream/buf.lock +11 -0
  89. package/sdk-core/sdk-core-protos/protos/api_upstream/buf.yaml +18 -0
  90. package/sdk-core/sdk-core-protos/protos/api_upstream/google/api/annotations.proto +31 -0
  91. package/sdk-core/sdk-core-protos/protos/api_upstream/google/api/http.proto +379 -0
  92. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/any.proto +162 -0
  93. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/descriptor.proto +1212 -0
  94. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/duration.proto +115 -0
  95. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/empty.proto +51 -0
  96. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/timestamp.proto +144 -0
  97. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/wrappers.proto +123 -0
  98. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/batch/v1/message.proto +3 -5
  99. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/command/v1/message.proto +11 -13
  100. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/common/v1/message.proto +2 -4
  101. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/failed_cause.proto +2 -0
  102. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/reset.proto +1 -1
  103. package/sdk-core/{protos/api_upstream/build/tools.go → sdk-core-protos/protos/api_upstream/temporal/api/export/v1/message.proto} +22 -6
  104. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/filter/v1/message.proto +2 -4
  105. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/history/v1/message.proto +21 -23
  106. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/namespace/v1/message.proto +2 -4
  107. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/operatorservice/v1/request_response.proto +2 -0
  108. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/operatorservice/v1/service.proto +4 -0
  109. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/replication/v1/message.proto +1 -3
  110. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/schedule/v1/message.proto +36 -20
  111. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +13 -0
  112. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -4
  113. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/update/v1/message.proto +1 -1
  114. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/version/v1/message.proto +2 -3
  115. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/workflow/v1/message.proto +18 -20
  116. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/workflowservice/v1/request_response.proto +84 -32
  117. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/workflowservice/v1/service.proto +205 -47
  118. package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +57 -0
  119. package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +27 -0
  120. package/sdk-core/sdk-core-protos/src/history_builder.rs +67 -2
  121. package/sdk-core/sdk-core-protos/src/lib.rs +75 -2
  122. package/sdk-core/sdk-core-protos/src/utilities.rs +14 -0
  123. package/sdk-core/test-utils/Cargo.toml +5 -1
  124. package/sdk-core/test-utils/src/canned_histories.rs +3 -57
  125. package/sdk-core/test-utils/src/interceptors.rs +46 -0
  126. package/sdk-core/test-utils/src/lib.rs +106 -38
  127. package/sdk-core/tests/integ_tests/metrics_tests.rs +110 -15
  128. package/sdk-core/tests/integ_tests/queries_tests.rs +174 -3
  129. package/sdk-core/tests/integ_tests/update_tests.rs +908 -0
  130. package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +44 -1
  131. package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +1 -1
  132. package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +1 -1
  133. package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +4 -4
  134. package/sdk-core/tests/integ_tests/workflow_tests/eager.rs +61 -0
  135. package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +27 -2
  136. package/sdk-core/tests/integ_tests/workflow_tests.rs +1 -0
  137. package/sdk-core/tests/main.rs +2 -1
  138. package/sdk-core/tests/runner.rs +15 -2
  139. package/src/conversions.rs +75 -89
  140. package/src/helpers.rs +74 -0
  141. package/src/runtime.rs +17 -6
  142. package/src/worker.rs +14 -61
  143. package/ts/index.ts +21 -52
  144. package/sdk-core/.buildkite/docker/Dockerfile +0 -9
  145. package/sdk-core/.buildkite/docker/build.sh +0 -5
  146. package/sdk-core/.buildkite/docker/docker-compose-ci.yaml +0 -27
  147. package/sdk-core/.buildkite/pipeline.yml +0 -57
  148. package/sdk-core/.github/workflows/semgrep.yml +0 -25
  149. package/sdk-core/core/src/worker/workflow/bridge.rs +0 -35
  150. package/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +0 -215
  151. package/sdk-core/protos/api_upstream/.buildkite/Dockerfile +0 -2
  152. package/sdk-core/protos/api_upstream/Makefile +0 -80
  153. package/sdk-core/protos/api_upstream/api-linter.yaml +0 -40
  154. package/sdk-core/protos/api_upstream/buf.yaml +0 -9
  155. package/sdk-core/protos/api_upstream/build/go.mod +0 -7
  156. package/sdk-core/protos/api_upstream/build/go.sum +0 -5
  157. package/sdk-core/protos/api_upstream/go.mod +0 -6
  158. package/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +0 -141
  159. /package/sdk-core/{.buildkite/docker → docker}/docker-compose-telem.yaml +0 -0
  160. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.buildkite/docker-compose.yml +0 -0
  161. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.buildkite/pipeline.yml +0 -0
  162. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.github/CODEOWNERS +0 -0
  163. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  164. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.github/workflows/publish-docs.yml +0 -0
  165. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.github/workflows/trigger-api-go-update.yml +0 -0
  166. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/LICENSE +0 -0
  167. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/README.md +0 -0
  168. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/batch_operation.proto +0 -0
  169. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/command_type.proto +0 -0
  170. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/common.proto +0 -0
  171. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/event_type.proto +0 -0
  172. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/namespace.proto +0 -0
  173. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/query.proto +0 -0
  174. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/schedule.proto +0 -0
  175. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/task_queue.proto +0 -0
  176. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/update.proto +0 -0
  177. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/workflow.proto +0 -0
  178. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/errordetails/v1/message.proto +0 -0
  179. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/failure/v1/message.proto +0 -0
  180. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/protocol/v1/message.proto +0 -0
  181. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/query/v1/message.proto +0 -0
  182. /package/sdk-core/{protos → sdk-core-protos/protos}/google/rpc/status.proto +0 -0
  183. /package/sdk-core/{protos → sdk-core-protos/protos}/grpc/health/v1/health.proto +0 -0
  184. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/activity_result/activity_result.proto +0 -0
  185. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/activity_task/activity_task.proto +0 -0
  186. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/child_workflow/child_workflow.proto +0 -0
  187. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/common/common.proto +0 -0
  188. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/core_interface.proto +0 -0
  189. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/external_data/external_data.proto +0 -0
  190. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +0 -0
  191. /package/sdk-core/{protos → sdk-core-protos/protos}/testsrv_upstream/Makefile +0 -0
  192. /package/sdk-core/{protos → sdk-core-protos/protos}/testsrv_upstream/api-linter.yaml +0 -0
  193. /package/sdk-core/{protos → sdk-core-protos/protos}/testsrv_upstream/buf.yaml +0 -0
  194. /package/sdk-core/{protos/api_upstream → sdk-core-protos/protos/testsrv_upstream}/dependencies/gogoproto/gogo.proto +0 -0
  195. /package/sdk-core/{protos → sdk-core-protos/protos}/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +0 -0
  196. /package/sdk-core/{protos → sdk-core-protos/protos}/testsrv_upstream/temporal/api/testservice/v1/service.proto +0 -0
@@ -1,33 +1,36 @@
1
+ use futures::channel::mpsc::{channel, Receiver, Sender};
1
2
  use parking_lot::Mutex;
2
3
  use ringbuf::{Consumer, HeapRb, Producer};
3
- use std::{collections::HashMap, sync::Arc, time::SystemTime};
4
- use temporal_sdk_core_api::telemetry::CoreLog;
4
+ use std::{collections::HashMap, fmt, sync::Arc, time::SystemTime};
5
+ use temporal_sdk_core_api::telemetry::{CoreLog, CoreLogConsumer};
5
6
  use tracing_subscriber::Layer;
6
7
 
7
- const RB_SIZE: usize = 2048;
8
+ type CoreLogsOut = Consumer<CoreLog, Arc<HeapRb<CoreLog>>>;
8
9
 
9
- pub(super) type CoreLogsOut = Consumer<CoreLog, Arc<HeapRb<CoreLog>>>;
10
+ #[derive(Debug)]
11
+ struct CoreLogFieldStorage(HashMap<String, serde_json::Value>);
10
12
 
11
- pub(super) struct CoreLogExportLayer {
12
- logs_in: Mutex<Producer<CoreLog, Arc<HeapRb<CoreLog>>>>,
13
+ pub(super) struct CoreLogConsumerLayer {
14
+ consumer: Arc<dyn CoreLogConsumer>,
13
15
  }
14
16
 
15
- #[derive(Debug)]
16
- struct CoreLogFieldStorage(HashMap<String, serde_json::Value>);
17
+ impl CoreLogConsumerLayer {
18
+ pub(super) fn new(consumer: Arc<dyn CoreLogConsumer>) -> Self {
19
+ Self { consumer }
20
+ }
17
21
 
18
- impl CoreLogExportLayer {
19
- pub(super) fn new() -> (Self, CoreLogsOut) {
20
- let (lin, lout) = HeapRb::new(RB_SIZE).split();
22
+ pub(super) fn new_buffered(ringbuf_capacity: usize) -> (Self, CoreLogBuffer) {
23
+ let (consumer, buffer) = CoreLogBufferedConsumer::new(ringbuf_capacity);
21
24
  (
22
25
  Self {
23
- logs_in: Mutex::new(lin),
26
+ consumer: Arc::new(consumer),
24
27
  },
25
- lout,
28
+ buffer,
26
29
  )
27
30
  }
28
31
  }
29
32
 
30
- impl<S> Layer<S> for CoreLogExportLayer
33
+ impl<S> Layer<S> for CoreLogConsumerLayer
31
34
  where
32
35
  S: tracing::Subscriber,
33
36
  S: for<'lookup> tracing_subscriber::registry::LookupSpan<'lookup>,
@@ -93,10 +96,78 @@ where
93
96
  fields,
94
97
  span_contexts: spans,
95
98
  };
99
+ self.consumer.on_log(log);
100
+ }
101
+ }
102
+
103
+ /// Core log consumer implementation backed by a ring buffer.
104
+ pub struct CoreLogBufferedConsumer {
105
+ logs_in: Mutex<Producer<CoreLog, Arc<HeapRb<CoreLog>>>>,
106
+ }
107
+
108
+ impl CoreLogBufferedConsumer {
109
+ /// Create a log consumer and drainable buffer for the given capacity.
110
+ pub fn new(ringbuf_capacity: usize) -> (Self, CoreLogBuffer) {
111
+ let (logs_in, logs_out) = HeapRb::new(ringbuf_capacity).split();
112
+ (
113
+ Self {
114
+ logs_in: Mutex::new(logs_in),
115
+ },
116
+ CoreLogBuffer { logs_out },
117
+ )
118
+ }
119
+ }
120
+
121
+ impl CoreLogConsumer for CoreLogBufferedConsumer {
122
+ fn on_log(&self, log: CoreLog) {
96
123
  let _ = self.logs_in.lock().push(log);
97
124
  }
98
125
  }
99
126
 
127
+ impl fmt::Debug for CoreLogBufferedConsumer {
128
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
129
+ f.write_str("<buffered consumer>")
130
+ }
131
+ }
132
+
133
+ /// Buffer of core logs that can be drained.
134
+ pub struct CoreLogBuffer {
135
+ logs_out: CoreLogsOut,
136
+ }
137
+
138
+ impl CoreLogBuffer {
139
+ /// Drain the buffer of its logs.
140
+ pub fn drain(&mut self) -> Vec<CoreLog> {
141
+ self.logs_out.pop_iter().collect()
142
+ }
143
+ }
144
+
145
+ /// Core log consumer implementation backed by a mpsc channel.
146
+ pub struct CoreLogStreamConsumer {
147
+ tx: Sender<CoreLog>,
148
+ }
149
+
150
+ impl CoreLogStreamConsumer {
151
+ /// Create a stream consumer and stream of logs.
152
+ pub fn new(buffer: usize) -> (Self, Receiver<CoreLog>) {
153
+ let (tx, rx) = channel(buffer);
154
+ (Self { tx }, rx)
155
+ }
156
+ }
157
+
158
+ impl CoreLogConsumer for CoreLogStreamConsumer {
159
+ fn on_log(&self, log: CoreLog) {
160
+ // We will drop messages if we can't send
161
+ let _ = self.tx.clone().try_send(log);
162
+ }
163
+ }
164
+
165
+ impl fmt::Debug for CoreLogStreamConsumer {
166
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
167
+ f.write_str("<stream consumer>")
168
+ }
169
+ }
170
+
100
171
  struct JsonVisitor<'a>(&'a mut HashMap<String, serde_json::Value>);
101
172
 
102
173
  impl<'a> tracing::field::Visit for JsonVisitor<'a> {
@@ -146,8 +217,15 @@ impl<'a> tracing::field::Visit for JsonVisitor<'a> {
146
217
 
147
218
  #[cfg(test)]
148
219
  mod tests {
149
- use crate::{telemetry::construct_filter_string, telemetry_init};
150
- use temporal_sdk_core_api::telemetry::{CoreTelemetry, Logger, TelemetryOptionsBuilder};
220
+ use crate::{
221
+ telemetry::construct_filter_string, telemetry::CoreLogStreamConsumer, telemetry_init,
222
+ };
223
+ use futures::stream::StreamExt;
224
+ use std::fmt;
225
+ use std::sync::{Arc, Mutex};
226
+ use temporal_sdk_core_api::telemetry::{
227
+ CoreLog, CoreLogConsumer, CoreTelemetry, Logger, TelemetryOptionsBuilder,
228
+ };
151
229
  use tracing::Level;
152
230
 
153
231
  #[instrument(fields(bros = "brohemian"))]
@@ -157,24 +235,15 @@ mod tests {
157
235
  debug!("debug");
158
236
  }
159
237
 
160
- #[tokio::test]
161
- async fn test_forwarding_output() {
162
- let opts = TelemetryOptionsBuilder::default()
163
- .logging(Logger::Forward {
164
- filter: construct_filter_string(Level::INFO, Level::WARN),
165
- })
166
- .build()
167
- .unwrap();
168
- let instance = telemetry_init(opts).unwrap();
169
- let _g = tracing::subscriber::set_default(instance.trace_subscriber.clone());
170
-
238
+ fn write_logs() {
171
239
  let top_span = span!(Level::INFO, "yayspan", huh = "wat");
172
240
  let _guard = top_span.enter();
173
241
  info!("Whata?");
174
242
  instrumented("hi");
175
243
  info!("Donezo");
244
+ }
176
245
 
177
- let logs = instance.fetch_buffered_logs();
246
+ fn assert_logs(logs: Vec<CoreLog>) {
178
247
  // Verify debug log was not forwarded
179
248
  assert!(!logs.iter().any(|l| l.message == "debug"));
180
249
  assert_eq!(logs.len(), 4);
@@ -187,4 +256,68 @@ mod tests {
187
256
  assert_eq!(info_msg.fields.get("bros"), Some(&"brohemian".into()));
188
257
  assert_eq!(info_msg.fields.get("thing"), Some(&"hi".into()));
189
258
  }
259
+
260
+ #[tokio::test]
261
+ async fn test_forwarding_output() {
262
+ let opts = TelemetryOptionsBuilder::default()
263
+ .logging(Logger::Forward {
264
+ filter: construct_filter_string(Level::INFO, Level::WARN),
265
+ })
266
+ .build()
267
+ .unwrap();
268
+ let instance = telemetry_init(opts).unwrap();
269
+ let _g = tracing::subscriber::set_default(instance.trace_subscriber().unwrap().clone());
270
+
271
+ write_logs();
272
+ assert_logs(instance.fetch_buffered_logs());
273
+ }
274
+
275
+ struct CaptureConsumer(Mutex<Vec<CoreLog>>);
276
+
277
+ impl CoreLogConsumer for CaptureConsumer {
278
+ fn on_log(&self, log: CoreLog) {
279
+ self.0.lock().unwrap().push(log);
280
+ }
281
+ }
282
+
283
+ impl fmt::Debug for CaptureConsumer {
284
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
285
+ f.write_str("<capture consumer>")
286
+ }
287
+ }
288
+
289
+ #[tokio::test]
290
+ async fn test_push_output() {
291
+ let consumer = Arc::new(CaptureConsumer(Mutex::new(Vec::new())));
292
+ let opts = TelemetryOptionsBuilder::default()
293
+ .logging(Logger::Push {
294
+ filter: construct_filter_string(Level::INFO, Level::WARN),
295
+ consumer: consumer.clone(),
296
+ })
297
+ .build()
298
+ .unwrap();
299
+ let instance = telemetry_init(opts).unwrap();
300
+ let _g = tracing::subscriber::set_default(instance.trace_subscriber().unwrap().clone());
301
+
302
+ write_logs();
303
+ assert_logs(consumer.0.lock().unwrap().drain(..).collect());
304
+ }
305
+
306
+ #[tokio::test]
307
+ async fn test_push_stream_output() {
308
+ let (consumer, stream) = CoreLogStreamConsumer::new(100);
309
+ let consumer = Arc::new(consumer);
310
+ let opts = TelemetryOptionsBuilder::default()
311
+ .logging(Logger::Push {
312
+ filter: construct_filter_string(Level::INFO, Level::WARN),
313
+ consumer: consumer.clone(),
314
+ })
315
+ .build()
316
+ .unwrap();
317
+ let instance = telemetry_init(opts).unwrap();
318
+ let _g = tracing::subscriber::set_default(instance.trace_subscriber().unwrap().clone());
319
+
320
+ write_logs();
321
+ assert_logs(stream.ready_chunks(100).next().await.unwrap());
322
+ }
190
323
  }