|
|
|
@@ -0,0 +1,44 @@ |
|
|
|
package server |
|
|
|
|
|
|
|
import ( |
|
|
|
"context" |
|
|
|
"strings" |
|
|
|
"time" |
|
|
|
|
|
|
|
"github.com/AFASystems/presence/internal/pkg/common/appcontext" |
|
|
|
"github.com/segmentio/kafka-go" |
|
|
|
"gorm.io/gorm" |
|
|
|
) |
|
|
|
|
|
|
|
const healthCheckTimeout = 3 * time.Second |
|
|
|
|
|
|
|
// CheckKafkaHealth dials the broker and returns ServiceStatus. Uses first broker from kafkaURL (comma-separated). |
|
|
|
func CheckKafkaHealth(ctx context.Context, kafkaURL string) appcontext.ServiceStatus { |
|
|
|
if kafkaURL == "" { |
|
|
|
return appcontext.ServiceStatus{Status: "down", Message: "no broker URL"} |
|
|
|
} |
|
|
|
broker := strings.TrimSpace(strings.Split(kafkaURL, ",")[0]) |
|
|
|
tctx, cancel := context.WithTimeout(ctx, healthCheckTimeout) |
|
|
|
defer cancel() |
|
|
|
dialer := &kafka.Dialer{Timeout: healthCheckTimeout} |
|
|
|
conn, err := dialer.DialContext(tctx, "tcp", broker) |
|
|
|
if err != nil { |
|
|
|
return appcontext.ServiceStatus{Status: "down", Message: err.Error()} |
|
|
|
} |
|
|
|
_ = conn.Close() |
|
|
|
return appcontext.ServiceStatus{Status: "up"} |
|
|
|
} |
|
|
|
|
|
|
|
// CheckDBHealth pings the database and returns ServiceStatus. |
|
|
|
func CheckDBHealth(ctx context.Context, db *gorm.DB) appcontext.ServiceStatus { |
|
|
|
sqlDB, err := db.DB() |
|
|
|
if err != nil { |
|
|
|
return appcontext.ServiceStatus{Status: "down", Message: err.Error()} |
|
|
|
} |
|
|
|
tctx, cancel := context.WithTimeout(ctx, healthCheckTimeout) |
|
|
|
defer cancel() |
|
|
|
if err := sqlDB.PingContext(tctx); err != nil { |
|
|
|
return appcontext.ServiceStatus{Status: "down", Message: err.Error()} |
|
|
|
} |
|
|
|
return appcontext.ServiceStatus{Status: "up"} |
|
|
|
} |