mirror of
https://github.com/logos-storage/nim-chroprof.git
synced 2026-01-03 14:03:09 +00:00
106 lines
3.3 KiB
Nim
106 lines
3.3 KiB
Nim
import std/times
|
|
import std/tables
|
|
|
|
import unittest2
|
|
import metrics
|
|
import chronos/[srcloc, timer]
|
|
|
|
import ../chroprof/[api, collector]
|
|
|
|
suite "metrics collector":
|
|
|
|
var locations = @[
|
|
SrcLoc(procedure: "start", file: "discovery.nim", line: 174),
|
|
SrcLoc(procedure: "start", file: "discovery.nim", line: 192),
|
|
SrcLoc(procedure: "query", file: "manager.nim", line: 323),
|
|
SrcLoc(procedure: "update", file: "sqliteds.nim", line: 107),
|
|
SrcLoc(procedure: "idle", file: "idle.nim", line: 100),
|
|
]
|
|
|
|
let sample = {
|
|
locations[0]: AggregateMetrics(
|
|
execTime: timer.nanoseconds(90062),
|
|
execTimeMax: timer.nanoseconds(80062),
|
|
childrenExecTime: timer.nanoseconds(52044),
|
|
wallClockTime: timer.nanoseconds(174567),
|
|
callCount: 1
|
|
),
|
|
locations[1]: AggregateMetrics(
|
|
execTime: timer.nanoseconds(91660),
|
|
execTimeMax: timer.nanoseconds(81660),
|
|
childrenExecTime: timer.nanoseconds(52495),
|
|
wallClockTime: timer.nanoseconds(72941),
|
|
callCount: 1
|
|
),
|
|
locations[2]: AggregateMetrics(
|
|
execTime: timer.nanoseconds(60529),
|
|
execTimeMax: timer.nanoseconds(60529),
|
|
childrenExecTime: timer.nanoseconds(9689),
|
|
wallClockTime: timer.nanoseconds(60784),
|
|
callCount: 1
|
|
),
|
|
locations[3]: AggregateMetrics(
|
|
execTime: timer.nanoseconds(60645),
|
|
execTimeMax: timer.nanoseconds(41257),
|
|
childrenExecTime: timer.nanoseconds(72934),
|
|
wallClockTime: timer.nanoseconds(60813),
|
|
callCount: 3
|
|
),
|
|
locations[4]: AggregateMetrics(
|
|
execTime: timer.nanoseconds(0),
|
|
execTimeMax: timer.nanoseconds(0),
|
|
childrenExecTime: timer.nanoseconds(0),
|
|
wallClockTime: timer.nanoseconds(60813),
|
|
callCount: 3
|
|
)
|
|
}.toTable
|
|
|
|
var wallTime = getTime()
|
|
|
|
var collector: ChronosProfilerInfo
|
|
|
|
proc setupCollector(k: int = high(int)): void =
|
|
collector = ChronosProfilerInfo.newCollector(
|
|
sampler = proc (): MetricsTotals = sample,
|
|
clock = proc (): Time = wallTime,
|
|
sampleInterval = times.initDuration(minutes = 5),
|
|
k = k,
|
|
)
|
|
|
|
collector.reset()
|
|
collector.collect()
|
|
|
|
test "should create labeled series for the k slowest procs in terms of execTime":
|
|
setupCollector(k = 3)
|
|
|
|
check chronos_exec_time_with_children_total.value(
|
|
labelValuesParam = @["start", "discovery.nim", "192"]) == 144155
|
|
check chronos_exec_time_with_children_total.value(
|
|
labelValuesParam = @["start", "discovery.nim", "174"]) == 142106
|
|
check chronos_exec_time_with_children_total.value(
|
|
labelValuesParam = @["update", "sqliteds.nim", "107"]) == 133579
|
|
|
|
# This is out of the top-k slowest, so should not have been recorded.
|
|
expect system.KeyError:
|
|
discard chronos_exec_time_with_children_total.value(
|
|
labelValuesParam = @["query", "manager.nim", "323"])
|
|
|
|
test "should not collect metrics again unless enough time has elapsed from last collection":
|
|
setupCollector()
|
|
|
|
check collector.collections == 1
|
|
collector.collect()
|
|
check collector.collections == 1
|
|
|
|
wallTime += 6.minutes
|
|
|
|
collector.collect()
|
|
check collector.collections == 2
|
|
|
|
test "should not collect metrics for futures with zero total exec time":
|
|
setupCollector()
|
|
|
|
expect system.KeyError:
|
|
discard chronos_exec_time_total.value(
|
|
labelValuesParam = @["idle", "idle.nim", "100"])
|