temporalio 0.0.0 → 0.0.2

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 (327) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +301 -0
  3. data/bridge/Cargo.lock +2888 -0
  4. data/bridge/Cargo.toml +27 -0
  5. data/bridge/sdk-core/ARCHITECTURE.md +76 -0
  6. data/bridge/sdk-core/Cargo.lock +2606 -0
  7. data/bridge/sdk-core/Cargo.toml +2 -0
  8. data/bridge/sdk-core/LICENSE.txt +23 -0
  9. data/bridge/sdk-core/README.md +104 -0
  10. data/bridge/sdk-core/arch_docs/diagrams/README.md +10 -0
  11. data/bridge/sdk-core/arch_docs/diagrams/sticky_queues.puml +40 -0
  12. data/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg +1 -0
  13. data/bridge/sdk-core/arch_docs/sticky_queues.md +51 -0
  14. data/bridge/sdk-core/client/Cargo.toml +40 -0
  15. data/bridge/sdk-core/client/LICENSE.txt +23 -0
  16. data/bridge/sdk-core/client/src/lib.rs +1286 -0
  17. data/bridge/sdk-core/client/src/metrics.rs +165 -0
  18. data/bridge/sdk-core/client/src/raw.rs +932 -0
  19. data/bridge/sdk-core/client/src/retry.rs +751 -0
  20. data/bridge/sdk-core/client/src/workflow_handle/mod.rs +185 -0
  21. data/bridge/sdk-core/core/Cargo.toml +116 -0
  22. data/bridge/sdk-core/core/LICENSE.txt +23 -0
  23. data/bridge/sdk-core/core/benches/workflow_replay.rs +76 -0
  24. data/bridge/sdk-core/core/src/abstractions.rs +166 -0
  25. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +1014 -0
  26. data/bridge/sdk-core/core/src/core_tests/child_workflows.rs +221 -0
  27. data/bridge/sdk-core/core/src/core_tests/determinism.rs +107 -0
  28. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +925 -0
  29. data/bridge/sdk-core/core/src/core_tests/mod.rs +100 -0
  30. data/bridge/sdk-core/core/src/core_tests/queries.rs +894 -0
  31. data/bridge/sdk-core/core/src/core_tests/replay_flag.rs +65 -0
  32. data/bridge/sdk-core/core/src/core_tests/workers.rs +259 -0
  33. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +124 -0
  34. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +2090 -0
  35. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +515 -0
  36. data/bridge/sdk-core/core/src/lib.rs +282 -0
  37. data/bridge/sdk-core/core/src/pollers/mod.rs +54 -0
  38. data/bridge/sdk-core/core/src/pollers/poll_buffer.rs +297 -0
  39. data/bridge/sdk-core/core/src/protosext/mod.rs +428 -0
  40. data/bridge/sdk-core/core/src/replay/mod.rs +215 -0
  41. data/bridge/sdk-core/core/src/retry_logic.rs +202 -0
  42. data/bridge/sdk-core/core/src/telemetry/log_export.rs +190 -0
  43. data/bridge/sdk-core/core/src/telemetry/metrics.rs +428 -0
  44. data/bridge/sdk-core/core/src/telemetry/mod.rs +407 -0
  45. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +78 -0
  46. data/bridge/sdk-core/core/src/test_help/mod.rs +889 -0
  47. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +580 -0
  48. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +1048 -0
  49. data/bridge/sdk-core/core/src/worker/activities.rs +481 -0
  50. data/bridge/sdk-core/core/src/worker/client/mocks.rs +87 -0
  51. data/bridge/sdk-core/core/src/worker/client.rs +373 -0
  52. data/bridge/sdk-core/core/src/worker/mod.rs +570 -0
  53. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +37 -0
  54. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +101 -0
  55. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +532 -0
  56. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +907 -0
  57. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +294 -0
  58. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +167 -0
  59. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +858 -0
  60. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +136 -0
  61. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +157 -0
  62. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +129 -0
  63. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +1450 -0
  64. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +316 -0
  65. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +178 -0
  66. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +708 -0
  67. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +439 -0
  68. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +435 -0
  69. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +175 -0
  70. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +242 -0
  71. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +96 -0
  72. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +1200 -0
  73. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +272 -0
  74. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +198 -0
  75. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +655 -0
  76. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +1200 -0
  77. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +145 -0
  78. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +88 -0
  79. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +985 -0
  80. data/bridge/sdk-core/core-api/Cargo.toml +32 -0
  81. data/bridge/sdk-core/core-api/LICENSE.txt +23 -0
  82. data/bridge/sdk-core/core-api/src/errors.rs +95 -0
  83. data/bridge/sdk-core/core-api/src/lib.rs +109 -0
  84. data/bridge/sdk-core/core-api/src/telemetry.rs +147 -0
  85. data/bridge/sdk-core/core-api/src/worker.rs +148 -0
  86. data/bridge/sdk-core/etc/deps.svg +162 -0
  87. data/bridge/sdk-core/etc/dynamic-config.yaml +2 -0
  88. data/bridge/sdk-core/etc/otel-collector-config.yaml +36 -0
  89. data/bridge/sdk-core/etc/prometheus.yaml +6 -0
  90. data/bridge/sdk-core/etc/regen-depgraph.sh +5 -0
  91. data/bridge/sdk-core/fsm/Cargo.toml +18 -0
  92. data/bridge/sdk-core/fsm/LICENSE.txt +23 -0
  93. data/bridge/sdk-core/fsm/README.md +3 -0
  94. data/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +27 -0
  95. data/bridge/sdk-core/fsm/rustfsm_procmacro/LICENSE.txt +23 -0
  96. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +647 -0
  97. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +8 -0
  98. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.rs +18 -0
  99. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +12 -0
  100. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dynamic_dest_pass.rs +41 -0
  101. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.rs +14 -0
  102. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.stderr +11 -0
  103. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_arg_pass.rs +32 -0
  104. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_pass.rs +31 -0
  105. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/medium_complex_pass.rs +46 -0
  106. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.rs +29 -0
  107. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +12 -0
  108. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/simple_pass.rs +32 -0
  109. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.rs +18 -0
  110. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +5 -0
  111. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.rs +11 -0
  112. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +5 -0
  113. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.rs +11 -0
  114. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +5 -0
  115. data/bridge/sdk-core/fsm/rustfsm_trait/Cargo.toml +14 -0
  116. data/bridge/sdk-core/fsm/rustfsm_trait/LICENSE.txt +23 -0
  117. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +249 -0
  118. data/bridge/sdk-core/fsm/src/lib.rs +2 -0
  119. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
  120. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
  121. data/bridge/sdk-core/histories/fail_wf_task.bin +0 -0
  122. data/bridge/sdk-core/histories/timer_workflow_history.bin +0 -0
  123. data/bridge/sdk-core/integ-with-otel.sh +7 -0
  124. data/bridge/sdk-core/protos/api_upstream/README.md +9 -0
  125. data/bridge/sdk-core/protos/api_upstream/api-linter.yaml +40 -0
  126. data/bridge/sdk-core/protos/api_upstream/buf.yaml +9 -0
  127. data/bridge/sdk-core/protos/api_upstream/build/go.mod +7 -0
  128. data/bridge/sdk-core/protos/api_upstream/build/go.sum +5 -0
  129. data/bridge/sdk-core/protos/api_upstream/build/tools.go +29 -0
  130. data/bridge/sdk-core/protos/api_upstream/dependencies/gogoproto/gogo.proto +141 -0
  131. data/bridge/sdk-core/protos/api_upstream/go.mod +6 -0
  132. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +89 -0
  133. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +260 -0
  134. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +112 -0
  135. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +47 -0
  136. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +57 -0
  137. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +56 -0
  138. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +170 -0
  139. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +118 -0
  140. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/interaction_type.proto +39 -0
  141. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +51 -0
  142. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +50 -0
  143. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +41 -0
  144. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +60 -0
  145. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +59 -0
  146. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +40 -0
  147. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +122 -0
  148. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +108 -0
  149. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +114 -0
  150. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +56 -0
  151. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +758 -0
  152. data/bridge/sdk-core/protos/api_upstream/temporal/api/interaction/v1/message.proto +87 -0
  153. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +97 -0
  154. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +121 -0
  155. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +80 -0
  156. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +61 -0
  157. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +55 -0
  158. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +379 -0
  159. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +108 -0
  160. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +59 -0
  161. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +146 -0
  162. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +1168 -0
  163. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +415 -0
  164. data/bridge/sdk-core/protos/grpc/health/v1/health.proto +63 -0
  165. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +78 -0
  166. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +79 -0
  167. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +77 -0
  168. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +15 -0
  169. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +30 -0
  170. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +30 -0
  171. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +263 -0
  172. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +304 -0
  173. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +29 -0
  174. data/bridge/sdk-core/protos/testsrv_upstream/api-linter.yaml +38 -0
  175. data/bridge/sdk-core/protos/testsrv_upstream/buf.yaml +13 -0
  176. data/bridge/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +141 -0
  177. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +63 -0
  178. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +90 -0
  179. data/bridge/sdk-core/rustfmt.toml +1 -0
  180. data/bridge/sdk-core/sdk/Cargo.toml +47 -0
  181. data/bridge/sdk-core/sdk/LICENSE.txt +23 -0
  182. data/bridge/sdk-core/sdk/src/activity_context.rs +230 -0
  183. data/bridge/sdk-core/sdk/src/app_data.rs +37 -0
  184. data/bridge/sdk-core/sdk/src/interceptors.rs +50 -0
  185. data/bridge/sdk-core/sdk/src/lib.rs +794 -0
  186. data/bridge/sdk-core/sdk/src/payload_converter.rs +11 -0
  187. data/bridge/sdk-core/sdk/src/workflow_context/options.rs +295 -0
  188. data/bridge/sdk-core/sdk/src/workflow_context.rs +694 -0
  189. data/bridge/sdk-core/sdk/src/workflow_future.rs +499 -0
  190. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +30 -0
  191. data/bridge/sdk-core/sdk-core-protos/LICENSE.txt +23 -0
  192. data/bridge/sdk-core/sdk-core-protos/build.rs +107 -0
  193. data/bridge/sdk-core/sdk-core-protos/src/constants.rs +7 -0
  194. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +544 -0
  195. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +230 -0
  196. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +1970 -0
  197. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +38 -0
  198. data/bridge/sdk-core/sdk-core-protos/src/utilities.rs +14 -0
  199. data/bridge/sdk-core/test-utils/Cargo.toml +36 -0
  200. data/bridge/sdk-core/test-utils/src/canned_histories.rs +1579 -0
  201. data/bridge/sdk-core/test-utils/src/histfetch.rs +28 -0
  202. data/bridge/sdk-core/test-utils/src/lib.rs +650 -0
  203. data/bridge/sdk-core/tests/integ_tests/client_tests.rs +36 -0
  204. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +128 -0
  205. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +221 -0
  206. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +37 -0
  207. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +133 -0
  208. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +437 -0
  209. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +93 -0
  210. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +878 -0
  211. data/bridge/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +61 -0
  212. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +59 -0
  213. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +58 -0
  214. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +50 -0
  215. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +60 -0
  216. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +54 -0
  217. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +788 -0
  218. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +53 -0
  219. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +113 -0
  220. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +223 -0
  221. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +93 -0
  222. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +167 -0
  223. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +99 -0
  224. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +131 -0
  225. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +75 -0
  226. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +597 -0
  227. data/bridge/sdk-core/tests/load_tests.rs +191 -0
  228. data/bridge/sdk-core/tests/main.rs +113 -0
  229. data/bridge/sdk-core/tests/runner.rs +93 -0
  230. data/bridge/src/connection.rs +186 -0
  231. data/bridge/src/lib.rs +239 -0
  232. data/bridge/src/runtime.rs +54 -0
  233. data/bridge/src/worker.rs +124 -0
  234. data/ext/Rakefile +9 -0
  235. data/lib/bridge.so +0 -0
  236. data/lib/gen/dependencies/gogoproto/gogo_pb.rb +14 -0
  237. data/lib/gen/temporal/api/batch/v1/message_pb.rb +50 -0
  238. data/lib/gen/temporal/api/command/v1/message_pb.rb +174 -0
  239. data/lib/gen/temporal/api/common/v1/message_pb.rb +69 -0
  240. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +33 -0
  241. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +39 -0
  242. data/lib/gen/temporal/api/enums/v1/common_pb.rb +42 -0
  243. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +68 -0
  244. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +77 -0
  245. data/lib/gen/temporal/api/enums/v1/interaction_type_pb.rb +25 -0
  246. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +37 -0
  247. data/lib/gen/temporal/api/enums/v1/query_pb.rb +31 -0
  248. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +24 -0
  249. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +28 -0
  250. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +30 -0
  251. data/lib/gen/temporal/api/enums/v1/update_pb.rb +23 -0
  252. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +89 -0
  253. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +84 -0
  254. data/lib/gen/temporal/api/failure/v1/message_pb.rb +83 -0
  255. data/lib/gen/temporal/api/filter/v1/message_pb.rb +40 -0
  256. data/lib/gen/temporal/api/history/v1/message_pb.rb +490 -0
  257. data/lib/gen/temporal/api/interaction/v1/message_pb.rb +49 -0
  258. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +63 -0
  259. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +85 -0
  260. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +20 -0
  261. data/lib/gen/temporal/api/query/v1/message_pb.rb +38 -0
  262. data/lib/gen/temporal/api/replication/v1/message_pb.rb +37 -0
  263. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +149 -0
  264. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +73 -0
  265. data/lib/gen/temporal/api/version/v1/message_pb.rb +41 -0
  266. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +111 -0
  267. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +788 -0
  268. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +20 -0
  269. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +58 -0
  270. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +57 -0
  271. data/lib/gen/temporal/sdk/core/bridge/bridge_pb.rb +222 -0
  272. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +57 -0
  273. data/lib/gen/temporal/sdk/core/common/common_pb.rb +22 -0
  274. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +34 -0
  275. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +27 -0
  276. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +165 -0
  277. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +196 -0
  278. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +34 -0
  279. data/lib/temporalio/activity/context.rb +97 -0
  280. data/lib/temporalio/activity/info.rb +67 -0
  281. data/lib/temporalio/activity.rb +85 -0
  282. data/lib/temporalio/bridge/error.rb +8 -0
  283. data/lib/temporalio/bridge.rb +14 -0
  284. data/lib/temporalio/client/implementation.rb +340 -0
  285. data/lib/temporalio/client/workflow_handle.rb +243 -0
  286. data/lib/temporalio/client.rb +131 -0
  287. data/lib/temporalio/connection.rb +751 -0
  288. data/lib/temporalio/data_converter.rb +191 -0
  289. data/lib/temporalio/error/failure.rb +194 -0
  290. data/lib/temporalio/error/workflow_failure.rb +19 -0
  291. data/lib/temporalio/errors.rb +40 -0
  292. data/lib/temporalio/failure_converter/base.rb +26 -0
  293. data/lib/temporalio/failure_converter/basic.rb +319 -0
  294. data/lib/temporalio/failure_converter.rb +7 -0
  295. data/lib/temporalio/interceptor/chain.rb +28 -0
  296. data/lib/temporalio/interceptor/client.rb +123 -0
  297. data/lib/temporalio/payload_codec/base.rb +32 -0
  298. data/lib/temporalio/payload_converter/base.rb +24 -0
  299. data/lib/temporalio/payload_converter/bytes.rb +27 -0
  300. data/lib/temporalio/payload_converter/composite.rb +49 -0
  301. data/lib/temporalio/payload_converter/encoding_base.rb +35 -0
  302. data/lib/temporalio/payload_converter/json.rb +26 -0
  303. data/lib/temporalio/payload_converter/nil.rb +26 -0
  304. data/lib/temporalio/payload_converter.rb +14 -0
  305. data/lib/temporalio/retry_policy.rb +82 -0
  306. data/lib/temporalio/retry_state.rb +35 -0
  307. data/lib/temporalio/runtime.rb +25 -0
  308. data/lib/temporalio/timeout_type.rb +29 -0
  309. data/lib/temporalio/version.rb +3 -0
  310. data/lib/temporalio/worker/activity_runner.rb +92 -0
  311. data/lib/temporalio/worker/activity_worker.rb +138 -0
  312. data/lib/temporalio/worker/reactor.rb +46 -0
  313. data/lib/temporalio/worker/runner.rb +63 -0
  314. data/lib/temporalio/worker/sync_worker.rb +88 -0
  315. data/lib/temporalio/worker/thread_pool_executor.rb +51 -0
  316. data/lib/temporalio/worker.rb +198 -0
  317. data/lib/temporalio/workflow/execution_info.rb +54 -0
  318. data/lib/temporalio/workflow/execution_status.rb +36 -0
  319. data/lib/temporalio/workflow/id_reuse_policy.rb +36 -0
  320. data/lib/temporalio/workflow/query_reject_condition.rb +33 -0
  321. data/lib/temporalio.rb +12 -1
  322. data/lib/thermite_patch.rb +23 -0
  323. data/temporalio.gemspec +45 -0
  324. metadata +566 -9
  325. data/lib/temporal/version.rb +0 -3
  326. data/lib/temporal.rb +0 -4
  327. data/temporal.gemspec +0 -20
