jettask 0.2.1__py3-none-any.whl → 0.2.4__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/constants.py +213 -0
- jettask/core/app.py +525 -205
- jettask/core/cli.py +193 -185
- jettask/core/consumer_manager.py +126 -34
- jettask/core/context.py +3 -0
- jettask/core/enums.py +137 -0
- jettask/core/event_pool.py +501 -168
- jettask/core/message.py +147 -0
- jettask/core/offline_worker_recovery.py +181 -114
- jettask/core/task.py +10 -174
- jettask/core/task_batch.py +153 -0
- jettask/core/unified_manager_base.py +243 -0
- jettask/core/worker_scanner.py +54 -54
- jettask/executors/asyncio.py +184 -64
- jettask/webui/backend/config.py +51 -0
- jettask/webui/backend/data_access.py +2083 -92
- jettask/webui/backend/data_api.py +3294 -0
- jettask/webui/backend/dependencies.py +261 -0
- jettask/webui/backend/init_meta_db.py +158 -0
- jettask/webui/backend/main.py +1358 -69
- jettask/webui/backend/main_unified.py +78 -0
- jettask/webui/backend/main_v2.py +394 -0
- jettask/webui/backend/namespace_api.py +295 -0
- jettask/webui/backend/namespace_api_old.py +294 -0
- jettask/webui/backend/namespace_data_access.py +611 -0
- jettask/webui/backend/queue_backlog_api.py +727 -0
- jettask/webui/backend/queue_stats_v2.py +521 -0
- jettask/webui/backend/redis_monitor_api.py +476 -0
- jettask/webui/backend/unified_api_router.py +1601 -0
- jettask/webui/db_init.py +204 -32
- jettask/webui/frontend/package-lock.json +492 -1
- jettask/webui/frontend/package.json +4 -1
- jettask/webui/frontend/src/App.css +105 -7
- jettask/webui/frontend/src/App.jsx +49 -20
- jettask/webui/frontend/src/components/NamespaceSelector.jsx +166 -0
- jettask/webui/frontend/src/components/QueueBacklogChart.jsx +298 -0
- jettask/webui/frontend/src/components/QueueBacklogTrend.jsx +638 -0
- jettask/webui/frontend/src/components/QueueDetailsTable.css +65 -0
- jettask/webui/frontend/src/components/QueueDetailsTable.jsx +487 -0
- jettask/webui/frontend/src/components/QueueDetailsTableV2.jsx +465 -0
- jettask/webui/frontend/src/components/ScheduledTaskFilter.jsx +423 -0
- jettask/webui/frontend/src/components/TaskFilter.jsx +425 -0
- jettask/webui/frontend/src/components/TimeRangeSelector.css +21 -0
- jettask/webui/frontend/src/components/TimeRangeSelector.jsx +160 -0
- jettask/webui/frontend/src/components/layout/AppLayout.css +95 -0
- jettask/webui/frontend/src/components/layout/AppLayout.jsx +49 -0
- jettask/webui/frontend/src/components/layout/Header.css +34 -10
- jettask/webui/frontend/src/components/layout/Header.jsx +31 -23
- jettask/webui/frontend/src/components/layout/SideMenu.css +137 -0
- jettask/webui/frontend/src/components/layout/SideMenu.jsx +209 -0
- jettask/webui/frontend/src/components/layout/TabsNav.css +244 -0
- jettask/webui/frontend/src/components/layout/TabsNav.jsx +206 -0
- jettask/webui/frontend/src/components/layout/UserInfo.css +197 -0
- jettask/webui/frontend/src/components/layout/UserInfo.jsx +197 -0
- jettask/webui/frontend/src/contexts/NamespaceContext.jsx +72 -0
- jettask/webui/frontend/src/contexts/TabsContext.backup.jsx +245 -0
- jettask/webui/frontend/src/main.jsx +1 -0
- jettask/webui/frontend/src/pages/Alerts.jsx +684 -0
- jettask/webui/frontend/src/pages/Dashboard.jsx +1330 -0
- jettask/webui/frontend/src/pages/QueueDetail.jsx +1109 -10
- jettask/webui/frontend/src/pages/QueueMonitor.jsx +236 -115
- jettask/webui/frontend/src/pages/Queues.jsx +5 -1
- jettask/webui/frontend/src/pages/ScheduledTasks.jsx +809 -0
- jettask/webui/frontend/src/pages/Settings.jsx +800 -0
- jettask/webui/frontend/src/services/api.js +7 -5
- jettask/webui/frontend/src/utils/suppressWarnings.js +22 -0
- jettask/webui/frontend/src/utils/userPreferences.js +154 -0
- jettask/webui/multi_namespace_consumer.py +543 -0
- jettask/webui/pg_consumer.py +983 -246
- jettask/webui/static/dist/assets/index-7129cfe1.css +1 -0
- jettask/webui/static/dist/assets/index-8d1935cc.js +774 -0
- jettask/webui/static/dist/index.html +2 -2
- jettask/webui/task_center.py +216 -0
- jettask/webui/task_center_client.py +150 -0
- jettask/webui/unified_consumer_manager.py +193 -0
- {jettask-0.2.1.dist-info → jettask-0.2.4.dist-info}/METADATA +1 -1
- jettask-0.2.4.dist-info/RECORD +134 -0
- jettask/webui/pg_consumer_slow.py +0 -1099
- jettask/webui/pg_consumer_test.py +0 -678
- jettask/webui/static/dist/assets/index-823408e8.css +0 -1
- jettask/webui/static/dist/assets/index-9968b0b8.js +0 -543
- jettask/webui/test_pg_consumer_recovery.py +0 -547
- jettask/webui/test_recovery_simple.py +0 -492
- jettask/webui/test_self_recovery.py +0 -467
- jettask-0.2.1.dist-info/RECORD +0 -91
- {jettask-0.2.1.dist-info → jettask-0.2.4.dist-info}/WHEEL +0 -0
- {jettask-0.2.1.dist-info → jettask-0.2.4.dist-info}/entry_points.txt +0 -0
- {jettask-0.2.1.dist-info → jettask-0.2.4.dist-info}/licenses/LICENSE +0 -0
- {jettask-0.2.1.dist-info → jettask-0.2.4.dist-info}/top_level.txt +0 -0
@@ -9,12 +9,12 @@ const getApiBaseUrl = () => {
|
|
9
9
|
|
10
10
|
// 如果是生产环境,使用相同的域名
|
11
11
|
if (hostname !== 'localhost' && hostname !== '127.0.0.1') {
|
12
|
-
return `${protocol}//${hostname}:
|
12
|
+
return `${protocol}//${hostname}:8001/api`;
|
13
13
|
}
|
14
14
|
}
|
15
15
|
|
16
16
|
// 默认开发环境
|
17
|
-
return 'http://localhost:
|
17
|
+
return 'http://localhost:8001/api';
|
18
18
|
};
|
19
19
|
|
20
20
|
// 智能获取 WebSocket URL
|
@@ -25,12 +25,12 @@ const getWsBaseUrl = () => {
|
|
25
25
|
|
26
26
|
// 如果是生产环境,使用相同的域名
|
27
27
|
if (hostname !== 'localhost' && hostname !== '127.0.0.1') {
|
28
|
-
return `${wsProtocol}//${hostname}:
|
28
|
+
return `${wsProtocol}//${hostname}:8001/ws`;
|
29
29
|
}
|
30
30
|
}
|
31
31
|
|
32
32
|
// 默认开发环境
|
33
|
-
return 'ws://localhost:
|
33
|
+
return 'ws://localhost:8001/ws';
|
34
34
|
};
|
35
35
|
|
36
36
|
const API_BASE_URL = getApiBaseUrl();
|
@@ -67,7 +67,9 @@ export const fetchQueues = async () => {
|
|
67
67
|
// 获取队列时间线数据
|
68
68
|
export const fetchQueueTimeline = async (params) => {
|
69
69
|
try {
|
70
|
-
|
70
|
+
// 从参数中提取命名空间,如果没有则使用 default
|
71
|
+
const namespace = params.namespace || 'default';
|
72
|
+
const response = await api.post(`/queue-timeline/${namespace}`, params);
|
71
73
|
// 处理数据,确保不包含填充的空值
|
72
74
|
const data = response.data.data || response.data || [];
|
73
75
|
return {
|
@@ -0,0 +1,22 @@
|
|
1
|
+
// 在开发环境中临时屏蔽特定的控制台警告
|
2
|
+
// 注意:这只是为了减少开发时的控制台噪音,不影响实际功能
|
3
|
+
|
4
|
+
if (process.env.NODE_ENV === 'development') {
|
5
|
+
const originalWarning = console.warn;
|
6
|
+
console.warn = (...args) => {
|
7
|
+
const warningMessage = args[0]?.toString() || '';
|
8
|
+
|
9
|
+
// 屏蔽 findDOMNode 相关警告(来自第三方库)
|
10
|
+
if (warningMessage.includes('findDOMNode')) {
|
11
|
+
return;
|
12
|
+
}
|
13
|
+
|
14
|
+
// 屏蔽 React Router v7 迁移提示
|
15
|
+
if (warningMessage.includes('React Router Future Flag Warning')) {
|
16
|
+
return;
|
17
|
+
}
|
18
|
+
|
19
|
+
// 其他警告正常显示
|
20
|
+
originalWarning.apply(console, args);
|
21
|
+
};
|
22
|
+
}
|
@@ -0,0 +1,154 @@
|
|
1
|
+
/**
|
2
|
+
* 用户偏好设置管理工具
|
3
|
+
*/
|
4
|
+
|
5
|
+
const STORAGE_KEY = 'jettask_user_preferences';
|
6
|
+
|
7
|
+
/**
|
8
|
+
* 获取用户偏好设置
|
9
|
+
* @returns {Object} 用户偏好设置对象
|
10
|
+
*/
|
11
|
+
export const getUserPreferences = () => {
|
12
|
+
try {
|
13
|
+
const stored = localStorage.getItem(STORAGE_KEY);
|
14
|
+
return stored ? JSON.parse(stored) : {};
|
15
|
+
} catch (error) {
|
16
|
+
console.error('Failed to load user preferences:', error);
|
17
|
+
return {};
|
18
|
+
}
|
19
|
+
};
|
20
|
+
|
21
|
+
/**
|
22
|
+
* 保存用户偏好设置
|
23
|
+
* @param {Object} preferences - 偏好设置对象
|
24
|
+
*/
|
25
|
+
export const saveUserPreferences = (preferences) => {
|
26
|
+
try {
|
27
|
+
const current = getUserPreferences();
|
28
|
+
console.log('[saveUserPreferences] 当前值:', current);
|
29
|
+
console.log('[saveUserPreferences] 要更新的值:', preferences);
|
30
|
+
const updated = { ...current, ...preferences };
|
31
|
+
console.log('[saveUserPreferences] 合并后的值:', updated);
|
32
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));
|
33
|
+
console.log('[saveUserPreferences] 已保存到 localStorage');
|
34
|
+
} catch (error) {
|
35
|
+
console.error('Failed to save user preferences:', error);
|
36
|
+
}
|
37
|
+
};
|
38
|
+
|
39
|
+
/**
|
40
|
+
* 获取特定的偏好设置
|
41
|
+
* @param {string} key - 设置项的键
|
42
|
+
* @param {*} defaultValue - 默认值
|
43
|
+
* @returns {*} 设置值
|
44
|
+
*/
|
45
|
+
export const getPreference = (key, defaultValue = null) => {
|
46
|
+
const preferences = getUserPreferences();
|
47
|
+
return preferences[key] !== undefined ? preferences[key] : defaultValue;
|
48
|
+
};
|
49
|
+
|
50
|
+
/**
|
51
|
+
* 保存特定的偏好设置
|
52
|
+
* @param {string} key - 设置项的键
|
53
|
+
* @param {*} value - 设置值
|
54
|
+
*/
|
55
|
+
export const setPreference = (key, value) => {
|
56
|
+
console.log('[setPreference] 保存偏好设置 - key:', key, 'value:', value);
|
57
|
+
saveUserPreferences({ [key]: value });
|
58
|
+
// 立即验证保存
|
59
|
+
const saved = getUserPreferences();
|
60
|
+
console.log('[setPreference] 保存后立即验证 - saved[key]:', saved[key]);
|
61
|
+
};
|
62
|
+
|
63
|
+
/**
|
64
|
+
* 清除所有偏好设置
|
65
|
+
*/
|
66
|
+
export const clearPreferences = () => {
|
67
|
+
try {
|
68
|
+
localStorage.removeItem(STORAGE_KEY);
|
69
|
+
} catch (error) {
|
70
|
+
console.error('Failed to clear user preferences:', error);
|
71
|
+
}
|
72
|
+
};
|
73
|
+
|
74
|
+
// 偏好设置的键
|
75
|
+
export const PREFERENCE_KEYS = {
|
76
|
+
QUEUE_MONITOR_TIME_RANGE: 'queueMonitor.timeRange',
|
77
|
+
QUEUE_MONITOR_SELECTED_QUEUES: 'queueMonitor.selectedQueues',
|
78
|
+
QUEUE_MONITOR_CUSTOM_TIME_RANGE: 'queueMonitor.customTimeRange',
|
79
|
+
QUEUE_DETAILS_PAGE_SIZE: 'queueDetails.pageSize',
|
80
|
+
};
|
81
|
+
|
82
|
+
/**
|
83
|
+
* 获取队列特定的筛选条件
|
84
|
+
* @param {string} queueName - 队列名称
|
85
|
+
* @returns {Object} 队列的筛选设置
|
86
|
+
*/
|
87
|
+
export const getQueueFilters = (queueName) => {
|
88
|
+
const key = `queue.${queueName}.filters`;
|
89
|
+
const preferences = getUserPreferences();
|
90
|
+
const queueSettings = preferences[key] || {};
|
91
|
+
|
92
|
+
// 返回默认结构
|
93
|
+
return {
|
94
|
+
filters: queueSettings.filters || [],
|
95
|
+
timeRange: queueSettings.timeRange || '1h',
|
96
|
+
customTimeRange: queueSettings.customTimeRange || null
|
97
|
+
};
|
98
|
+
};
|
99
|
+
|
100
|
+
/**
|
101
|
+
* 保存队列特定的筛选条件
|
102
|
+
* @param {string} queueName - 队列名称
|
103
|
+
* @param {Object} settings - 筛选设置
|
104
|
+
*/
|
105
|
+
export const saveQueueFilters = (queueName, settings) => {
|
106
|
+
const key = `queue.${queueName}.filters`;
|
107
|
+
const currentPrefs = getUserPreferences();
|
108
|
+
|
109
|
+
// 限制存储的队列数量,防止localStorage过大
|
110
|
+
const queueKeys = Object.keys(currentPrefs).filter(k => k.startsWith('queue.'));
|
111
|
+
if (queueKeys.length > 50) {
|
112
|
+
// 删除最旧的队列设置(简单策略:删除第一个)
|
113
|
+
delete currentPrefs[queueKeys[0]];
|
114
|
+
}
|
115
|
+
|
116
|
+
// 保存新的设置
|
117
|
+
currentPrefs[key] = {
|
118
|
+
filters: settings.filters || [],
|
119
|
+
timeRange: settings.timeRange || '1h',
|
120
|
+
customTimeRange: settings.customTimeRange || null,
|
121
|
+
lastUpdated: new Date().toISOString()
|
122
|
+
};
|
123
|
+
|
124
|
+
try {
|
125
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(currentPrefs));
|
126
|
+
} catch (error) {
|
127
|
+
console.error('Failed to save queue filters:', error);
|
128
|
+
// 如果存储失败(可能是容量问题),清理旧数据
|
129
|
+
if (error.name === 'QuotaExceededError') {
|
130
|
+
// 清理最旧的一半队列设置
|
131
|
+
const halfLength = Math.floor(queueKeys.length / 2);
|
132
|
+
for (let i = 0; i < halfLength; i++) {
|
133
|
+
delete currentPrefs[queueKeys[i]];
|
134
|
+
}
|
135
|
+
// 重试保存
|
136
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(currentPrefs));
|
137
|
+
}
|
138
|
+
}
|
139
|
+
};
|
140
|
+
|
141
|
+
/**
|
142
|
+
* 清除特定队列的筛选设置
|
143
|
+
* @param {string} queueName - 队列名称
|
144
|
+
*/
|
145
|
+
export const clearQueueFilters = (queueName) => {
|
146
|
+
const key = `queue.${queueName}.filters`;
|
147
|
+
const currentPrefs = getUserPreferences();
|
148
|
+
delete currentPrefs[key];
|
149
|
+
try {
|
150
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(currentPrefs));
|
151
|
+
} catch (error) {
|
152
|
+
console.error('Failed to clear queue filters:', error);
|
153
|
+
}
|
154
|
+
};
|