opengris-scaler 1.12.37__cp38-cp38-musllinux_1_2_x86_64.whl

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. opengris_scaler-1.12.37.dist-info/METADATA +730 -0
  2. opengris_scaler-1.12.37.dist-info/RECORD +196 -0
  3. opengris_scaler-1.12.37.dist-info/WHEEL +5 -0
  4. opengris_scaler-1.12.37.dist-info/entry_points.txt +10 -0
  5. opengris_scaler-1.12.37.dist-info/licenses/LICENSE +201 -0
  6. opengris_scaler-1.12.37.dist-info/licenses/LICENSE.spdx +7 -0
  7. opengris_scaler-1.12.37.dist-info/licenses/NOTICE +8 -0
  8. opengris_scaler.libs/libcapnp-1-e88d5415.0.1.so +0 -0
  9. opengris_scaler.libs/libgcc_s-2298274a.so.1 +0 -0
  10. opengris_scaler.libs/libkj-1-9bebd8ac.0.1.so +0 -0
  11. opengris_scaler.libs/libstdc++-08d5c7eb.so.6.0.33 +0 -0
  12. scaler/__init__.py +14 -0
  13. scaler/about.py +5 -0
  14. scaler/client/__init__.py +0 -0
  15. scaler/client/agent/__init__.py +0 -0
  16. scaler/client/agent/client_agent.py +218 -0
  17. scaler/client/agent/disconnect_manager.py +27 -0
  18. scaler/client/agent/future_manager.py +112 -0
  19. scaler/client/agent/heartbeat_manager.py +74 -0
  20. scaler/client/agent/mixins.py +89 -0
  21. scaler/client/agent/object_manager.py +98 -0
  22. scaler/client/agent/task_manager.py +64 -0
  23. scaler/client/client.py +672 -0
  24. scaler/client/future.py +252 -0
  25. scaler/client/object_buffer.py +129 -0
  26. scaler/client/object_reference.py +25 -0
  27. scaler/client/serializer/__init__.py +0 -0
  28. scaler/client/serializer/default.py +16 -0
  29. scaler/client/serializer/mixins.py +38 -0
  30. scaler/cluster/__init__.py +0 -0
  31. scaler/cluster/cluster.py +95 -0
  32. scaler/cluster/combo.py +157 -0
  33. scaler/cluster/object_storage_server.py +45 -0
  34. scaler/cluster/scheduler.py +86 -0
  35. scaler/config/__init__.py +0 -0
  36. scaler/config/common/__init__.py +0 -0
  37. scaler/config/common/logging.py +41 -0
  38. scaler/config/common/web.py +18 -0
  39. scaler/config/common/worker.py +65 -0
  40. scaler/config/common/worker_adapter.py +28 -0
  41. scaler/config/config_class.py +317 -0
  42. scaler/config/defaults.py +94 -0
  43. scaler/config/mixins.py +20 -0
  44. scaler/config/section/__init__.py +0 -0
  45. scaler/config/section/cluster.py +66 -0
  46. scaler/config/section/ecs_worker_adapter.py +78 -0
  47. scaler/config/section/native_worker_adapter.py +30 -0
  48. scaler/config/section/object_storage_server.py +13 -0
  49. scaler/config/section/scheduler.py +126 -0
  50. scaler/config/section/symphony_worker_adapter.py +35 -0
  51. scaler/config/section/top.py +16 -0
  52. scaler/config/section/webui.py +16 -0
  53. scaler/config/types/__init__.py +0 -0
  54. scaler/config/types/network_backend.py +12 -0
  55. scaler/config/types/object_storage_server.py +45 -0
  56. scaler/config/types/worker.py +67 -0
  57. scaler/config/types/zmq.py +83 -0
  58. scaler/entry_points/__init__.py +0 -0
  59. scaler/entry_points/cluster.py +10 -0
  60. scaler/entry_points/object_storage_server.py +26 -0
  61. scaler/entry_points/scheduler.py +51 -0
  62. scaler/entry_points/top.py +272 -0
  63. scaler/entry_points/webui.py +6 -0
  64. scaler/entry_points/worker_adapter_ecs.py +22 -0
  65. scaler/entry_points/worker_adapter_native.py +31 -0
  66. scaler/entry_points/worker_adapter_symphony.py +26 -0
  67. scaler/io/__init__.py +0 -0
  68. scaler/io/async_binder.py +89 -0
  69. scaler/io/async_connector.py +95 -0
  70. scaler/io/async_object_storage_connector.py +225 -0
  71. scaler/io/mixins.py +154 -0
  72. scaler/io/sync_connector.py +68 -0
  73. scaler/io/sync_object_storage_connector.py +249 -0
  74. scaler/io/sync_subscriber.py +83 -0
  75. scaler/io/utility.py +80 -0
  76. scaler/io/ymq/__init__.py +0 -0
  77. scaler/io/ymq/_ymq.pyi +95 -0
  78. scaler/io/ymq/_ymq.so +0 -0
  79. scaler/io/ymq/ymq.py +138 -0
  80. scaler/io/ymq_async_object_storage_connector.py +184 -0
  81. scaler/io/ymq_sync_object_storage_connector.py +184 -0
  82. scaler/object_storage/__init__.py +0 -0
  83. scaler/object_storage/object_storage_server.so +0 -0
  84. scaler/protocol/__init__.py +0 -0
  85. scaler/protocol/capnp/__init__.py +0 -0
  86. scaler/protocol/capnp/_python.py +6 -0
  87. scaler/protocol/capnp/common.capnp +68 -0
  88. scaler/protocol/capnp/message.capnp +218 -0
  89. scaler/protocol/capnp/object_storage.capnp +57 -0
  90. scaler/protocol/capnp/status.capnp +73 -0
  91. scaler/protocol/introduction.md +105 -0
  92. scaler/protocol/python/__init__.py +0 -0
  93. scaler/protocol/python/common.py +140 -0
  94. scaler/protocol/python/message.py +751 -0
  95. scaler/protocol/python/mixins.py +13 -0
  96. scaler/protocol/python/object_storage.py +118 -0
  97. scaler/protocol/python/status.py +279 -0
  98. scaler/protocol/worker.md +228 -0
  99. scaler/scheduler/__init__.py +0 -0
  100. scaler/scheduler/allocate_policy/__init__.py +0 -0
  101. scaler/scheduler/allocate_policy/allocate_policy.py +9 -0
  102. scaler/scheduler/allocate_policy/capability_allocate_policy.py +280 -0
  103. scaler/scheduler/allocate_policy/even_load_allocate_policy.py +159 -0
  104. scaler/scheduler/allocate_policy/mixins.py +55 -0
  105. scaler/scheduler/controllers/__init__.py +0 -0
  106. scaler/scheduler/controllers/balance_controller.py +65 -0
  107. scaler/scheduler/controllers/client_controller.py +131 -0
  108. scaler/scheduler/controllers/config_controller.py +31 -0
  109. scaler/scheduler/controllers/graph_controller.py +424 -0
  110. scaler/scheduler/controllers/information_controller.py +81 -0
  111. scaler/scheduler/controllers/mixins.py +194 -0
  112. scaler/scheduler/controllers/object_controller.py +147 -0
  113. scaler/scheduler/controllers/scaling_policies/__init__.py +0 -0
  114. scaler/scheduler/controllers/scaling_policies/fixed_elastic.py +145 -0
  115. scaler/scheduler/controllers/scaling_policies/mixins.py +10 -0
  116. scaler/scheduler/controllers/scaling_policies/null.py +14 -0
  117. scaler/scheduler/controllers/scaling_policies/types.py +9 -0
  118. scaler/scheduler/controllers/scaling_policies/utility.py +20 -0
  119. scaler/scheduler/controllers/scaling_policies/vanilla.py +95 -0
  120. scaler/scheduler/controllers/task_controller.py +376 -0
  121. scaler/scheduler/controllers/worker_controller.py +169 -0
  122. scaler/scheduler/object_usage/__init__.py +0 -0
  123. scaler/scheduler/object_usage/object_tracker.py +131 -0
  124. scaler/scheduler/scheduler.py +251 -0
  125. scaler/scheduler/task/__init__.py +0 -0
  126. scaler/scheduler/task/task_state_machine.py +92 -0
  127. scaler/scheduler/task/task_state_manager.py +61 -0
  128. scaler/ui/__init__.py +0 -0
  129. scaler/ui/common/__init__.py +0 -0
  130. scaler/ui/common/constants.py +9 -0
  131. scaler/ui/common/live_display.py +147 -0
  132. scaler/ui/common/memory_window.py +146 -0
  133. scaler/ui/common/setting_page.py +40 -0
  134. scaler/ui/common/task_graph.py +840 -0
  135. scaler/ui/common/task_log.py +111 -0
  136. scaler/ui/common/utility.py +66 -0
  137. scaler/ui/common/webui.py +80 -0
  138. scaler/ui/common/worker_processors.py +104 -0
  139. scaler/ui/v1.py +76 -0
  140. scaler/ui/v2.py +102 -0
  141. scaler/ui/webui.py +21 -0
  142. scaler/utility/__init__.py +0 -0
  143. scaler/utility/debug.py +19 -0
  144. scaler/utility/event_list.py +63 -0
  145. scaler/utility/event_loop.py +58 -0
  146. scaler/utility/exceptions.py +42 -0
  147. scaler/utility/formatter.py +44 -0
  148. scaler/utility/graph/__init__.py +0 -0
  149. scaler/utility/graph/optimization.py +27 -0
  150. scaler/utility/graph/topological_sorter.py +11 -0
  151. scaler/utility/graph/topological_sorter_graphblas.py +174 -0
  152. scaler/utility/identifiers.py +107 -0
  153. scaler/utility/logging/__init__.py +0 -0
  154. scaler/utility/logging/decorators.py +25 -0
  155. scaler/utility/logging/scoped_logger.py +33 -0
  156. scaler/utility/logging/utility.py +183 -0
  157. scaler/utility/many_to_many_dict.py +123 -0
  158. scaler/utility/metadata/__init__.py +0 -0
  159. scaler/utility/metadata/profile_result.py +31 -0
  160. scaler/utility/metadata/task_flags.py +30 -0
  161. scaler/utility/mixins.py +13 -0
  162. scaler/utility/network_util.py +7 -0
  163. scaler/utility/one_to_many_dict.py +72 -0
  164. scaler/utility/queues/__init__.py +0 -0
  165. scaler/utility/queues/async_indexed_queue.py +37 -0
  166. scaler/utility/queues/async_priority_queue.py +70 -0
  167. scaler/utility/queues/async_sorted_priority_queue.py +45 -0
  168. scaler/utility/queues/indexed_queue.py +114 -0
  169. scaler/utility/serialization.py +9 -0
  170. scaler/version.txt +1 -0
  171. scaler/worker/__init__.py +0 -0
  172. scaler/worker/agent/__init__.py +0 -0
  173. scaler/worker/agent/heartbeat_manager.py +110 -0
  174. scaler/worker/agent/mixins.py +137 -0
  175. scaler/worker/agent/processor/__init__.py +0 -0
  176. scaler/worker/agent/processor/object_cache.py +107 -0
  177. scaler/worker/agent/processor/processor.py +285 -0
  178. scaler/worker/agent/processor/streaming_buffer.py +28 -0
  179. scaler/worker/agent/processor_holder.py +147 -0
  180. scaler/worker/agent/processor_manager.py +369 -0
  181. scaler/worker/agent/profiling_manager.py +109 -0
  182. scaler/worker/agent/task_manager.py +150 -0
  183. scaler/worker/agent/timeout_manager.py +19 -0
  184. scaler/worker/preload.py +84 -0
  185. scaler/worker/worker.py +265 -0
  186. scaler/worker_adapter/__init__.py +0 -0
  187. scaler/worker_adapter/common.py +26 -0
  188. scaler/worker_adapter/ecs.py +241 -0
  189. scaler/worker_adapter/native.py +138 -0
  190. scaler/worker_adapter/symphony/__init__.py +0 -0
  191. scaler/worker_adapter/symphony/callback.py +45 -0
  192. scaler/worker_adapter/symphony/heartbeat_manager.py +82 -0
  193. scaler/worker_adapter/symphony/message.py +24 -0
  194. scaler/worker_adapter/symphony/task_manager.py +289 -0
  195. scaler/worker_adapter/symphony/worker.py +204 -0
  196. scaler/worker_adapter/symphony/worker_adapter.py +123 -0
