django-cfg 1.4.120__py3-none-any.whl → 1.5.2__py3-none-any.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 django-cfg might be problematic. Click here for more details.
- django_cfg/__init__.py +8 -4
- django_cfg/apps/centrifugo/admin/centrifugo_log.py +33 -71
- django_cfg/apps/dashboard/TRANSACTION_FIX.md +73 -0
- django_cfg/apps/dashboard/serializers/__init__.py +0 -12
- django_cfg/apps/dashboard/serializers/activity.py +1 -1
- django_cfg/apps/dashboard/services/__init__.py +0 -2
- django_cfg/apps/dashboard/services/charts_service.py +4 -3
- django_cfg/apps/dashboard/services/statistics_service.py +11 -2
- django_cfg/apps/dashboard/services/system_health_service.py +64 -106
- django_cfg/apps/dashboard/urls.py +0 -2
- django_cfg/apps/dashboard/views/__init__.py +0 -2
- django_cfg/apps/dashboard/views/commands_views.py +3 -6
- django_cfg/apps/dashboard/views/overview_views.py +14 -13
- django_cfg/apps/grpc/__init__.py +9 -0
- django_cfg/apps/grpc/admin/__init__.py +11 -0
- django_cfg/apps/{tasks → grpc}/admin/config.py +32 -41
- django_cfg/apps/grpc/admin/grpc_request_log.py +252 -0
- django_cfg/apps/grpc/apps.py +28 -0
- django_cfg/apps/grpc/auth/__init__.py +9 -0
- django_cfg/apps/grpc/auth/jwt_auth.py +295 -0
- django_cfg/apps/grpc/interceptors/__init__.py +19 -0
- django_cfg/apps/grpc/interceptors/errors.py +241 -0
- django_cfg/apps/grpc/interceptors/logging.py +270 -0
- django_cfg/apps/grpc/interceptors/metrics.py +306 -0
- django_cfg/apps/grpc/interceptors/request_logger.py +515 -0
- django_cfg/apps/grpc/management/__init__.py +1 -0
- django_cfg/apps/grpc/management/commands/rungrpc.py +302 -0
- django_cfg/apps/grpc/managers/__init__.py +10 -0
- django_cfg/apps/grpc/managers/grpc_request_log.py +310 -0
- django_cfg/apps/grpc/migrations/0001_initial.py +69 -0
- django_cfg/apps/grpc/migrations/0002_rename_django_cfg__service_4c4a8e_idx_django_cfg__service_584308_idx_and_more.py +38 -0
- django_cfg/apps/grpc/models/__init__.py +9 -0
- django_cfg/apps/grpc/models/grpc_request_log.py +219 -0
- django_cfg/apps/grpc/serializers/__init__.py +23 -0
- django_cfg/apps/grpc/serializers/health.py +18 -0
- django_cfg/apps/grpc/serializers/requests.py +18 -0
- django_cfg/apps/grpc/serializers/services.py +50 -0
- django_cfg/apps/grpc/serializers/stats.py +22 -0
- django_cfg/apps/grpc/services/__init__.py +16 -0
- django_cfg/apps/grpc/services/base.py +375 -0
- django_cfg/apps/grpc/services/discovery.py +415 -0
- django_cfg/apps/grpc/urls.py +23 -0
- django_cfg/apps/grpc/utils/__init__.py +13 -0
- django_cfg/apps/grpc/utils/proto_gen.py +423 -0
- django_cfg/apps/grpc/views/__init__.py +9 -0
- django_cfg/apps/grpc/views/monitoring.py +497 -0
- django_cfg/apps/knowbase/apps.py +2 -2
- django_cfg/apps/maintenance/admin/api_key_admin.py +7 -9
- django_cfg/apps/maintenance/admin/site_admin.py +5 -4
- django_cfg/apps/newsletter/admin/newsletter_admin.py +12 -11
- django_cfg/apps/payments/admin/balance_admin.py +26 -36
- django_cfg/apps/payments/admin/payment_admin.py +65 -85
- django_cfg/apps/payments/admin/withdrawal_admin.py +65 -100
- django_cfg/apps/rq/__init__.py +9 -0
- django_cfg/apps/rq/apps.py +80 -0
- django_cfg/apps/rq/management/__init__.py +1 -0
- django_cfg/apps/rq/management/commands/__init__.py +1 -0
- django_cfg/apps/rq/management/commands/rqscheduler.py +31 -0
- django_cfg/apps/rq/management/commands/rqstats.py +33 -0
- django_cfg/apps/rq/management/commands/rqworker.py +31 -0
- django_cfg/apps/rq/management/commands/rqworker_pool.py +27 -0
- django_cfg/apps/rq/serializers/__init__.py +40 -0
- django_cfg/apps/rq/serializers/health.py +60 -0
- django_cfg/apps/rq/serializers/job.py +100 -0
- django_cfg/apps/rq/serializers/queue.py +80 -0
- django_cfg/apps/rq/serializers/schedule.py +178 -0
- django_cfg/apps/rq/serializers/testing.py +139 -0
- django_cfg/apps/rq/serializers/worker.py +58 -0
- django_cfg/apps/rq/services/__init__.py +25 -0
- django_cfg/apps/rq/services/config_helper.py +233 -0
- django_cfg/apps/rq/services/models/README.md +417 -0
- django_cfg/apps/rq/services/models/__init__.py +30 -0
- django_cfg/apps/rq/services/models/event.py +123 -0
- django_cfg/apps/rq/services/models/job.py +99 -0
- django_cfg/apps/rq/services/models/queue.py +92 -0
- django_cfg/apps/rq/services/models/worker.py +104 -0
- django_cfg/apps/rq/services/rq_converters.py +183 -0
- django_cfg/apps/rq/tasks/__init__.py +23 -0
- django_cfg/apps/rq/tasks/demo_tasks.py +284 -0
- django_cfg/apps/rq/urls.py +54 -0
- django_cfg/apps/rq/views/__init__.py +19 -0
- django_cfg/apps/rq/views/jobs.py +882 -0
- django_cfg/apps/rq/views/monitoring.py +248 -0
- django_cfg/apps/rq/views/queues.py +261 -0
- django_cfg/apps/rq/views/schedule.py +400 -0
- django_cfg/apps/rq/views/testing.py +761 -0
- django_cfg/apps/rq/views/workers.py +195 -0
- django_cfg/apps/urls.py +13 -8
- django_cfg/config.py +106 -0
- django_cfg/core/base/config_model.py +16 -26
- django_cfg/core/builders/apps_builder.py +7 -11
- django_cfg/core/generation/integration_generators/__init__.py +3 -6
- django_cfg/core/generation/integration_generators/django_rq.py +80 -0
- django_cfg/core/generation/integration_generators/grpc_generator.py +318 -0
- django_cfg/core/generation/orchestrator.py +15 -15
- django_cfg/core/integration/display/startup.py +6 -20
- django_cfg/mixins/__init__.py +2 -0
- django_cfg/mixins/superadmin_api.py +59 -0
- django_cfg/models/__init__.py +3 -3
- django_cfg/models/api/grpc/__init__.py +59 -0
- django_cfg/models/api/grpc/config.py +364 -0
- django_cfg/models/django/__init__.py +3 -3
- django_cfg/models/django/django_rq.py +621 -0
- django_cfg/models/django/revolution_legacy.py +1 -1
- django_cfg/modules/base.py +19 -6
- django_cfg/modules/django_admin/base/pydantic_admin.py +2 -2
- django_cfg/modules/django_admin/config/background_task_config.py +4 -4
- django_cfg/modules/django_admin/utils/__init__.py +41 -3
- django_cfg/modules/django_admin/utils/badges/__init__.py +13 -0
- django_cfg/modules/django_admin/utils/{badges.py → badges/status_badges.py} +3 -3
- django_cfg/modules/django_admin/utils/displays/__init__.py +13 -0
- django_cfg/modules/django_admin/utils/{displays.py → displays/data_displays.py} +2 -2
- django_cfg/modules/django_admin/utils/html/__init__.py +26 -0
- django_cfg/modules/django_admin/utils/html/badges.py +47 -0
- django_cfg/modules/django_admin/utils/html/base.py +167 -0
- django_cfg/modules/django_admin/utils/html/code.py +87 -0
- django_cfg/modules/django_admin/utils/html/composition.py +205 -0
- django_cfg/modules/django_admin/utils/html/formatting.py +231 -0
- django_cfg/modules/django_admin/utils/html/keyvalue.py +219 -0
- django_cfg/modules/django_admin/utils/html/markdown_integration.py +108 -0
- django_cfg/modules/django_admin/utils/html/progress.py +127 -0
- django_cfg/modules/django_admin/utils/html_builder.py +55 -408
- django_cfg/modules/django_admin/utils/markdown/__init__.py +21 -0
- django_cfg/modules/django_unfold/navigation.py +21 -18
- django_cfg/pyproject.toml +4 -6
- django_cfg/registry/core.py +4 -7
- django_cfg/registry/modules.py +6 -0
- django_cfg/static/frontend/admin.zip +0 -0
- django_cfg/templates/admin/constance/includes/results_list.html +73 -0
- django_cfg/templates/admin/index.html +187 -62
- django_cfg/templatetags/django_cfg.py +61 -1
- {django_cfg-1.4.120.dist-info → django_cfg-1.5.2.dist-info}/METADATA +12 -4
- {django_cfg-1.4.120.dist-info → django_cfg-1.5.2.dist-info}/RECORD +140 -96
- django_cfg/apps/dashboard/permissions.py +0 -48
- django_cfg/apps/dashboard/serializers/django_q2.py +0 -50
- django_cfg/apps/dashboard/services/django_q2_service.py +0 -159
- django_cfg/apps/dashboard/views/django_q2_views.py +0 -79
- django_cfg/apps/tasks/__init__.py +0 -64
- django_cfg/apps/tasks/admin/__init__.py +0 -4
- django_cfg/apps/tasks/admin/task_log.py +0 -265
- django_cfg/apps/tasks/apps.py +0 -15
- django_cfg/apps/tasks/filters/__init__.py +0 -10
- django_cfg/apps/tasks/filters/task_log.py +0 -121
- django_cfg/apps/tasks/migrations/0001_initial.py +0 -196
- django_cfg/apps/tasks/migrations/0002_delete_tasklog.py +0 -16
- django_cfg/apps/tasks/models/__init__.py +0 -4
- django_cfg/apps/tasks/models/task_log.py +0 -246
- django_cfg/apps/tasks/serializers/__init__.py +0 -28
- django_cfg/apps/tasks/serializers/task_log.py +0 -249
- django_cfg/apps/tasks/services/__init__.py +0 -10
- django_cfg/apps/tasks/services/client/__init__.py +0 -7
- django_cfg/apps/tasks/services/client/client.py +0 -234
- django_cfg/apps/tasks/services/config_helper.py +0 -63
- django_cfg/apps/tasks/services/sync.py +0 -204
- django_cfg/apps/tasks/urls.py +0 -16
- django_cfg/apps/tasks/views/__init__.py +0 -10
- django_cfg/apps/tasks/views/task_log.py +0 -41
- django_cfg/apps/tasks/views/task_log_base.py +0 -41
- django_cfg/apps/tasks/views/task_log_overview.py +0 -100
- django_cfg/apps/tasks/views/task_log_related.py +0 -41
- django_cfg/apps/tasks/views/task_log_stats.py +0 -91
- django_cfg/apps/tasks/views/task_log_timeline.py +0 -81
- django_cfg/core/generation/integration_generators/django_q2.py +0 -133
- django_cfg/core/generation/integration_generators/tasks.py +0 -88
- django_cfg/models/django/django_q2.py +0 -514
- django_cfg/models/tasks/__init__.py +0 -49
- django_cfg/models/tasks/backends.py +0 -122
- django_cfg/models/tasks/config.py +0 -209
- django_cfg/models/tasks/utils.py +0 -162
- django_cfg/modules/django_admin/utils/CODE_BLOCK_DOCS.md +0 -396
- django_cfg/modules/django_q2/README.md +0 -140
- django_cfg/modules/django_q2/__init__.py +0 -8
- django_cfg/modules/django_q2/apps.py +0 -107
- django_cfg/modules/django_q2/management/commands/__init__.py +0 -0
- django_cfg/modules/django_q2/management/commands/sync_django_q_schedules.py +0 -74
- /django_cfg/apps/{tasks/migrations → grpc/management/commands}/__init__.py +0 -0
- /django_cfg/{modules/django_q2/management → apps/grpc/migrations}/__init__.py +0 -0
- /django_cfg/modules/django_admin/utils/{mermaid_plugin.py → markdown/mermaid_plugin.py} +0 -0
- /django_cfg/modules/django_admin/utils/{markdown_renderer.py → markdown/renderer.py} +0 -0
- {django_cfg-1.4.120.dist-info → django_cfg-1.5.2.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.120.dist-info → django_cfg-1.5.2.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.120.dist-info → django_cfg-1.5.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Demo tasks for RQ testing and simulation.
|
|
3
|
+
|
|
4
|
+
These tasks provide various scenarios for testing RQ functionality:
|
|
5
|
+
- Successful completion
|
|
6
|
+
- Failure scenarios
|
|
7
|
+
- Long-running tasks
|
|
8
|
+
- Progress tracking
|
|
9
|
+
- Crash simulation
|
|
10
|
+
- Retry logic
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import time
|
|
14
|
+
import random
|
|
15
|
+
from django_cfg.modules.django_logging import get_logger
|
|
16
|
+
|
|
17
|
+
logger = get_logger("rq.demo_tasks")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def demo_success_task(duration: int = 2, message: str = "Demo task completed"):
|
|
21
|
+
"""
|
|
22
|
+
Simple task that always succeeds.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
duration: How long to run (seconds)
|
|
26
|
+
message: Custom message to return
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
dict: Success result with message and metadata
|
|
30
|
+
"""
|
|
31
|
+
logger.info(f"Starting demo_success_task (duration={duration}s)")
|
|
32
|
+
time.sleep(duration)
|
|
33
|
+
|
|
34
|
+
result = {
|
|
35
|
+
"status": "success",
|
|
36
|
+
"message": message,
|
|
37
|
+
"duration": duration,
|
|
38
|
+
"timestamp": time.time(),
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
logger.info(f"Completed demo_success_task: {result}")
|
|
42
|
+
return result
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def demo_failure_task(error_message: str = "Simulated failure"):
|
|
46
|
+
"""
|
|
47
|
+
Task that always fails with an exception.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
error_message: Custom error message
|
|
51
|
+
|
|
52
|
+
Raises:
|
|
53
|
+
ValueError: Always raises this exception
|
|
54
|
+
"""
|
|
55
|
+
logger.warning(f"Starting demo_failure_task (will fail with: {error_message})")
|
|
56
|
+
time.sleep(1)
|
|
57
|
+
raise ValueError(error_message)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def demo_slow_task(duration: int = 30, step_interval: int = 5):
|
|
61
|
+
"""
|
|
62
|
+
Long-running task for testing worker timeouts and monitoring.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
duration: Total duration (seconds)
|
|
66
|
+
step_interval: How often to log progress (seconds)
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
dict: Success result with timing info
|
|
70
|
+
"""
|
|
71
|
+
logger.info(f"Starting demo_slow_task (duration={duration}s)")
|
|
72
|
+
|
|
73
|
+
steps = duration // step_interval
|
|
74
|
+
for i in range(steps):
|
|
75
|
+
time.sleep(step_interval)
|
|
76
|
+
progress = ((i + 1) / steps) * 100
|
|
77
|
+
logger.info(f"Progress: {progress:.1f}%")
|
|
78
|
+
|
|
79
|
+
result = {
|
|
80
|
+
"status": "success",
|
|
81
|
+
"message": "Slow task completed",
|
|
82
|
+
"duration": duration,
|
|
83
|
+
"steps": steps,
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
logger.info(f"Completed demo_slow_task: {result}")
|
|
87
|
+
return result
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def demo_progress_task(total_items: int = 100):
|
|
91
|
+
"""
|
|
92
|
+
Task that updates progress in job meta.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
total_items: Number of items to process
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
dict: Success result with processed items count
|
|
99
|
+
"""
|
|
100
|
+
from rq import get_current_job
|
|
101
|
+
|
|
102
|
+
logger.info(f"Starting demo_progress_task (items={total_items})")
|
|
103
|
+
|
|
104
|
+
job = get_current_job()
|
|
105
|
+
|
|
106
|
+
for i in range(total_items):
|
|
107
|
+
# Simulate work
|
|
108
|
+
time.sleep(0.1)
|
|
109
|
+
|
|
110
|
+
# Update progress in job meta
|
|
111
|
+
if job:
|
|
112
|
+
job.meta['progress'] = {
|
|
113
|
+
'current': i + 1,
|
|
114
|
+
'total': total_items,
|
|
115
|
+
'percentage': ((i + 1) / total_items) * 100,
|
|
116
|
+
}
|
|
117
|
+
job.save_meta()
|
|
118
|
+
|
|
119
|
+
if (i + 1) % 10 == 0:
|
|
120
|
+
logger.info(f"Processed {i + 1}/{total_items} items")
|
|
121
|
+
|
|
122
|
+
result = {
|
|
123
|
+
"status": "success",
|
|
124
|
+
"message": "Progress task completed",
|
|
125
|
+
"processed_items": total_items,
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
logger.info(f"Completed demo_progress_task: {result}")
|
|
129
|
+
return result
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def demo_crash_task():
|
|
133
|
+
"""
|
|
134
|
+
Task that simulates a worker crash (raises SystemExit).
|
|
135
|
+
|
|
136
|
+
WARNING: This will actually crash the worker! Use with caution.
|
|
137
|
+
|
|
138
|
+
Raises:
|
|
139
|
+
SystemExit: Simulates worker crash
|
|
140
|
+
"""
|
|
141
|
+
logger.warning("Starting demo_crash_task (will crash worker!)")
|
|
142
|
+
time.sleep(1)
|
|
143
|
+
raise SystemExit("Simulated worker crash")
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def demo_retry_task(max_attempts: int = 3, fail_until_attempt: int = 2):
|
|
147
|
+
"""
|
|
148
|
+
Task that fails N times before succeeding.
|
|
149
|
+
|
|
150
|
+
Useful for testing retry logic.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
max_attempts: Maximum retry attempts
|
|
154
|
+
fail_until_attempt: Succeed on this attempt
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
dict: Success result if attempt succeeds
|
|
158
|
+
|
|
159
|
+
Raises:
|
|
160
|
+
ValueError: If attempt should fail
|
|
161
|
+
"""
|
|
162
|
+
from rq import get_current_job
|
|
163
|
+
|
|
164
|
+
job = get_current_job()
|
|
165
|
+
|
|
166
|
+
# Track attempt count in job meta
|
|
167
|
+
if job:
|
|
168
|
+
attempts = job.meta.get('attempts', 0) + 1
|
|
169
|
+
job.meta['attempts'] = attempts
|
|
170
|
+
job.save_meta()
|
|
171
|
+
else:
|
|
172
|
+
attempts = 1
|
|
173
|
+
|
|
174
|
+
logger.info(f"demo_retry_task attempt {attempts}/{max_attempts}")
|
|
175
|
+
|
|
176
|
+
if attempts < fail_until_attempt:
|
|
177
|
+
error_msg = f"Retry attempt {attempts} - failing until attempt {fail_until_attempt}"
|
|
178
|
+
logger.warning(error_msg)
|
|
179
|
+
raise ValueError(error_msg)
|
|
180
|
+
|
|
181
|
+
result = {
|
|
182
|
+
"status": "success",
|
|
183
|
+
"message": f"Succeeded on attempt {attempts}",
|
|
184
|
+
"attempts": attempts,
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
logger.info(f"Completed demo_retry_task: {result}")
|
|
188
|
+
return result
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def demo_random_task(success_rate: float = 0.7):
|
|
192
|
+
"""
|
|
193
|
+
Task that randomly succeeds or fails.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
success_rate: Probability of success (0.0 to 1.0)
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
dict: Success result if task succeeds
|
|
200
|
+
|
|
201
|
+
Raises:
|
|
202
|
+
ValueError: If task randomly fails
|
|
203
|
+
"""
|
|
204
|
+
logger.info(f"Starting demo_random_task (success_rate={success_rate})")
|
|
205
|
+
time.sleep(2)
|
|
206
|
+
|
|
207
|
+
if random.random() < success_rate:
|
|
208
|
+
result = {
|
|
209
|
+
"status": "success",
|
|
210
|
+
"message": "Random task succeeded",
|
|
211
|
+
"success_rate": success_rate,
|
|
212
|
+
}
|
|
213
|
+
logger.info(f"demo_random_task succeeded: {result}")
|
|
214
|
+
return result
|
|
215
|
+
else:
|
|
216
|
+
error_msg = f"Random task failed (success_rate={success_rate})"
|
|
217
|
+
logger.warning(error_msg)
|
|
218
|
+
raise ValueError(error_msg)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def demo_memory_intensive_task(mb_to_allocate: int = 100):
|
|
222
|
+
"""
|
|
223
|
+
Task that allocates memory for testing worker memory limits.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
mb_to_allocate: Megabytes of memory to allocate
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
dict: Success result with memory info
|
|
230
|
+
"""
|
|
231
|
+
logger.info(f"Starting demo_memory_intensive_task (allocating {mb_to_allocate}MB)")
|
|
232
|
+
|
|
233
|
+
# Allocate memory (1MB = 1024*1024 bytes, store as list of integers)
|
|
234
|
+
data = []
|
|
235
|
+
chunk_size = 1024 * 1024 # 1MB chunks
|
|
236
|
+
|
|
237
|
+
for i in range(mb_to_allocate):
|
|
238
|
+
chunk = [0] * (chunk_size // 8) # 8 bytes per integer
|
|
239
|
+
data.append(chunk)
|
|
240
|
+
|
|
241
|
+
if (i + 1) % 10 == 0:
|
|
242
|
+
logger.info(f"Allocated {i + 1}MB")
|
|
243
|
+
|
|
244
|
+
time.sleep(2)
|
|
245
|
+
|
|
246
|
+
result = {
|
|
247
|
+
"status": "success",
|
|
248
|
+
"message": "Memory intensive task completed",
|
|
249
|
+
"mb_allocated": mb_to_allocate,
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
logger.info(f"Completed demo_memory_intensive_task: {result}")
|
|
253
|
+
return result
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def demo_cpu_intensive_task(iterations: int = 1000000):
|
|
257
|
+
"""
|
|
258
|
+
CPU-intensive task for testing worker CPU limits.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
iterations: Number of iterations to compute
|
|
262
|
+
|
|
263
|
+
Returns:
|
|
264
|
+
dict: Success result with computation info
|
|
265
|
+
"""
|
|
266
|
+
logger.info(f"Starting demo_cpu_intensive_task (iterations={iterations})")
|
|
267
|
+
|
|
268
|
+
# Perform CPU-intensive calculation
|
|
269
|
+
result_value = 0
|
|
270
|
+
for i in range(iterations):
|
|
271
|
+
result_value += i ** 2
|
|
272
|
+
|
|
273
|
+
if (i + 1) % 100000 == 0:
|
|
274
|
+
logger.info(f"Processed {i + 1}/{iterations} iterations")
|
|
275
|
+
|
|
276
|
+
result = {
|
|
277
|
+
"status": "success",
|
|
278
|
+
"message": "CPU intensive task completed",
|
|
279
|
+
"iterations": iterations,
|
|
280
|
+
"result": result_value,
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
logger.info(f"Completed demo_cpu_intensive_task: {result}")
|
|
284
|
+
return result
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""
|
|
2
|
+
URL patterns for Django-RQ monitoring and management API.
|
|
3
|
+
|
|
4
|
+
Public API endpoints for RQ task queue monitoring, job management,
|
|
5
|
+
queue management, worker monitoring, and schedule management.
|
|
6
|
+
|
|
7
|
+
Endpoints:
|
|
8
|
+
/rq/monitor/ - Monitoring, health checks, and metrics
|
|
9
|
+
/rq/queues/ - Queue management (list, details, empty)
|
|
10
|
+
/rq/workers/ - Worker monitoring and statistics
|
|
11
|
+
/rq/jobs/ - Job management (view, cancel, requeue, delete)
|
|
12
|
+
/rq/schedules/ - Schedule management (create, list, cancel)
|
|
13
|
+
/rq/testing/ - Testing and simulation (demo tasks, stress tests)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from django.urls import include, path
|
|
17
|
+
from rest_framework import routers
|
|
18
|
+
|
|
19
|
+
from .views import (
|
|
20
|
+
RQMonitorViewSet,
|
|
21
|
+
QueueViewSet,
|
|
22
|
+
WorkerViewSet,
|
|
23
|
+
JobViewSet,
|
|
24
|
+
ScheduleViewSet,
|
|
25
|
+
TestingViewSet,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
app_name = 'django_cfg_rq'
|
|
29
|
+
|
|
30
|
+
# Create router
|
|
31
|
+
router = routers.DefaultRouter()
|
|
32
|
+
|
|
33
|
+
# Monitoring endpoints (health, config, metrics)
|
|
34
|
+
router.register(r'monitor', RQMonitorViewSet, basename='monitor')
|
|
35
|
+
|
|
36
|
+
# Queue management endpoints
|
|
37
|
+
router.register(r'queues', QueueViewSet, basename='queues')
|
|
38
|
+
|
|
39
|
+
# Worker monitoring endpoints
|
|
40
|
+
router.register(r'workers', WorkerViewSet, basename='workers')
|
|
41
|
+
|
|
42
|
+
# Job management endpoints
|
|
43
|
+
router.register(r'jobs', JobViewSet, basename='jobs')
|
|
44
|
+
|
|
45
|
+
# Schedule management endpoints (requires rq-scheduler)
|
|
46
|
+
router.register(r'schedules', ScheduleViewSet, basename='schedules')
|
|
47
|
+
|
|
48
|
+
# Testing and simulation endpoints (admin-only)
|
|
49
|
+
router.register(r'testing', TestingViewSet, basename='testing')
|
|
50
|
+
|
|
51
|
+
urlpatterns = [
|
|
52
|
+
# Include router URLs
|
|
53
|
+
path('', include(router.urls)),
|
|
54
|
+
]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Views for Django-RQ monitoring and management API.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from .monitoring import RQMonitorViewSet
|
|
6
|
+
from .queues import QueueViewSet
|
|
7
|
+
from .workers import WorkerViewSet
|
|
8
|
+
from .jobs import JobViewSet
|
|
9
|
+
from .schedule import ScheduleViewSet
|
|
10
|
+
from .testing import TestingViewSet
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
'RQMonitorViewSet',
|
|
14
|
+
'QueueViewSet',
|
|
15
|
+
'WorkerViewSet',
|
|
16
|
+
'JobViewSet',
|
|
17
|
+
'ScheduleViewSet',
|
|
18
|
+
'TestingViewSet',
|
|
19
|
+
]
|