@@ -0,0 +1,407 @@
1
+ //! This module helps with the initialization and management of telemetry. IE: Metrics and tracing.
2
+ //! Logs from core are all traces, which may be exported to the console, in memory, or externally.
3
+
4
+ mod log_export;
5
+ pub(crate) mod metrics;
6
+ mod prometheus_server;
7
+
8
+ use crate::telemetry::{
9
+ log_export::{CoreLogExportLayer, CoreLogsOut},
10
+ metrics::SDKAggSelector,
11
+ prometheus_server::PromServer,
12
+ };
13
+ use crossbeam::channel::Receiver;
14
+ use itertools::Itertools;
15
+ use once_cell::sync::OnceCell;
16
+ use opentelemetry::{
17
+ metrics::{Meter, MeterProvider},
18
+ runtime,
19
+ sdk::{
20
+ export::metrics::aggregation::{self, Temporality, TemporalitySelector},
21
+ trace::Config,
22
+ Resource,
23
+ },
24
+ KeyValue,
25
+ };
26
+ use opentelemetry_otlp::WithExportConfig;
27
+ use parking_lot::Mutex;
28
+ use std::{
29
+ cell::RefCell,
30
+ collections::VecDeque,
31
+ convert::TryInto,
32
+ env,
33
+ sync::{
34
+ atomic::{AtomicBool, Ordering},
35
+ Arc,
36
+ },
37
+ time::Duration,
38
+ };
39
+ use temporal_sdk_core_api::telemetry::{
40
+ CoreLog, CoreTelemetry, Logger, MetricTemporality, MetricsExporter, OtelCollectorOptions,
41
+ TelemetryOptions, TraceExporter,
42
+ };
43
+ use tonic::metadata::MetadataMap;
44
+ use tracing::{Level, Subscriber};
45
+ use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Layer};
46
+
47
+ const TELEM_SERVICE_NAME: &str = "temporal-core-sdk";
48
+
49
+ /// Help you construct an [EnvFilter] compatible filter string which will forward all core module
50
+ /// traces at `core_level` and all others (from 3rd party modules, etc) at `other_levl.
51
+ pub fn construct_filter_string(core_level: Level, other_level: Level) -> String {
52
+ format!(
53
+ "{o},temporal_sdk_core={l},temporal_client={l},temporal_sdk={l}",
54
+ o = other_level,
55
+ l = core_level
56
+ )
57
+ }
58
+
59
+ /// Holds initialized tracing/metrics exporters, etc
60
+ pub struct TelemetryInstance {
61
+ metric_prefix: &'static str,
62
+ logs_out: Option<Mutex<CoreLogsOut>>,
63
+ metrics: Option<(Box<dyn MeterProvider + Send + Sync + 'static>, Meter)>,
64
+ trace_subscriber: Arc<dyn Subscriber + Send + Sync>,
65
+ _keepalive_rx: Receiver<()>,
66
+ }
67
+
68
+ impl TelemetryInstance {
69
+ fn new(
70
+ trace_subscriber: Arc<dyn Subscriber + Send + Sync>,
71
+ logs_out: Option<Mutex<CoreLogsOut>>,
72
+ metric_prefix: &'static str,
73
+ mut meter_provider: Option<Box<dyn MeterProvider + Send + Sync + 'static>>,
74
+ keepalive_rx: Receiver<()>,
75
+ ) -> Self {
76
+ let metrics = meter_provider.take().map(|mp| {
77
+ let meter = mp.meter(TELEM_SERVICE_NAME);
78
+ (mp, meter)
79
+ });
80
+ Self {
81
+ metric_prefix,
82
+ logs_out,
83
+ metrics,
84
+ trace_subscriber,
85
+ _keepalive_rx: keepalive_rx,
86
+ }
87
+ }
88
+
89
+ /// Returns a trace subscriber which can be used with the tracing crate, or with our own
90
+ /// [set_trace_subscriber_for_current_thread] function.
91
+ pub fn trace_subscriber(&self) -> Arc<dyn Subscriber + Send + Sync> {
92
+ self.trace_subscriber.clone()
93
+ }
94
+ }
95
+
96
+ thread_local! {
97
+ static SUB_GUARD: RefCell<Option<tracing::subscriber::DefaultGuard>> = RefCell::new(None);
98
+ }
99
+ /// Set the trace subscriber for the current thread. This must be done in every thread which uses
100
+ /// core stuff, otherwise traces/logs will not be collected on that thread. For example, if using
101
+ /// a multithreaded Tokio runtime, you should ensure that said runtime uses
102
+ /// [on_thread_start](https://docs.rs/tokio/latest/tokio/runtime/struct.Builder.html#method.on_thread_start)
103
+ /// or a similar mechanism to call this for each thread within the runtime.
104
+ pub fn set_trace_subscriber_for_current_thread(sub: impl Subscriber + Send + Sync + 'static) {
105
+ SUB_GUARD.with(|sg| {
106
+ if sg.borrow().is_none() {
107
+ let g = tracing::subscriber::set_default(sub);
108
+ *sg.borrow_mut() = Some(g);
109
+ }
110
+ })
111
+ }
112
+
113
+ /// Undoes [set_trace_subscriber_for_current_thread]
114
+ pub fn remove_trace_subscriber_for_current_thread() {
115
+ SUB_GUARD.with(|sg| sg.take());
116
+ }
117
+
118
+ fn metric_prefix(opts: &TelemetryOptions) -> &'static str {
119
+ if opts.no_temporal_prefix_for_metrics {
120
+ ""
121
+ } else {
122
+ "temporal_"
123
+ }
124
+ }
125
+
126
+ impl CoreTelemetry for TelemetryInstance {
127
+ fn fetch_buffered_logs(&self) -> Vec<CoreLog> {
128
+ if let Some(logs_out) = self.logs_out.as_ref() {
129
+ logs_out.lock().pop_iter().collect()
130
+ } else {
131
+ vec![]
132
+ }
133
+ }
134
+
135
+ fn get_metric_meter(&self) -> Option<&Meter> {
136
+ self.metrics.as_ref().map(|(_, m)| m)
137
+ }
138
+ }
139
+
140
+ /// Initialize tracing subscribers/output and logging export, returning a [TelemetryInstance]
141
+ /// which can be used to register default / global tracing subscribers.
142
+ ///
143
+ /// You should only call this once per unique [TelemetryOptions]
144
+ ///
145
+ /// See [TelemetryOptions] docs for more on configuration.
146
+ pub fn telemetry_init(opts: TelemetryOptions) -> Result<TelemetryInstance, anyhow::Error> {
147
+ // This is a bit odd, but functional. It's desirable to create a separate tokio runtime for
148
+ // metrics handling, since tests typically use a single-threaded runtime and initializing
149
+ // pipeline requires us to know if the runtime is single or multithreaded, we will crash
150
+ // in one case or the other. There does not seem to be a way to tell from the current runtime
151
+ // handle if it is single or multithreaded. Additionally, we can isolate metrics work this
152
+ // way which is nice.
153
+ let (tx, rx) = crossbeam::channel::bounded(0);
154
+ let (keepalive_tx, keepalive_rx) = crossbeam::channel::bounded(0);
155
+ let jh = std::thread::spawn(move || -> Result<(), anyhow::Error> {
156
+ let runtime = tokio::runtime::Builder::new_multi_thread()
157
+ .thread_name("telemetry")
158
+ .worker_threads(2)
159
+ .enable_all()
160
+ .build()?;
161
+ // Parts of telem dat ====
162
+ let mut logs_out = None;
163
+ let metric_prefix = metric_prefix(&opts);
164
+ // =======================
165
+
166
+ // Tracing subscriber layers =========
167
+ let mut console_pretty_layer = None;
168
+ let mut console_compact_layer = None;
169
+ let mut forward_layer = None;
170
+ let mut export_layer = None;
171
+ // ===================================
172
+
173
+ if let Some(ref logger) = opts.logging {
174
+ match logger {
175
+ Logger::Console { filter } => {
176
+ // This is silly dupe but can't be avoided without boxing.
177
+ if env::var("TEMPORAL_CORE_PRETTY_LOGS").is_ok() {
178
+ console_pretty_layer = Some(
179
+ tracing_subscriber::fmt::layer()
180
+ .with_target(false)
181
+ .event_format(
182
+ tracing_subscriber::fmt::format()
183
+ .pretty()
184
+ .with_source_location(false),
185
+ )
186
+ .with_filter(EnvFilter::new(filter)),
187
+ )
188
+ } else {
189
+ console_compact_layer = Some(
190
+ tracing_subscriber::fmt::layer()
191
+ .with_target(false)
192
+ .event_format(
193
+ tracing_subscriber::fmt::format()
194
+ .compact()
195
+ .with_source_location(false),
196
+ )
197
+ .with_filter(EnvFilter::new(filter)),
198
+ )
199
+ }
200
+ }
201
+ Logger::Forward { filter } => {
202
+ let (export_layer, lo) = CoreLogExportLayer::new();
203
+ logs_out = Some(Mutex::new(lo));
204
+ forward_layer = Some(export_layer.with_filter(EnvFilter::new(filter)));
205
+ }
206
+ };
207
+ };
208
+
209
+ let meter_provider = if let Some(ref metrics) = opts.metrics {
210
+ let aggregator = SDKAggSelector { metric_prefix };
211
+ match metrics {
212
+ MetricsExporter::Prometheus(addr) => {
213
+ let srv = PromServer::new(
214
+ *addr,
215
+ aggregator,
216
+ metric_temporality_to_selector(opts.metric_temporality),
217
+ )?;
218
+ let mp = srv.exporter.meter_provider()?;
219
+ runtime.spawn(async move { srv.run().await });
220
+ Some(Box::new(mp) as Box<dyn MeterProvider + Send + Sync>)
221
+ }
222
+ MetricsExporter::Otel(OtelCollectorOptions {
223
+ url,
224
+ headers,
225
+ metric_periodicity,
226
+ }) => runtime.block_on(async {
227
+ let metrics = opentelemetry_otlp::new_pipeline()
228
+ .metrics(
229
+ aggregator,
230
+ metric_temporality_to_selector(opts.metric_temporality),
231
+ runtime::Tokio,
232
+ )
233
+ .with_period(metric_periodicity.unwrap_or_else(|| Duration::from_secs(1)))
234
+ .with_resource(default_resource())
235
+ .with_exporter(
236
+ opentelemetry_otlp::new_exporter()
237
+ .tonic()
238
+ .with_endpoint(url.to_string())
239
+ .with_metadata(MetadataMap::from_headers(headers.try_into()?)),
240
+ )
241
+ .build()?;
242
+ Ok::<_, anyhow::Error>(Some(
243
+ Box::new(metrics) as Box<dyn MeterProvider + Send + Sync>
244
+ ))
245
+ })?,
246
+ }
247
+ } else {
248
+ None
249
+ };
250
+
251
+ if let Some(ref tracing) = opts.tracing {
252
+ match &tracing.exporter {
253
+ TraceExporter::Otel(OtelCollectorOptions { url, headers, .. }) => {
254
+ runtime.block_on(async {
255
+ let tracer_cfg = Config::default().with_resource(default_resource());
256
+ let tracer = opentelemetry_otlp::new_pipeline()
257
+ .tracing()
258
+ .with_exporter(
259
+ opentelemetry_otlp::new_exporter()
260
+ .tonic()
261
+ .with_endpoint(url.to_string())
262
+ .with_metadata(MetadataMap::from_headers(headers.try_into()?)),
263
+ )
264
+ .with_trace_config(tracer_cfg)
265
+ .install_batch(runtime::Tokio)?;
266
+
267
+ let opentelemetry = tracing_opentelemetry::layer()
268
+ .with_tracer(tracer)
269
+ .with_filter(EnvFilter::new(&tracing.filter));
270
+
271
+ export_layer = Some(opentelemetry);
272
+ Result::<(), anyhow::Error>::Ok(())
273
+ })?;
274
+ }
275
+ };
276
+ };
277
+
278
+ let reg = tracing_subscriber::registry()
279
+ .with(console_pretty_layer)
280
+ .with(console_compact_layer)
281
+ .with(forward_layer)
282
+ .with(export_layer);
283
+
284
+ tx.send(TelemetryInstance::new(
285
+ Arc::new(reg),
286
+ logs_out,
287
+ metric_prefix,
288
+ meter_provider,
289
+ keepalive_rx,
290
+ ))
291
+ .expect("Must be able to send telem instance out of thread");
292
+ // Now keep the thread alive until the telemetry instance is dropped by trying to send
293
+ // something forever
294
+ let _ = keepalive_tx.send(());
295
+ Ok(())
296
+ });
297
+ match rx.recv() {
298
+ Ok(ti) => Ok(ti),
299
+ Err(_) => {
300
+ // Immediately join the thread since something went wrong in it
301
+ jh.join().expect("Telemetry must init cleanly")?;
302
+ // This can't happen. The rx channel can't be dropped unless the thread errored.
303
+ unreachable!("Impossible error in telemetry init thread");
304
+ }
305
+ }
306
+ }
307
+
308
+ /// Initialize telemetry/tracing globally. Useful for testing. Only takes affect when called
309
+ /// the first time. Subsequent calls are ignored.
310
+ pub fn telemetry_init_global(opts: TelemetryOptions) -> Result<(), anyhow::Error> {
311
+ static INITTED: AtomicBool = AtomicBool::new(false);
312
+ if INITTED
313
+ .compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)
314
+ .is_ok()
315
+ {
316
+ let ti = telemetry_init(opts)?;
317
+ tracing::subscriber::set_global_default(ti.trace_subscriber())?;
318
+ }
319
+ Ok(())
320
+ }
321
+
322
+ fn default_resource_kvs() -> &'static [KeyValue] {
323
+ static INSTANCE: OnceCell<[KeyValue; 1]> = OnceCell::new();
324
+ INSTANCE.get_or_init(|| [KeyValue::new("service.name", TELEM_SERVICE_NAME)])
325
+ }
326
+ fn default_resource() -> Resource {
327
+ Resource::new(default_resource_kvs().iter().cloned())
328
+ }
329
+
330
+ fn metric_temporality_to_selector(
331
+ t: MetricTemporality,
332
+ ) -> impl TemporalitySelector + Send + Sync + Clone {
333
+ match t {
334
+ MetricTemporality::Cumulative => {
335
+ aggregation::constant_temporality_selector(Temporality::Cumulative)
336
+ }
337
+ MetricTemporality::Delta => aggregation::constant_temporality_selector(Temporality::Delta),
338
+ }
339
+ }
340
+
341
+ #[cfg(test)]
342
+ pub mod test_initters {
343
+ use super::*;
344
+ use temporal_sdk_core_api::telemetry::{TelemetryOptionsBuilder, TraceExportConfig};
345
+
346
+ #[allow(dead_code)] // Not always used, called to enable for debugging when needed
347
+ pub fn test_telem_console() {
348
+ telemetry_init_global(
349
+ TelemetryOptionsBuilder::default()
350
+ .logging(Logger::Console {
351
+ filter: construct_filter_string(Level::DEBUG, Level::WARN),
352
+ })
353
+ .build()
354
+ .unwrap(),
355
+ )
356
+ .unwrap();
357
+ }
358
+
359
+ #[allow(dead_code)] // Not always used, called to enable for debugging when needed
360
+ pub fn test_telem_collector() {
361
+ telemetry_init_global(
362
+ TelemetryOptionsBuilder::default()
363
+ .logging(Logger::Console {
364
+ filter: construct_filter_string(Level::DEBUG, Level::WARN),
365
+ })
366
+ .tracing(TraceExportConfig {
367
+ filter: construct_filter_string(Level::DEBUG, Level::WARN),
368
+ exporter: TraceExporter::Otel(OtelCollectorOptions {
369
+ url: "grpc://localhost:4317".parse().unwrap(),
370
+ headers: Default::default(),
371
+ metric_periodicity: None,
372
+ }),
373
+ })
374
+ .build()
375
+ .unwrap(),
376
+ )
377
+ .unwrap();
378
+ }
379
+ }
380
+ #[cfg(test)]
381
+ pub use test_initters::*;
382
+
383
+ /// A trait for using [Display] on the contents of vecs, etc, which don't implement it.
384
+ ///
385
+ /// Dislike this, but, there doesn't seem to be a great alternative. Calling itertools format
386
+ /// inline in an `event!` macro can panic because it gets evaluated twice somehow.
387
+ pub(crate) trait VecDisplayer {
388
+ fn display(&self) -> String;
389
+ }
390
+
391
+ impl<T> VecDisplayer for Vec<T>
392
+ where
393
+ T: std::fmt::Display,
394
+ {
395
+ fn display(&self) -> String {
396
+ format!("[{}]", self.iter().format(","))
397
+ }
398
+ }
399
+
400
+ impl<T> VecDisplayer for VecDeque<T>
401
+ where
402
+ T: std::fmt::Display,
403
+ {
404
+ fn display(&self) -> String {
405
+ format!("[{}]", self.iter().format(","))
406
+ }
407
+ }
@@ -0,0 +1,78 @@
1
+ use crate::telemetry::default_resource;
2
+ use hyper::{
3
+ header::CONTENT_TYPE,
4
+ service::{make_service_fn, service_fn},
5
+ Body, Method, Request, Response, Server,
6
+ };
7
+ use opentelemetry::{
8
+ metrics::MetricsError,
9
+ sdk::{
10
+ export::metrics::{aggregation::TemporalitySelector, AggregatorSelector},
11
+ metrics::{controllers, processors},
12
+ },
13
+ };
14
+ use opentelemetry_prometheus::{ExporterBuilder, PrometheusExporter};
15
+ use prometheus::{Encoder, TextEncoder};
16
+ use std::{convert::Infallible, net::SocketAddr, sync::Arc};
17
+
18
+ /// Exposes prometheus metrics for scraping
19
+ pub(super) struct PromServer {
20
+ addr: SocketAddr,
21
+ pub exporter: Arc<PrometheusExporter>,
22
+ }
23
+
24
+ impl PromServer {
25
+ pub fn new(
26
+ addr: SocketAddr,
27
+ aggregation: impl AggregatorSelector + Send + Sync + 'static,
28
+ temporality: impl TemporalitySelector + Send + Sync + 'static,
29
+ ) -> Result<Self, MetricsError> {
30
+ let controller =
31
+ controllers::basic(processors::factory(aggregation, temporality).with_memory(true))
32
+ .with_resource(default_resource())
33
+ .build();
34
+ let exporter = ExporterBuilder::new(controller).try_init()?;
35
+ Ok(Self {
36
+ exporter: Arc::new(exporter),
37
+ addr,
38
+ })
39
+ }
40
+
41
+ pub async fn run(&self) -> hyper::Result<()> {
42
+ // Spin up hyper server to serve metrics for scraping. We use hyper since we already depend
43
+ // on it via Tonic.
44
+ let expclone = self.exporter.clone();
45
+ let svc = make_service_fn(move |_conn| {
46
+ let expclone = expclone.clone();
47
+ async move { Ok::<_, Infallible>(service_fn(move |req| metrics_req(req, expclone.clone()))) }
48
+ });
49
+ let server = Server::bind(&self.addr).serve(svc);
50
+ server.await
51
+ }
52
+ }
53
+
54
+ /// Serves prometheus metrics in the expected format for scraping
55
+ async fn metrics_req(
56
+ req: Request<Body>,
57
+ exporter: Arc<PrometheusExporter>,
58
+ ) -> Result<Response<Body>, hyper::Error> {
59
+ let response = match (req.method(), req.uri().path()) {
60
+ (&Method::GET, "/metrics") => {
61
+ let mut buffer = vec![];
62
+ let encoder = TextEncoder::new();
63
+ let metric_families = exporter.registry().gather();
64
+ encoder.encode(&metric_families, &mut buffer).unwrap();
65
+
66
+ Response::builder()
67
+ .status(200)
68
+ .header(CONTENT_TYPE, encoder.format_type())
69
+ .body(Body::from(buffer))
70
+ .unwrap()
71
+ }
72
+ _ => Response::builder()
73
+ .status(404)
74
+ .body(Body::empty())
75
+ .expect("Can't fail to construct empty resp"),
76
+ };
77
+ Ok(response)
78
+ }