Files
Trackeep/backend/handlers/health.go
T
Tomas Dvorak 55d0284b2a uppdate
2026-02-24 10:33:08 +01:00

104 lines
2.0 KiB
Go

package handlers
import (
"runtime"
"time"
"github.com/gin-gonic/gin"
"github.com/trackeep/backend/config"
)
var startTime = time.Now()
func HealthCheck(c *gin.Context) {
db := config.GetDB()
dbStatus := "connected"
var dbPingTime time.Duration = 0
if db == nil {
dbStatus = "disconnected"
} else {
sqlDB, err := db.DB()
if err != nil {
dbStatus = "error"
} else {
start := time.Now()
if err := sqlDB.Ping(); err != nil {
dbStatus = "error"
} else {
dbPingTime = time.Since(start)
}
}
}
sessionStatus := "ok"
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
uptime := time.Since(startTime)
health := gin.H{
"status": "ok",
"message": "Trackeep API is running",
"version": "1.0.0",
"uptime": uptime.String(),
"database": gin.H{
"status": dbStatus,
"ping_time": dbPingTime.String(),
},
"sessions": gin.H{
"status": sessionStatus,
},
"system": gin.H{
"goroutines": runtime.NumGoroutine(),
"memory": gin.H{
"alloc_mb": memStats.Alloc / 1024 / 1024,
"total_alloc_mb": memStats.TotalAlloc / 1024 / 1024,
"sys_mb": memStats.Sys / 1024 / 1024,
},
},
"timestamp": gin.H{
"human": time.Now().Format(time.RFC3339),
"unix": time.Now().Unix(),
},
}
overallStatus := "healthy"
if dbStatus != "connected" {
overallStatus = "degraded"
health["status"] = "degraded"
}
if sessionStatus != "ok" {
overallStatus = "degraded"
health["status"] = "degraded"
}
statusCode := 200
if overallStatus == "degraded" {
statusCode = 503
}
c.JSON(statusCode, health)
}
func ReadinessCheck(c *gin.Context) {
db := config.GetDB()
if db == nil {
c.JSON(503, gin.H{"status": "not_ready", "reason": "database_not_connected"})
return
}
sqlDB, err := db.DB()
if err != nil || sqlDB.Ping() != nil {
c.JSON(503, gin.H{"status": "not_ready", "reason": "database_ping_failed"})
return
}
c.JSON(200, gin.H{"status": "ready"})
}
func LivenessCheck(c *gin.Context) {
c.JSON(200, gin.H{"status": "alive", "timestamp": time.Now().Unix()})
}