You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
# backend/app/routers/ops.py — readiness + 메트릭 노출 (phase-15)
|
|
from fastapi import APIRouter, Depends
|
|
from fastapi.responses import PlainTextResponse
|
|
from sqlmodel import Session, text
|
|
|
|
from ..config import get_settings
|
|
from ..db import get_session
|
|
from ..observability import metrics
|
|
from ..schemas import ReadyOut
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
def check_ollama() -> dict:
|
|
"""Ollama 도달성 점검(테스트에서 monkeypatch 가능)."""
|
|
import httpx
|
|
|
|
st = get_settings()
|
|
try:
|
|
r = httpx.get(f"{st.ollama_host}/api/tags", timeout=2.0)
|
|
return {"reachable": r.status_code == 200, "model": st.ollama_model, "host": st.ollama_host}
|
|
except Exception:
|
|
return {"reachable": False, "model": st.ollama_model, "host": st.ollama_host}
|
|
|
|
|
|
@router.get("/ready", response_model=ReadyOut)
|
|
def ready(s: Session = Depends(get_session)):
|
|
checks: dict[str, str] = {}
|
|
db_ok = True
|
|
try:
|
|
s.exec(text("SELECT 1"))
|
|
checks["db"] = "ok"
|
|
except Exception as e:
|
|
db_ok = False
|
|
checks["db"] = f"error: {type(e).__name__}"
|
|
checks["migrations"] = "ok"
|
|
llm = check_ollama()
|
|
# LLM 미가용은 차단하지 않음(heuristic 폴백)
|
|
checks["llm"] = f"ok:{llm['model']}" if llm.get("reachable") else "fallback:heuristic"
|
|
checks["worker"] = "scheduled" if get_settings().worker_enabled else "manual"
|
|
return ReadyOut(ready=db_ok, checks=checks)
|
|
|
|
|
|
@router.get("/metrics", response_class=PlainTextResponse)
|
|
def prometheus_metrics():
|
|
"""Prometheus 텍스트. 운영에선 리버스 프록시(Caddy)가 외부 접근 차단."""
|
|
return PlainTextResponse(metrics.render(), media_type="text/plain; version=0.0.4")
|