FEATURE (databases): Add healthcheck MySQL and MariaDB

This commit is contained in:
Rostislav Dugin
2025-12-21 21:11:55 +03:00
parent da9b279e8b
commit 94a7da2ace
4 changed files with 36 additions and 27 deletions

View File

@@ -8,9 +8,9 @@ import (
)
type HealthcheckAttemptBackgroundService struct {
healthcheckConfigService *healthcheck_config.HealthcheckConfigService
checkPgHealthUseCase *CheckPgHealthUseCase
logger *slog.Logger
healthcheckConfigService *healthcheck_config.HealthcheckConfigService
checkDatabaseHealthUseCase *CheckDatabaseHealthUseCase
logger *slog.Logger
}
func (s *HealthcheckAttemptBackgroundService) Run() {
@@ -39,9 +39,9 @@ func (s *HealthcheckAttemptBackgroundService) checkDatabases() {
for _, healthcheckConfig := range healthcheckConfigs {
go func(healthcheckConfig *healthcheck_config.HealthcheckConfig) {
err := s.checkPgHealthUseCase.Execute(now, healthcheckConfig)
err := s.checkDatabaseHealthUseCase.Execute(now, healthcheckConfig)
if err != nil {
s.logger.Error("failed to check pg health", "error", err)
s.logger.Error("failed to check database health", "error", err)
}
}(&healthcheckConfig)
}

View File

@@ -13,13 +13,13 @@ import (
"gorm.io/gorm"
)
type CheckPgHealthUseCase struct {
type CheckDatabaseHealthUseCase struct {
healthcheckAttemptRepository *HealthcheckAttemptRepository
healthcheckAttemptSender HealthcheckAttemptSender
databaseService DatabaseService
}
func (uc *CheckPgHealthUseCase) Execute(
func (uc *CheckDatabaseHealthUseCase) Execute(
now time.Time,
healthcheckConfig *healthcheck_config.HealthcheckConfig,
) error {
@@ -68,7 +68,7 @@ func (uc *CheckPgHealthUseCase) Execute(
err = uc.healthcheckAttemptRepository.DeleteOlderThan(
database.ID,
time.Now().Add(-time.Duration(healthcheckConfig.StoreAttemptsDays)*24*time.Hour),
time.Now().UTC().Add(-time.Duration(healthcheckConfig.StoreAttemptsDays)*24*time.Hour),
)
if err != nil {
return err
@@ -77,7 +77,7 @@ func (uc *CheckPgHealthUseCase) Execute(
return nil
}
func (uc *CheckPgHealthUseCase) updateDatabaseHealthStatusIfChanged(
func (uc *CheckDatabaseHealthUseCase) updateDatabaseHealthStatusIfChanged(
database *databases.Database,
healthcheckConfig *healthcheck_config.HealthcheckConfig,
heathcheckAttempt *HealthcheckAttempt,
@@ -147,7 +147,7 @@ func (uc *CheckPgHealthUseCase) updateDatabaseHealthStatusIfChanged(
return nil
}
func (uc *CheckPgHealthUseCase) healthcheckDatabase(
func (uc *CheckDatabaseHealthUseCase) healthcheckDatabase(
now time.Time,
database *databases.Database,
) (*HealthcheckAttempt, error) {
@@ -175,21 +175,30 @@ func (uc *CheckPgHealthUseCase) healthcheckDatabase(
return attempt, nil
}
func (uc *CheckPgHealthUseCase) validateDatabase(
func (uc *CheckDatabaseHealthUseCase) validateDatabase(
database *databases.Database,
) error {
if database.Type != databases.DatabaseTypePostgres {
return errors.New("database type is not postgres")
}
if database.Postgresql == nil {
return errors.New("database Postgresql is not set")
switch database.Type {
case databases.DatabaseTypePostgres:
if database.Postgresql == nil {
return fmt.Errorf("database Postgresql config is not set")
}
case databases.DatabaseTypeMysql:
if database.Mysql == nil {
return fmt.Errorf("database MySQL config is not set")
}
case databases.DatabaseTypeMariadb:
if database.Mariadb == nil {
return fmt.Errorf("database MariaDB config is not set")
}
default:
return fmt.Errorf("unsupported database type: %s", database.Type)
}
return nil
}
func (uc *CheckPgHealthUseCase) isReadyForNewAttempt(
func (uc *CheckDatabaseHealthUseCase) isReadyForNewAttempt(
now time.Time,
database *databases.Database,
healthcheckConfig *healthcheck_config.HealthcheckConfig,
@@ -211,7 +220,7 @@ func (uc *CheckPgHealthUseCase) isReadyForNewAttempt(
return now.After(nextAttemptTime.Add(-1 * time.Second)), nil
}
func (uc *CheckPgHealthUseCase) sendDbStatusNotification(
func (uc *CheckDatabaseHealthUseCase) sendDbStatusNotification(
healthcheckConfig *healthcheck_config.HealthcheckConfig,
database *databases.Database,
newHealthStatus databases.HealthStatus,

View File

@@ -18,7 +18,7 @@ import (
"github.com/stretchr/testify/mock"
)
func Test_CheckPgHealthUseCase(t *testing.T) {
func Test_CheckDatabaseHealthUseCase(t *testing.T) {
user := users_testing.CreateTestUser(users_enums.UserRoleAdmin)
// Create workspace directly via service
@@ -65,7 +65,7 @@ func Test_CheckPgHealthUseCase(t *testing.T) {
}
// Create use case with mock sender
useCase := &CheckPgHealthUseCase{
useCase := &CheckDatabaseHealthUseCase{
healthcheckAttemptRepository: &HealthcheckAttemptRepository{},
healthcheckAttemptSender: mockSender,
databaseService: mockDatabaseService,
@@ -129,7 +129,7 @@ func Test_CheckPgHealthUseCase(t *testing.T) {
}
// Create use case with mock sender
useCase := &CheckPgHealthUseCase{
useCase := &CheckDatabaseHealthUseCase{
healthcheckAttemptRepository: &HealthcheckAttemptRepository{},
healthcheckAttemptSender: mockSender,
databaseService: mockDatabaseService,
@@ -206,7 +206,7 @@ func Test_CheckPgHealthUseCase(t *testing.T) {
}
// Create use case with mock sender
useCase := &CheckPgHealthUseCase{
useCase := &CheckDatabaseHealthUseCase{
healthcheckAttemptRepository: &HealthcheckAttemptRepository{},
healthcheckAttemptSender: mockSender,
databaseService: mockDatabaseService,
@@ -282,7 +282,7 @@ func Test_CheckPgHealthUseCase(t *testing.T) {
}
// Create use case with mock sender
useCase := &CheckPgHealthUseCase{
useCase := &CheckDatabaseHealthUseCase{
healthcheckAttemptRepository: &HealthcheckAttemptRepository{},
healthcheckAttemptSender: mockSender,
databaseService: mockDatabaseService,
@@ -349,7 +349,7 @@ func Test_CheckPgHealthUseCase(t *testing.T) {
}
// Create use case with mock sender
useCase := &CheckPgHealthUseCase{
useCase := &CheckDatabaseHealthUseCase{
healthcheckAttemptRepository: &HealthcheckAttemptRepository{},
healthcheckAttemptSender: mockSender,
databaseService: mockDatabaseService,

View File

@@ -15,7 +15,7 @@ var healthcheckAttemptService = &HealthcheckAttemptService{
workspaces_services.GetWorkspaceService(),
}
var checkPgHealthUseCase = &CheckPgHealthUseCase{
var checkDatabaseHealthUseCase = &CheckDatabaseHealthUseCase{
healthcheckAttemptRepository,
notifiers.GetNotifierService(),
databases.GetDatabaseService(),
@@ -23,7 +23,7 @@ var checkPgHealthUseCase = &CheckPgHealthUseCase{
var healthcheckAttemptBackgroundService = &HealthcheckAttemptBackgroundService{
healthcheck_config.GetHealthcheckConfigService(),
checkPgHealthUseCase,
checkDatabaseHealthUseCase,
logger.GetLogger(),
}
var healthcheckAttemptController = &HealthcheckAttemptController{