
that checks for every environment if the filled share of the prewarmin pool is at least the specified threshold.
43 lines
1.4 KiB
Go
43 lines
1.4 KiB
Go
package api
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"github.com/openHPI/poseidon/internal/config"
|
|
"github.com/openHPI/poseidon/internal/environment"
|
|
"github.com/openHPI/poseidon/pkg/dto"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
var ErrorPrewarmingPoolDepleting = errors.New("the prewarming pool is depleting")
|
|
|
|
// Health handles the health route.
|
|
// It responds that the server is alive.
|
|
// If it is not, the response won't reach the client.
|
|
func Health(manager environment.Manager) http.HandlerFunc {
|
|
return func(writer http.ResponseWriter, request *http.Request) {
|
|
if err := checkPrewarmingPool(manager); err != nil {
|
|
sendJSON(writer, &dto.InternalServerError{Message: err.Error(), ErrorCode: dto.PrewarmingPoolDepleting},
|
|
http.StatusServiceUnavailable, request.Context())
|
|
return
|
|
}
|
|
|
|
writer.WriteHeader(http.StatusNoContent)
|
|
}
|
|
}
|
|
|
|
func checkPrewarmingPool(manager environment.Manager) error {
|
|
var depletingEnvironments []int
|
|
for _, data := range manager.Statistics() {
|
|
if float64(data.IdleRunners)/float64(data.PrewarmingPoolSize) < config.Config.Server.PrewarmingPoolAlertThreshold {
|
|
depletingEnvironments = append(depletingEnvironments, data.ID)
|
|
}
|
|
}
|
|
if len(depletingEnvironments) > 0 {
|
|
arrayToString := strings.Trim(strings.Join(strings.Fields(fmt.Sprint(depletingEnvironments)), ","), "[]")
|
|
return fmt.Errorf("%w: environments %s", ErrorPrewarmingPoolDepleting, arrayToString)
|
|
}
|
|
return nil
|
|
}
|