refactor: metrics parsing: extract common checking code
Signed-off-by: Bryan Boreham <bjboreham@gmail.com>
This commit is contained in:
parent
e6d3d6abd9
commit
ba6aa95222
|
@ -14,7 +14,6 @@
|
||||||
package textparse
|
package textparse
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
@ -23,7 +22,6 @@ import (
|
||||||
|
|
||||||
"github.com/prometheus/prometheus/model/exemplar"
|
"github.com/prometheus/prometheus/model/exemplar"
|
||||||
"github.com/prometheus/prometheus/model/labels"
|
"github.com/prometheus/prometheus/model/labels"
|
||||||
"github.com/prometheus/prometheus/util/testutil"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestOpenMetricsParse(t *testing.T) {
|
func TestOpenMetricsParse(t *testing.T) {
|
||||||
|
@ -74,17 +72,7 @@ foo_total 17.0 1520879607.789 # {id="counter-test"} 5`
|
||||||
|
|
||||||
int64p := func(x int64) *int64 { return &x }
|
int64p := func(x int64) *int64 { return &x }
|
||||||
|
|
||||||
exp := []struct {
|
exp := []expectedParse{
|
||||||
lset labels.Labels
|
|
||||||
m string
|
|
||||||
t *int64
|
|
||||||
v float64
|
|
||||||
typ model.MetricType
|
|
||||||
help string
|
|
||||||
unit string
|
|
||||||
comment string
|
|
||||||
e *exemplar.Exemplar
|
|
||||||
}{
|
|
||||||
{
|
{
|
||||||
m: "go_gc_duration_seconds",
|
m: "go_gc_duration_seconds",
|
||||||
help: "A summary of the GC invocation durations.",
|
help: "A summary of the GC invocation durations.",
|
||||||
|
@ -248,57 +236,7 @@ foo_total 17.0 1520879607.789 # {id="counter-test"} 5`
|
||||||
}
|
}
|
||||||
|
|
||||||
p := NewOpenMetricsParser([]byte(input), labels.NewSymbolTable())
|
p := NewOpenMetricsParser([]byte(input), labels.NewSymbolTable())
|
||||||
i := 0
|
checkParseResults(t, p, exp)
|
||||||
|
|
||||||
var res labels.Labels
|
|
||||||
|
|
||||||
for {
|
|
||||||
et, err := p.Next()
|
|
||||||
if errors.Is(err, io.EOF) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
switch et {
|
|
||||||
case EntrySeries:
|
|
||||||
m, ts, v := p.Series()
|
|
||||||
|
|
||||||
var e exemplar.Exemplar
|
|
||||||
p.Metric(&res)
|
|
||||||
found := p.Exemplar(&e)
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].t, ts)
|
|
||||||
require.Equal(t, exp[i].v, v)
|
|
||||||
testutil.RequireEqual(t, exp[i].lset, res)
|
|
||||||
if exp[i].e == nil {
|
|
||||||
require.False(t, found)
|
|
||||||
} else {
|
|
||||||
require.True(t, found)
|
|
||||||
testutil.RequireEqual(t, *exp[i].e, e)
|
|
||||||
}
|
|
||||||
|
|
||||||
case EntryType:
|
|
||||||
m, typ := p.Type()
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].typ, typ)
|
|
||||||
|
|
||||||
case EntryHelp:
|
|
||||||
m, h := p.Help()
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].help, string(h))
|
|
||||||
|
|
||||||
case EntryUnit:
|
|
||||||
m, u := p.Unit()
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].unit, string(u))
|
|
||||||
|
|
||||||
case EntryComment:
|
|
||||||
require.Equal(t, exp[i].comment, string(p.Comment()))
|
|
||||||
}
|
|
||||||
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
require.Len(t, exp, i)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUTF8OpenMetricsParse(t *testing.T) {
|
func TestUTF8OpenMetricsParse(t *testing.T) {
|
||||||
|
@ -322,17 +260,7 @@ func TestUTF8OpenMetricsParse(t *testing.T) {
|
||||||
|
|
||||||
input += "\n# EOF\n"
|
input += "\n# EOF\n"
|
||||||
|
|
||||||
exp := []struct {
|
exp := []expectedParse{
|
||||||
lset labels.Labels
|
|
||||||
m string
|
|
||||||
t *int64
|
|
||||||
v float64
|
|
||||||
typ model.MetricType
|
|
||||||
help string
|
|
||||||
unit string
|
|
||||||
comment string
|
|
||||||
e *exemplar.Exemplar
|
|
||||||
}{
|
|
||||||
{
|
{
|
||||||
m: "go.gc_duration_seconds",
|
m: "go.gc_duration_seconds",
|
||||||
help: "A summary of the GC invocation durations.",
|
help: "A summary of the GC invocation durations.",
|
||||||
|
@ -379,57 +307,7 @@ choices}`, "strange©™\n'quoted' \"name\"", "6"),
|
||||||
}
|
}
|
||||||
|
|
||||||
p := NewOpenMetricsParser([]byte(input), labels.NewSymbolTable())
|
p := NewOpenMetricsParser([]byte(input), labels.NewSymbolTable())
|
||||||
i := 0
|
checkParseResults(t, p, exp)
|
||||||
|
|
||||||
var res labels.Labels
|
|
||||||
|
|
||||||
for {
|
|
||||||
et, err := p.Next()
|
|
||||||
if errors.Is(err, io.EOF) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
switch et {
|
|
||||||
case EntrySeries:
|
|
||||||
m, ts, v := p.Series()
|
|
||||||
|
|
||||||
var e exemplar.Exemplar
|
|
||||||
p.Metric(&res)
|
|
||||||
found := p.Exemplar(&e)
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].t, ts)
|
|
||||||
require.Equal(t, exp[i].v, v)
|
|
||||||
testutil.RequireEqual(t, exp[i].lset, res)
|
|
||||||
if exp[i].e == nil {
|
|
||||||
require.False(t, found)
|
|
||||||
} else {
|
|
||||||
require.True(t, found)
|
|
||||||
require.Equal(t, *exp[i].e, e)
|
|
||||||
}
|
|
||||||
|
|
||||||
case EntryType:
|
|
||||||
m, typ := p.Type()
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].typ, typ)
|
|
||||||
|
|
||||||
case EntryHelp:
|
|
||||||
m, h := p.Help()
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].help, string(h))
|
|
||||||
|
|
||||||
case EntryUnit:
|
|
||||||
m, u := p.Unit()
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].unit, string(u))
|
|
||||||
|
|
||||||
case EntryComment:
|
|
||||||
require.Equal(t, exp[i].comment, string(p.Comment()))
|
|
||||||
}
|
|
||||||
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
require.Len(t, exp, i)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestOpenMetricsParseErrors(t *testing.T) {
|
func TestOpenMetricsParseErrors(t *testing.T) {
|
||||||
|
|
|
@ -26,10 +26,23 @@ import (
|
||||||
"github.com/prometheus/common/expfmt"
|
"github.com/prometheus/common/expfmt"
|
||||||
"github.com/prometheus/common/model"
|
"github.com/prometheus/common/model"
|
||||||
|
|
||||||
|
"github.com/prometheus/prometheus/model/exemplar"
|
||||||
"github.com/prometheus/prometheus/model/labels"
|
"github.com/prometheus/prometheus/model/labels"
|
||||||
"github.com/prometheus/prometheus/util/testutil"
|
"github.com/prometheus/prometheus/util/testutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type expectedParse struct {
|
||||||
|
lset labels.Labels
|
||||||
|
m string
|
||||||
|
t *int64
|
||||||
|
v float64
|
||||||
|
typ model.MetricType
|
||||||
|
help string
|
||||||
|
unit string
|
||||||
|
comment string
|
||||||
|
e *exemplar.Exemplar
|
||||||
|
}
|
||||||
|
|
||||||
func TestPromParse(t *testing.T) {
|
func TestPromParse(t *testing.T) {
|
||||||
input := `# HELP go_gc_duration_seconds A summary of the GC invocation durations.
|
input := `# HELP go_gc_duration_seconds A summary of the GC invocation durations.
|
||||||
# TYPE go_gc_duration_seconds summary
|
# TYPE go_gc_duration_seconds summary
|
||||||
|
@ -63,15 +76,7 @@ testmetric{label="\"bar\""} 1`
|
||||||
|
|
||||||
int64p := func(x int64) *int64 { return &x }
|
int64p := func(x int64) *int64 { return &x }
|
||||||
|
|
||||||
exp := []struct {
|
exp := []expectedParse{
|
||||||
lset labels.Labels
|
|
||||||
m string
|
|
||||||
t *int64
|
|
||||||
v float64
|
|
||||||
typ model.MetricType
|
|
||||||
help string
|
|
||||||
comment string
|
|
||||||
}{
|
|
||||||
{
|
{
|
||||||
m: "go_gc_duration_seconds",
|
m: "go_gc_duration_seconds",
|
||||||
help: "A summary of the GC invocation durations.",
|
help: "A summary of the GC invocation durations.",
|
||||||
|
@ -179,6 +184,10 @@ testmetric{label="\"bar\""} 1`
|
||||||
}
|
}
|
||||||
|
|
||||||
p := NewPromParser([]byte(input), labels.NewSymbolTable())
|
p := NewPromParser([]byte(input), labels.NewSymbolTable())
|
||||||
|
checkParseResults(t, p, exp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkParseResults(t *testing.T, p Parser, exp []expectedParse) {
|
||||||
i := 0
|
i := 0
|
||||||
|
|
||||||
var res labels.Labels
|
var res labels.Labels
|
||||||
|
@ -201,6 +210,15 @@ testmetric{label="\"bar\""} 1`
|
||||||
require.Equal(t, exp[i].v, v)
|
require.Equal(t, exp[i].v, v)
|
||||||
testutil.RequireEqual(t, exp[i].lset, res)
|
testutil.RequireEqual(t, exp[i].lset, res)
|
||||||
|
|
||||||
|
var e exemplar.Exemplar
|
||||||
|
found := p.Exemplar(&e)
|
||||||
|
if exp[i].e == nil {
|
||||||
|
require.False(t, found)
|
||||||
|
} else {
|
||||||
|
require.True(t, found)
|
||||||
|
testutil.RequireEqual(t, *exp[i].e, e)
|
||||||
|
}
|
||||||
|
|
||||||
case EntryType:
|
case EntryType:
|
||||||
m, typ := p.Type()
|
m, typ := p.Type()
|
||||||
require.Equal(t, exp[i].m, string(m))
|
require.Equal(t, exp[i].m, string(m))
|
||||||
|
@ -211,6 +229,11 @@ testmetric{label="\"bar\""} 1`
|
||||||
require.Equal(t, exp[i].m, string(m))
|
require.Equal(t, exp[i].m, string(m))
|
||||||
require.Equal(t, exp[i].help, string(h))
|
require.Equal(t, exp[i].help, string(h))
|
||||||
|
|
||||||
|
case EntryUnit:
|
||||||
|
m, u := p.Unit()
|
||||||
|
require.Equal(t, exp[i].m, string(m))
|
||||||
|
require.Equal(t, exp[i].unit, string(u))
|
||||||
|
|
||||||
case EntryComment:
|
case EntryComment:
|
||||||
require.Equal(t, exp[i].comment, string(p.Comment()))
|
require.Equal(t, exp[i].comment, string(p.Comment()))
|
||||||
}
|
}
|
||||||
|
@ -241,15 +264,7 @@ func TestUTF8PromParse(t *testing.T) {
|
||||||
{"go.gc_duration_seconds_count"} 99
|
{"go.gc_duration_seconds_count"} 99
|
||||||
{"Heizölrückstoßabdämpfung 10€ metric with \"interesting\" {character\nchoices}","strange©™\n'quoted' \"name\""="6"} 10.0`
|
{"Heizölrückstoßabdämpfung 10€ metric with \"interesting\" {character\nchoices}","strange©™\n'quoted' \"name\""="6"} 10.0`
|
||||||
|
|
||||||
exp := []struct {
|
exp := []expectedParse{
|
||||||
lset labels.Labels
|
|
||||||
m string
|
|
||||||
t *int64
|
|
||||||
v float64
|
|
||||||
typ model.MetricType
|
|
||||||
help string
|
|
||||||
comment string
|
|
||||||
}{
|
|
||||||
{
|
{
|
||||||
m: "go.gc_duration_seconds",
|
m: "go.gc_duration_seconds",
|
||||||
help: "A summary of the GC invocation durations.",
|
help: "A summary of the GC invocation durations.",
|
||||||
|
@ -305,45 +320,7 @@ choices}`, "strange©™\n'quoted' \"name\"", "6"),
|
||||||
}
|
}
|
||||||
|
|
||||||
p := NewPromParser([]byte(input), labels.NewSymbolTable())
|
p := NewPromParser([]byte(input), labels.NewSymbolTable())
|
||||||
i := 0
|
checkParseResults(t, p, exp)
|
||||||
|
|
||||||
var res labels.Labels
|
|
||||||
|
|
||||||
for {
|
|
||||||
et, err := p.Next()
|
|
||||||
if errors.Is(err, io.EOF) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
switch et {
|
|
||||||
case EntrySeries:
|
|
||||||
m, ts, v := p.Series()
|
|
||||||
|
|
||||||
p.Metric(&res)
|
|
||||||
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].t, ts)
|
|
||||||
require.Equal(t, exp[i].v, v)
|
|
||||||
testutil.RequireEqual(t, exp[i].lset, res)
|
|
||||||
|
|
||||||
case EntryType:
|
|
||||||
m, typ := p.Type()
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].typ, typ)
|
|
||||||
|
|
||||||
case EntryHelp:
|
|
||||||
m, h := p.Help()
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].help, string(h))
|
|
||||||
|
|
||||||
case EntryComment:
|
|
||||||
require.Equal(t, exp[i].comment, string(p.Comment()))
|
|
||||||
}
|
|
||||||
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
require.Len(t, exp, i)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPromParseErrors(t *testing.T) {
|
func TestPromParseErrors(t *testing.T) {
|
||||||
|
|
Loading…
Reference in New Issue