refactor: metrics server. Simplify app.nim module (#2650)

This commit is contained in:
Ivan FB 2024-04-30 15:07:17 +02:00 committed by GitHub
parent 6382dedb42
commit 4a110f65ff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 42 additions and 50 deletions

View File

@ -20,6 +20,7 @@ import
../../waku/factory/networks_config, ../../waku/factory/networks_config,
../../waku/factory/app, ../../waku/factory/app,
../../waku/node/health_monitor, ../../waku/node/health_monitor,
../../waku/node/waku_metrics,
../../waku/waku_api/rest/builder as rest_server_builder ../../waku/waku_api/rest/builder as rest_server_builder
logScope: logScope:
@ -152,7 +153,7 @@ when isMainModule:
error "Starting protocols support REST server failed.", error = $error error "Starting protocols support REST server failed.", error = $error
quit(QuitFailure) quit(QuitFailure)
wakunode2.startMetricsServerAndLogging().isOkOr: wakunode2.metricsServer = waku_metrics.startMetricsServerAndLogging(conf).valueOr:
error "Starting monitoring and external interfaces failed", error = error error "Starting monitoring and external interfaces failed", error = error
quit(QuitFailure) quit(QuitFailure)

View File

@ -51,8 +51,8 @@ suite "Wakunode2 - App initialization":
wakunode2.startApp().isOkOr: wakunode2.startApp().isOkOr:
raiseAssert error raiseAssert error
let mountRes = wakunode2.startMetricsServerAndLogging() wakunode2.metricsServer = waku_metrics.startMetricsServerAndLogging(conf).valueOr:
assert mountRes.isOk(), mountRes.error raiseAssert error
## Then ## Then
let node = wakunode2.node let node = wakunode2.node

View File

@ -65,7 +65,7 @@ type
node: WakuNode node: WakuNode
restServer*: WakuRestServerRef restServer*: WakuRestServerRef
metricsServer: Option[MetricsHttpServerRef] metricsServer*: MetricsHttpServerRef
AppResult*[T] = Result[T, string] AppResult*[T] = Result[T, string]
@ -273,56 +273,14 @@ proc startApp*(app: var App): AppResult[void] =
return ok() return ok()
proc startMetricsServer(
serverIp: IpAddress, serverPort: Port
): AppResult[MetricsHttpServerRef] =
info "Starting metrics HTTP server", serverIp = $serverIp, serverPort = $serverPort
let metricsServerRes = MetricsHttpServerRef.new($serverIp, serverPort)
if metricsServerRes.isErr():
return err("metrics HTTP server start failed: " & $metricsServerRes.error)
let server = metricsServerRes.value
try:
waitFor server.start()
except CatchableError:
return err("metrics HTTP server start failed: " & getCurrentExceptionMsg())
info "Metrics HTTP server started", serverIp = $serverIp, serverPort = $serverPort
ok(server)
proc startMetricsLogging(): AppResult[void] =
startMetricsLog()
ok()
proc startMetricsServerAndLogging*(app: var App): AppResult[void] =
if app.conf.metricsServer:
let startMetricsServerRes = startMetricsServer(
app.conf.metricsServerAddress,
Port(app.conf.metricsServerPort + app.conf.portsShift),
)
if startMetricsServerRes.isErr():
error "Starting metrics server failed. Continuing in current state.",
error = startMetricsServerRes.error
else:
app.metricsServer = some(startMetricsServerRes.value)
if app.conf.metricsLogging:
let startMetricsLoggingRes = startMetricsLogging()
if startMetricsLoggingRes.isErr():
error "Starting metrics console logging failed. Continuing in current state.",
error = startMetricsLoggingRes.error
ok()
# App shutdown # App shutdown
proc stop*(app: App): Future[void] {.async: (raises: [Exception]).} = proc stop*(app: App): Future[void] {.async: (raises: [Exception]).} =
if app.conf.rest: if not app.restServer.isNil():
await app.restServer.stop() await app.restServer.stop()
if app.metricsServer.isSome(): if not app.metricsServer.isNil():
await app.metricsServer.get().stop() await app.metricsServer.stop()
if app.wakuDiscv5.isSome(): if app.wakuDiscv5.isSome():
await app.wakuDiscv5.get().stop() await app.wakuDiscv5.get().stop()

View File

@ -8,7 +8,8 @@ import
../waku_rln_relay/protocol_metrics as rln_metrics, ../waku_rln_relay/protocol_metrics as rln_metrics,
../utils/collector, ../utils/collector,
./peer_manager, ./peer_manager,
./waku_node ./waku_node,
../factory/external_config
const LogInterval = 10.minutes const LogInterval = 10.minutes
@ -54,3 +55,35 @@ proc startMetricsLog*() =
) )
discard setTimer(Moment.fromNow(LogInterval), logMetrics) discard setTimer(Moment.fromNow(LogInterval), logMetrics)
proc startMetricsServer(
serverIp: IpAddress, serverPort: Port
): Result[MetricsHttpServerRef, string] =
info "Starting metrics HTTP server", serverIp = $serverIp, serverPort = $serverPort
let server = MetricsHttpServerRef.new($serverIp, serverPort).valueOr:
return err("metrics HTTP server start failed: " & $error)
try:
waitFor server.start()
except CatchableError:
return err("metrics HTTP server start failed: " & getCurrentExceptionMsg())
info "Metrics HTTP server started", serverIp = $serverIp, serverPort = $serverPort
return ok(server)
proc startMetricsServerAndLogging*(
conf: WakuNodeConf
): Result[MetricsHttpServerRef, string] =
var metricsServer: MetricsHttpServerRef
if conf.metricsServer:
metricsServer = startMetricsServer(
conf.metricsServerAddress, Port(conf.metricsServerPort + conf.portsShift)
).valueOr:
return
err("Starting metrics server failed. Continuing in current state:" & $error)
if conf.metricsLogging:
startMetricsLog()
return ok(metricsServer)