jettask 0.2.15__py3-none-any.whl → 0.2.16__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.
- jettask/__init__.py +14 -35
- jettask/{webui/__main__.py → __main__.py} +4 -4
- jettask/api/__init__.py +103 -0
- jettask/api/v1/__init__.py +29 -0
- jettask/api/v1/alerts.py +226 -0
- jettask/api/v1/analytics.py +323 -0
- jettask/api/v1/namespaces.py +134 -0
- jettask/api/v1/overview.py +136 -0
- jettask/api/v1/queues.py +530 -0
- jettask/api/v1/scheduled.py +420 -0
- jettask/api/v1/settings.py +44 -0
- jettask/{webui/api.py → api.py} +4 -46
- jettask/{webui/backend → backend}/main.py +21 -109
- jettask/{webui/backend → backend}/main_unified.py +1 -1
- jettask/{webui/backend → backend}/namespace_api_old.py +3 -30
- jettask/{webui/backend → backend}/namespace_data_access.py +2 -1
- jettask/{webui/backend → backend}/unified_api_router.py +14 -74
- jettask/{core/cli.py → cli.py} +106 -26
- jettask/config/nacos_config.py +386 -0
- jettask/core/app.py +8 -100
- jettask/core/db_manager.py +515 -0
- jettask/core/event_pool.py +5 -2
- jettask/core/unified_manager_base.py +47 -14
- jettask/{webui/db_init.py → db_init.py} +1 -1
- jettask/executors/asyncio.py +2 -2
- jettask/{webui/integrated_gradio_app.py → integrated_gradio_app.py} +1 -1
- jettask/{webui/multi_namespace_consumer.py → multi_namespace_consumer.py} +5 -2
- jettask/{webui/pg_consumer.py → pg_consumer.py} +137 -69
- jettask/{webui/run.py → run.py} +1 -1
- jettask/{webui/run_webui.py → run_webui.py} +4 -4
- jettask/scheduler/multi_namespace_scheduler.py +2 -2
- jettask/scheduler/unified_manager.py +5 -5
- jettask/scheduler/unified_scheduler_manager.py +1 -1
- jettask/schemas/__init__.py +166 -0
- jettask/schemas/alert.py +99 -0
- jettask/schemas/backlog.py +122 -0
- jettask/schemas/common.py +139 -0
- jettask/schemas/monitoring.py +181 -0
- jettask/schemas/namespace.py +168 -0
- jettask/schemas/queue.py +83 -0
- jettask/schemas/scheduled_task.py +128 -0
- jettask/schemas/task.py +70 -0
- jettask/services/__init__.py +24 -0
- jettask/services/alert_service.py +454 -0
- jettask/services/analytics_service.py +46 -0
- jettask/services/overview_service.py +978 -0
- jettask/services/queue_service.py +711 -0
- jettask/services/redis_monitor_service.py +151 -0
- jettask/services/scheduled_task_service.py +207 -0
- jettask/services/settings_service.py +758 -0
- jettask/services/task_service.py +157 -0
- jettask/{webui/task_center.py → task_center.py} +30 -8
- jettask/{webui/task_center_client.py → task_center_client.py} +1 -1
- jettask/{webui/config.py → webui_config.py} +6 -1
- jettask/webui_exceptions.py +67 -0
- jettask/webui_sql/verify_database.sql +72 -0
- {jettask-0.2.15.dist-info → jettask-0.2.16.dist-info}/METADATA +2 -1
- jettask-0.2.16.dist-info/RECORD +150 -0
- {jettask-0.2.15.dist-info → jettask-0.2.16.dist-info}/entry_points.txt +1 -1
- jettask/webui/backend/data_api.py +0 -3294
- jettask/webui/backend/namespace_api.py +0 -295
- jettask/webui/backend/queue_backlog_api.py +0 -727
- jettask/webui/backend/redis_monitor_api.py +0 -476
- jettask/webui/frontend/index.html +0 -13
- jettask/webui/frontend/package.json +0 -30
- jettask/webui/frontend/src/App.css +0 -109
- jettask/webui/frontend/src/App.jsx +0 -66
- jettask/webui/frontend/src/components/NamespaceSelector.jsx +0 -166
- jettask/webui/frontend/src/components/QueueBacklogChart.jsx +0 -298
- jettask/webui/frontend/src/components/QueueBacklogTrend.jsx +0 -638
- jettask/webui/frontend/src/components/QueueDetailsTable.css +0 -65
- jettask/webui/frontend/src/components/QueueDetailsTable.jsx +0 -487
- jettask/webui/frontend/src/components/QueueDetailsTableV2.jsx +0 -465
- jettask/webui/frontend/src/components/ScheduledTaskFilter.jsx +0 -423
- jettask/webui/frontend/src/components/TaskFilter.jsx +0 -425
- jettask/webui/frontend/src/components/TimeRangeSelector.css +0 -21
- jettask/webui/frontend/src/components/TimeRangeSelector.jsx +0 -160
- jettask/webui/frontend/src/components/charts/QueueChart.jsx +0 -111
- jettask/webui/frontend/src/components/charts/QueueTrendChart.jsx +0 -115
- jettask/webui/frontend/src/components/charts/WorkerChart.jsx +0 -40
- jettask/webui/frontend/src/components/common/StatsCard.jsx +0 -18
- jettask/webui/frontend/src/components/layout/AppLayout.css +0 -95
- jettask/webui/frontend/src/components/layout/AppLayout.jsx +0 -49
- jettask/webui/frontend/src/components/layout/Header.css +0 -106
- jettask/webui/frontend/src/components/layout/Header.jsx +0 -106
- jettask/webui/frontend/src/components/layout/SideMenu.css +0 -137
- jettask/webui/frontend/src/components/layout/SideMenu.jsx +0 -209
- jettask/webui/frontend/src/components/layout/TabsNav.css +0 -244
- jettask/webui/frontend/src/components/layout/TabsNav.jsx +0 -206
- jettask/webui/frontend/src/components/layout/UserInfo.css +0 -197
- jettask/webui/frontend/src/components/layout/UserInfo.jsx +0 -197
- jettask/webui/frontend/src/contexts/LoadingContext.jsx +0 -27
- jettask/webui/frontend/src/contexts/NamespaceContext.jsx +0 -72
- jettask/webui/frontend/src/contexts/TabsContext.backup.jsx +0 -245
- jettask/webui/frontend/src/index.css +0 -114
- jettask/webui/frontend/src/main.jsx +0 -22
- jettask/webui/frontend/src/pages/Alerts.jsx +0 -684
- jettask/webui/frontend/src/pages/Dashboard/index.css +0 -35
- jettask/webui/frontend/src/pages/Dashboard/index.jsx +0 -281
- jettask/webui/frontend/src/pages/Dashboard.jsx +0 -1330
- jettask/webui/frontend/src/pages/QueueDetail.jsx +0 -1117
- jettask/webui/frontend/src/pages/QueueMonitor.jsx +0 -527
- jettask/webui/frontend/src/pages/Queues.jsx +0 -12
- jettask/webui/frontend/src/pages/ScheduledTasks.jsx +0 -810
- jettask/webui/frontend/src/pages/Settings.jsx +0 -801
- jettask/webui/frontend/src/pages/Workers.jsx +0 -12
- jettask/webui/frontend/src/services/api.js +0 -159
- jettask/webui/frontend/src/services/queueTrend.js +0 -166
- jettask/webui/frontend/src/utils/suppressWarnings.js +0 -22
- jettask/webui/frontend/src/utils/userPreferences.js +0 -154
- jettask/webui/frontend/vite.config.js +0 -26
- jettask/webui/sql/init_database.sql +0 -640
- jettask-0.2.15.dist-info/RECORD +0 -172
- /jettask/{webui/backend → backend}/__init__.py +0 -0
- /jettask/{webui/backend → backend}/api/__init__.py +0 -0
- /jettask/{webui/backend → backend}/api/v1/__init__.py +0 -0
- /jettask/{webui/backend → backend}/api/v1/monitoring.py +0 -0
- /jettask/{webui/backend → backend}/api/v1/namespaces.py +0 -0
- /jettask/{webui/backend → backend}/api/v1/queues.py +0 -0
- /jettask/{webui/backend → backend}/api/v1/tasks.py +0 -0
- /jettask/{webui/backend → backend}/config.py +0 -0
- /jettask/{webui/backend → backend}/core/__init__.py +0 -0
- /jettask/{webui/backend → backend}/core/cache.py +0 -0
- /jettask/{webui/backend → backend}/core/database.py +0 -0
- /jettask/{webui/backend → backend}/core/exceptions.py +0 -0
- /jettask/{webui/backend → backend}/data_access.py +0 -0
- /jettask/{webui/backend → backend}/dependencies.py +0 -0
- /jettask/{webui/backend → backend}/init_meta_db.py +0 -0
- /jettask/{webui/backend → backend}/main_v2.py +0 -0
- /jettask/{webui/backend → backend}/models/__init__.py +0 -0
- /jettask/{webui/backend → backend}/models/requests.py +0 -0
- /jettask/{webui/backend → backend}/models/responses.py +0 -0
- /jettask/{webui/backend → backend}/queue_stats_v2.py +0 -0
- /jettask/{webui/backend → backend}/services/__init__.py +0 -0
- /jettask/{webui/backend → backend}/start.py +0 -0
- /jettask/{webui/cleanup_deprecated_tables.sql → cleanup_deprecated_tables.sql} +0 -0
- /jettask/{webui/gradio_app.py → gradio_app.py} +0 -0
- /jettask/{webui/__init__.py → main.py} +0 -0
- /jettask/{webui/models.py → models.py} +0 -0
- /jettask/{webui/run_monitor.py → run_monitor.py} +0 -0
- /jettask/{webui/schema.sql → schema.sql} +0 -0
- /jettask/{webui/unified_consumer_manager.py → unified_consumer_manager.py} +0 -0
- /jettask/{webui/models → webui_models}/__init__.py +0 -0
- /jettask/{webui/models → webui_models}/namespace.py +0 -0
- /jettask/{webui/sql → webui_sql}/batch_upsert_functions.sql +0 -0
- {jettask-0.2.15.dist-info → jettask-0.2.16.dist-info}/WHEEL +0 -0
- {jettask-0.2.15.dist-info → jettask-0.2.16.dist-info}/licenses/LICENSE +0 -0
- {jettask-0.2.15.dist-info → jettask-0.2.16.dist-info}/top_level.txt +0 -0
jettask/schemas/queue.py
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""
|
|
2
|
+
队列相关的数据模型
|
|
3
|
+
"""
|
|
4
|
+
from typing import Optional, List, Dict, Any
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TimeRangeQuery(BaseModel):
|
|
10
|
+
"""时间范围查询模型"""
|
|
11
|
+
queues: Optional[List[str]] = Field(None, description="队列名称列表,为空时统计所有队列")
|
|
12
|
+
time_range: Optional[str] = Field(None, description="时间范围(如 '1h', '24h', '7d'),与 start_time/end_time 二选一")
|
|
13
|
+
start_time: Optional[str] = Field(None, description="开始时间,与 time_range 二选一")
|
|
14
|
+
end_time: Optional[str] = Field(None, description="结束时间,与 time_range 二选一")
|
|
15
|
+
interval: Optional[str] = Field(default="1h", description="时间间隔")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class QueueStatsResponse(BaseModel):
|
|
19
|
+
"""队列统计响应模型"""
|
|
20
|
+
queue_name: str = Field(..., description="队列名称")
|
|
21
|
+
pending_count: int = Field(default=0, description="待处理任务数")
|
|
22
|
+
processing_count: int = Field(default=0, description="处理中任务数")
|
|
23
|
+
completed_count: int = Field(default=0, description="已完成任务数")
|
|
24
|
+
failed_count: int = Field(default=0, description="失败任务数")
|
|
25
|
+
success_rate: float = Field(default=0.0, description="成功率")
|
|
26
|
+
avg_processing_time: Optional[float] = Field(None, description="平均处理时间")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class QueueTimelineResponse(BaseModel):
|
|
30
|
+
"""队列时间线响应模型"""
|
|
31
|
+
queue_name: str = Field(..., description="队列名称")
|
|
32
|
+
timeline: List[Dict[str, Any]] = Field(default=[], description="时间线数据")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class TrimQueueRequest(BaseModel):
|
|
36
|
+
"""修剪队列请求模型"""
|
|
37
|
+
queue_name: str = Field(..., description="队列名称")
|
|
38
|
+
max_length: int = Field(..., ge=1, description="最大长度")
|
|
39
|
+
trim_strategy: str = Field(default="oldest", description="修剪策略", pattern="^(oldest|newest)$")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class QueueInfo(BaseModel):
|
|
43
|
+
"""队列信息模型"""
|
|
44
|
+
name: str = Field(..., description="队列名称")
|
|
45
|
+
namespace: str = Field(..., description="命名空间")
|
|
46
|
+
pending_count: int = Field(default=0, description="待处理任务数")
|
|
47
|
+
processing_count: int = Field(default=0, description="处理中任务数")
|
|
48
|
+
completed_count: int = Field(default=0, description="已完成任务数")
|
|
49
|
+
failed_count: int = Field(default=0, description="失败任务数")
|
|
50
|
+
created_at: Optional[datetime] = Field(None, description="创建时间")
|
|
51
|
+
updated_at: Optional[datetime] = Field(None, description="更新时间")
|
|
52
|
+
|
|
53
|
+
class Config:
|
|
54
|
+
json_encoders = {
|
|
55
|
+
datetime: lambda v: v.isoformat() if v else None
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class QueueStats(BaseModel):
|
|
60
|
+
"""队列统计模型"""
|
|
61
|
+
queue_name: str = Field(..., description="队列名称")
|
|
62
|
+
total_tasks: int = Field(default=0, description="总任务数")
|
|
63
|
+
pending_tasks: int = Field(default=0, description="待处理任务数")
|
|
64
|
+
processing_tasks: int = Field(default=0, description="处理中任务数")
|
|
65
|
+
completed_tasks: int = Field(default=0, description="已完成任务数")
|
|
66
|
+
failed_tasks: int = Field(default=0, description="失败任务数")
|
|
67
|
+
success_rate: float = Field(default=0.0, description="成功率")
|
|
68
|
+
avg_processing_time: Optional[float] = Field(None, description="平均处理时间")
|
|
69
|
+
throughput: Optional[float] = Field(None, description="吞吐量(任务/秒)")
|
|
70
|
+
last_activity: Optional[datetime] = Field(None, description="最后活动时间")
|
|
71
|
+
|
|
72
|
+
class Config:
|
|
73
|
+
json_encoders = {
|
|
74
|
+
datetime: lambda v: v.isoformat() if v else None
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class QueueActionRequest(BaseModel):
|
|
79
|
+
"""队列操作请求模型"""
|
|
80
|
+
queue_names: List[str] = Field(..., min_items=1, description="队列名称列表")
|
|
81
|
+
action: str = Field(..., description="操作类型", pattern="^(pause|resume|clear|delete)$")
|
|
82
|
+
reason: Optional[str] = Field(None, description="操作原因")
|
|
83
|
+
force: bool = Field(default=False, description="是否强制执行")
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""
|
|
2
|
+
定时任务相关的数据模型
|
|
3
|
+
"""
|
|
4
|
+
from typing import Optional, Dict, Any
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ScheduleConfig(BaseModel):
|
|
10
|
+
"""调度配置模型"""
|
|
11
|
+
schedule_type: str = Field(..., description="调度类型", pattern="^(cron|interval)$")
|
|
12
|
+
cron_expression: Optional[str] = Field(None, description="Cron表达式(当schedule_type为cron时)")
|
|
13
|
+
interval_seconds: Optional[int] = Field(None, ge=1, description="间隔秒数(当schedule_type为interval时)")
|
|
14
|
+
timezone: str = Field(default="UTC", description="时区")
|
|
15
|
+
max_instances: int = Field(default=1, ge=1, description="最大实例数")
|
|
16
|
+
|
|
17
|
+
def validate_schedule_config(self):
|
|
18
|
+
"""验证调度配置"""
|
|
19
|
+
if self.schedule_type == "cron" and not self.cron_expression:
|
|
20
|
+
raise ValueError("Cron类型调度必须提供cron_expression")
|
|
21
|
+
if self.schedule_type == "interval" and not self.interval_seconds:
|
|
22
|
+
raise ValueError("Interval类型调度必须提供interval_seconds")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ScheduledTaskRequest(BaseModel):
|
|
26
|
+
"""定时任务请求模型"""
|
|
27
|
+
task_name: str = Field(..., description="任务名称")
|
|
28
|
+
task_function: str = Field(..., description="任务函数")
|
|
29
|
+
schedule_config: ScheduleConfig = Field(..., description="调度配置")
|
|
30
|
+
task_args: Optional[list] = Field(default=[], description="任务参数")
|
|
31
|
+
task_kwargs: Optional[Dict[str, Any]] = Field(default={}, description="任务关键字参数")
|
|
32
|
+
queue_name: Optional[str] = Field(None, description="队列名称")
|
|
33
|
+
priority: int = Field(default=0, description="优先级")
|
|
34
|
+
enabled: bool = Field(default=True, description="是否启用")
|
|
35
|
+
description: Optional[str] = Field(None, description="任务描述")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ScheduledTaskCreate(BaseModel):
|
|
39
|
+
"""创建定时任务请求模型"""
|
|
40
|
+
name: str = Field(..., description="任务名称")
|
|
41
|
+
task_function: str = Field(..., description="任务函数")
|
|
42
|
+
schedule_type: str = Field(..., description="调度类型", pattern="^(cron|interval)$")
|
|
43
|
+
cron_expression: Optional[str] = Field(None, description="Cron表达式")
|
|
44
|
+
interval_seconds: Optional[int] = Field(None, ge=1, description="间隔秒数")
|
|
45
|
+
task_args: Optional[list] = Field(default=[], description="任务参数")
|
|
46
|
+
task_kwargs: Optional[Dict[str, Any]] = Field(default={}, description="任务关键字参数")
|
|
47
|
+
enabled: bool = Field(default=True, description="是否启用")
|
|
48
|
+
description: Optional[str] = Field(None, description="任务描述")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ScheduledTaskUpdate(BaseModel):
|
|
52
|
+
"""更新定时任务请求模型"""
|
|
53
|
+
name: Optional[str] = Field(None, description="任务名称")
|
|
54
|
+
task_function: Optional[str] = Field(None, description="任务函数")
|
|
55
|
+
schedule_type: Optional[str] = Field(None, description="调度类型")
|
|
56
|
+
cron_expression: Optional[str] = Field(None, description="Cron表达式")
|
|
57
|
+
interval_seconds: Optional[int] = Field(None, ge=1, description="间隔秒数")
|
|
58
|
+
task_args: Optional[list] = Field(None, description="任务参数")
|
|
59
|
+
task_kwargs: Optional[Dict[str, Any]] = Field(None, description="任务关键字参数")
|
|
60
|
+
enabled: Optional[bool] = Field(None, description="是否启用")
|
|
61
|
+
description: Optional[str] = Field(None, description="任务描述")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ScheduledTaskCreateRequest(BaseModel):
|
|
65
|
+
"""定时任务创建请求模型(详细版)"""
|
|
66
|
+
task_name: str = Field(..., min_length=1, max_length=255, description="任务名称")
|
|
67
|
+
task_function: str = Field(..., min_length=1, description="任务函数路径")
|
|
68
|
+
schedule_type: str = Field(..., description="调度类型", pattern="^(cron|interval|once)$")
|
|
69
|
+
cron_expression: Optional[str] = Field(None, description="Cron表达式")
|
|
70
|
+
interval_seconds: Optional[int] = Field(None, ge=1, le=86400*365, description="间隔秒数")
|
|
71
|
+
start_time: Optional[datetime] = Field(None, description="开始时间")
|
|
72
|
+
end_time: Optional[datetime] = Field(None, description="结束时间")
|
|
73
|
+
task_args: list = Field(default=[], description="任务参数")
|
|
74
|
+
task_kwargs: Dict[str, Any] = Field(default={}, description="任务关键字参数")
|
|
75
|
+
queue_name: Optional[str] = Field(None, description="目标队列")
|
|
76
|
+
priority: int = Field(default=0, ge=0, le=100, description="优先级")
|
|
77
|
+
max_retries: int = Field(default=3, ge=0, le=10, description="最大重试次数")
|
|
78
|
+
timeout: Optional[int] = Field(None, ge=1, description="超时时间(秒)")
|
|
79
|
+
enabled: bool = Field(default=True, description="是否启用")
|
|
80
|
+
description: Optional[str] = Field(None, max_length=1000, description="任务描述")
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class ScheduledTaskResponse(BaseModel):
|
|
84
|
+
"""定时任务响应模型"""
|
|
85
|
+
id: str = Field(..., description="任务ID")
|
|
86
|
+
task_name: str = Field(..., description="任务名称")
|
|
87
|
+
task_function: str = Field(..., description="任务函数")
|
|
88
|
+
schedule_type: str = Field(..., description="调度类型")
|
|
89
|
+
next_run_time: Optional[datetime] = Field(None, description="下次运行时间")
|
|
90
|
+
last_run_time: Optional[datetime] = Field(None, description="上次运行时间")
|
|
91
|
+
status: str = Field(..., description="任务状态")
|
|
92
|
+
enabled: bool = Field(..., description="是否启用")
|
|
93
|
+
|
|
94
|
+
class Config:
|
|
95
|
+
json_encoders = {
|
|
96
|
+
datetime: lambda v: v.isoformat() if v else None
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class ScheduledTaskInfo(BaseModel):
|
|
101
|
+
"""定时任务详细信息模型"""
|
|
102
|
+
id: str = Field(..., description="任务ID")
|
|
103
|
+
task_name: str = Field(..., description="任务名称")
|
|
104
|
+
task_function: str = Field(..., description="任务函数")
|
|
105
|
+
schedule_type: str = Field(..., description="调度类型")
|
|
106
|
+
cron_expression: Optional[str] = Field(None, description="Cron表达式")
|
|
107
|
+
interval_seconds: Optional[int] = Field(None, description="间隔秒数")
|
|
108
|
+
task_args: list = Field(default=[], description="任务参数")
|
|
109
|
+
task_kwargs: Dict[str, Any] = Field(default={}, description="任务关键字参数")
|
|
110
|
+
queue_name: Optional[str] = Field(None, description="队列名称")
|
|
111
|
+
priority: int = Field(default=0, description="优先级")
|
|
112
|
+
max_retries: int = Field(default=3, description="最大重试次数")
|
|
113
|
+
timeout: Optional[int] = Field(None, description="超时时间")
|
|
114
|
+
enabled: bool = Field(default=True, description="是否启用")
|
|
115
|
+
status: str = Field(..., description="任务状态")
|
|
116
|
+
created_at: datetime = Field(..., description="创建时间")
|
|
117
|
+
updated_at: Optional[datetime] = Field(None, description="更新时间")
|
|
118
|
+
next_run_time: Optional[datetime] = Field(None, description="下次运行时间")
|
|
119
|
+
last_run_time: Optional[datetime] = Field(None, description="上次运行时间")
|
|
120
|
+
run_count: int = Field(default=0, description="运行次数")
|
|
121
|
+
success_count: int = Field(default=0, description="成功次数")
|
|
122
|
+
failure_count: int = Field(default=0, description="失败次数")
|
|
123
|
+
description: Optional[str] = Field(None, description="任务描述")
|
|
124
|
+
|
|
125
|
+
class Config:
|
|
126
|
+
json_encoders = {
|
|
127
|
+
datetime: lambda v: v.isoformat() if v else None
|
|
128
|
+
}
|
jettask/schemas/task.py
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""
|
|
2
|
+
任务相关的数据模型
|
|
3
|
+
"""
|
|
4
|
+
from typing import Optional, List, Dict, Any
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TasksRequest(BaseModel):
|
|
10
|
+
"""任务查询请求模型"""
|
|
11
|
+
queue_name: str = Field(..., description="队列名称")
|
|
12
|
+
page: int = Field(default=1, ge=1, description="页码")
|
|
13
|
+
page_size: int = Field(default=20, ge=1, le=100, description="每页大小")
|
|
14
|
+
filters: Optional[List[Dict]] = Field(default=[], description="筛选条件")
|
|
15
|
+
time_range: Optional[str] = Field(None, description="时间范围,如 '15m', '1h', '7d'")
|
|
16
|
+
start_time: Optional[str] = Field(None, description="开始时间")
|
|
17
|
+
end_time: Optional[str] = Field(None, description="结束时间")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TaskInfo(BaseModel):
|
|
21
|
+
"""任务信息模型"""
|
|
22
|
+
id: str = Field(..., description="任务ID")
|
|
23
|
+
queue_name: str = Field(..., description="队列名称")
|
|
24
|
+
status: str = Field(..., description="任务状态")
|
|
25
|
+
created_at: datetime = Field(..., description="创建时间")
|
|
26
|
+
started_at: Optional[datetime] = Field(None, description="开始时间")
|
|
27
|
+
completed_at: Optional[datetime] = Field(None, description="完成时间")
|
|
28
|
+
worker_id: Optional[str] = Field(None, description="工作节点ID")
|
|
29
|
+
task_name: Optional[str] = Field(None, description="任务名称")
|
|
30
|
+
task_data: Optional[Dict[str, Any]] = Field(None, description="任务数据")
|
|
31
|
+
result: Optional[Any] = Field(None, description="任务结果")
|
|
32
|
+
error: Optional[str] = Field(None, description="错误信息")
|
|
33
|
+
retry_count: int = Field(default=0, description="重试次数")
|
|
34
|
+
execution_time: Optional[float] = Field(None, description="执行时间(秒)")
|
|
35
|
+
priority: Optional[int] = Field(None, description="优先级")
|
|
36
|
+
consumer_group: Optional[str] = Field(None, description="消费者组")
|
|
37
|
+
|
|
38
|
+
class Config:
|
|
39
|
+
json_encoders = {
|
|
40
|
+
datetime: lambda v: v.isoformat() if v else None
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class TaskDetailResponse(BaseModel):
|
|
45
|
+
"""任务详细信息响应模型"""
|
|
46
|
+
success: bool = Field(default=True, description="请求是否成功")
|
|
47
|
+
data: Optional[TaskInfo] = Field(None, description="任务详细信息")
|
|
48
|
+
error: Optional[str] = Field(None, description="错误信息")
|
|
49
|
+
|
|
50
|
+
class Config:
|
|
51
|
+
json_encoders = {
|
|
52
|
+
datetime: lambda v: v.isoformat() if v else None
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class TaskActionRequest(BaseModel):
|
|
57
|
+
"""任务操作请求模型"""
|
|
58
|
+
task_ids: List[str] = Field(..., min_items=1, description="任务ID列表")
|
|
59
|
+
action: str = Field(..., description="操作类型", pattern="^(retry|cancel|delete)$")
|
|
60
|
+
reason: Optional[str] = Field(None, description="操作原因")
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class TaskListResponse(BaseModel):
|
|
64
|
+
"""任务列表响应模型"""
|
|
65
|
+
success: bool = Field(default=True, description="请求是否成功")
|
|
66
|
+
data: List[TaskInfo] = Field(default=[], description="任务列表")
|
|
67
|
+
total: int = Field(default=0, description="总记录数")
|
|
68
|
+
page: int = Field(default=1, description="当前页码")
|
|
69
|
+
page_size: int = Field(default=20, description="每页大小")
|
|
70
|
+
error: Optional[str] = Field(None, description="错误信息")
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""
|
|
2
|
+
业务逻辑服务层
|
|
3
|
+
包含所有业务逻辑处理
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from .overview_service import OverviewService
|
|
7
|
+
from .queue_service import QueueService
|
|
8
|
+
from .scheduled_task_service import ScheduledTaskService
|
|
9
|
+
from .alert_service import AlertService
|
|
10
|
+
from .analytics_service import AnalyticsService
|
|
11
|
+
from .settings_service import SettingsService
|
|
12
|
+
from .task_service import TaskService
|
|
13
|
+
from .redis_monitor_service import RedisMonitorService
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
'OverviewService',
|
|
17
|
+
'QueueService',
|
|
18
|
+
'ScheduledTaskService',
|
|
19
|
+
'AlertService',
|
|
20
|
+
'AnalyticsService',
|
|
21
|
+
'SettingsService',
|
|
22
|
+
'TaskService',
|
|
23
|
+
'RedisMonitorService'
|
|
24
|
+
]
|