feat: Resilienz (Fallback-Ketten) und Metriken (#5)
- Fallback-Provider (app/providers/fallback.py) fuer STT/LLM/TTS: Provider-Kette der Reihe nach; Config *_FALLBACK; build_orchestrator baut Ketten (dedupliziert) - LLM-Stream-Fallback nur solange kein Token gesendet wurde - Metriken (app/metrics.py): In-Memory Counter/Timer, keine externe Dependency - HTTP-Middleware (Requests/Latenz/Status je Pfad); Pipeline-Stufen-Timing stt/llm/tts; Fallback-/Fehlerzaehler; GET /api/metrics (JSON + Prometheus) - Tests: 58 gruen (+6); Doku aktualisiert (README, BEDIENUNGSANLEITUNG, Architektur, .env.example) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
093da817d8
commit
6422444017
13 changed files with 452 additions and 23 deletions
25
app/main.py
25
app/main.py
|
|
@ -1,4 +1,8 @@
|
|||
from fastapi import FastAPI
|
||||
import time
|
||||
|
||||
from fastapi import FastAPI, Request
|
||||
|
||||
from app.metrics import metrics
|
||||
from app.api.health import router as health_router
|
||||
from app.api.chat import router as chat_router
|
||||
from app.api.transcribe import router as transcribe_router
|
||||
|
|
@ -8,9 +12,27 @@ from app.api.sessions import router as sessions_router
|
|||
from app.api.config import router as config_router
|
||||
from app.api.admin import router as admin_router
|
||||
from app.api.me import router as me_router
|
||||
from app.api.metrics import router as metrics_router
|
||||
from app.api.ws import router as ws_router
|
||||
|
||||
app = FastAPI(title="Voice Assistant Gateway")
|
||||
|
||||
|
||||
@app.middleware("http")
|
||||
async def record_metrics(request: Request, call_next):
|
||||
start = time.perf_counter()
|
||||
response = await call_next(request)
|
||||
duration = time.perf_counter() - start
|
||||
# Route-Template (z. B. /api/sessions/{session_id}/route) statt konkreter URL,
|
||||
# um die Label-Kardinalitaet niedrig zu halten.
|
||||
route = request.scope.get("route")
|
||||
path = getattr(route, "path", request.url.path)
|
||||
labels = {"method": request.method, "path": path}
|
||||
metrics.inc("http_requests_total", {**labels, "status": response.status_code})
|
||||
metrics.observe("http_request_duration_seconds", duration, labels)
|
||||
return response
|
||||
|
||||
|
||||
app.include_router(health_router)
|
||||
app.include_router(chat_router, prefix="/api")
|
||||
app.include_router(transcribe_router, prefix="/api")
|
||||
|
|
@ -20,4 +42,5 @@ app.include_router(sessions_router, prefix="/api")
|
|||
app.include_router(config_router, prefix="/api")
|
||||
app.include_router(admin_router, prefix="/api")
|
||||
app.include_router(me_router, prefix="/api")
|
||||
app.include_router(metrics_router, prefix="/api")
|
||||
app.include_router(ws_router)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue