87 lines
2.4 KiB
Nim
Raw Normal View History

import pkg/chronicles
import pkg/chronos
import pkg/questionable
import pkg/questionable/results
import ../state
import ../services/metrics
import ../services/marketplace
2025-03-20 16:20:37 +01:00
import ../components/requeststore
import ../component
2025-03-21 09:41:05 +01:00
import ../types
logScope:
topics = "chainmetrics"
2025-03-21 09:41:05 +01:00
type
ChainMetrics* = ref object of Component
state: State
metrics: Metrics
store: RequestStore
marketplace: MarketplaceService
Update = ref object
numRequests: int
numPending: int
2025-03-21 09:41:05 +01:00
numSlots: int
totalSize: int64
totalPrice: uint64
2025-03-21 09:41:05 +01:00
proc collectUpdate(c: ChainMetrics): Future[?!Update] {.async: (raises: []).} =
var update = Update(
numRequests: 0, numPending: 0, numSlots: 0, totalSize: 0, totalPrice: 0.uint64
)
2025-03-21 09:41:05 +01:00
proc onRequest(entry: RequestEntry): Future[?!void] {.async: (raises: []).} =
let response = await c.marketplace.getRequestInfo(entry.id)
if info =? response:
if info.pending:
trace "request is pending", id = $entry.id
inc update.numPending
else:
trace "request is running", id = $entry.id
inc update.numRequests
update.numSlots += info.slots.int
update.totalSize += (info.slots * info.slotSize).int64
update.totalPrice += info.pricePerBytePerSecond
2025-03-21 09:41:05 +01:00
else:
?await c.store.remove(entry.id)
2025-03-21 09:41:05 +01:00
return success()
?await c.store.iterateAll(onRequest)
return success(update)
proc updateMetrics(c: ChainMetrics, update: Update) =
c.metrics.setRequests(update.numRequests)
c.metrics.setPendingRequests(update.numPending)
2025-03-21 09:41:05 +01:00
c.metrics.setRequestSlots(update.numSlots)
c.metrics.setTotalSize(update.totalSize)
c.metrics.setPrice(update.totalPrice.int64)
proc step(c: ChainMetrics): Future[?!void] {.async: (raises: []).} =
2025-03-21 09:41:05 +01:00
without update =? (await c.collectUpdate()), err:
return failure(err)
c.updateMetrics(update)
return success()
2025-06-02 14:30:28 +02:00
method start*(c: ChainMetrics): Future[?!void] {.async: (raises: [CancelledError]).} =
2025-03-19 15:52:50 +01:00
info "starting..."
proc onStep(): Future[?!void] {.async: (raises: []), gcsafe.} =
return await c.step()
if c.state.config.marketplaceEnable:
2025-03-24 09:05:07 +01:00
await c.state.whileRunning(onStep, c.state.config.requestCheckDelay.minutes)
return success()
proc new*(
2025-03-18 15:55:58 +01:00
T: type ChainMetrics,
state: State,
metrics: Metrics,
2025-03-20 16:20:37 +01:00
store: RequestStore,
2025-03-21 09:41:05 +01:00
marketplace: MarketplaceService,
): ChainMetrics =
2025-03-24 14:16:12 +01:00
ChainMetrics(state: state, metrics: metrics, store: store, marketplace: marketplace)