Restores todo metric

This commit is contained in:
Ben 2025-02-12 15:16:59 +01:00
parent 7378148ed8
commit e8ec737285
No known key found for this signature in database
GPG Key ID: 0F16E812E736C24B
4 changed files with 29 additions and 6 deletions

View File

@ -40,6 +40,7 @@ method start*(d: DhtMetrics): Future[?!void] {.async.} =
proc onCheck(event: DhtNodeCheckEventData): Future[?!void] {.async.} =
await d.handleCheckEvent(event)
d.sub = d.state.events.dhtNodeCheck.subscribe(onCheck)
return success()

View File

@ -11,6 +11,7 @@ import ../state
import ../types
import ../component
import ../utils/asyncdataevent
import ../services/metrics
logScope:
topics = "todolist"
@ -21,11 +22,14 @@ type TodoList* = ref object of Component
subNew: AsyncDataEventSubscription
subExp: AsyncDataEventSubscription
emptySignal: ?Future[void]
metrics: Metrics
proc addNodes(t: TodoList, nids: seq[Nid]) =
for nid in nids:
t.nids.add(nid)
t.metrics.setTodoNodes(t.nids.len)
if s =? t.emptySignal:
trace "Nodes added, resuming...", nodes = nids.len
s.complete()
@ -64,8 +68,10 @@ method stop*(t: TodoList): Future[?!void] {.async.} =
await t.state.events.nodesExpired.unsubscribe(t.subExp)
return success()
proc new*(_: type TodoList, state: State): TodoList =
TodoList(nids: newSeq[Nid](), state: state, emptySignal: Future[void].none)
proc new*(_: type TodoList, state: State, metrics: Metrics): TodoList =
TodoList(
nids: newSeq[Nid](), state: state, emptySignal: Future[void].none, metrics: metrics
)
proc createTodoList*(state: State): TodoList =
TodoList.new(state)
proc createTodoList*(state: State, metrics: Metrics): TodoList =
TodoList.new(state, metrics)

View File

@ -22,7 +22,7 @@ proc createComponents*(state: State): Future[?!seq[Component]] {.async.} =
let
metrics = createMetrics(state.config.metricsAddress, state.config.metricsPort)
todoList = createTodoList(state)
todoList = createTodoList(state, metrics)
without dhtMetrics =? createDhtMetrics(state, metrics), err:
return failure(err)

View File

@ -7,19 +7,22 @@ import ../../../codexcrawler/utils/asyncdataevent
import ../../../codexcrawler/types
import ../../../codexcrawler/state
import ../mocks/mockstate
import ../mocks/mockmetrics
import ../helpers
suite "TodoList":
var
nid: Nid
state: MockState
metrics: MockMetrics
todo: TodoList
setup:
nid = genNid()
state = createMockState()
metrics = createMockMetrics()
todo = TodoList.new(state)
todo = TodoList.new(state, metrics)
(await todo.start()).tryGet()
@ -47,6 +50,19 @@ suite "TodoList":
check:
item == nid
test "newNodesDiscovered event updates todo metric":
await fireNewNodesDiscoveredEvent(@[nid])
check:
metrics.todo == 1
test "nodesExpired event updates todo metric":
await fireNodesExpiredEvent(@[nid])
let item = (await todo.pop).tryGet()
check:
metrics.todo == 1
test "pop on empty todo list waits until item is added":
let popFuture = todo.pop()
check: