2024-06-28 10:34:57 +00:00
|
|
|
{.push raises: [].}
|
2024-04-23 16:53:18 +00:00
|
|
|
|
|
|
|
import std/[options], chronos
|
|
|
|
|
|
|
|
import waku_node, ../waku_rln_relay
|
|
|
|
|
|
|
|
type
|
|
|
|
HealthStatus* = enum
|
|
|
|
INITIALIZING
|
|
|
|
SYNCHRONIZING
|
|
|
|
READY
|
|
|
|
NOT_READY
|
|
|
|
NOT_MOUNTED
|
|
|
|
SHUTTING_DOWN
|
|
|
|
|
|
|
|
ProtocolHealth* = object
|
|
|
|
protocol*: string
|
|
|
|
health*: HealthStatus
|
|
|
|
|
|
|
|
HealthReport* = object
|
|
|
|
nodeHealth*: HealthStatus
|
|
|
|
protocolsHealth*: seq[ProtocolHealth]
|
|
|
|
|
|
|
|
WakuNodeHealthMonitor* = ref object
|
|
|
|
nodeHealth: HealthStatus
|
|
|
|
node: Option[WakuNode]
|
|
|
|
|
|
|
|
proc `$`*(t: HealthStatus): string =
|
|
|
|
result =
|
|
|
|
case t
|
|
|
|
of INITIALIZING: "Initializing"
|
|
|
|
of SYNCHRONIZING: "Synchronizing"
|
|
|
|
of READY: "Ready"
|
|
|
|
of NOT_READY: "Not Ready"
|
|
|
|
of NOT_MOUNTED: "Not Mounted"
|
|
|
|
of SHUTTING_DOWN: "Shutting Down"
|
|
|
|
|
|
|
|
proc init*(
|
|
|
|
t: typedesc[HealthStatus], strRep: string
|
|
|
|
): HealthStatus {.raises: [ValueError].} =
|
|
|
|
case strRep
|
|
|
|
of "Initializing":
|
|
|
|
return HealthStatus.INITIALIZING
|
|
|
|
of "Synchronizing":
|
|
|
|
return HealthStatus.SYNCHRONIZING
|
|
|
|
of "Ready":
|
|
|
|
return HealthStatus.READY
|
|
|
|
of "Not Ready":
|
|
|
|
return HealthStatus.NOT_READY
|
|
|
|
of "Not Mounted":
|
|
|
|
return HealthStatus.NOT_MOUNTED
|
|
|
|
of "Shutting Down":
|
|
|
|
return HealthStatus.SHUTTING_DOWN
|
|
|
|
else:
|
|
|
|
raise newException(ValueError, "Invalid HealthStatus string representation")
|
|
|
|
|
|
|
|
const FutIsReadyTimout = 5.seconds
|
|
|
|
|
|
|
|
proc getNodeHealthReport*(hm: WakuNodeHealthMonitor): Future[HealthReport] {.async.} =
|
|
|
|
result.nodeHealth = hm.nodeHealth
|
|
|
|
|
|
|
|
if hm.node.isSome() and hm.node.get().wakuRlnRelay != nil:
|
|
|
|
let getRlnRelayHealth = proc(): Future[HealthStatus] {.async.} =
|
|
|
|
let isReadyStateFut = hm.node.get().wakuRlnRelay.isReady()
|
|
|
|
if not await isReadyStateFut.withTimeout(FutIsReadyTimout):
|
|
|
|
return HealthStatus.NOT_READY
|
|
|
|
|
|
|
|
try:
|
|
|
|
if not isReadyStateFut.completed():
|
|
|
|
return HealthStatus.NOT_READY
|
|
|
|
elif isReadyStateFut.read():
|
|
|
|
return HealthStatus.READY
|
|
|
|
|
|
|
|
return HealthStatus.SYNCHRONIZING
|
|
|
|
except:
|
|
|
|
error "exception reading state: " & getCurrentExceptionMsg()
|
|
|
|
return HealthStatus.NOT_READY
|
|
|
|
|
|
|
|
result.protocolsHealth.add(
|
|
|
|
ProtocolHealth(protocol: "Rln Relay", health: await getRlnRelayHealth())
|
|
|
|
)
|
|
|
|
|
|
|
|
proc setNode*(hm: WakuNodeHealthMonitor, node: WakuNode) =
|
|
|
|
hm.node = some(node)
|
|
|
|
|
|
|
|
proc setOverallHealth*(hm: WakuNodeHealthMonitor, health: HealthStatus) =
|
|
|
|
hm.nodeHealth = health
|