12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- discard """
- matrix: "-d:nimNoLentIterators --mm:arc"
- output: '''PUSH DATA: {"test.message":{"test":{"nested":"v1"}}}'''
- joinable: false
- """
- # bug #22748
- import std/[json, typetraits, times]
- # publish
- proc publish*[T](payload: T) =
- discard
- type MetricsPoint* = JsonNode
- proc push*(stat: string, data: JsonNode, usec: int64 = 0) =
- let payload = newJObject()
- # this results in a infinite recursion unless we deepCopy()
- payload[stat] = data #.deepCopy
- echo "PUSH DATA: ", payload
- publish[MetricsPoint](payload)
- var scopes {.threadvar.}: seq[JsonNode]
- type WithTimeCallback*[T] = proc(data: var JsonNode): T
- proc pushScoped*[T](metric: string, blk: WithTimeCallback[T]): T {.gcsafe.} =
- scopes.add newJObject()
- defer: discard scopes.pop()
- let stc = (cpuTime() * 1000_000).int64
- result = blk(scopes[^1])
- let dfc = (cpuTime() * 1000_000).int64 - stc
- push(metric, scopes[^1], dfc)
- # demo code
- discard pushScoped[int]("test.message") do (data: var JsonNode) -> int:
- data["test"] = %*{
- "nested": "v1"
- }
|