feat: Add comprehensive provider health monitoring and failover system

- Implemented ProviderHealthMonitor for real-time tracking
  - Monitors availability, response times, success rates
  - Automatic marking unavailable after failures
  - Background health check loop

- Added ProviderFailover for automatic provider switching
  - Configurable retry attempts with exponential backoff
  - Integration with health monitoring
  - Smart provider selection

- Created MonitoredProviderWrapper for performance tracking
  - Transparent monitoring for any provider
  - Automatic metric recording
  - No changes needed to existing providers

- Implemented ProviderConfigManager for dynamic configuration
  - Runtime updates without restart
  - Per-provider settings (timeout, retries, bandwidth)
  - JSON-based persistence

- Added Provider Management API (15+ endpoints)
  - Health monitoring endpoints
  - Configuration management
  - Failover control

- Comprehensive testing (34 tests, 100% pass rate)
  - Health monitoring tests
  - Failover scenario tests
  - Configuration management tests

- Documentation updates
  - Updated infrastructure.md
  - Updated instructions.md
  - Created PROVIDER_ENHANCEMENT_SUMMARY.md

Total: ~2,593 lines of code, 34 passing tests
This commit is contained in:
2025-10-24 11:01:40 +02:00
parent 85d73b8294
commit fecdb38a90
23 changed files with 3137 additions and 109 deletions

View File

@@ -0,0 +1,21 @@
{
"name": "Aniworld",
"data_dir": "data",
"scheduler": {
"enabled": true,
"interval_minutes": 60
},
"logging": {
"level": "INFO",
"file": null,
"max_bytes": null,
"backup_count": 3
},
"backup": {
"enabled": false,
"path": "data/backups",
"keep_days": 30
},
"other": {},
"version": "1.0.0"
}

View File

@@ -0,0 +1,21 @@
{
"name": "Aniworld",
"data_dir": "data",
"scheduler": {
"enabled": true,
"interval_minutes": 60
},
"logging": {
"level": "INFO",
"file": null,
"max_bytes": null,
"backup_count": 3
},
"backup": {
"enabled": false,
"path": "data/backups",
"keep_days": 30
},
"other": {},
"version": "1.0.0"
}

View File

@@ -0,0 +1,21 @@
{
"name": "Aniworld",
"data_dir": "data",
"scheduler": {
"enabled": true,
"interval_minutes": 60
},
"logging": {
"level": "INFO",
"file": null,
"max_bytes": null,
"backup_count": 3
},
"backup": {
"enabled": false,
"path": "data/backups",
"keep_days": 30
},
"other": {},
"version": "1.0.0"
}

View File

@@ -0,0 +1,21 @@
{
"name": "Aniworld",
"data_dir": "data",
"scheduler": {
"enabled": true,
"interval_minutes": 60
},
"logging": {
"level": "INFO",
"file": null,
"max_bytes": null,
"backup_count": 3
},
"backup": {
"enabled": false,
"path": "data/backups",
"keep_days": 30
},
"other": {},
"version": "1.0.0"
}

View File

