78 lines
2.2 KiB
Text
78 lines
2.2 KiB
Text
# Platform Service Health Checks
|
|
|
|
# Selective imports (ADR-025 Phase 3 Layer 2).
|
|
use platform/target.nu [get-deployment-service-config get-enabled-services]
|
|
|
|
# Check if service is healthy at its port
|
|
export def check-service-health [service: string] {
|
|
let config = (get-deployment-service-config $service)
|
|
let enabled = ($config.enabled? | default false)
|
|
|
|
if not $enabled {
|
|
return false
|
|
}
|
|
|
|
# Extract port
|
|
let port = (
|
|
if (($config.server?) != null) {
|
|
$config.server.port
|
|
} else if (($config.port?) != null) {
|
|
$config.port
|
|
} else {
|
|
return false
|
|
}
|
|
)
|
|
|
|
# Check using platform-specific command — always filter by port to avoid full scan
|
|
if ($nu.os-info.name == "macos") {
|
|
let result = (do { ^lsof -i $":($port)" -P -n } | complete)
|
|
($result.exit_code == 0) and ($result.stdout | str contains "LISTEN")
|
|
} else {
|
|
let result = (do { ^ss -tlnp $"sport = :($port)" } | complete)
|
|
if ($result.exit_code == 0) {
|
|
($result.stdout | lines | skip 1 | length) > 0
|
|
} else {
|
|
# fallback: netstat with port grep
|
|
let r2 = (do { ^netstat -tlnp } | complete)
|
|
($r2.exit_code == 0) and ($r2.stdout | str contains $":($port) ")
|
|
}
|
|
}
|
|
}
|
|
|
|
# Check all enabled services
|
|
export def check-all-services [] {
|
|
let services = (get-enabled-services)
|
|
|
|
$services | each {|item|
|
|
let healthy = (check-service-health $item.name)
|
|
{
|
|
name: $item.name
|
|
status: (if $healthy { "healthy" } else { "unhealthy" })
|
|
priority: $item.priority
|
|
}
|
|
}
|
|
}
|
|
|
|
# Get health status for all services
|
|
export def check-required-services [] {
|
|
check-all-services
|
|
}
|
|
|
|
# Wait for service to become healthy
|
|
export def wait-for-service [service: string, --timeout_seconds: int = 30] {
|
|
let max_attempts = 60
|
|
let attempt_list = (seq 1 $max_attempts)
|
|
|
|
let results = (
|
|
$attempt_list | each {|_attempt|
|
|
if (check-service-health $service) {
|
|
"healthy"
|
|
} else {
|
|
sleep 500ms
|
|
"checking"
|
|
}
|
|
}
|
|
)
|
|
|
|
($results | any {|status| $status == "healthy"})
|
|
}
|