jettask 0.2.18__py3-none-any.whl → 0.2.20__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.
Files changed (165) hide show
  1. jettask/__init__.py +60 -2
  2. jettask/cli.py +314 -228
  3. jettask/config/__init__.py +9 -1
  4. jettask/config/config.py +245 -0
  5. jettask/config/env_loader.py +381 -0
  6. jettask/config/lua_scripts.py +158 -0
  7. jettask/config/nacos_config.py +132 -5
  8. jettask/core/__init__.py +1 -1
  9. jettask/core/app.py +1573 -666
  10. jettask/core/app_importer.py +33 -16
  11. jettask/core/container.py +532 -0
  12. jettask/core/task.py +1 -4
  13. jettask/core/unified_manager_base.py +2 -2
  14. jettask/executor/__init__.py +38 -0
  15. jettask/executor/core.py +625 -0
  16. jettask/executor/executor.py +338 -0
  17. jettask/executor/orchestrator.py +290 -0
  18. jettask/executor/process_entry.py +638 -0
  19. jettask/executor/task_executor.py +317 -0
  20. jettask/messaging/__init__.py +68 -0
  21. jettask/messaging/event_pool.py +2188 -0
  22. jettask/messaging/reader.py +519 -0
  23. jettask/messaging/registry.py +266 -0
  24. jettask/messaging/scanner.py +369 -0
  25. jettask/messaging/sender.py +312 -0
  26. jettask/persistence/__init__.py +118 -0
  27. jettask/persistence/backlog_monitor.py +567 -0
  28. jettask/{backend/data_access.py → persistence/base.py} +58 -57
  29. jettask/persistence/consumer.py +315 -0
  30. jettask/{core → persistence}/db_manager.py +23 -22
  31. jettask/persistence/maintenance.py +81 -0
  32. jettask/persistence/message_consumer.py +259 -0
  33. jettask/{backend/namespace_data_access.py → persistence/namespace.py} +66 -98
  34. jettask/persistence/offline_recovery.py +196 -0
  35. jettask/persistence/queue_discovery.py +215 -0
  36. jettask/persistence/task_persistence.py +218 -0
  37. jettask/persistence/task_updater.py +583 -0
  38. jettask/scheduler/__init__.py +2 -2
  39. jettask/scheduler/loader.py +6 -5
  40. jettask/scheduler/run_scheduler.py +1 -1
  41. jettask/scheduler/scheduler.py +7 -7
  42. jettask/scheduler/{unified_scheduler_manager.py → scheduler_coordinator.py} +18 -13
  43. jettask/task/__init__.py +16 -0
  44. jettask/{router.py → task/router.py} +26 -8
  45. jettask/task/task_center/__init__.py +9 -0
  46. jettask/task/task_executor.py +318 -0
  47. jettask/task/task_registry.py +291 -0
  48. jettask/test_connection_monitor.py +73 -0
  49. jettask/utils/__init__.py +31 -1
  50. jettask/{monitor/run_backlog_collector.py → utils/backlog_collector.py} +1 -1
  51. jettask/utils/db_connector.py +1629 -0
  52. jettask/{db_init.py → utils/db_init.py} +1 -1
  53. jettask/utils/rate_limit/__init__.py +30 -0
  54. jettask/utils/rate_limit/concurrency_limiter.py +665 -0
  55. jettask/utils/rate_limit/config.py +145 -0
  56. jettask/utils/rate_limit/limiter.py +41 -0
  57. jettask/utils/rate_limit/manager.py +269 -0
  58. jettask/utils/rate_limit/qps_limiter.py +154 -0
  59. jettask/utils/rate_limit/task_limiter.py +384 -0
  60. jettask/utils/serializer.py +3 -0
  61. jettask/{monitor/stream_backlog_monitor.py → utils/stream_backlog.py} +14 -6
  62. jettask/utils/time_sync.py +173 -0
  63. jettask/webui/__init__.py +27 -0
  64. jettask/{api/v1 → webui/api}/alerts.py +1 -1
  65. jettask/{api/v1 → webui/api}/analytics.py +2 -2
  66. jettask/{api/v1 → webui/api}/namespaces.py +1 -1
  67. jettask/{api/v1 → webui/api}/overview.py +1 -1
  68. jettask/{api/v1 → webui/api}/queues.py +3 -3
  69. jettask/{api/v1 → webui/api}/scheduled.py +1 -1
  70. jettask/{api/v1 → webui/api}/settings.py +1 -1
  71. jettask/{api.py → webui/app.py} +253 -145
  72. jettask/webui/namespace_manager/__init__.py +10 -0
  73. jettask/{multi_namespace_consumer.py → webui/namespace_manager/multi.py} +69 -22
  74. jettask/{unified_consumer_manager.py → webui/namespace_manager/unified.py} +1 -1
  75. jettask/{run.py → webui/run.py} +2 -2
  76. jettask/{services → webui/services}/__init__.py +1 -3
  77. jettask/{services → webui/services}/overview_service.py +34 -16
  78. jettask/{services → webui/services}/queue_service.py +1 -1
  79. jettask/{backend → webui/services}/queue_stats_v2.py +1 -1
  80. jettask/{services → webui/services}/settings_service.py +1 -1
  81. jettask/worker/__init__.py +53 -0
  82. jettask/worker/lifecycle.py +1507 -0
  83. jettask/worker/manager.py +583 -0
  84. jettask/{core/offline_worker_recovery.py → worker/recovery.py} +268 -175
  85. {jettask-0.2.18.dist-info → jettask-0.2.20.dist-info}/METADATA +2 -71
  86. jettask-0.2.20.dist-info/RECORD +145 -0
  87. jettask/__main__.py +0 -140
  88. jettask/api/__init__.py +0 -103
  89. jettask/backend/__init__.py +0 -1
  90. jettask/backend/api/__init__.py +0 -3
  91. jettask/backend/api/v1/__init__.py +0 -17
  92. jettask/backend/api/v1/monitoring.py +0 -431
  93. jettask/backend/api/v1/namespaces.py +0 -504
  94. jettask/backend/api/v1/queues.py +0 -342
  95. jettask/backend/api/v1/tasks.py +0 -367
  96. jettask/backend/core/__init__.py +0 -3
  97. jettask/backend/core/cache.py +0 -221
  98. jettask/backend/core/database.py +0 -200
  99. jettask/backend/core/exceptions.py +0 -102
  100. jettask/backend/dependencies.py +0 -261
  101. jettask/backend/init_meta_db.py +0 -158
  102. jettask/backend/main.py +0 -1426
  103. jettask/backend/main_unified.py +0 -78
  104. jettask/backend/main_v2.py +0 -394
  105. jettask/backend/models/__init__.py +0 -3
  106. jettask/backend/models/requests.py +0 -236
  107. jettask/backend/models/responses.py +0 -230
  108. jettask/backend/namespace_api_old.py +0 -267
  109. jettask/backend/services/__init__.py +0 -3
  110. jettask/backend/start.py +0 -42
  111. jettask/backend/unified_api_router.py +0 -1541
  112. jettask/cleanup_deprecated_tables.sql +0 -16
  113. jettask/core/consumer_manager.py +0 -1695
  114. jettask/core/delay_scanner.py +0 -256
  115. jettask/core/event_pool.py +0 -1700
  116. jettask/core/heartbeat_process.py +0 -222
  117. jettask/core/task_batch.py +0 -153
  118. jettask/core/worker_scanner.py +0 -271
  119. jettask/executors/__init__.py +0 -5
  120. jettask/executors/asyncio.py +0 -876
  121. jettask/executors/base.py +0 -30
  122. jettask/executors/common.py +0 -148
  123. jettask/executors/multi_asyncio.py +0 -309
  124. jettask/gradio_app.py +0 -570
  125. jettask/integrated_gradio_app.py +0 -1088
  126. jettask/main.py +0 -0
  127. jettask/monitoring/__init__.py +0 -3
  128. jettask/pg_consumer.py +0 -1896
  129. jettask/run_monitor.py +0 -22
  130. jettask/run_webui.py +0 -148
  131. jettask/scheduler/multi_namespace_scheduler.py +0 -294
  132. jettask/scheduler/unified_manager.py +0 -450
  133. jettask/task_center_client.py +0 -150
  134. jettask/utils/serializer_optimized.py +0 -33
  135. jettask/webui_exceptions.py +0 -67
  136. jettask-0.2.18.dist-info/RECORD +0 -150
  137. /jettask/{constants.py → config/constants.py} +0 -0
  138. /jettask/{backend/config.py → config/task_center.py} +0 -0
  139. /jettask/{pg_consumer → messaging/pg_consumer}/pg_consumer_v2.py +0 -0
  140. /jettask/{pg_consumer → messaging/pg_consumer}/sql/add_execution_time_field.sql +0 -0
  141. /jettask/{pg_consumer → messaging/pg_consumer}/sql/create_new_tables.sql +0 -0
  142. /jettask/{pg_consumer → messaging/pg_consumer}/sql/create_tables_v3.sql +0 -0
  143. /jettask/{pg_consumer → messaging/pg_consumer}/sql/migrate_to_new_structure.sql +0 -0
  144. /jettask/{pg_consumer → messaging/pg_consumer}/sql/modify_time_fields.sql +0 -0
  145. /jettask/{pg_consumer → messaging/pg_consumer}/sql_utils.py +0 -0
  146. /jettask/{models.py → persistence/models.py} +0 -0
  147. /jettask/scheduler/{manager.py → task_crud.py} +0 -0
  148. /jettask/{schema.sql → schemas/schema.sql} +0 -0
  149. /jettask/{task_center.py → task/task_center/client.py} +0 -0
  150. /jettask/{monitoring → utils}/file_watcher.py +0 -0
  151. /jettask/{services/redis_monitor_service.py → utils/redis_monitor.py} +0 -0
  152. /jettask/{api/v1 → webui/api}/__init__.py +0 -0
  153. /jettask/{webui_config.py → webui/config.py} +0 -0
  154. /jettask/{webui_models → webui/models}/__init__.py +0 -0
  155. /jettask/{webui_models → webui/models}/namespace.py +0 -0
  156. /jettask/{services → webui/services}/alert_service.py +0 -0
  157. /jettask/{services → webui/services}/analytics_service.py +0 -0
  158. /jettask/{services → webui/services}/scheduled_task_service.py +0 -0
  159. /jettask/{services → webui/services}/task_service.py +0 -0
  160. /jettask/{webui_sql → webui/sql}/batch_upsert_functions.sql +0 -0
  161. /jettask/{webui_sql → webui/sql}/verify_database.sql +0 -0
  162. {jettask-0.2.18.dist-info → jettask-0.2.20.dist-info}/WHEEL +0 -0
  163. {jettask-0.2.18.dist-info → jettask-0.2.20.dist-info}/entry_points.txt +0 -0
  164. {jettask-0.2.18.dist-info → jettask-0.2.20.dist-info}/licenses/LICENSE +0 -0
  165. {jettask-0.2.18.dist-info → jettask-0.2.20.dist-info}/top_level.txt +0 -0