@@ -0,0 +1,146 @@
1
+ import datetime
2
+ from typing import Any, Dict, Optional
3
+
4
+ from nicegui import ui
5
+
6
+ from scaler.protocol.python.message import StateTask, StateWorker
7
+ from scaler.ui.common.setting_page import Settings
8
+ from scaler.ui.common.utility import format_timediff, get_bounds, make_taskstream_ticks, make_tick_text
9
+ from scaler.utility.formatter import format_bytes
10
+ from scaler.utility.metadata.profile_result import ProfileResult
11
+
12
+ CHART_NAME = "Memory Usage (in bytes)"
13
+ X_AXIS_GRID_LINES = False
14
+ Y_AXIS_GRID_LINES = True
15
+
16
+
17
+ class MemoryChart:
18
+ def __init__(self):
19
+ self._figure = {}
20
+ self._plot = None
21
+ self._plot_data: Dict[str, Any] = {}
22
+
23
+ self._settings: Optional[Settings] = None
24
+
25
+ self._start_time = datetime.datetime.now() - datetime.timedelta(minutes=30)
26
+
27
+ def setup_memory_chart(self, settings: Settings):
28
+ with ui.card().classes("w-full").style("height: 600px"):
29
+ self._plot_data = {
30
+ "type": "scatter",
31
+ "fill": "tozeroy",
32
+ "fillcolor": "rgba(0,0,255,1)",
33
+ "mode": "none",
34
+ "name": "",
35
+ "x": [],
36
+ "y": [],
37
+ "hovertemplate": [],
38
+ }
39
+ fig = {
40
+ "data": [self._plot_data],
41
+ "layout": {
42
+ "title": {"text": CHART_NAME},
43
+ "autosize": True,
44
+ "margin": {"l": 163},
45
+ "xaxis": {
46
+ "autorange": False,
47
+ "range": [0, 300],
48
+ "showgrid": X_AXIS_GRID_LINES,
49
+ "tickmode": "array",
50
+ "tickvals": [0, 50, 100, 150, 200, 250, 300],
51
+ "ticktext": [-300, -250, -200, -150, -100, -50, 0],
52
+ "zeroline": False,
53
+ },
54
+ "yaxis": {
55
+ "tickmode": "auto",
56
+ "nticks": 4,
57
+ "tickformat": "~s",
58
+ "autorange": True,
59
+ "automargin": True,
60
+ "rangemode": "nonnegative",
61
+ "showgrid": Y_AXIS_GRID_LINES,
62
+ "type": "log",
63
+ },
64
+ },
65
+ }
66
+ self._figure = fig
67
+ self._plot = ui.plotly(self._figure).classes("w-full h-full")
68
+ self._settings = settings
69
+
70
+ def handle_task_state(self, state_task: StateTask):
71
+ """
72
+ Only completed tasks have profiling data.
73
+ Use this data to fill in history.
74
+ """
75
+ if state_task.metadata == b"":
76
+ return
77
+
78
+ profile_result = ProfileResult.deserialize(state_task.metadata)
79
+
80
+ worker_memory = profile_result.memory_peak
81
+ worker_duration = profile_result.duration_s
82
+
83
+ if worker_memory == 0:
84
+ return
85
+
86
+ self.__add_memory_usage(worker_duration, worker_memory)
87
+
88
+ def handle_worker_state(self, _: StateWorker):
89
+ return
90
+
91
+ def update_plot(self):
92
+ now = datetime.datetime.now()
93
+ self.__render_plot(now)
94
+
95
+ def __add_memory_usage(self, time_taken: float, memory_usage: int):
96
+ now = datetime.datetime.now()
97
+ current_time = format_timediff(self._start_time, now)
98
+ task_start_time = current_time - time_taken
99
+
100
+ # find index we need to start changing memory use from
101
+ insert_index = len(self._plot_data["x"])
102
+ while insert_index > 0 and self._plot_data["x"][insert_index - 1] > task_start_time:
103
+ insert_index -= 1
104
+
105
+ # insert points to mark change
106
+ self._plot_data["x"].insert(insert_index, task_start_time)
107
+ self._plot_data["x"].insert(insert_index, task_start_time - 0.01)
108
+
109
+ prev_mem = 0
110
+ if insert_index < len(self._plot_data["y"]):
111
+ prev_mem = self._plot_data["y"][insert_index]
112
+
113
+ self._plot_data["y"].insert(insert_index, prev_mem + memory_usage)
114
+ self._plot_data["y"].insert(insert_index, prev_mem)
115
+
116
+ self._plot_data["hovertemplate"].insert(insert_index, format_bytes(prev_mem + memory_usage))
117
+ self._plot_data["hovertemplate"].insert(insert_index, format_bytes(prev_mem))
118
+
119
+ # fill future overlapping points with the additional memory use
120
+ i = insert_index + 2
121
+ while i < len(self._plot_data["x"]):
122
+ self._plot_data["y"][i] += memory_usage
123
+ self._plot_data["hovertemplate"][i] = format_bytes(self._plot_data["y"][i])
124
+ i += 1
125
+
126
+ # mark end of this task's memory use. always going to be the latest task we have so far.
127
+ self._plot_data["y"].append(memory_usage)
128
+ self._plot_data["hovertemplate"].append(format_bytes(memory_usage))
129
+ self._plot_data["x"].append(current_time - 0.01)
130
+
131
+ self._plot_data["y"].append(0)
132
+ self._plot_data["hovertemplate"].append(format_bytes(0))
133
+ self._plot_data["x"].append(current_time)
134
+
135
+ def __render_plot(self, now: datetime.datetime):
136
+ lower_bound, upper_bound = get_bounds(now, self._start_time, self._settings)
137
+
138
+ ticks = make_taskstream_ticks(lower_bound, upper_bound)
139
+ tick_text = make_tick_text(int(self._settings.stream_window.total_seconds()))
140
+
141
+ self._figure["layout"]["xaxis"]["range"] = [lower_bound, upper_bound]
142
+ self._figure["layout"]["xaxis"]["tickvals"] = ticks
143
+ self._figure["layout"]["xaxis"]["ticktext"] = tick_text
144
+ self._figure["layout"]["yaxis"]["type"] = self._settings.memory_usage_scale
145
+
146
+ self._plot.update()
@@ -0,0 +1,40 @@
1
+ import datetime
2
+
3
+ from nicegui import ui
4
+
5
+ from scaler.protocol.python.message import StateTask, StateWorker
6
+
7
+ SLIDING_WINDOW_OPTIONS = {
8
+ datetime.timedelta(minutes=5): "5",
9
+ datetime.timedelta(minutes=10): "10",
10
+ datetime.timedelta(minutes=30): "30",
11
+ }
12
+ MEMORY_STORE_TIME = max(SLIDING_WINDOW_OPTIONS.keys())
13
+
14
+ MEMORY_USAGE_SCALE_OPTIONS = {"log": "log", "linear": "linear"}
15
+
16
+
17
+ class Settings:
18
+ def __init__(self):
19
+ self.stream_window = datetime.timedelta(minutes=5)
20
+ self.memory_store_time = MEMORY_STORE_TIME
21
+ self.memory_usage_scale = "linear"
22
+
23
+ def draw_section(self):
24
+ with ui.card().classes("w-fit").classes("q-mx-auto"):
25
+ ui.label("Sliding Window Length").classes("q-mx-auto")
26
+ ui.toggle(SLIDING_WINDOW_OPTIONS).bind_value(self, "stream_window")
27
+
28
+ with ui.card().classes("w-fit").classes("q-mx-auto"):
29
+ ui.label("Memory Usage Scale").classes("q-mx-auto")
30
+ ui.toggle(MEMORY_USAGE_SCALE_OPTIONS).bind_value(self, "memory_usage_scale")
31
+
32
+ def handle_task_state(self, _: StateTask):
33
+ return
34
+
35
+ def handle_worker_state(self, _: StateWorker):
36
+ return
37
+
38
+ @staticmethod
39
+ def max_window_size() -> datetime.timedelta:
40
+ return max(SLIDING_WINDOW_OPTIONS.keys())