model/textparse: associate correct token to errors

In some cases, the Prometheus HTTP format parser was not returning the
right token in the error output which made debugging impossible.

Signed-off-by: Damien Grisonnet <dgrisonn@redhat.com>
This commit is contained in:
Damien Grisonnet 2022-12-07 10:46:14 +01:00
parent 49f775d8a0
commit 96b9d8cebb
2 changed files with 10 additions and 6 deletions

View File

@ -340,7 +340,7 @@ func (p *PromParser) Next() (Entry, error) {
t2 = p.nextToken() t2 = p.nextToken()
} }
if t2 != tValue { if t2 != tValue {
return EntryInvalid, parseError("expected value after metric", t) return EntryInvalid, parseError("expected value after metric", t2)
} }
if p.val, err = parseFloat(yoloString(p.l.buf())); err != nil { if p.val, err = parseFloat(yoloString(p.l.buf())); err != nil {
return EntryInvalid, err return EntryInvalid, err
@ -350,7 +350,7 @@ func (p *PromParser) Next() (Entry, error) {
p.val = math.Float64frombits(value.NormalNaN) p.val = math.Float64frombits(value.NormalNaN)
} }
p.hasTS = false p.hasTS = false
switch p.nextToken() { switch t := p.nextToken(); t {
case tLinebreak: case tLinebreak:
break break
case tTimestamp: case tTimestamp:
@ -359,7 +359,7 @@ func (p *PromParser) Next() (Entry, error) {
return EntryInvalid, err return EntryInvalid, err
} }
if t2 := p.nextToken(); t2 != tLinebreak { if t2 := p.nextToken(); t2 != tLinebreak {
return EntryInvalid, parseError("expected next entry after timestamp", t) return EntryInvalid, parseError("expected next entry after timestamp", t2)
} }
default: default:
return EntryInvalid, parseError("expected timestamp or new record", t) return EntryInvalid, parseError("expected timestamp or new record", t)

View File

@ -219,7 +219,7 @@ func TestPromParseErrors(t *testing.T) {
}{ }{
{ {
input: "a", input: "a",
err: "expected value after metric, got \"MNAME\"", err: "expected value after metric, got \"INVALID\"",
}, },
{ {
input: "a{b='c'} 1\n", input: "a{b='c'} 1\n",
@ -263,7 +263,7 @@ func TestPromParseErrors(t *testing.T) {
}, },
{ {
input: "foo 0 1_2\n", input: "foo 0 1_2\n",
err: "expected next entry after timestamp, got \"MNAME\"", err: "expected next entry after timestamp, got \"INVALID\"",
}, },
{ {
input: `{a="ok"} 1`, input: `{a="ok"} 1`,
@ -325,7 +325,11 @@ func TestPromNullByteHandling(t *testing.T) {
}, },
{ {
input: "a\x00{b=\"ddd\"} 1", input: "a\x00{b=\"ddd\"} 1",
err: "expected value after metric, got \"MNAME\"", err: "expected value after metric, got \"INVALID\"",
},
{
input: "a 0 1\x00",
err: "expected next entry after timestamp, got \"INVALID\"",
}, },
} }