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  }