feat(B.13-B.17+B.16): Error-Handling-Infra, Observability, Graceful Shutdown, Cost-Cap, API Versioning
B.13 Error-Handling-Infrastruktur:
- ErrorCategory Enum (TRANSIENT/PERMANENT/PARTIAL), ApiError erweitert
- Einheitliches Error-Response-Format: {code, detail, field, trace_id, retryable, category}
- 3 FastAPI Exception-Handler (ApiError, HTTPException, unhandled)
- classify_exception() Helper, 6 neue Error-Codes
- 28 Tests in test_error_handling.py
B.14 Observability & trace_id-Korrelation:
- trace_id pro Request (UUID4 short) in structlog contextvars
- X-Trace-Id Response-Header
- Sensitive Fields structlog processor
- llm_complete()/llm_embed() akzeptieren trace_id kwarg
- 12 Tests in test_observability.py
B.15 Graceful Shutdown & Connection Draining:
- _shutdown_event + _inflight_requests Tracking in main.py
- drain_all_connections() in ws_helpers.py
- Worker on_shutdown pausiert WorkflowInstances (status=paused)
- 8 Tests in test_graceful_shutdown.py
B.16 API Versioning Strategie:
- Plugin-Dev-Guide Kapitel 30: URL-basiertes Versioning, Breaking Change Prozess
B.17 Cost Overrun Protection:
- llm_monthly_budget_usd + llm_hard_cutoff Settings
- _check_tenant_budget() vor jedem LLM-Call
- _track_tenant_cost() in Redis (INCRBYFLOAT)
- _check_cost_alerts() bei 50%/80%/100% -> post_system_message()
- 20 Tests in test_cost_protection.py
Total: 68 neue Tests, alle grün. Keine Regressionen.
This commit is contained in:
+34
-1
@@ -10,7 +10,7 @@
|
||||
| Phase | Status | Start | Ende | Tasks Done | Tasks Total |
|
||||
|-------|-------|-------|------|------------|-------------|
|
||||
| A — Stabilität verifizieren | `done` | 2026-08-13 | 2026-08-13 | 5 | 5 |
|
||||
| B — System-Konsolidierung | `in_progress` | 2026-08-13 | — | 0 | ~50 |
|
||||
| B — System-Konsolidierung | `in_progress` | 2026-08-13 | — | 13 | ~50 |
|
||||
| C — Core UI | `not_started` | — | — | 0 | ~18 |
|
||||
| C.5 — Import/Export | `not_started` | — | — | 0 | 8 |
|
||||
| D — Undo/Restore | `not_started` | — | — | 0 | ~12 |
|
||||
@@ -156,6 +156,39 @@
|
||||
| B-NOTIF-DEPREC | `done` | — | Routes + create_notification deprecated |
|
||||
| B-NOTIF-TEST | `done` | — | tests/test_notification_migration.py 19/19 pass |
|
||||
|
||||
### B.13 Error-Handling-Infrastruktur
|
||||
|
||||
| Task | Status | Forgejo Issue | Verifiziert |
|
||||
|------|-------|---------------|------------|
|
||||
| B-ERR-FMT | `done` | — | ✅ ApiError um category/retryable erweitert, einheitliches Response-Format {code,detail,field,trace_id,retryable,category}, 6 neue Error-Codes (forbidden,conflict,unprocessable,not_implemented,service_timeout,bad_gateway), FastAPI Exception-Handler für ApiError+HTTPException+unhandled |
|
||||
| B-ERR-CAT | `done` | — | ✅ ErrorCategory Enum (TRANSIENT/PERMANENT/PARTIAL), classify_exception() Helper, jeder ApiError trägt Kategorie |
|
||||
| B-ERR-TEST | `done` | — | ✅ 28 Tests in test_error_handling.py, alle grün |
|
||||
|
||||
### B.14 Observability & trace_id-Korrelation
|
||||
|
||||
| Task | Status | Forgejo Issue | Verifiziert |
|
||||
|------|-------|---------------|------------|
|
||||
| B-OBS-TRACE | `done` | — | ✅ trace_id pro Request (UUID4 short 8-char), structlog contextvars, X-Trace-Id Response-Header, llm_complete()/llm_embed() akzeptieren trace_id kwarg |
|
||||
| B-OBS-LOG | `done` | — | ✅ sanitize_dict() + _sanitize_sensitive_fields structlog processor, sensitive fields (password,api_key,token,etc) redacted from logs |
|
||||
| B-OBS-TEST | `done` | — | ✅ 12 Tests in test_observability.py, alle grün |
|
||||
|
||||
### B.15 Graceful Shutdown & Connection Draining
|
||||
|
||||
| Task | Status | Forgejo Issue | Verifiziert |
|
||||
|------|-------|---------------|------------|
|
||||
| B-SHUT-API | `done` | — | ✅ _shutdown_event (asyncio.Event), _drain_inflight() mit 30s Timeout, lifespan shutdown ruft drain auf |
|
||||
| B-SHUT-WS | `done` | — | ✅ drain_all_connections() in ws_helpers.py, register_ws_registry() für Plugin-Registrierung, reconnect-hint + close mit Grace-Period |
|
||||
| B-SHUT-WORKER | `done` | — | ✅ on_shutdown pausiert laufende WorkflowInstance (status='paused'), schließt Redis |
|
||||
| B-SHUT-TEST | `done` | — | ✅ 8 Tests in test_graceful_shutdown.py, alle grün |
|
||||
|
||||
### B.17 Cost Overrun Protection
|
||||
|
||||
| Task | Status | Forgejo Issue | Verifiziert |
|
||||
|------|-------|---------------|------------|
|
||||
| B-COST-CAP | `done` | — | ✅ llm_monthly_budget_usd + llm_hard_cutoff in config.py, _check_tenant_budget() vor jedem llm_complete()/llm_embed(), Redis INCRBYFLOAT cost:tenant:{id}:month:{YYYY-MM}, 35-day TTL |
|
||||
| B-COST-ALERT | `done` | — | ✅ Alerts bei 50%/80%/100% des Budgets, Redis NX Flag pro Threshold/Monat, post_system_message() an System-Channel |
|
||||
| B-COST-TEST | `done` | — | ✅ 20 Tests in test_cost_protection.py, alle grün |
|
||||
|
||||
---
|
||||
|
||||
## Phasen C-J
|
||||
|
||||
Reference in New Issue
Block a user