Merge pull request #9008 from cw9/cw9/openmetricsparsets

Return error on NaN and Inf timestamps for OpenMetrics parser
This commit is contained in:
Julien Pivotto 2021-06-29 17:56:49 +02:00 committed by GitHub
commit 1a1394fc58
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 0 deletions

View file

@ -336,6 +336,9 @@ func (p *OpenMetricsParser) Next() (Entry, error) {
if ts, err = parseFloat(yoloString(p.l.buf()[1:])); err != nil {
return EntryInvalid, err
}
if math.IsNaN(ts) || math.IsInf(ts, 0) {
return EntryInvalid, errors.New("invalid timestamp")
}
p.ts = int64(ts * 1000)
switch t3 := p.nextToken(); t3 {
case tLinebreak:
@ -392,6 +395,9 @@ func (p *OpenMetricsParser) parseComment() error {
if ts, err = parseFloat(yoloString(p.l.buf()[1:])); err != nil {
return err
}
if math.IsNaN(ts) || math.IsInf(ts, 0) {
return errors.New("invalid exemplar timestamp")
}
p.exemplarTs = int64(ts * 1000)
switch t3 := p.nextToken(); t3 {
case tLinebreak:

View file

@ -504,6 +504,30 @@ func TestOpenMetricsParseErrors(t *testing.T) {
input: `{b="c",} 1`,
err: `"INVALID" "{" is not a valid start token`,
},
{
input: `a 1 NaN`,
err: `invalid timestamp`,
},
{
input: `a 1 -Inf`,
err: `invalid timestamp`,
},
{
input: `a 1 Inf`,
err: `invalid timestamp`,
},
{
input: "# TYPE hhh histogram\nhhh_bucket{le=\"+Inf\"} 1 # {aa=\"bb\"} 4 NaN",
err: `invalid exemplar timestamp`,
},
{
input: "# TYPE hhh histogram\nhhh_bucket{le=\"+Inf\"} 1 # {aa=\"bb\"} 4 -Inf",
err: `invalid exemplar timestamp`,
},
{
input: "# TYPE hhh histogram\nhhh_bucket{le=\"+Inf\"} 1 # {aa=\"bb\"} 4 Inf",
err: `invalid exemplar timestamp`,
},
}
for i, c := range cases {