opengris-scaler 1.12.28__cp313-cp313-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.

Potentially problematic release.


This version of opengris-scaler might be problematic. Click here for more details.

Files changed (187) hide show
  1. opengris_scaler-1.12.28.dist-info/METADATA +728 -0
  2. opengris_scaler-1.12.28.dist-info/RECORD +187 -0
  3. opengris_scaler-1.12.28.dist-info/WHEEL +5 -0
  4. opengris_scaler-1.12.28.dist-info/entry_points.txt +10 -0
  5. opengris_scaler-1.12.28.dist-info/licenses/LICENSE +201 -0
  6. opengris_scaler-1.12.28.dist-info/licenses/LICENSE.spdx +7 -0
  7. opengris_scaler-1.12.28.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 +210 -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 +658 -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 +115 -0
  32. scaler/cluster/combo.py +150 -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/defaults.py +94 -0
  37. scaler/config/loader.py +96 -0
  38. scaler/config/mixins.py +20 -0
  39. scaler/config/section/__init__.py +0 -0
  40. scaler/config/section/cluster.py +55 -0
  41. scaler/config/section/ecs_worker_adapter.py +85 -0
  42. scaler/config/section/native_worker_adapter.py +43 -0
  43. scaler/config/section/object_storage_server.py +8 -0
  44. scaler/config/section/scheduler.py +54 -0
  45. scaler/config/section/symphony_worker_adapter.py +47 -0
  46. scaler/config/section/top.py +13 -0
  47. scaler/config/section/webui.py +21 -0
  48. scaler/config/types/__init__.py +0 -0
  49. scaler/config/types/network_backend.py +12 -0
  50. scaler/config/types/object_storage_server.py +45 -0
  51. scaler/config/types/worker.py +62 -0
  52. scaler/config/types/zmq.py +83 -0
  53. scaler/entry_points/__init__.py +0 -0
  54. scaler/entry_points/cluster.py +133 -0
  55. scaler/entry_points/object_storage_server.py +45 -0
  56. scaler/entry_points/scheduler.py +144 -0
  57. scaler/entry_points/top.py +286 -0
  58. scaler/entry_points/webui.py +48 -0
  59. scaler/entry_points/worker_adapter_ecs.py +191 -0
  60. scaler/entry_points/worker_adapter_native.py +137 -0
  61. scaler/entry_points/worker_adapter_symphony.py +98 -0
  62. scaler/io/__init__.py +0 -0
  63. scaler/io/async_binder.py +89 -0
  64. scaler/io/async_connector.py +95 -0
  65. scaler/io/async_object_storage_connector.py +225 -0
  66. scaler/io/mixins.py +154 -0
  67. scaler/io/sync_connector.py +68 -0
  68. scaler/io/sync_object_storage_connector.py +247 -0
  69. scaler/io/sync_subscriber.py +83 -0
  70. scaler/io/utility.py +80 -0
  71. scaler/io/ymq/__init__.py +0 -0
  72. scaler/io/ymq/_ymq.pyi +95 -0
  73. scaler/io/ymq/ymq.py +138 -0
  74. scaler/io/ymq_async_object_storage_connector.py +184 -0
  75. scaler/io/ymq_sync_object_storage_connector.py +184 -0
  76. scaler/object_storage/__init__.py +0 -0
  77. scaler/protocol/__init__.py +0 -0
  78. scaler/protocol/capnp/__init__.py +0 -0
  79. scaler/protocol/capnp/_python.py +6 -0
  80. scaler/protocol/capnp/common.capnp +68 -0
  81. scaler/protocol/capnp/message.capnp +218 -0
  82. scaler/protocol/capnp/object_storage.capnp +57 -0
  83. scaler/protocol/capnp/status.capnp +73 -0
  84. scaler/protocol/introduction.md +105 -0
  85. scaler/protocol/python/__init__.py +0 -0
  86. scaler/protocol/python/common.py +140 -0
  87. scaler/protocol/python/message.py +751 -0
  88. scaler/protocol/python/mixins.py +13 -0
  89. scaler/protocol/python/object_storage.py +118 -0
  90. scaler/protocol/python/status.py +279 -0
  91. scaler/protocol/worker.md +228 -0
  92. scaler/scheduler/__init__.py +0 -0
  93. scaler/scheduler/allocate_policy/__init__.py +0 -0
  94. scaler/scheduler/allocate_policy/allocate_policy.py +9 -0
  95. scaler/scheduler/allocate_policy/capability_allocate_policy.py +280 -0
  96. scaler/scheduler/allocate_policy/even_load_allocate_policy.py +159 -0
  97. scaler/scheduler/allocate_policy/mixins.py +55 -0
  98. scaler/scheduler/controllers/__init__.py +0 -0
  99. scaler/scheduler/controllers/balance_controller.py +65 -0
  100. scaler/scheduler/controllers/client_controller.py +131 -0
  101. scaler/scheduler/controllers/config_controller.py +31 -0
  102. scaler/scheduler/controllers/graph_controller.py +424 -0
  103. scaler/scheduler/controllers/information_controller.py +81 -0
  104. scaler/scheduler/controllers/mixins.py +194 -0
  105. scaler/scheduler/controllers/object_controller.py +147 -0
  106. scaler/scheduler/controllers/scaling_policies/__init__.py +0 -0
  107. scaler/scheduler/controllers/scaling_policies/fixed_elastic.py +145 -0
  108. scaler/scheduler/controllers/scaling_policies/mixins.py +10 -0
  109. scaler/scheduler/controllers/scaling_policies/null.py +14 -0
  110. scaler/scheduler/controllers/scaling_policies/types.py +9 -0
  111. scaler/scheduler/controllers/scaling_policies/utility.py +20 -0
  112. scaler/scheduler/controllers/scaling_policies/vanilla.py +95 -0
  113. scaler/scheduler/controllers/task_controller.py +376 -0
  114. scaler/scheduler/controllers/worker_controller.py +169 -0
  115. scaler/scheduler/object_usage/__init__.py +0 -0
  116. scaler/scheduler/object_usage/object_tracker.py +131 -0
  117. scaler/scheduler/scheduler.py +251 -0
  118. scaler/scheduler/task/__init__.py +0 -0
  119. scaler/scheduler/task/task_state_machine.py +92 -0
  120. scaler/scheduler/task/task_state_manager.py +61 -0
  121. scaler/ui/__init__.py +0 -0
  122. scaler/ui/constants.py +9 -0
  123. scaler/ui/live_display.py +147 -0
  124. scaler/ui/memory_window.py +146 -0
  125. scaler/ui/setting_page.py +40 -0
  126. scaler/ui/task_graph.py +832 -0
  127. scaler/ui/task_log.py +107 -0
  128. scaler/ui/utility.py +66 -0
  129. scaler/ui/webui.py +147 -0
  130. scaler/ui/worker_processors.py +104 -0
  131. scaler/utility/__init__.py +0 -0
  132. scaler/utility/debug.py +19 -0
  133. scaler/utility/event_list.py +63 -0
  134. scaler/utility/event_loop.py +58 -0
  135. scaler/utility/exceptions.py +42 -0
  136. scaler/utility/formatter.py +44 -0
  137. scaler/utility/graph/__init__.py +0 -0
  138. scaler/utility/graph/optimization.py +27 -0
  139. scaler/utility/graph/topological_sorter.py +11 -0
  140. scaler/utility/graph/topological_sorter_graphblas.py +174 -0
  141. scaler/utility/identifiers.py +107 -0
  142. scaler/utility/logging/__init__.py +0 -0
  143. scaler/utility/logging/decorators.py +25 -0
  144. scaler/utility/logging/scoped_logger.py +33 -0
  145. scaler/utility/logging/utility.py +183 -0
  146. scaler/utility/many_to_many_dict.py +123 -0
  147. scaler/utility/metadata/__init__.py +0 -0
  148. scaler/utility/metadata/profile_result.py +31 -0
  149. scaler/utility/metadata/task_flags.py +30 -0
  150. scaler/utility/mixins.py +13 -0
  151. scaler/utility/network_util.py +7 -0
  152. scaler/utility/one_to_many_dict.py +72 -0
  153. scaler/utility/queues/__init__.py +0 -0
  154. scaler/utility/queues/async_indexed_queue.py +37 -0
  155. scaler/utility/queues/async_priority_queue.py +70 -0
  156. scaler/utility/queues/async_sorted_priority_queue.py +45 -0
  157. scaler/utility/queues/indexed_queue.py +114 -0
  158. scaler/utility/serialization.py +9 -0
  159. scaler/version.txt +1 -0
  160. scaler/worker/__init__.py +0 -0
  161. scaler/worker/agent/__init__.py +0 -0
  162. scaler/worker/agent/heartbeat_manager.py +107 -0
  163. scaler/worker/agent/mixins.py +137 -0
  164. scaler/worker/agent/processor/__init__.py +0 -0
  165. scaler/worker/agent/processor/object_cache.py +107 -0
  166. scaler/worker/agent/processor/processor.py +285 -0
  167. scaler/worker/agent/processor/streaming_buffer.py +28 -0
  168. scaler/worker/agent/processor_holder.py +147 -0
  169. scaler/worker/agent/processor_manager.py +369 -0
  170. scaler/worker/agent/profiling_manager.py +109 -0
  171. scaler/worker/agent/task_manager.py +150 -0
  172. scaler/worker/agent/timeout_manager.py +19 -0
  173. scaler/worker/preload.py +84 -0
  174. scaler/worker/worker.py +265 -0
  175. scaler/worker_adapter/__init__.py +0 -0
  176. scaler/worker_adapter/common.py +26 -0
  177. scaler/worker_adapter/ecs.py +269 -0
  178. scaler/worker_adapter/native.py +155 -0
  179. scaler/worker_adapter/symphony/__init__.py +0 -0
  180. scaler/worker_adapter/symphony/callback.py +45 -0
  181. scaler/worker_adapter/symphony/heartbeat_manager.py +79 -0
  182. scaler/worker_adapter/symphony/message.py +24 -0
  183. scaler/worker_adapter/symphony/task_manager.py +289 -0
  184. scaler/worker_adapter/symphony/worker.py +204 -0
  185. scaler/worker_adapter/symphony/worker_adapter.py +139 -0
  186. src/scaler/io/ymq/_ymq.so +0 -0
  187. src/scaler/object_storage/object_storage_server.so +0 -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.setting_page import Settings
8
+ from scaler.ui.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())