2026-06-25 14:27:41 +07:00

64 lines
1.9 KiB
Go

package api
import (
"net/http"
)
// handleHealth — GET /api/health — возвращает статус всех зависимостей.
func (a *API) handleHealth(w http.ResponseWriter, r *http.Request) {
stats := a.engine.GetHealthStats()
natsStatus := "disconnected"
if a.natsConnected != nil && a.natsConnected() {
natsStatus = "connected"
}
eslInfo := map[string]interface{}{"status": "disabled"}
if a.eslClient != nil {
eslStats := a.eslClient.GetStats()
eslInfo = map[string]interface{}{
"status": eslStats.Status,
"host": eslStats.Host,
"uptime_seconds": eslStats.UptimeSec,
"reconnects": eslStats.Reconnects,
"gateway_ops": eslStats.GatewayOps,
"events_recv": eslStats.EventsRecv,
}
}
writeJSON(w, http.StatusOK, map[string]interface{}{
"status": "ok",
"version": "1.0.0",
"connections": map[string]interface{}{
"nats": natsStatus,
"esl": eslInfo,
},
"stats": stats,
})
}
// handleLiveness — GET /api/health/live — всегда 200, если процесс жив.
func (a *API) handleLiveness(w http.ResponseWriter, r *http.Request) {
writeJSON(w, http.StatusOK, map[string]string{"status": "alive"})
}
// handleReadiness — GET /api/health/ready — 200 когда NATS подключён, метрики поступают.
// ESL опционален — не требуется для готовности.
func (a *API) handleReadiness(w http.ResponseWriter, r *http.Request) {
if a.natsConnected != nil && !a.natsConnected() {
writeJSON(w, http.StatusServiceUnavailable, map[string]string{
"status": "not_ready",
"reason": "nats_disconnected",
})
return
}
if !a.engine.HasRecentMetrics(60) {
writeJSON(w, http.StatusServiceUnavailable, map[string]string{
"status": "not_ready",
"reason": "no_recent_metrics",
})
return
}
writeJSON(w, http.StatusOK, map[string]string{"status": "ready"})
}