mirror of
https://github.com/prometheus/prometheus.git
synced 2025-03-05 20:59:13 -08:00
feat: advance parser and parse histograms + summary
Signed-off-by: Manik Rana <manikrana54@gmail.com>
This commit is contained in:
parent
ea9c8cb5a3
commit
96e850df7e
|
@ -31,6 +31,23 @@ func (ls Labels) Len() int { return len(ls) }
|
||||||
func (ls Labels) Swap(i, j int) { ls[i], ls[j] = ls[j], ls[i] }
|
func (ls Labels) Swap(i, j int) { ls[i], ls[j] = ls[j], ls[i] }
|
||||||
func (ls Labels) Less(i, j int) bool { return ls[i].Name < ls[j].Name }
|
func (ls Labels) Less(i, j int) bool { return ls[i].Name < ls[j].Name }
|
||||||
|
|
||||||
|
func (l Labels) ExtractNames() []string {
|
||||||
|
names := make([]string, len(l))
|
||||||
|
for i, label := range l {
|
||||||
|
names[i] = label.Name
|
||||||
|
}
|
||||||
|
return names
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l Labels) Contains(name string) bool {
|
||||||
|
for _, label := range l {
|
||||||
|
if label.Name == name {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// Bytes returns ls as a byte slice.
|
// Bytes returns ls as a byte slice.
|
||||||
// It uses an byte invalid character as a separator and so should not be used for printing.
|
// It uses an byte invalid character as a separator and so should not be used for printing.
|
||||||
func (ls Labels) Bytes(buf []byte) []byte {
|
func (ls Labels) Bytes(buf []byte) []byte {
|
||||||
|
|
|
@ -95,6 +95,7 @@ type OpenMetricsParser struct {
|
||||||
exemplarVal float64
|
exemplarVal float64
|
||||||
exemplarTs int64
|
exemplarTs int64
|
||||||
hasExemplarTs bool
|
hasExemplarTs bool
|
||||||
|
skipCT bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewOpenMetricsParser returns a new parser of the byte slice.
|
// NewOpenMetricsParser returns a new parser of the byte slice.
|
||||||
|
@ -102,6 +103,7 @@ func NewOpenMetricsParser(b []byte, st *labels.SymbolTable) Parser {
|
||||||
return &OpenMetricsParser{
|
return &OpenMetricsParser{
|
||||||
l: &openMetricsLexer{b: b},
|
l: &openMetricsLexer{b: b},
|
||||||
builder: labels.NewScratchBuilderWithSymbolTable(st, 16),
|
builder: labels.NewScratchBuilderWithSymbolTable(st, 16),
|
||||||
|
skipCT: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,6 +234,11 @@ loop:
|
||||||
for {
|
for {
|
||||||
switch t, _ := newParser.Next(); t {
|
switch t, _ := newParser.Next(); t {
|
||||||
case EntrySeries:
|
case EntrySeries:
|
||||||
|
// TODO: potentially broken? Missing type?
|
||||||
|
if newParser.mName != p.mName {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// continue instead of return nil until we get new series/labels. can happen for histograms, summaries
|
// continue instead of return nil until we get new series/labels. can happen for histograms, summaries
|
||||||
// Check _created suffix
|
// Check _created suffix
|
||||||
var newLbs labels.Labels
|
var newLbs labels.Labels
|
||||||
|
@ -241,15 +248,29 @@ loop:
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: potentially broken? Missing type?
|
|
||||||
if newParser.mName != p.mName {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// edge case: if gauge_created of unknown type -> skip parsing
|
// edge case: if gauge_created of unknown type -> skip parsing
|
||||||
newLbs = newLbs.DropMetricName()
|
newLbs = newLbs.DropMetricName()
|
||||||
if !labels.Equal(lbs, newLbs) {
|
switch p.mtype {
|
||||||
return nil
|
case model.MetricTypeCounter:
|
||||||
|
if !labels.Equal(lbs, newLbs) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
case model.MetricTypeSummary:
|
||||||
|
labelDiffs := lbs.MatchLabels(false, newLbs.ExtractNames()...)
|
||||||
|
if labelDiffs.Len() != 0 {
|
||||||
|
if !labelDiffs.Contains("quantile") || labelDiffs.Len() != 1 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case model.MetricTypeHistogram:
|
||||||
|
labelDiffs := lbs.MatchLabels(false, newLbs.ExtractNames()...)
|
||||||
|
if labelDiffs.Len() != 0 {
|
||||||
|
if !labelDiffs.Contains("le") || labelDiffs.Len() != 1 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: for histograms
|
// TODO: for histograms
|
||||||
|
@ -259,10 +280,6 @@ loop:
|
||||||
|
|
||||||
// gauge_created is a metric
|
// gauge_created is a metric
|
||||||
ct := int64(newParser.val)
|
ct := int64(newParser.val)
|
||||||
_, err := p.Next()
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &ct
|
return &ct
|
||||||
default:
|
default:
|
||||||
break loop
|
break loop
|
||||||
|
@ -312,6 +329,7 @@ func deepCopyParser(p *OpenMetricsParser) OpenMetricsParser {
|
||||||
exemplarVal: p.exemplarVal,
|
exemplarVal: p.exemplarVal,
|
||||||
exemplarTs: p.exemplarTs,
|
exemplarTs: p.exemplarTs,
|
||||||
hasExemplarTs: p.hasExemplarTs,
|
hasExemplarTs: p.hasExemplarTs,
|
||||||
|
skipCT: false,
|
||||||
}
|
}
|
||||||
return newParser
|
return newParser
|
||||||
}
|
}
|
||||||
|
@ -603,6 +621,13 @@ func (p *OpenMetricsParser) parseMetricSuffix(t token) (Entry, error) {
|
||||||
return EntryInvalid, p.parseError("expected next entry after timestamp", t3)
|
return EntryInvalid, p.parseError("expected next entry after timestamp", t3)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var newLbs labels.Labels
|
||||||
|
p.Metric(&newLbs)
|
||||||
|
name := newLbs.Get(model.MetricNameLabel)
|
||||||
|
if strings.HasSuffix(name, "_created") && p.skipCT {
|
||||||
|
return p.Next()
|
||||||
|
}
|
||||||
return EntrySeries, nil
|
return EntrySeries, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,50 +24,68 @@ import (
|
||||||
"github.com/prometheus/prometheus/model/labels"
|
"github.com/prometheus/prometheus/model/labels"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// # HELP go_gc_duration_seconds A summary of the GC invocation durations.
|
||||||
|
// # TYPE go_gc_duration_seconds summary
|
||||||
|
// # UNIT go_gc_duration_seconds seconds
|
||||||
|
// go_gc_duration_seconds{quantile="0"} 4.9351e-05
|
||||||
|
// go_gc_duration_seconds{quantile="0.25"} 7.424100000000001e-05
|
||||||
|
// go_gc_duration_seconds{quantile="0.5",a="b"} 8.3835e-05
|
||||||
|
// # HELP nohelp1
|
||||||
|
// # HELP help2 escape \ \n \\ \" \x chars
|
||||||
|
// # UNIT nounit
|
||||||
|
// go_gc_duration_seconds{quantile="1.0",a="b"} 8.3835e-05
|
||||||
|
// go_gc_duration_seconds_count 99
|
||||||
|
// some:aggregate:rate5m{a_b="c"} 1
|
||||||
|
// # HELP go_goroutines Number of goroutines that currently exist.
|
||||||
|
// # TYPE go_goroutines gauge
|
||||||
|
// go_goroutines 33 123.123
|
||||||
|
// # TYPE hh histogram
|
||||||
|
// hh_bucket{le="+Inf"} 1
|
||||||
|
// # TYPE gh gaugehistogram
|
||||||
|
// gh_bucket{le="+Inf"} 1
|
||||||
|
// # TYPE hhh histogram
|
||||||
|
// hhh_bucket{le="+Inf"} 1 # {id="histogram-bucket-test"} 4
|
||||||
|
// hhh_count 1 # {id="histogram-count-test"} 4
|
||||||
|
// # TYPE ggh gaugehistogram
|
||||||
|
// ggh_bucket{le="+Inf"} 1 # {id="gaugehistogram-bucket-test",xx="yy"} 4 123.123
|
||||||
|
// ggh_count 1 # {id="gaugehistogram-count-test",xx="yy"} 4 123.123
|
||||||
|
// # TYPE smr_seconds summary
|
||||||
|
// smr_seconds_count 2.0 # {id="summary-count-test"} 1 123.321
|
||||||
|
// smr_seconds_sum 42.0 # {id="summary-sum-test"} 1 123.321
|
||||||
|
// # TYPE ii info
|
||||||
|
// ii{foo="bar"} 1
|
||||||
|
// # TYPE ss stateset
|
||||||
|
// ss{ss="foo"} 1
|
||||||
|
// ss{ss="bar"} 0
|
||||||
|
// ss{A="a"} 0
|
||||||
|
// # TYPE un unknown
|
||||||
|
// _metric_starting_with_underscore 1
|
||||||
|
// testmetric{_label_starting_with_underscore="foo"} 1
|
||||||
|
// testmetric{label="\"bar\""} 1
|
||||||
|
|
||||||
|
// In summary: we find created but then p.Next() is called and we end up parsing the bar_created again
|
||||||
|
// In histogram bucket labels {le="0.0"} end up getting compared to baz_created which is not what we want
|
||||||
|
// This issue might happen in summaries if quantiles are before _created
|
||||||
|
|
||||||
|
// figure out summary order for _created, quantiles etc
|
||||||
func TestOpenMetricsParse(t *testing.T) {
|
func TestOpenMetricsParse(t *testing.T) {
|
||||||
input := `# HELP go_gc_duration_seconds A summary of the GC invocation durations.
|
input := `# TYPE foo counter
|
||||||
# TYPE go_gc_duration_seconds summary
|
|
||||||
# UNIT go_gc_duration_seconds seconds
|
|
||||||
go_gc_duration_seconds{quantile="0"} 4.9351e-05
|
|
||||||
go_gc_duration_seconds{quantile="0.25"} 7.424100000000001e-05
|
|
||||||
go_gc_duration_seconds{quantile="0.5",a="b"} 8.3835e-05
|
|
||||||
# HELP nohelp1
|
|
||||||
# HELP help2 escape \ \n \\ \" \x chars
|
|
||||||
# UNIT nounit
|
|
||||||
go_gc_duration_seconds{quantile="1.0",a="b"} 8.3835e-05
|
|
||||||
go_gc_duration_seconds_count 99
|
|
||||||
some:aggregate:rate5m{a_b="c"} 1
|
|
||||||
# HELP go_goroutines Number of goroutines that currently exist.
|
|
||||||
# TYPE go_goroutines gauge
|
|
||||||
go_goroutines 33 123.123
|
|
||||||
# TYPE hh histogram
|
|
||||||
hh_bucket{le="+Inf"} 1
|
|
||||||
# TYPE gh gaugehistogram
|
|
||||||
gh_bucket{le="+Inf"} 1
|
|
||||||
# TYPE hhh histogram
|
|
||||||
hhh_bucket{le="+Inf"} 1 # {id="histogram-bucket-test"} 4
|
|
||||||
hhh_count 1 # {id="histogram-count-test"} 4
|
|
||||||
# TYPE ggh gaugehistogram
|
|
||||||
ggh_bucket{le="+Inf"} 1 # {id="gaugehistogram-bucket-test",xx="yy"} 4 123.123
|
|
||||||
ggh_count 1 # {id="gaugehistogram-count-test",xx="yy"} 4 123.123
|
|
||||||
# TYPE smr_seconds summary
|
|
||||||
smr_seconds_count 2.0 # {id="summary-count-test"} 1 123.321
|
|
||||||
smr_seconds_sum 42.0 # {id="summary-sum-test"} 1 123.321
|
|
||||||
# TYPE ii info
|
|
||||||
ii{foo="bar"} 1
|
|
||||||
# TYPE ss stateset
|
|
||||||
ss{ss="foo"} 1
|
|
||||||
ss{ss="bar"} 0
|
|
||||||
ss{A="a"} 0
|
|
||||||
# TYPE un unknown
|
|
||||||
_metric_starting_with_underscore 1
|
|
||||||
testmetric{_label_starting_with_underscore="foo"} 1
|
|
||||||
testmetric{label="\"bar\""} 1
|
|
||||||
# TYPE foo counter
|
|
||||||
foo_total 17.0 1520879607.789 # {id="counter-test"} 5
|
foo_total 17.0 1520879607.789 # {id="counter-test"} 5
|
||||||
foo_created 1000
|
foo_created 1000
|
||||||
foo_total{a="b"} 17.0 1520879607.789 # {id="counter-test"} 5
|
foo_total{a="b"} 17.0 1520879607.789 # {id="counter-test"} 5
|
||||||
foo_created{a="b"} 1000`
|
foo_created{a="b"} 1000
|
||||||
|
# TYPE bar summary
|
||||||
|
bar_count 17.0
|
||||||
|
bar_sum 324789.3
|
||||||
|
bar{quantile="0.95"} 123.7
|
||||||
|
bar{quantile="0.99"} 150.0
|
||||||
|
bar_created 1520430000
|
||||||
|
# TYPE baz histogram
|
||||||
|
baz_bucket{le="0.0"} 0
|
||||||
|
baz_bucket{le="+Inf"} 17
|
||||||
|
baz_count 17
|
||||||
|
baz_sum 324789.3
|
||||||
|
baz_created 1520430000`
|
||||||
|
|
||||||
input += "\n# HELP metric foo\x00bar"
|
input += "\n# HELP metric foo\x00bar"
|
||||||
input += "\nnull_byte_metric{a=\"abc\x00\"} 1"
|
input += "\nnull_byte_metric{a=\"abc\x00\"} 1"
|
||||||
|
@ -76,170 +94,215 @@ foo_created{a="b"} 1000`
|
||||||
int64p := func(x int64) *int64 { return &x }
|
int64p := func(x int64) *int64 { return &x }
|
||||||
|
|
||||||
exp := []expectedParse{
|
exp := []expectedParse{
|
||||||
|
// {
|
||||||
|
// m: "go_gc_duration_seconds",
|
||||||
|
// help: "A summary of the GC invocation durations.",
|
||||||
|
// }, {
|
||||||
|
// m: "go_gc_duration_seconds",
|
||||||
|
// typ: model.MetricTypeSummary,
|
||||||
|
// }, {
|
||||||
|
// m: "go_gc_duration_seconds",
|
||||||
|
// unit: "seconds",
|
||||||
|
// }, {
|
||||||
|
// m: `go_gc_duration_seconds{quantile="0"}`,
|
||||||
|
// v: 4.9351e-05,
|
||||||
|
// lset: labels.FromStrings("__name__", "go_gc_duration_seconds", "quantile", "0"),
|
||||||
|
// }, {
|
||||||
|
// m: `go_gc_duration_seconds{quantile="0.25"}`,
|
||||||
|
// v: 7.424100000000001e-05,
|
||||||
|
// lset: labels.FromStrings("__name__", "go_gc_duration_seconds", "quantile", "0.25"),
|
||||||
|
// }, {
|
||||||
|
// m: `go_gc_duration_seconds{quantile="0.5",a="b"}`,
|
||||||
|
// v: 8.3835e-05,
|
||||||
|
// lset: labels.FromStrings("__name__", "go_gc_duration_seconds", "quantile", "0.5", "a", "b"),
|
||||||
|
// }, {
|
||||||
|
// m: "nohelp1",
|
||||||
|
// help: "",
|
||||||
|
// }, {
|
||||||
|
// m: "help2",
|
||||||
|
// help: "escape \\ \n \\ \" \\x chars",
|
||||||
|
// }, {
|
||||||
|
// m: "nounit",
|
||||||
|
// unit: "",
|
||||||
|
// }, {
|
||||||
|
// m: `go_gc_duration_seconds{quantile="1.0",a="b"}`,
|
||||||
|
// v: 8.3835e-05,
|
||||||
|
// lset: labels.FromStrings("__name__", "go_gc_duration_seconds", "quantile", "1.0", "a", "b"),
|
||||||
|
// }, {
|
||||||
|
// m: `go_gc_duration_seconds_count`,
|
||||||
|
// v: 99,
|
||||||
|
// lset: labels.FromStrings("__name__", "go_gc_duration_seconds_count"),
|
||||||
|
// }, {
|
||||||
|
// m: `some:aggregate:rate5m{a_b="c"}`,
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "some:aggregate:rate5m", "a_b", "c"),
|
||||||
|
// }, {
|
||||||
|
// m: "go_goroutines",
|
||||||
|
// help: "Number of goroutines that currently exist.",
|
||||||
|
// }, {
|
||||||
|
// m: "go_goroutines",
|
||||||
|
// typ: model.MetricTypeGauge,
|
||||||
|
// }, {
|
||||||
|
// m: `go_goroutines`,
|
||||||
|
// v: 33,
|
||||||
|
// t: int64p(123123),
|
||||||
|
// lset: labels.FromStrings("__name__", "go_goroutines"),
|
||||||
|
// }, {
|
||||||
|
// m: "hh",
|
||||||
|
// typ: model.MetricTypeHistogram,
|
||||||
|
// }, {
|
||||||
|
// m: `hh_bucket{le="+Inf"}`,
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "hh_bucket", "le", "+Inf"),
|
||||||
|
// }, {
|
||||||
|
// m: "gh",
|
||||||
|
// typ: model.MetricTypeGaugeHistogram,
|
||||||
|
// }, {
|
||||||
|
// m: `gh_bucket{le="+Inf"}`,
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "gh_bucket", "le", "+Inf"),
|
||||||
|
// }, {
|
||||||
|
// m: "hhh",
|
||||||
|
// typ: model.MetricTypeHistogram,
|
||||||
|
// }, {
|
||||||
|
// m: `hhh_bucket{le="+Inf"}`,
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "hhh_bucket", "le", "+Inf"),
|
||||||
|
// e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "histogram-bucket-test"), Value: 4},
|
||||||
|
// }, {
|
||||||
|
// m: `hhh_count`,
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "hhh_count"),
|
||||||
|
// e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "histogram-count-test"), Value: 4},
|
||||||
|
// }, {
|
||||||
|
// m: "ggh",
|
||||||
|
// typ: model.MetricTypeGaugeHistogram,
|
||||||
|
// }, {
|
||||||
|
// m: `ggh_bucket{le="+Inf"}`,
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "ggh_bucket", "le", "+Inf"),
|
||||||
|
// e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "gaugehistogram-bucket-test", "xx", "yy"), Value: 4, HasTs: true, Ts: 123123},
|
||||||
|
// }, {
|
||||||
|
// m: `ggh_count`,
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "ggh_count"),
|
||||||
|
// e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "gaugehistogram-count-test", "xx", "yy"), Value: 4, HasTs: true, Ts: 123123},
|
||||||
|
// }, {
|
||||||
|
// m: "smr_seconds",
|
||||||
|
// typ: model.MetricTypeSummary,
|
||||||
|
// }, {
|
||||||
|
// m: `smr_seconds_count`,
|
||||||
|
// v: 2,
|
||||||
|
// lset: labels.FromStrings("__name__", "smr_seconds_count"),
|
||||||
|
// e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "summary-count-test"), Value: 1, HasTs: true, Ts: 123321},
|
||||||
|
// }, {
|
||||||
|
// m: `smr_seconds_sum`,
|
||||||
|
// v: 42,
|
||||||
|
// lset: labels.FromStrings("__name__", "smr_seconds_sum"),
|
||||||
|
// e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "summary-sum-test"), Value: 1, HasTs: true, Ts: 123321},
|
||||||
|
// }, {
|
||||||
|
// m: "ii",
|
||||||
|
// typ: model.MetricTypeInfo,
|
||||||
|
// }, {
|
||||||
|
// m: `ii{foo="bar"}`,
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "ii", "foo", "bar"),
|
||||||
|
// }, {
|
||||||
|
// m: "ss",
|
||||||
|
// typ: model.MetricTypeStateset,
|
||||||
|
// }, {
|
||||||
|
// m: `ss{ss="foo"}`,
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "ss", "ss", "foo"),
|
||||||
|
// }, {
|
||||||
|
// m: `ss{ss="bar"}`,
|
||||||
|
// v: 0,
|
||||||
|
// lset: labels.FromStrings("__name__", "ss", "ss", "bar"),
|
||||||
|
// }, {
|
||||||
|
// m: `ss{A="a"}`,
|
||||||
|
// v: 0,
|
||||||
|
// lset: labels.FromStrings("A", "a", "__name__", "ss"),
|
||||||
|
// }, {
|
||||||
|
// m: "un",
|
||||||
|
// typ: model.MetricTypeUnknown,
|
||||||
|
// }, {
|
||||||
|
// m: "_metric_starting_with_underscore",
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "_metric_starting_with_underscore"),
|
||||||
|
// }, {
|
||||||
|
// m: "testmetric{_label_starting_with_underscore=\"foo\"}",
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "testmetric", "_label_starting_with_underscore", "foo"),
|
||||||
|
// }, {
|
||||||
|
// m: "testmetric{label=\"\\\"bar\\\"\"}",
|
||||||
|
// v: 1,
|
||||||
|
// lset: labels.FromStrings("__name__", "testmetric", "label", `"bar"`),
|
||||||
|
// }, {
|
||||||
{
|
{
|
||||||
m: "go_gc_duration_seconds",
|
|
||||||
help: "A summary of the GC invocation durations.",
|
|
||||||
}, {
|
|
||||||
m: "go_gc_duration_seconds",
|
|
||||||
typ: model.MetricTypeSummary,
|
|
||||||
}, {
|
|
||||||
m: "go_gc_duration_seconds",
|
|
||||||
unit: "seconds",
|
|
||||||
}, {
|
|
||||||
m: `go_gc_duration_seconds{quantile="0"}`,
|
|
||||||
v: 4.9351e-05,
|
|
||||||
lset: labels.FromStrings("__name__", "go_gc_duration_seconds", "quantile", "0"),
|
|
||||||
}, {
|
|
||||||
m: `go_gc_duration_seconds{quantile="0.25"}`,
|
|
||||||
v: 7.424100000000001e-05,
|
|
||||||
lset: labels.FromStrings("__name__", "go_gc_duration_seconds", "quantile", "0.25"),
|
|
||||||
}, {
|
|
||||||
m: `go_gc_duration_seconds{quantile="0.5",a="b"}`,
|
|
||||||
v: 8.3835e-05,
|
|
||||||
lset: labels.FromStrings("__name__", "go_gc_duration_seconds", "quantile", "0.5", "a", "b"),
|
|
||||||
}, {
|
|
||||||
m: "nohelp1",
|
|
||||||
help: "",
|
|
||||||
}, {
|
|
||||||
m: "help2",
|
|
||||||
help: "escape \\ \n \\ \" \\x chars",
|
|
||||||
}, {
|
|
||||||
m: "nounit",
|
|
||||||
unit: "",
|
|
||||||
}, {
|
|
||||||
m: `go_gc_duration_seconds{quantile="1.0",a="b"}`,
|
|
||||||
v: 8.3835e-05,
|
|
||||||
lset: labels.FromStrings("__name__", "go_gc_duration_seconds", "quantile", "1.0", "a", "b"),
|
|
||||||
}, {
|
|
||||||
m: `go_gc_duration_seconds_count`,
|
|
||||||
v: 99,
|
|
||||||
lset: labels.FromStrings("__name__", "go_gc_duration_seconds_count"),
|
|
||||||
}, {
|
|
||||||
m: `some:aggregate:rate5m{a_b="c"}`,
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "some:aggregate:rate5m", "a_b", "c"),
|
|
||||||
}, {
|
|
||||||
m: "go_goroutines",
|
|
||||||
help: "Number of goroutines that currently exist.",
|
|
||||||
}, {
|
|
||||||
m: "go_goroutines",
|
|
||||||
typ: model.MetricTypeGauge,
|
|
||||||
}, {
|
|
||||||
m: `go_goroutines`,
|
|
||||||
v: 33,
|
|
||||||
t: int64p(123123),
|
|
||||||
lset: labels.FromStrings("__name__", "go_goroutines"),
|
|
||||||
}, {
|
|
||||||
m: "hh",
|
|
||||||
typ: model.MetricTypeHistogram,
|
|
||||||
}, {
|
|
||||||
m: `hh_bucket{le="+Inf"}`,
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "hh_bucket", "le", "+Inf"),
|
|
||||||
}, {
|
|
||||||
m: "gh",
|
|
||||||
typ: model.MetricTypeGaugeHistogram,
|
|
||||||
}, {
|
|
||||||
m: `gh_bucket{le="+Inf"}`,
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "gh_bucket", "le", "+Inf"),
|
|
||||||
}, {
|
|
||||||
m: "hhh",
|
|
||||||
typ: model.MetricTypeHistogram,
|
|
||||||
}, {
|
|
||||||
m: `hhh_bucket{le="+Inf"}`,
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "hhh_bucket", "le", "+Inf"),
|
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "histogram-bucket-test"), Value: 4},
|
|
||||||
}, {
|
|
||||||
m: `hhh_count`,
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "hhh_count"),
|
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "histogram-count-test"), Value: 4},
|
|
||||||
}, {
|
|
||||||
m: "ggh",
|
|
||||||
typ: model.MetricTypeGaugeHistogram,
|
|
||||||
}, {
|
|
||||||
m: `ggh_bucket{le="+Inf"}`,
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "ggh_bucket", "le", "+Inf"),
|
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "gaugehistogram-bucket-test", "xx", "yy"), Value: 4, HasTs: true, Ts: 123123},
|
|
||||||
}, {
|
|
||||||
m: `ggh_count`,
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "ggh_count"),
|
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "gaugehistogram-count-test", "xx", "yy"), Value: 4, HasTs: true, Ts: 123123},
|
|
||||||
}, {
|
|
||||||
m: "smr_seconds",
|
|
||||||
typ: model.MetricTypeSummary,
|
|
||||||
}, {
|
|
||||||
m: `smr_seconds_count`,
|
|
||||||
v: 2,
|
|
||||||
lset: labels.FromStrings("__name__", "smr_seconds_count"),
|
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "summary-count-test"), Value: 1, HasTs: true, Ts: 123321},
|
|
||||||
}, {
|
|
||||||
m: `smr_seconds_sum`,
|
|
||||||
v: 42,
|
|
||||||
lset: labels.FromStrings("__name__", "smr_seconds_sum"),
|
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "summary-sum-test"), Value: 1, HasTs: true, Ts: 123321},
|
|
||||||
}, {
|
|
||||||
m: "ii",
|
|
||||||
typ: model.MetricTypeInfo,
|
|
||||||
}, {
|
|
||||||
m: `ii{foo="bar"}`,
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "ii", "foo", "bar"),
|
|
||||||
}, {
|
|
||||||
m: "ss",
|
|
||||||
typ: model.MetricTypeStateset,
|
|
||||||
}, {
|
|
||||||
m: `ss{ss="foo"}`,
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "ss", "ss", "foo"),
|
|
||||||
}, {
|
|
||||||
m: `ss{ss="bar"}`,
|
|
||||||
v: 0,
|
|
||||||
lset: labels.FromStrings("__name__", "ss", "ss", "bar"),
|
|
||||||
}, {
|
|
||||||
m: `ss{A="a"}`,
|
|
||||||
v: 0,
|
|
||||||
lset: labels.FromStrings("A", "a", "__name__", "ss"),
|
|
||||||
}, {
|
|
||||||
m: "un",
|
|
||||||
typ: model.MetricTypeUnknown,
|
|
||||||
}, {
|
|
||||||
m: "_metric_starting_with_underscore",
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "_metric_starting_with_underscore"),
|
|
||||||
}, {
|
|
||||||
m: "testmetric{_label_starting_with_underscore=\"foo\"}",
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "testmetric", "_label_starting_with_underscore", "foo"),
|
|
||||||
}, {
|
|
||||||
m: "testmetric{label=\"\\\"bar\\\"\"}",
|
|
||||||
v: 1,
|
|
||||||
lset: labels.FromStrings("__name__", "testmetric", "label", `"bar"`),
|
|
||||||
}, {
|
|
||||||
m: "foo",
|
m: "foo",
|
||||||
typ: model.MetricTypeCounter,
|
typ: model.MetricTypeCounter,
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
m: "foo_total",
|
m: "foo_total",
|
||||||
v: 17,
|
v: 17,
|
||||||
lset: labels.FromStrings("__name__", "foo_total"),
|
lset: labels.FromStrings("__name__", "foo_total"),
|
||||||
t: int64p(1520879607789),
|
t: int64p(1520879607789),
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "counter-test"), Value: 5},
|
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "counter-test"), Value: 5},
|
||||||
ct: int64p(1000),
|
ct: int64p(1000),
|
||||||
},{
|
}, {
|
||||||
m: `foo_total{a="b"}`,
|
m: `foo_total{a="b"}`,
|
||||||
v: 17.0,
|
v: 17.0,
|
||||||
lset: labels.FromStrings("__name__", "foo_total", "a", "b"),
|
lset: labels.FromStrings("__name__", "foo_total", "a", "b"),
|
||||||
t: int64p(1520879607789),
|
t: int64p(1520879607789),
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "counter-test"), Value: 5},
|
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "counter-test"), Value: 5},
|
||||||
ct: int64p(1000),
|
ct: int64p(1000),
|
||||||
},{
|
}, {
|
||||||
m: "rpc_durations_histogram_seconds_bucket",
|
m: "bar",
|
||||||
ct: int64p(1000),
|
typ: model.MetricTypeSummary,
|
||||||
},{
|
}, {
|
||||||
|
m: "bar_count",
|
||||||
|
v: 17.0,
|
||||||
|
lset: labels.FromStrings("__name__", "bar_count"),
|
||||||
|
ct: int64p(1520430000),
|
||||||
|
}, {
|
||||||
|
m: "bar_sum",
|
||||||
|
v: 324789.3,
|
||||||
|
lset: labels.FromStrings("__name__", "bar_sum"),
|
||||||
|
ct: int64p(1520430000),
|
||||||
|
}, {
|
||||||
|
m: `bar{quantile="0.95"}`,
|
||||||
|
v: 123.7,
|
||||||
|
lset: labels.FromStrings("__name__", "bar", "quantile", "0.95"),
|
||||||
|
ct: int64p(1520430000),
|
||||||
|
}, {
|
||||||
|
m: `bar{quantile="0.99"}`,
|
||||||
|
v: 150.0,
|
||||||
|
lset: labels.FromStrings("__name__", "bar", "quantile", "0.99"),
|
||||||
|
ct: int64p(1520430000),
|
||||||
|
}, {
|
||||||
|
m: "baz",
|
||||||
|
typ: model.MetricTypeHistogram,
|
||||||
|
}, {
|
||||||
|
m: `baz_bucket{le="0.0"}`,
|
||||||
|
v: 0,
|
||||||
|
lset: labels.FromStrings("__name__", "baz_bucket", "le", "0.0"),
|
||||||
|
ct: int64p(1520430000),
|
||||||
|
}, {
|
||||||
|
m: `baz_bucket{le="+Inf"}`,
|
||||||
|
v: 17,
|
||||||
|
lset: labels.FromStrings("__name__", "baz_bucket", "le", "+Inf"),
|
||||||
|
ct: int64p(1520430000),
|
||||||
|
}, {
|
||||||
|
m: `baz_count`,
|
||||||
|
v: 17,
|
||||||
|
lset: labels.FromStrings("__name__", "baz_count"),
|
||||||
|
ct: int64p(1520430000),
|
||||||
|
}, {
|
||||||
|
m: `baz_sum`,
|
||||||
|
v: 324789.3,
|
||||||
|
lset: labels.FromStrings("__name__", "baz_sum"),
|
||||||
|
ct: int64p(1520430000),
|
||||||
|
}, {
|
||||||
m: "metric",
|
m: "metric",
|
||||||
help: "foo\x00bar",
|
help: "foo\x00bar",
|
||||||
}, {
|
}, {
|
||||||
|
@ -697,4 +760,4 @@ func TestOMNullByteHandling(t *testing.T) {
|
||||||
|
|
||||||
require.Equal(t, c.err, err.Error(), "test %d", i)
|
require.Equal(t, c.err, err.Error(), "test %d", i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ type expectedParse struct {
|
||||||
unit string
|
unit string
|
||||||
comment string
|
comment string
|
||||||
e *exemplar.Exemplar
|
e *exemplar.Exemplar
|
||||||
ct *int64
|
ct *int64
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPromParse(t *testing.T) {
|
func TestPromParse(t *testing.T) {
|
||||||
|
|
Loading…
Reference in a new issue