jettask 0.2.15__tar.gz → 0.2.16__tar.gz
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-0.2.15/jettask.egg-info → jettask-0.2.16}/PKG-INFO +2 -1
- jettask-0.2.16/jettask/__init__.py +19 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/__main__.py +4 -4
- jettask-0.2.16/jettask/api/__init__.py +103 -0
- jettask-0.2.16/jettask/api/v1/__init__.py +29 -0
- jettask-0.2.16/jettask/api/v1/alerts.py +226 -0
- jettask-0.2.16/jettask/api/v1/analytics.py +323 -0
- jettask-0.2.16/jettask/api/v1/namespaces.py +134 -0
- jettask-0.2.16/jettask/api/v1/overview.py +136 -0
- jettask-0.2.16/jettask/api/v1/queues.py +530 -0
- jettask-0.2.16/jettask/api/v1/scheduled.py +420 -0
- jettask-0.2.16/jettask/api/v1/settings.py +44 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/api.py +4 -46
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/main.py +21 -109
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/main_unified.py +1 -1
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/namespace_api_old.py +3 -30
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/namespace_data_access.py +2 -1
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/unified_api_router.py +14 -74
- {jettask-0.2.15/jettask/core → jettask-0.2.16/jettask}/cli.py +106 -26
- jettask-0.2.16/jettask/config/nacos_config.py +386 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/app.py +8 -100
- jettask-0.2.16/jettask/core/db_manager.py +515 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/event_pool.py +5 -2
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/unified_manager_base.py +47 -14
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/db_init.py +1 -1
- {jettask-0.2.15 → jettask-0.2.16}/jettask/executors/asyncio.py +2 -2
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/integrated_gradio_app.py +1 -1
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/multi_namespace_consumer.py +5 -2
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/pg_consumer.py +137 -69
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/run.py +1 -1
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/run_webui.py +4 -4
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/multi_namespace_scheduler.py +2 -2
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/unified_manager.py +5 -5
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/unified_scheduler_manager.py +1 -1
- jettask-0.2.16/jettask/schemas/__init__.py +166 -0
- jettask-0.2.16/jettask/schemas/alert.py +99 -0
- jettask-0.2.16/jettask/schemas/backlog.py +122 -0
- jettask-0.2.16/jettask/schemas/common.py +139 -0
- jettask-0.2.16/jettask/schemas/monitoring.py +181 -0
- jettask-0.2.16/jettask/schemas/namespace.py +168 -0
- jettask-0.2.16/jettask/schemas/queue.py +83 -0
- jettask-0.2.16/jettask/schemas/scheduled_task.py +128 -0
- jettask-0.2.16/jettask/schemas/task.py +70 -0
- jettask-0.2.16/jettask/services/__init__.py +24 -0
- jettask-0.2.16/jettask/services/alert_service.py +454 -0
- jettask-0.2.16/jettask/services/analytics_service.py +46 -0
- jettask-0.2.16/jettask/services/overview_service.py +978 -0
- jettask-0.2.16/jettask/services/queue_service.py +711 -0
- jettask-0.2.16/jettask/services/redis_monitor_service.py +151 -0
- jettask-0.2.16/jettask/services/scheduled_task_service.py +207 -0
- jettask-0.2.16/jettask/services/settings_service.py +758 -0
- jettask-0.2.16/jettask/services/task_service.py +157 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/task_center.py +30 -8
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/task_center_client.py +1 -1
- jettask-0.2.15/jettask/webui/config.py → jettask-0.2.16/jettask/webui_config.py +6 -1
- jettask-0.2.16/jettask/webui_exceptions.py +67 -0
- jettask-0.2.16/jettask/webui_sql/verify_database.sql +72 -0
- {jettask-0.2.15 → jettask-0.2.16/jettask.egg-info}/PKG-INFO +2 -1
- jettask-0.2.16/jettask.egg-info/SOURCES.txt +154 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask.egg-info/entry_points.txt +1 -1
- {jettask-0.2.15 → jettask-0.2.16}/jettask.egg-info/requires.txt +1 -0
- {jettask-0.2.15 → jettask-0.2.16}/pyproject.toml +3 -2
- jettask-0.2.15/jettask/__init__.py +0 -40
- jettask-0.2.15/jettask/webui/backend/data_api.py +0 -3294
- jettask-0.2.15/jettask/webui/backend/namespace_api.py +0 -295
- jettask-0.2.15/jettask/webui/backend/queue_backlog_api.py +0 -727
- jettask-0.2.15/jettask/webui/backend/redis_monitor_api.py +0 -476
- jettask-0.2.15/jettask/webui/frontend/index.html +0 -13
- jettask-0.2.15/jettask/webui/frontend/package.json +0 -30
- jettask-0.2.15/jettask/webui/frontend/src/App.css +0 -109
- jettask-0.2.15/jettask/webui/frontend/src/App.jsx +0 -66
- jettask-0.2.15/jettask/webui/frontend/src/components/NamespaceSelector.jsx +0 -166
- jettask-0.2.15/jettask/webui/frontend/src/components/QueueBacklogChart.jsx +0 -298
- jettask-0.2.15/jettask/webui/frontend/src/components/QueueBacklogTrend.jsx +0 -638
- jettask-0.2.15/jettask/webui/frontend/src/components/QueueDetailsTable.css +0 -65
- jettask-0.2.15/jettask/webui/frontend/src/components/QueueDetailsTable.jsx +0 -487
- jettask-0.2.15/jettask/webui/frontend/src/components/QueueDetailsTableV2.jsx +0 -465
- jettask-0.2.15/jettask/webui/frontend/src/components/ScheduledTaskFilter.jsx +0 -423
- jettask-0.2.15/jettask/webui/frontend/src/components/TaskFilter.jsx +0 -425
- jettask-0.2.15/jettask/webui/frontend/src/components/TimeRangeSelector.css +0 -21
- jettask-0.2.15/jettask/webui/frontend/src/components/TimeRangeSelector.jsx +0 -160
- jettask-0.2.15/jettask/webui/frontend/src/components/charts/QueueChart.jsx +0 -111
- jettask-0.2.15/jettask/webui/frontend/src/components/charts/QueueTrendChart.jsx +0 -115
- jettask-0.2.15/jettask/webui/frontend/src/components/charts/WorkerChart.jsx +0 -40
- jettask-0.2.15/jettask/webui/frontend/src/components/common/StatsCard.jsx +0 -18
- jettask-0.2.15/jettask/webui/frontend/src/components/layout/AppLayout.css +0 -95
- jettask-0.2.15/jettask/webui/frontend/src/components/layout/AppLayout.jsx +0 -49
- jettask-0.2.15/jettask/webui/frontend/src/components/layout/Header.css +0 -106
- jettask-0.2.15/jettask/webui/frontend/src/components/layout/Header.jsx +0 -106
- jettask-0.2.15/jettask/webui/frontend/src/components/layout/SideMenu.css +0 -137
- jettask-0.2.15/jettask/webui/frontend/src/components/layout/SideMenu.jsx +0 -209
- jettask-0.2.15/jettask/webui/frontend/src/components/layout/TabsNav.css +0 -244
- jettask-0.2.15/jettask/webui/frontend/src/components/layout/TabsNav.jsx +0 -206
- jettask-0.2.15/jettask/webui/frontend/src/components/layout/UserInfo.css +0 -197
- jettask-0.2.15/jettask/webui/frontend/src/components/layout/UserInfo.jsx +0 -197
- jettask-0.2.15/jettask/webui/frontend/src/contexts/LoadingContext.jsx +0 -27
- jettask-0.2.15/jettask/webui/frontend/src/contexts/NamespaceContext.jsx +0 -72
- jettask-0.2.15/jettask/webui/frontend/src/contexts/TabsContext.backup.jsx +0 -245
- jettask-0.2.15/jettask/webui/frontend/src/index.css +0 -114
- jettask-0.2.15/jettask/webui/frontend/src/main.jsx +0 -22
- jettask-0.2.15/jettask/webui/frontend/src/pages/Alerts.jsx +0 -684
- jettask-0.2.15/jettask/webui/frontend/src/pages/Dashboard/index.css +0 -35
- jettask-0.2.15/jettask/webui/frontend/src/pages/Dashboard/index.jsx +0 -281
- jettask-0.2.15/jettask/webui/frontend/src/pages/Dashboard.jsx +0 -1330
- jettask-0.2.15/jettask/webui/frontend/src/pages/QueueDetail.jsx +0 -1117
- jettask-0.2.15/jettask/webui/frontend/src/pages/QueueMonitor.jsx +0 -527
- jettask-0.2.15/jettask/webui/frontend/src/pages/Queues.jsx +0 -12
- jettask-0.2.15/jettask/webui/frontend/src/pages/ScheduledTasks.jsx +0 -810
- jettask-0.2.15/jettask/webui/frontend/src/pages/Settings.jsx +0 -801
- jettask-0.2.15/jettask/webui/frontend/src/pages/Workers.jsx +0 -12
- jettask-0.2.15/jettask/webui/frontend/src/services/api.js +0 -159
- jettask-0.2.15/jettask/webui/frontend/src/services/queueTrend.js +0 -166
- jettask-0.2.15/jettask/webui/frontend/src/utils/suppressWarnings.js +0 -22
- jettask-0.2.15/jettask/webui/frontend/src/utils/userPreferences.js +0 -154
- jettask-0.2.15/jettask/webui/frontend/vite.config.js +0 -26
- jettask-0.2.15/jettask/webui/sql/init_database.sql +0 -640
- jettask-0.2.15/jettask.egg-info/SOURCES.txt +0 -176
- {jettask-0.2.15 → jettask-0.2.16}/LICENSE +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/MANIFEST.in +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/README.md +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/__init__.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/api/__init__.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/api/v1/__init__.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/api/v1/monitoring.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/api/v1/namespaces.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/api/v1/queues.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/api/v1/tasks.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/config.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/core/__init__.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/core/cache.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/core/database.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/core/exceptions.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/data_access.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/dependencies.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/init_meta_db.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/main_v2.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/models/__init__.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/models/requests.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/models/responses.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/queue_stats_v2.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/services/__init__.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/backend/start.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/cleanup_deprecated_tables.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/config/__init__.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/config/performance.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/constants.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/__init__.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/app_importer.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/consumer_manager.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/context.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/delay_scanner.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/enums.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/heartbeat_process.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/message.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/offline_worker_recovery.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/retry.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/task.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/task_batch.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/core/worker_scanner.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/exceptions.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/executors/__init__.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/executors/base.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/executors/common.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/executors/multi_asyncio.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/gradio_app.py +0 -0
- /jettask-0.2.15/jettask/webui/__init__.py → /jettask-0.2.16/jettask/main.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/models.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/monitor/run_backlog_collector.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/monitor/stream_backlog_monitor.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/monitoring/__init__.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/monitoring/file_watcher.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/pg_consumer/pg_consumer_v2.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/pg_consumer/sql/add_execution_time_field.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/pg_consumer/sql/create_new_tables.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/pg_consumer/sql/create_tables_v3.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/pg_consumer/sql/migrate_to_new_structure.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/pg_consumer/sql/modify_time_fields.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/pg_consumer/sql_utils.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/router.py +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/run_monitor.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/__init__.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/add_execution_count.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/add_priority_field.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/add_scheduler_id.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/add_scheduler_id_index.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/loader.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/make_scheduler_id_required.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/manager.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/migrate_interval_seconds.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/models.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/performance_optimization.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/run_scheduler.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/scheduler.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/scheduler/schema.sql +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/schema.sql +0 -0
- {jettask-0.2.15/jettask/webui → jettask-0.2.16/jettask}/unified_consumer_manager.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/utils/__init__.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/utils/error_handler.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/utils/exception_hook.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/utils/helpers.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/utils/logger.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/utils/serializer.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/utils/serializer_optimized.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/utils/task_logger.py +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask/utils/traceback_filter.py +0 -0
- {jettask-0.2.15/jettask/webui/models → jettask-0.2.16/jettask/webui_models}/__init__.py +0 -0
- {jettask-0.2.15/jettask/webui/models → jettask-0.2.16/jettask/webui_models}/namespace.py +0 -0
- {jettask-0.2.15/jettask/webui/sql → jettask-0.2.16/jettask/webui_sql}/batch_upsert_functions.sql +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask.egg-info/dependency_links.txt +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/jettask.egg-info/top_level.txt +0 -0
- {jettask-0.2.15 → jettask-0.2.16}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: jettask
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.16
|
4
4
|
Summary: A high-performance distributed task queue system with web monitoring
|
5
5
|
Author-email: JetTask Team <support@jettask.io>
|
6
6
|
License-Expression: MIT
|
@@ -40,6 +40,7 @@ Requires-Dist: croniter>=1.4.0
|
|
40
40
|
Requires-Dist: click>=8.1.0
|
41
41
|
Requires-Dist: python-dotenv>=1.0.0
|
42
42
|
Requires-Dist: psutil>=5.9.0
|
43
|
+
Requires-Dist: nacos_tools
|
43
44
|
Provides-Extra: dev
|
44
45
|
Requires-Dist: pytest>=7.0; extra == "dev"
|
45
46
|
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""
|
3
|
+
JetTask - High Performance Distributed Task Queue System
|
4
|
+
"""
|
5
|
+
|
6
|
+
# Core class imports
|
7
|
+
from jettask.core.app import Jettask
|
8
|
+
from jettask.core.message import TaskMessage
|
9
|
+
from jettask.task_center import TaskCenter
|
10
|
+
|
11
|
+
# Version info
|
12
|
+
__version__ = "0.1.0"
|
13
|
+
|
14
|
+
# Public API exports
|
15
|
+
__all__ = [
|
16
|
+
"Jettask",
|
17
|
+
"TaskMessage",
|
18
|
+
"TaskCenter",
|
19
|
+
]
|
@@ -9,10 +9,10 @@ import asyncio
|
|
9
9
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
10
10
|
|
11
11
|
import uvicorn
|
12
|
-
from jettask.
|
13
|
-
from jettask.
|
14
|
-
from jettask.
|
15
|
-
from jettask.
|
12
|
+
from jettask.api import app
|
13
|
+
from jettask.webui_config import PostgreSQLConfig, WebUIConfig, RedisConfig
|
14
|
+
from jettask.db_init import init_database
|
15
|
+
from jettask.pg_consumer import PostgreSQLConsumer
|
16
16
|
|
17
17
|
def parse_pg_config(args):
|
18
18
|
"""解析PostgreSQL配置"""
|
@@ -0,0 +1,103 @@
|
|
1
|
+
"""
|
2
|
+
JetTask API 应用初始化
|
3
|
+
"""
|
4
|
+
from fastapi import FastAPI
|
5
|
+
from fastapi.middleware.cors import CORSMiddleware
|
6
|
+
from contextlib import asynccontextmanager
|
7
|
+
import logging
|
8
|
+
|
9
|
+
# 设置日志
|
10
|
+
logging.basicConfig(level=logging.INFO)
|
11
|
+
logger = logging.getLogger(__name__)
|
12
|
+
|
13
|
+
|
14
|
+
def create_app() -> FastAPI:
|
15
|
+
"""创建并配置 FastAPI 应用"""
|
16
|
+
|
17
|
+
@asynccontextmanager
|
18
|
+
async def lifespan(app: FastAPI):
|
19
|
+
"""应用生命周期管理"""
|
20
|
+
# 启动时初始化
|
21
|
+
try:
|
22
|
+
import os
|
23
|
+
# 检查是否使用Nacos配置
|
24
|
+
use_nacos = os.getenv('USE_NACOS', 'false').lower() == 'true'
|
25
|
+
|
26
|
+
# 初始化数据库管理器
|
27
|
+
from jettask.core.db_manager import init_db_manager
|
28
|
+
await init_db_manager(use_nacos=use_nacos)
|
29
|
+
|
30
|
+
# 延迟导入,避免循环依赖
|
31
|
+
from jettask.backend.data_access import JetTaskDataAccess
|
32
|
+
from jettask.backend.namespace_data_access import get_namespace_data_access
|
33
|
+
from jettask.backend.config import task_center_config
|
34
|
+
|
35
|
+
# 创建数据访问实例
|
36
|
+
data_access = JetTaskDataAccess()
|
37
|
+
namespace_data_access = get_namespace_data_access()
|
38
|
+
|
39
|
+
# 存储在app.state中供路由使用
|
40
|
+
app.state.data_access = data_access
|
41
|
+
app.state.namespace_data_access = namespace_data_access
|
42
|
+
|
43
|
+
# 初始化JetTask数据访问
|
44
|
+
await data_access.initialize()
|
45
|
+
|
46
|
+
# 记录任务中心配置
|
47
|
+
logger.info("=" * 60)
|
48
|
+
logger.info("任务中心配置:")
|
49
|
+
logger.info(f" 配置模式: {'Nacos' if use_nacos else '环境变量'}")
|
50
|
+
logger.info(f" 元数据库: {task_center_config.meta_db_host}:{task_center_config.meta_db_port}/{task_center_config.meta_db_name}")
|
51
|
+
logger.info(f" API服务: {task_center_config.api_host}:{task_center_config.api_port}")
|
52
|
+
logger.info(f" 基础URL: {task_center_config.base_url}")
|
53
|
+
logger.info("=" * 60)
|
54
|
+
|
55
|
+
logger.info("JetTask Monitor API 启动成功")
|
56
|
+
except Exception as e:
|
57
|
+
logger.error(f"启动失败: {e}")
|
58
|
+
import traceback
|
59
|
+
traceback.print_exc()
|
60
|
+
raise
|
61
|
+
|
62
|
+
yield
|
63
|
+
|
64
|
+
# 关闭时清理资源
|
65
|
+
try:
|
66
|
+
await app.state.data_access.close()
|
67
|
+
|
68
|
+
# 关闭数据库管理器
|
69
|
+
from jettask.core.db_manager import close_db_manager
|
70
|
+
await close_db_manager()
|
71
|
+
|
72
|
+
logger.info("JetTask Monitor API 关闭完成")
|
73
|
+
except Exception as e:
|
74
|
+
logger.error(f"关闭时出错: {e}")
|
75
|
+
import traceback
|
76
|
+
traceback.print_exc()
|
77
|
+
|
78
|
+
# 创建 FastAPI 应用
|
79
|
+
app = FastAPI(
|
80
|
+
title="JetTask Monitor API",
|
81
|
+
version="1.0.0",
|
82
|
+
lifespan=lifespan
|
83
|
+
)
|
84
|
+
|
85
|
+
# 配置CORS
|
86
|
+
app.add_middleware(
|
87
|
+
CORSMiddleware,
|
88
|
+
allow_origins=["*"], # 生产环境应该配置具体的前端地址
|
89
|
+
allow_credentials=True,
|
90
|
+
allow_methods=["*"],
|
91
|
+
allow_headers=["*"],
|
92
|
+
)
|
93
|
+
|
94
|
+
# 注册路由
|
95
|
+
from jettask.api.v1 import api_router
|
96
|
+
|
97
|
+
app.include_router(api_router)
|
98
|
+
|
99
|
+
return app
|
100
|
+
|
101
|
+
|
102
|
+
# 创建默认应用实例
|
103
|
+
app = create_app()
|
@@ -0,0 +1,29 @@
|
|
1
|
+
"""
|
2
|
+
API v1 路由模块集合
|
3
|
+
"""
|
4
|
+
from fastapi import APIRouter
|
5
|
+
|
6
|
+
# 导入7个主要模块的路由
|
7
|
+
from .overview import router as overview_router # 概览
|
8
|
+
from .namespaces import router as namespaces_router # 命名空间
|
9
|
+
from .queues import router as queues_router # 队列
|
10
|
+
from .scheduled import router as scheduled_router # 定时任务
|
11
|
+
from .alerts import router as alerts_router # 告警
|
12
|
+
from .analytics import router as analytics_router # 分析
|
13
|
+
from .settings import router as settings_router # 设置
|
14
|
+
|
15
|
+
# 创建 v1 总路由,添加统一的 /api/v1 前缀
|
16
|
+
api_router = APIRouter(prefix="/api/v1")
|
17
|
+
|
18
|
+
# 按功能模块组织路由(namespaces和settings现在是平级的)
|
19
|
+
api_router.include_router(overview_router) # 系统概览、健康检查
|
20
|
+
api_router.include_router(namespaces_router) # 命名空间管理(独立路由)
|
21
|
+
api_router.include_router(queues_router) # 队列管理、任务处理
|
22
|
+
api_router.include_router(scheduled_router) # 定时任务管理
|
23
|
+
api_router.include_router(alerts_router) # 告警规则管理
|
24
|
+
api_router.include_router(analytics_router) # 数据分析查询
|
25
|
+
api_router.include_router(settings_router) # 系统配置
|
26
|
+
|
27
|
+
__all__ = ['api_router']
|
28
|
+
|
29
|
+
|
@@ -0,0 +1,226 @@
|
|
1
|
+
"""
|
2
|
+
告警管理路由
|
3
|
+
提供轻量级的路由入口,业务逻辑在 AlertService 中实现
|
4
|
+
"""
|
5
|
+
from fastapi import APIRouter, HTTPException, Query
|
6
|
+
from typing import Optional
|
7
|
+
import logging
|
8
|
+
|
9
|
+
from jettask.schemas import AlertRuleRequest
|
10
|
+
from jettask.services.alert_service import AlertService
|
11
|
+
|
12
|
+
router = APIRouter(prefix="/alerts", tags=["alerts"])
|
13
|
+
logger = logging.getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
@router.get("/rules")
|
17
|
+
async def get_alert_rules(
|
18
|
+
page: int = Query(1, ge=1),
|
19
|
+
page_size: int = Query(20, ge=1, le=100),
|
20
|
+
is_active: Optional[bool] = None
|
21
|
+
):
|
22
|
+
"""
|
23
|
+
获取告警规则列表
|
24
|
+
|
25
|
+
Args:
|
26
|
+
page: 页码(从1开始)
|
27
|
+
page_size: 每页数量
|
28
|
+
is_active: 是否只返回激活的规则
|
29
|
+
"""
|
30
|
+
try:
|
31
|
+
return AlertService.get_alert_rules(page, page_size, is_active)
|
32
|
+
except Exception as e:
|
33
|
+
logger.error(f"获取告警规则列表失败: {e}")
|
34
|
+
raise HTTPException(status_code=500, detail=str(e))
|
35
|
+
|
36
|
+
|
37
|
+
@router.post("/rules", status_code=201)
|
38
|
+
async def create_alert_rule(request: AlertRuleRequest):
|
39
|
+
"""
|
40
|
+
创建告警规则
|
41
|
+
|
42
|
+
Args:
|
43
|
+
request: 告警规则请求数据
|
44
|
+
"""
|
45
|
+
try:
|
46
|
+
return AlertService.create_alert_rule(request)
|
47
|
+
except ValueError as e:
|
48
|
+
raise HTTPException(status_code=400, detail=str(e))
|
49
|
+
except Exception as e:
|
50
|
+
logger.error(f"创建告警规则失败: {e}")
|
51
|
+
raise HTTPException(status_code=500, detail=str(e))
|
52
|
+
|
53
|
+
|
54
|
+
@router.put("/rules/{rule_id}")
|
55
|
+
async def update_alert_rule(rule_id: str, request: AlertRuleRequest):
|
56
|
+
"""
|
57
|
+
更新告警规则
|
58
|
+
|
59
|
+
Args:
|
60
|
+
rule_id: 规则ID
|
61
|
+
request: 告警规则请求数据
|
62
|
+
"""
|
63
|
+
try:
|
64
|
+
return AlertService.update_alert_rule(rule_id, request)
|
65
|
+
except ValueError as e:
|
66
|
+
raise HTTPException(status_code=404, detail=str(e))
|
67
|
+
except Exception as e:
|
68
|
+
logger.error(f"更新告警规则失败: {e}")
|
69
|
+
raise HTTPException(status_code=500, detail=str(e))
|
70
|
+
|
71
|
+
|
72
|
+
@router.delete("/rules/{rule_id}")
|
73
|
+
async def delete_alert_rule(rule_id: str):
|
74
|
+
"""
|
75
|
+
删除告警规则
|
76
|
+
|
77
|
+
Args:
|
78
|
+
rule_id: 规则ID
|
79
|
+
"""
|
80
|
+
try:
|
81
|
+
return AlertService.delete_alert_rule(rule_id)
|
82
|
+
except ValueError as e:
|
83
|
+
raise HTTPException(status_code=404, detail=str(e))
|
84
|
+
except Exception as e:
|
85
|
+
logger.error(f"删除告警规则失败: {e}")
|
86
|
+
raise HTTPException(status_code=500, detail=str(e))
|
87
|
+
|
88
|
+
|
89
|
+
@router.post("/rules/{rule_id}/toggle")
|
90
|
+
async def toggle_alert_rule(rule_id: str):
|
91
|
+
"""
|
92
|
+
启用/禁用告警规则
|
93
|
+
|
94
|
+
Args:
|
95
|
+
rule_id: 规则ID
|
96
|
+
"""
|
97
|
+
try:
|
98
|
+
return AlertService.toggle_alert_rule(rule_id)
|
99
|
+
except ValueError as e:
|
100
|
+
raise HTTPException(status_code=404, detail=str(e))
|
101
|
+
except Exception as e:
|
102
|
+
logger.error(f"切换告警规则状态失败: {e}")
|
103
|
+
raise HTTPException(status_code=500, detail=str(e))
|
104
|
+
|
105
|
+
|
106
|
+
@router.get("/rules/{rule_id}/history")
|
107
|
+
async def get_alert_history(
|
108
|
+
rule_id: str,
|
109
|
+
page: int = Query(1, ge=1),
|
110
|
+
page_size: int = Query(20, ge=1, le=100)
|
111
|
+
):
|
112
|
+
"""
|
113
|
+
获取告警触发历史
|
114
|
+
|
115
|
+
Args:
|
116
|
+
rule_id: 规则ID
|
117
|
+
page: 页码(从1开始)
|
118
|
+
page_size: 每页数量
|
119
|
+
"""
|
120
|
+
try:
|
121
|
+
return AlertService.get_alert_history(rule_id, page, page_size)
|
122
|
+
except ValueError as e:
|
123
|
+
raise HTTPException(status_code=404, detail=str(e))
|
124
|
+
except Exception as e:
|
125
|
+
logger.error(f"获取告警历史失败: {e}")
|
126
|
+
raise HTTPException(status_code=500, detail=str(e))
|
127
|
+
|
128
|
+
|
129
|
+
@router.post("/rules/{rule_id}/test")
|
130
|
+
async def test_alert_rule(rule_id: str):
|
131
|
+
"""
|
132
|
+
测试告警规则(发送测试通知)
|
133
|
+
|
134
|
+
Args:
|
135
|
+
rule_id: 规则ID
|
136
|
+
"""
|
137
|
+
try:
|
138
|
+
return AlertService.test_alert_rule(rule_id)
|
139
|
+
except ValueError as e:
|
140
|
+
raise HTTPException(status_code=404, detail=str(e))
|
141
|
+
except Exception as e:
|
142
|
+
logger.error(f"测试告警规则失败: {e}")
|
143
|
+
raise HTTPException(status_code=500, detail=str(e))
|
144
|
+
|
145
|
+
|
146
|
+
# ============ 告警统计接口 ============
|
147
|
+
|
148
|
+
@router.get("/statistics")
|
149
|
+
async def get_alert_statistics(
|
150
|
+
namespace: Optional[str] = Query(None, description="命名空间名称")
|
151
|
+
):
|
152
|
+
"""
|
153
|
+
获取告警统计信息
|
154
|
+
|
155
|
+
Args:
|
156
|
+
namespace: 命名空间名称(可选)
|
157
|
+
"""
|
158
|
+
try:
|
159
|
+
return AlertService.get_alert_statistics(namespace)
|
160
|
+
except Exception as e:
|
161
|
+
logger.error(f"获取告警统计信息失败: {e}")
|
162
|
+
raise HTTPException(status_code=500, detail=str(e))
|
163
|
+
|
164
|
+
|
165
|
+
# ============ 活跃告警管理 ============
|
166
|
+
|
167
|
+
@router.get("/active")
|
168
|
+
async def get_active_alerts(
|
169
|
+
namespace: Optional[str] = Query(None, description="命名空间名称")
|
170
|
+
):
|
171
|
+
"""
|
172
|
+
获取当前活跃的告警
|
173
|
+
|
174
|
+
Args:
|
175
|
+
namespace: 命名空间名称(可选)
|
176
|
+
"""
|
177
|
+
try:
|
178
|
+
return AlertService.get_active_alerts(namespace)
|
179
|
+
except Exception as e:
|
180
|
+
logger.error(f"获取活跃告警失败: {e}")
|
181
|
+
raise HTTPException(status_code=500, detail=str(e))
|
182
|
+
|
183
|
+
|
184
|
+
@router.post("/active/{alert_id}/acknowledge")
|
185
|
+
async def acknowledge_alert(
|
186
|
+
alert_id: str,
|
187
|
+
user: str = Query("system", description="确认用户")
|
188
|
+
):
|
189
|
+
"""
|
190
|
+
确认告警
|
191
|
+
|
192
|
+
Args:
|
193
|
+
alert_id: 告警ID
|
194
|
+
user: 确认用户
|
195
|
+
"""
|
196
|
+
try:
|
197
|
+
return AlertService.acknowledge_alert(alert_id, user)
|
198
|
+
except ValueError as e:
|
199
|
+
raise HTTPException(status_code=404, detail=str(e))
|
200
|
+
except Exception as e:
|
201
|
+
logger.error(f"确认告警失败: {e}")
|
202
|
+
raise HTTPException(status_code=500, detail=str(e))
|
203
|
+
|
204
|
+
|
205
|
+
@router.post("/active/{alert_id}/resolve")
|
206
|
+
async def resolve_alert(
|
207
|
+
alert_id: str,
|
208
|
+
resolution_note: Optional[str] = Query(None, description="解决说明")
|
209
|
+
):
|
210
|
+
"""
|
211
|
+
解决告警
|
212
|
+
|
213
|
+
Args:
|
214
|
+
alert_id: 告警ID
|
215
|
+
resolution_note: 解决说明(可选)
|
216
|
+
"""
|
217
|
+
try:
|
218
|
+
return AlertService.resolve_alert(alert_id, resolution_note)
|
219
|
+
except ValueError as e:
|
220
|
+
raise HTTPException(status_code=404, detail=str(e))
|
221
|
+
except Exception as e:
|
222
|
+
logger.error(f"解决告警失败: {e}")
|
223
|
+
raise HTTPException(status_code=500, detail=str(e))
|
224
|
+
|
225
|
+
|
226
|
+
__all__ = ['router']
|