2025-03-20 15:27:17 +01:00

63 lines
1.7 KiB
Nim

import pkg/chronicles
import pkg/chronos
import pkg/questionable
import pkg/questionable/results
import ../state
import ../services/metrics
import ../services/marketplace
import ../component
logScope:
topics = "chainmetrics"
type ChainMetrics* = ref object of Component
state: State
metrics: Metrics
marketplace: MarketplaceService
proc step(c: ChainMetrics): Future[?!void] {.async: (raises: []).} =
# replace slotFills entirely:
# iterate all requests in requestStore:
# get state of request on chain
# if failed/canceled/error:
# if last-seen is old (1month?3months?)
# delete entry
# else (request is running):
# count:
# total running
# total num slots
# total size of request
# iter finished: update metrics!
# without slotFills =? (await c.marketplace.getRecentSlotFillEvents()), err:
# trace "Unable to get recent slotFill events from chain", err = err.msg
# return success() # We don't propagate this error.
# # The call is allowed to fail and the app should continue as normal.
# c.metrics.setSlotFill(slotFills.len)
return success()
method start*(c: ChainMetrics): Future[?!void] {.async.} =
info "starting..."
proc onStep(): Future[?!void] {.async: (raises: []), gcsafe.} =
return await c.step()
if c.state.config.marketplaceEnable:
await c.state.whileRunning(onStep, 10.minutes)
return success()
method stop*(c: ChainMetrics): Future[?!void] {.async.} =
return success()
proc new*(
T: type ChainMetrics,
state: State,
metrics: Metrics,
marketplace: MarketplaceService,
): ChainMetrics =
ChainMetrics(state: state, metrics: metrics, marketplace: marketplace)