@@ -1,236 +0,0 @@
1
- """
2
- Request models for JetTask WebUI Backend
3
- """
4
- from typing import List, Dict, Any, Optional, Union
5
- from datetime import datetime
6
- from pydantic import BaseModel, Field, validator
7
- from enum import Enum
8
-
9
-
10
- class TimeRange(str, Enum):
11
- """时间范围枚举"""
12
- FIFTEEN_MINUTES = "15m"
13
- THIRTY_MINUTES = "30m"
14
- ONE_HOUR = "1h"
15
- THREE_HOURS = "3h"
16
- SIX_HOURS = "6h"
17
- TWELVE_HOURS = "12h"
18
- ONE_DAY = "24h"
19
- THREE_DAYS = "3d"
20
- ONE_WEEK = "7d"
21
- ONE_MONTH = "30d"
22
-
23
-
24
- class SortOrder(str, Enum):
25
- """排序方向"""
26
- ASC = "asc"
27
- DESC = "desc"
28
-
29
-
30
- class FilterOperator(str, Enum):
31
- """筛选操作符"""
32
- EQ = "eq" # 等于
33
- NE = "ne" # 不等于
34
- GT = "gt" # 大于
35
- GTE = "gte" # 大于等于
36
- LT = "lt" # 小于
37
- LTE = "lte" # 小于等于
38
- IN = "in" # 包含
39
- NOT_IN = "not_in" # 不包含
40
- LIKE = "like" # 模糊匹配
41
- REGEX = "regex" # 正则表达式
42
- IS_NULL = "is_null" # 为空
43
- IS_NOT_NULL = "is_not_null" # 不为空
44
-
45
-
46
- class FilterCondition(BaseModel):
47
- """筛选条件"""
48
- field: str = Field(description="字段名")
49
- operator: FilterOperator = Field(description="操作符")
50
- value: Optional[Any] = Field(default=None, description="筛选值")
51
-
52
- @validator('value')
53
- def validate_value(cls, v, values):
54
- operator = values.get('operator')
55
- if operator in [FilterOperator.IS_NULL, FilterOperator.IS_NOT_NULL]:
56
- return None
57
- if operator in [FilterOperator.IN, FilterOperator.NOT_IN] and not isinstance(v, list):
58
- raise ValueError(f"Operator {operator} requires a list value")
59
- return v
60
-
61
-
62
- class BaseListRequest(BaseModel):
63
- """基础列表查询请求"""
64
- page: int = Field(default=1, ge=1, description="页码")
65
- page_size: int = Field(default=20, ge=1, le=100, description="每页大小")
66
- sort_field: Optional[str] = Field(default=None, description="排序字段")
67
- sort_order: SortOrder = Field(default=SortOrder.DESC, description="排序方向")
68
- filters: List[FilterCondition] = Field(default_factory=list, description="筛选条件")
69
- search: Optional[str] = Field(default=None, description="搜索关键词")
70
-
71
-
72
- class TimeRangeRequest(BaseModel):
73
- """时间范围查询请求"""
74
- start_time: Optional[datetime] = Field(default=None, description="开始时间")
75
- end_time: Optional[datetime] = Field(default=None, description="结束时间")
76
- time_range: Optional[TimeRange] = Field(default=None, description="预设时间范围")
77
- granularity: Optional[str] = Field(default=None, description="数据粒度")
78
-
79
- @validator('end_time')
80
- def validate_time_range(cls, v, values):
81
- start_time = values.get('start_time')
82
- if start_time and v and start_time >= v:
83
- raise ValueError("end_time must be after start_time")
84
- return v
85
-
86
-
87
- # 队列相关请求模型
88
- class QueueListRequest(BaseListRequest):
89
- """队列列表查询请求"""
90
- namespace: str = Field(default="default", description="命名空间")
91
- status: Optional[str] = Field(default=None, description="队列状态筛选")
92
- include_stats: bool = Field(default=True, description="是否包含统计信息")
93
-
94
-
95
- class QueueMetricsRequest(TimeRangeRequest):
96
- """队列指标查询请求"""
97
- namespace: str = Field(default="default", description="命名空间")
98
- queue_name: str = Field(description="队列名称")
99
- metrics: List[str] = Field(default_factory=lambda: ["pending", "processing", "completed"], description="指标类型")
100
- include_consumer_groups: bool = Field(default=False, description="是否包含消费者组数据")
101
-
102
-
103
- class QueueActionRequest(BaseModel):
104
- """队列操作请求"""
105
- action: str = Field(description="操作类型")
106
- parameters: Dict[str, Any] = Field(default_factory=dict, description="操作参数")
107
-
108
-
109
- # 任务相关请求模型
110
- class TaskListRequest(BaseListRequest, TimeRangeRequest):
111
- """任务列表查询请求"""
112
- namespace: str = Field(default="default", description="命名空间")
113
- queue_name: Optional[str] = Field(default=None, description="队列名称")
114
- status: Optional[str] = Field(default=None, description="任务状态")
115
- consumer_group: Optional[str] = Field(default=None, description="消费者组")
116
- worker_id: Optional[str] = Field(default=None, description="工作者ID")
117
- task_name: Optional[str] = Field(default=None, description="任务名称")
118
-
119
-
120
- class TaskActionRequest(BaseModel):
121
- """任务操作请求"""
122
- task_ids: List[str] = Field(description="任务ID列表")
123
- action: str = Field(description="操作类型")
124
- parameters: Dict[str, Any] = Field(default_factory=dict, description="操作参数")
125
-
126
-
127
- # 监控相关请求模型
128
- class MonitoringRequest(TimeRangeRequest):
129
- """监控数据请求"""
130
- namespace: str = Field(default="default", description="命名空间")
131
- queues: Optional[List[str]] = Field(default=None, description="队列列表")
132
- metrics: List[str] = Field(default_factory=list, description="指标类型")
133
- include_groups: bool = Field(default=False, description="是否包含消费者组")
134
-
135
-
136
- class BacklogTrendRequest(TimeRangeRequest):
137
- """队列积压趋势请求"""
138
- namespace: str = Field(default="default", description="命名空间")
139
- queues: Optional[List[str]] = Field(default=None, description="队列列表")
140
- include_groups: bool = Field(default=False, description="是否包含消费者组级别数据")
141
-
142
-
143
- # 分析相关请求模型
144
- class AnalyticsRequest(TimeRangeRequest):
145
- """分析查询请求"""
146
- namespace: str = Field(default="default", description="命名空间")
147
- analysis_type: str = Field(description="分析类型")
148
- dimensions: List[str] = Field(default_factory=list, description="分析维度")
149
- metrics: List[str] = Field(default_factory=list, description="分析指标")
150
- filters: List[FilterCondition] = Field(default_factory=list, description="筛选条件")
151
-
152
-
153
- # 定时任务相关请求模型
154
- class ScheduleConfig(BaseModel):
155
- """调度配置"""
156
- cron_expression: Optional[str] = Field(default=None, description="Cron表达式")
157
- interval_seconds: Optional[int] = Field(default=None, description="间隔秒数")
158
- interval_minutes: Optional[int] = Field(default=None, description="间隔分钟数")
159
- interval_hours: Optional[int] = Field(default=None, description="间隔小时数")
160
- start_date: Optional[datetime] = Field(default=None, description="开始时间")
161
- end_date: Optional[datetime] = Field(default=None, description="结束时间")
162
- max_runs: Optional[int] = Field(default=None, description="最大运行次数")
163
-
164
- @validator('interval_seconds')
165
- def validate_interval_seconds(cls, v):
166
- if v is not None and v < 1:
167
- raise ValueError("interval_seconds must be at least 1")
168
- return v
169
-
170
-
171
- class ScheduledTaskCreateRequest(BaseModel):
172
- """创建定时任务请求"""
173
- name: str = Field(description="任务名称")
174
- namespace: str = Field(default="default", description="命名空间")
175
- queue_name: str = Field(description="队列名称")
176
- task_name: str = Field(description="任务函数名")
177
- task_data: Dict[str, Any] = Field(default_factory=dict, description="任务数据")
178
- schedule_type: str = Field(description="调度类型")
179
- schedule_config: ScheduleConfig = Field(description="调度配置")
180
- is_active: bool = Field(default=True, description="是否启用")
181
- description: Optional[str] = Field(default=None, description="任务描述")
182
- max_retry: int = Field(default=3, ge=0, description="最大重试次数")
183
- timeout: Optional[int] = Field(default=None, ge=1, description="超时时间(秒)")
184
-
185
-
186
- class ScheduledTaskUpdateRequest(ScheduledTaskCreateRequest):
187
- """更新定时任务请求"""
188
- pass
189
-
190
-
191
- class ScheduledTaskListRequest(BaseListRequest):
192
- """定时任务列表查询请求"""
193
- namespace: str = Field(default="default", description="命名空间")
194
- is_active: Optional[bool] = Field(default=None, description="是否启用")
195
- schedule_type: Optional[str] = Field(default=None, description="调度类型")
196
-
197
-
198
- # 命名空间相关请求模型
199
- class NamespaceCreateRequest(BaseModel):
200
- """创建命名空间请求"""
201
- name: str = Field(description="命名空间名称", pattern="^[a-zA-Z0-9_-]+$")
202
- display_name: str = Field(description="显示名称")
203
- description: Optional[str] = Field(default=None, description="描述")
204
- redis_url: str = Field(description="Redis连接URL")
205
- pg_url: Optional[str] = Field(default=None, description="PostgreSQL连接URL")
206
- redis_prefix: str = Field(default="jettask", description="Redis键前缀")
207
-
208
-
209
- class NamespaceUpdateRequest(BaseModel):
210
- """更新命名空间请求"""
211
- display_name: Optional[str] = Field(default=None, description="显示名称")
212
- description: Optional[str] = Field(default=None, description="描述")
213
- redis_url: Optional[str] = Field(default=None, description="Redis连接URL")
214
- pg_url: Optional[str] = Field(default=None, description="PostgreSQL连接URL")
215
- is_active: Optional[bool] = Field(default=None, description="是否启用")
216
-
217
-
218
- class NamespaceListRequest(BaseListRequest):
219
- """命名空间列表查询请求"""
220
- is_active: Optional[bool] = Field(default=None, description="是否启用")
221
-
222
-
223
- # 系统管理相关请求模型
224
- class SystemConfigUpdateRequest(BaseModel):
225
- """系统配置更新请求"""
226
- config_key: str = Field(description="配置键")
227
- config_value: Any = Field(description="配置值")
228
- description: Optional[str] = Field(default=None, description="配置描述")
229
-
230
-
231
- class BatchOperationRequest(BaseModel):
232
- """批量操作请求"""
233
- operation: str = Field(description="操作类型")
234
- target_type: str = Field(description="目标类型")
235
- target_ids: List[str] = Field(description="目标ID列表")
236
- parameters: Dict[str, Any] = Field(default_factory=dict, description="操作参数")
@@ -1,230 +0,0 @@
1
- """
2
- Response models for JetTask WebUI Backend
3
- """
4
- from typing import List, Dict, Any, Optional, Generic, TypeVar
5
- from datetime import datetime
6
- from pydantic import BaseModel, Field
7
-
8
- T = TypeVar('T')
9
-
10
-
11
- class BaseResponse(BaseModel, Generic[T]):
12
- """基础响应模型"""
13
- success: bool = Field(default=True, description="请求是否成功")
14
- message: Optional[str] = Field(default=None, description="响应消息")
15
- data: Optional[T] = Field(default=None, description="响应数据")
16
- timestamp: datetime = Field(default_factory=datetime.now, description="响应时间戳")
17
-
18
-
19
- class PaginatedResponse(BaseResponse[List[T]]):
20
- """分页响应模型"""
21
- total: int = Field(description="总记录数")
22
- page: int = Field(description="当前页码")
23
- page_size: int = Field(description="每页大小")
24
- total_pages: int = Field(description="总页数")
25
-
26
- @classmethod
27
- def create(
28
- cls,
29
- data: List[T],
30
- total: int,
31
- page: int,
32
- page_size: int,
33
- message: Optional[str] = None
34
- ):
35
- """创建分页响应"""
36
- total_pages = (total + page_size - 1) // page_size
37
- return cls(
38
- data=data,
39
- total=total,
40
- page=page,
41
- page_size=page_size,
42
- total_pages=total_pages,
43
- message=message
44
- )
45
-
46
-
47
- class ErrorResponse(BaseModel):
48
- """错误响应模型"""
49
- success: bool = Field(default=False)
50
- error_code: str = Field(description="错误码")
51
- message: str = Field(description="错误信息")
52
- details: Optional[Dict[str, Any]] = Field(default=None, description="错误详情")
53
- timestamp: datetime = Field(default_factory=datetime.now)
54
-
55
-
56
- # 队列相关响应模型
57
- class QueueInfo(BaseModel):
58
- """队列基本信息"""
59
- name: str = Field(description="队列名称")
60
- namespace: str = Field(description="命名空间")
61
- priority: Optional[int] = Field(default=None, description="优先级")
62
- pending_count: int = Field(default=0, description="待处理任务数")
63
- running_count: int = Field(default=0, description="运行中任务数")
64
- completed_count: int = Field(default=0, description="已完成任务数")
65
- failed_count: int = Field(default=0, description="失败任务数")
66
- last_activity: Optional[datetime] = Field(default=None, description="最后活动时间")
67
-
68
-
69
- class QueueStats(BaseModel):
70
- """队列统计信息"""
71
- queue_info: QueueInfo
72
- consumer_groups: List[Dict[str, Any]] = Field(default_factory=list, description="消费者组信息")
73
- metrics: Dict[str, Any] = Field(default_factory=dict, description="性能指标")
74
- trends: Dict[str, Any] = Field(default_factory=dict, description="趋势数据")
75
-
76
-
77
- class QueueListResponse(BaseResponse[List[QueueInfo]]):
78
- """队列列表响应"""
79
- pass
80
-
81
-
82
- class QueueDetailResponse(BaseResponse[QueueStats]):
83
- """队列详情响应"""
84
- pass
85
-
86
-
87
- # 任务相关响应模型
88
- class TaskInfo(BaseModel):
89
- """任务基本信息"""
90
- id: str = Field(description="任务ID")
91
- stream_id: Optional[str] = Field(default=None, description="流ID")
92
- queue: str = Field(description="队列名称")
93
- task_name: Optional[str] = Field(default=None, description="任务名称")
94
- status: str = Field(description="任务状态")
95
- created_at: datetime = Field(description="创建时间")
96
- started_at: Optional[datetime] = Field(default=None, description="开始时间")
97
- completed_at: Optional[datetime] = Field(default=None, description="完成时间")
98
- duration: Optional[float] = Field(default=None, description="执行时长(秒)")
99
- worker_id: Optional[str] = Field(default=None, description="工作者ID")
100
- consumer_group: Optional[str] = Field(default=None, description="消费者组")
101
- priority: Optional[int] = Field(default=None, description="优先级")
102
-
103
-
104
- class TaskDetail(TaskInfo):
105
- """任务详细信息"""
106
- task_data: Optional[Dict[str, Any]] = Field(default=None, description="任务数据")
107
- result: Optional[Dict[str, Any]] = Field(default=None, description="执行结果")
108
- error_info: Optional[Dict[str, Any]] = Field(default=None, description="错误信息")
109
- retry_count: int = Field(default=0, description="重试次数")
110
- metadata: Optional[Dict[str, Any]] = Field(default=None, description="元数据")
111
-
112
-
113
- class TaskListResponse(PaginatedResponse[TaskInfo]):
114
- """任务列表响应"""
115
- pass
116
-
117
-
118
- class TaskDetailResponse(BaseResponse[TaskDetail]):
119
- """任务详情响应"""
120
- pass
121
-
122
-
123
- # 监控相关响应模型
124
- class MetricPoint(BaseModel):
125
- """指标数据点"""
126
- timestamp: datetime = Field(description="时间戳")
127
- value: float = Field(description="指标值")
128
- metadata: Optional[Dict[str, Any]] = Field(default=None, description="元数据")
129
-
130
-
131
- class TimeSeries(BaseModel):
132
- """时间序列数据"""
133
- name: str = Field(description="序列名称")
134
- data_points: List[MetricPoint] = Field(description="数据点")
135
- unit: Optional[str] = Field(default=None, description="单位")
136
-
137
-
138
- class MonitoringMetrics(BaseModel):
139
- """监控指标"""
140
- series: List[TimeSeries] = Field(description="时间序列数据")
141
- granularity: str = Field(description="数据粒度")
142
- time_range: Dict[str, datetime] = Field(description="时间范围")
143
-
144
-
145
- class MonitoringResponse(BaseResponse[MonitoringMetrics]):
146
- """监控数据响应"""
147
- pass
148
-
149
-
150
- # 分析相关响应模型
151
- class AnalyticsData(BaseModel):
152
- """分析数据"""
153
- chart_data: List[Dict[str, Any]] = Field(description="图表数据")
154
- summary: Dict[str, Any] = Field(description="汇总信息")
155
- insights: List[str] = Field(default_factory=list, description="分析洞察")
156
-
157
-
158
- class AnalyticsResponse(BaseResponse[AnalyticsData]):
159
- """分析响应"""
160
- pass
161
-
162
-
163
- # 定时任务相关响应模型
164
- class ScheduledTaskInfo(BaseModel):
165
- """定时任务信息"""
166
- id: str = Field(description="任务ID")
167
- name: str = Field(description="任务名称")
168
- namespace: str = Field(description="命名空间")
169
- queue_name: str = Field(description="队列名称")
170
- task_name: str = Field(description="任务函数名")
171
- schedule_type: str = Field(description="调度类型")
172
- schedule_config: Dict[str, Any] = Field(description="调度配置")
173
- is_active: bool = Field(description="是否启用")
174
- created_at: datetime = Field(description="创建时间")
175
- updated_at: Optional[datetime] = Field(default=None, description="更新时间")
176
- last_run_at: Optional[datetime] = Field(default=None, description="最后运行时间")
177
- next_run_at: Optional[datetime] = Field(default=None, description="下次运行时间")
178
- run_count: int = Field(default=0, description="运行次数")
179
- success_count: int = Field(default=0, description="成功次数")
180
- failure_count: int = Field(default=0, description="失败次数")
181
-
182
-
183
- class ScheduledTaskListResponse(PaginatedResponse[ScheduledTaskInfo]):
184
- """定时任务列表响应"""
185
- pass
186
-
187
-
188
- class ScheduledTaskResponse(BaseResponse[ScheduledTaskInfo]):
189
- """定时任务响应"""
190
- pass
191
-
192
-
193
- # 命名空间相关响应模型
194
- class NamespaceInfo(BaseModel):
195
- """命名空间信息"""
196
- id: str = Field(description="命名空间ID")
197
- name: str = Field(description="命名空间名称")
198
- display_name: str = Field(description="显示名称")
199
- description: Optional[str] = Field(default=None, description="描述")
200
- redis_url: str = Field(description="Redis连接URL")
201
- pg_url: Optional[str] = Field(default=None, description="PostgreSQL连接URL")
202
- created_at: datetime = Field(description="创建时间")
203
- is_active: bool = Field(default=True, description="是否启用")
204
- queue_count: int = Field(default=0, description="队列数量")
205
- task_count: int = Field(default=0, description="任务数量")
206
-
207
-
208
- class NamespaceListResponse(BaseResponse[List[NamespaceInfo]]):
209
- """命名空间列表响应"""
210
- pass
211
-
212
-
213
- class NamespaceResponse(BaseResponse[NamespaceInfo]):
214
- """命名空间响应"""
215
- pass
216
-
217
-
218
- # 系统状态响应模型
219
- class SystemHealth(BaseModel):
220
- """系统健康状态"""
221
- status: str = Field(description="系统状态")
222
- version: str = Field(description="系统版本")
223
- uptime: float = Field(description="运行时间(秒)")
224
- components: Dict[str, str] = Field(description="组件状态")
225
- metrics: Dict[str, Any] = Field(description="系统指标")
226
-
227
-
228
- class HealthResponse(BaseResponse[SystemHealth]):
229
- """健康检查响应"""
230
- pass