@@ -1,7 +1,7 @@
{
"pending": [
{
"id": "31c7cb94-fa71-40ed-aa7b-356ecb6e4332",
"id": "1107c159-def4-4504-bd7a-bfec760f6b27",
"serie_id": "workflow-series",
"serie_name": "Workflow Test Series",
"episode": {
@@ -11,7 +11,7 @@
},
"status": "pending",
"priority": "high",
"added_at": "2025-10-23T19:56:51.755530Z",
"added_at": "2025-10-24T08:49:41.492062Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -20,7 +20,7 @@
"source_url": null
},
{
"id": "6a3d347b-0af4-4ed9-8a07-13fc7e8ac163",
"id": "358e6f86-1004-4bb0-8f64-2502319226df",
"serie_id": "series-2",
"serie_name": "Series 2",
"episode": {
@@ -30,7 +30,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.465503Z",
"added_at": "2025-10-24T08:49:40.948844Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -39,7 +39,7 @@
"source_url": null
},
{
"id": "fe1b2f0e-e1e1-400e-8228-debdde9b4de0",
"id": "3c48f5ce-1ba8-4c32-9b88-e945015b28cb",
"serie_id": "series-1",
"serie_name": "Series 1",
"episode": {
@@ -49,7 +49,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.462159Z",
"added_at": "2025-10-24T08:49:40.942983Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -58,7 +58,7 @@
"source_url": null
},
{
"id": "7fac71fe-9902-4109-a127-31f4f7e10e8c",
"id": "f42f3b7f-99ad-4c57-80f3-a3493180fc2e",
"serie_id": "series-0",
"serie_name": "Series 0",
"episode": {
@@ -68,7 +68,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.457543Z",
"added_at": "2025-10-24T08:49:40.932522Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -77,7 +77,7 @@
"source_url": null
},
{
"id": "d17b1756-a563-4af0-a916-2049b4ccf5a9",
"id": "272330f5-264b-496d-9b5f-dfaf995da57a",
"serie_id": "series-high",
"serie_name": "Series High",
"episode": {
@@ -87,7 +87,7 @@
},
"status": "pending",
"priority": "high",
"added_at": "2025-10-23T19:56:51.216398Z",
"added_at": "2025-10-24T08:49:40.430951Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -96,7 +96,7 @@
"source_url": null
},
{
"id": "f3b1fde7-a405-427d-ac41-8c43568aa2f3",
"id": "8b90227a-2fc1-4c0e-a642-026bb280c52c",
"serie_id": "test-series-2",
"serie_name": "Another Series",
"episode": {
@@ -106,7 +106,7 @@
},
"status": "pending",
"priority": "high",
"added_at": "2025-10-23T19:56:51.189202Z",
"added_at": "2025-10-24T08:49:40.385596Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -115,7 +115,7 @@
"source_url": null
},
{
"id": "2cf0ef50-f4db-4c56-a3fb-9081a2e18eec",
"id": "f132413e-11ae-4ab4-8043-3643a5815c92",
"serie_id": "test-series-1",
"serie_name": "Test Anime Series",
"episode": {
@@ -125,7 +125,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.161055Z",
"added_at": "2025-10-24T08:49:40.337566Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -134,7 +134,7 @@
"source_url": null
},
{
"id": "aa579aab-5c97-486a-91e6-54c46231b90a",
"id": "f255c446-a59b-416d-98e7-5bf5295f178b",
"serie_id": "test-series-1",
"serie_name": "Test Anime Series",
"episode": {
@@ -144,7 +144,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.161286Z",
"added_at": "2025-10-24T08:49:40.338005Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -153,7 +153,7 @@
"source_url": null
},
{
"id": "55e34b18-9825-4f70-86c4-8d590356316a",
"id": "ab81c359-f7d9-4e77-8adf-b8cb8af88359",
"serie_id": "series-normal",
"serie_name": "Series Normal",
"episode": {
@@ -163,7 +163,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.218456Z",
"added_at": "2025-10-24T08:49:40.433510Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -172,7 +172,7 @@
"source_url": null
},
{
"id": "12253698-64ea-4fc8-99c2-5ae0d4ed6895",
"id": "0bf9e0ca-06fa-4a30-9546-cc7f5209ca04",
"serie_id": "series-low",
"serie_name": "Series Low",
"episode": {
@@ -182,7 +182,7 @@
},
"status": "pending",
"priority": "low",
"added_at": "2025-10-23T19:56:51.220209Z",
"added_at": "2025-10-24T08:49:40.436022Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -191,7 +191,7 @@
"source_url": null
},
{
"id": "ae30a3d7-3481-4b3f-a6f9-e49a5a0c8fe5",
"id": "a08fbdc7-b58e-47fd-9ca2-756b7fbe3599",
"serie_id": "test-series",
"serie_name": "Test Series",
"episode": {
@@ -201,7 +201,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.405934Z",
"added_at": "2025-10-24T08:49:40.802798Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -210,7 +210,7 @@
"source_url": null
},
{
"id": "fae088ee-b2f1-44ea-bbb9-f5806e0994a6",
"id": "0644a69e-0a53-4301-b277-75deda4a4df6",
"serie_id": "test-series",
"serie_name": "Test Series",
"episode": {
@@ -220,7 +220,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.490971Z",
"added_at": "2025-10-24T08:49:41.001859Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -229,7 +229,7 @@
"source_url": null
},
{
"id": "9c85e739-6fa0-4a92-896d-8aedd57618e0",
"id": "5f725fd5-00fd-44ab-93c2-01d7feb4cdef",
"serie_id": "invalid-series",
"serie_name": "Invalid Series",
"episode": {
@@ -239,7 +239,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.546058Z",
"added_at": "2025-10-24T08:49:41.123804Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -248,7 +248,7 @@
"source_url": null
},
{
"id": "45829428-d7d5-4242-a929-4c4b71a4bec6",
"id": "683dfb1d-5364-4ef3-9ead-4896bad0da04",
"serie_id": "test-series",
"serie_name": "Test Series",
"episode": {
@@ -258,7 +258,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.571105Z",
"added_at": "2025-10-24T08:49:41.189557Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -267,64 +267,7 @@
"source_url": null
},
{
"id": "672bf347-2ad7-45ae-9799-d9999c1d9368",
"serie_id": "series-1",
"serie_name": "Series 1",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.614228Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "e95a02fd-5cbf-4f0f-8a08-9ac4bcdf6c15",
"serie_id": "series-2",
"serie_name": "Series 2",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.615864Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "c7127db3-c62e-4af3-ae81-04f521320519",
"serie_id": "series-0",
"serie_name": "Series 0",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.616544Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "d01e8e1f-6522-49cd-bc45-f7f28ca76228",
"id": "b967c4c2-f4ba-4c73-93db-b11a760246ea",
"serie_id": "series-4",
"serie_name": "Series 4",
"episode": {
@@ -334,7 +277,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.617214Z",
"added_at": "2025-10-24T08:49:41.261729Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -343,7 +286,7 @@
"source_url": null
},
{
"id": "ee067702-e382-4758-ae83-173a2bc2a8a3",
"id": "7a7563d8-1026-4834-9478-379b41b50917",
"serie_id": "series-3",
"serie_name": "Series 3",
"episode": {
@@ -353,7 +296,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.617883Z",
"added_at": "2025-10-24T08:49:41.264718Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -362,7 +305,64 @@
"source_url": null
},
{
"id": "3159eadc-8298-4418-ac78-a61d2646f84c",
"id": "f9f691ea-28e2-40c8-95dc-0f1352d22227",
"serie_id": "series-0",
"serie_name": "Series 0",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-24T08:49:41.268182Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "eff42725-7efa-4b1e-aae0-42dc6f9ec517",
"serie_id": "series-1",
"serie_name": "Series 1",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-24T08:49:41.270669Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "59eb6d4d-70fa-4462-89ec-2cbed7492701",
"serie_id": "series-2",
"serie_name": "Series 2",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-24T08:49:41.273355Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "77a06cb4-dd32-46a3-bbc0-5260dbcb618d",
"serie_id": "persistent-series",
"serie_name": "Persistent Series",
"episode": {
@@ -372,7 +372,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.680519Z",
"added_at": "2025-10-24T08:49:41.386796Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -381,7 +381,7 @@
"source_url": null
},
{
"id": "4e7a25db-819f-4782-bd59-01d443497131",
"id": "e69a4d6a-f87d-4d57-9682-3bc1efd0e843",
"serie_id": "ws-series",
"serie_name": "WebSocket Series",
"episode": {
@@ -391,7 +391,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.731180Z",
"added_at": "2025-10-24T08:49:41.460477Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -400,7 +400,7 @@
"source_url": null
},
{
"id": "2f6b4857-6cc9-43ca-bb21-b55e8e4931f8",
"id": "b0ebfb22-df77-4163-9879-a7b9b635b067",
"serie_id": "pause-test",
"serie_name": "Pause Test Series",
"episode": {
@@ -410,7 +410,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-23T19:56:51.890630Z",
"added_at": "2025-10-24T08:49:41.646597Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -421,5 +421,5 @@
],
"active": [],
"failed": [],
"timestamp": "2025-10-23T19:56:51.891251+00:00"
"timestamp": "2025-10-24T08:49:41.646995+00:00"
}