diff --git a/library/logosmetrics.nim b/library/logosmetrics.nim index ebf83671..338e1092 100644 --- a/library/logosmetrics.nim +++ b/library/logosmetrics.nim @@ -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) diff --git a/tests/libstorage/logosmetrics.nim b/tests/libstorage/logosmetrics.nim index e04f2c83..8c7517b4 100644 --- a/tests/libstorage/logosmetrics.nim +++ b/tests/libstorage/logosmetrics.nim @@ -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"}, },