feat: include metric type and help

This commit is contained in:
Marcin Czenko 2026-06-18 19:47:34 +02:00
parent 94e0abd579
commit ebd8a42755
No known key found for this signature in database
GPG Key ID: F6CB3ED4082ED433
2 changed files with 93 additions and 12 deletions

View File

@ -1,11 +1,28 @@
import std/[json, locks, times, sets]
import std/[json, locks, strutils, times, sets]
import pkg/metrics
proc jsonHelp(collector: Collector): string =
let prefix = "# HELP " & collector.name & " "
if collector.help.startsWith(prefix):
return collector.help[prefix.len .. ^1].strip(leading = false, trailing = true)
return ""
proc jsonType(collector: Collector): string =
let parts = collector.typ.splitWhitespace()
if parts.len == 4 and parts[0] == "#" and parts[1] == "TYPE" and
parts[2] == collector.name:
return parts[3]
return "unknown"
proc toJson(collector: Collector, metrics: var seq[JsonNode]) =
# We know the closure won't outlive `metrics` so this is
# an acceptable hack.
let metricsPtr = addr metrics
let help = collector.jsonHelp()
let typ = collector.jsonType()
proc serializeMetric(
name: string,
@ -22,7 +39,9 @@ proc toJson(collector: Collector, metrics: var seq[JsonNode]) =
for i in 0 ..< min(labelValues.len, labels.len):
labelMap[labels[i]] = %labelValues[i]
metricsPtr[].add(%*{"name": name, "value": value, "labels": labelMap})
metricsPtr[].add(
%*{"name": name, "type": typ, "help": help, "value": value, "labels": labelMap}
)
collector.collect(serializeMetric)

View File

@ -56,15 +56,69 @@ suite "Metrics":
check filteredMetrics ==
%*{
"metrics": [
{"name": "myCounter_total", "value": 1.0, "labels": {"part_type": "screws"}},
{"name": "myCounter_total", "value": 1.0, "labels": {"part_type": "washers"}},
{"name": "myGauge", "value": 42.0, "labels": {}},
{"name": "myHistogram_sum", "value": 15.0, "labels": {}},
{"name": "myHistogram_count", "value": 5.0, "labels": {}},
{"name": "myHistogram_bucket", "value": 0.0, "labels": {"le": "0.0"}},
{"name": "myHistogram_bucket", "value": 1.0, "labels": {"le": "1.0"}},
{"name": "myHistogram_bucket", "value": 2.0, "labels": {"le": "2.0"}},
{"name": "myHistogram_bucket", "value": 5.0, "labels": {"le": "+Inf"}},
{
"name": "myCounter_total",
"type": "counter",
"help": "Parts Counter",
"value": 1.0,
"labels": {"part_type": "screws"},
},
{
"name": "myCounter_total",
"type": "counter",
"help": "Parts Counter",
"value": 1.0,
"labels": {"part_type": "washers"},
},
{
"name": "myGauge",
"type": "gauge",
"help": "My gauge",
"value": 42.0,
"labels": {},
},
{
"name": "myHistogram_sum",
"type": "histogram",
"help": "My histogram",
"value": 15.0,
"labels": {},
},
{
"name": "myHistogram_count",
"type": "histogram",
"help": "My histogram",
"value": 5.0,
"labels": {},
},
{
"name": "myHistogram_bucket",
"type": "histogram",
"help": "My histogram",
"value": 0.0,
"labels": {"le": "0.0"},
},
{
"name": "myHistogram_bucket",
"type": "histogram",
"help": "My histogram",
"value": 1.0,
"labels": {"le": "1.0"},
},
{
"name": "myHistogram_bucket",
"type": "histogram",
"help": "My histogram",
"value": 2.0,
"labels": {"le": "2.0"},
},
{
"name": "myHistogram_bucket",
"type": "histogram",
"help": "My histogram",
"value": 5.0,
"labels": {"le": "+Inf"},
},
]
}
@ -76,9 +130,17 @@ suite "Metrics":
check metrics ==
%*{
"metrics": [
{"name": "bad_metric", "value": 1.0, "labels": {"label1": "value1"}},
{
"name": "bad_metric",
"type": "gauge",
"help": "Badly behaved collector",
"value": 1.0,
"labels": {"label1": "value1"},
},
{
"name": "bad_metric",
"type": "gauge",
"help": "Badly behaved collector",
"value": 1.0,
"labels": {"label1": "value1", "label2": "value2"},
},