github.com/mundipagg/boleto-api@v0.0.0-20230620145841-3f9ec742599f/healthcheck/healthcheck.go (about) 1 package healthcheck 2 3 import ( 4 "errors" 5 stdlog "log" 6 "net/http" 7 "time" 8 9 "github.com/gin-gonic/gin" 10 "github.com/mundipagg/boleto-api/db" 11 "github.com/mundipagg/boleto-api/log" 12 "github.com/mundipagg/boleto-api/queue" 13 14 HealthCheckLib "github.com/mundipagg/healthcheck-go" 15 checks "github.com/mundipagg/healthcheck-go/checks" 16 ) 17 18 const ( 19 Unhealthy string = "Unhealthy" 20 ) 21 22 type HealthCheckResponse struct { 23 Status string `json:"status"` 24 } 25 26 func newHealthCheckResponse(healthCheckResult *checks.HealthCheckResult) HealthCheckResponse { 27 return HealthCheckResponse{ 28 Status: healthCheckResult.Status, 29 } 30 } 31 32 func createHealthCheck() HealthCheckLib.HealthCheck { 33 mongoConfig := db.GetDatabaseConfiguration() 34 rabbitConfig := queue.GetQueueConfiguration() 35 36 healthCheck := HealthCheckLib.New() 37 healthCheck.AddService(mongoConfig) 38 healthCheck.AddService(rabbitConfig) 39 40 return healthCheck 41 } 42 43 func Ping(c *gin.Context) { 44 c.Status(http.StatusOK) 45 } 46 47 func ExecuteOnAPI(c *gin.Context) { 48 healthCheck := createHealthCheck() 49 result := healthCheck.Execute() 50 status := http.StatusOK 51 52 if result.Status == Unhealthy { 53 logInstance("ExecuteOnAPI").ErrorBasicWithContent("Healthcheck is Unhealthy", "HealthCheck", result) 54 status = http.StatusServiceUnavailable 55 } 56 57 c.JSON(status, newHealthCheckResponse(&result)) 58 } 59 60 func ExecuteOnStartup() bool { 61 var logger = logInstance("ExecuteOnStartup") 62 logger.InfoWithBasic("Starting HealthCheck", "HealthCheck", nil) 63 64 healthCheck := createHealthCheck() 65 result := healthCheck.Execute() 66 67 if result.Status == Unhealthy { 68 stdlog.Println("Healthcheck is Unhealthy", result) 69 logger.ErrorBasicWithContent("Application Unhealthy. The application will be terminated", "HealthCheck", result) 70 shutdown() 71 72 return false 73 } 74 75 logger.InfoWithBasic("Result of check dependecies execution", "HealthCheck", map[string]interface{}{"Content": result}) 76 return true 77 } 78 79 func shutdown() { 80 time.Sleep(5 * time.Second) 81 panic(errors.New("healthcheck is unhealthy")) 82 } 83 84 func logInstance(operation string) *log.Log { 85 logger := log.CreateLog() 86 logger.Operation = operation 87 return logger 88 }