feat: design a separate package for health check

This commit is contained in:
2026-02-15 11:56:12 +01:00
parent 8f30fe7412
commit a3ed6685de
5 changed files with 572 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
package health
import (
"context"
"database/sql"
"time"
"goyco/internal/middleware"
)
type DatabaseChecker struct {
db *sql.DB
monitor middleware.DBMonitor
}
func NewDatabaseChecker(db *sql.DB, monitor middleware.DBMonitor) *DatabaseChecker {
return &DatabaseChecker{
db: db,
monitor: monitor,
}
}
func (c *DatabaseChecker) Name() string {
return "database"
}
func (c *DatabaseChecker) Check(ctx context.Context) Result {
start := time.Now()
err := c.db.Ping()
latency := time.Since(start)
result := Result{
Status: StatusHealthy,
Latency: latency,
Timestamp: time.Now().UTC(),
Details: map[string]any{
"ping_time": latency.String(),
},
}
if err != nil {
result.Status = StatusUnhealthy
result.Message = err.Error()
return result
}
if c.monitor != nil {
stats := c.monitor.GetStats()
result.Details["stats"] = map[string]any{
"total_queries": stats.TotalQueries,
"slow_queries": stats.SlowQueries,
"average_duration": stats.AverageDuration.String(),
"max_duration": stats.MaxDuration.String(),
"error_count": stats.ErrorCount,
"last_query_time": stats.LastQueryTime.Format(time.RFC3339),
}
}
return result
}