mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
lib/protoparser/influx: allow multiple whitespace chars between measurement, fields and timestamp in Influx line protocol
This commit is contained in:
parent
6f0038209c
commit
b0e4b234cb
3 changed files with 43 additions and 2 deletions
|
@ -2,6 +2,10 @@
|
|||
|
||||
# tip
|
||||
|
||||
* FEATURE: allow multiple whitespace chars between measurements, fields and timestamp when parsing InfluxDB line protocol.
|
||||
Though [InfluxDB line protocol](https://docs.influxdata.com/influxdb/v1.8/write_protocols/line_protocol_tutorial/) denies multiple whitespace chars between these entities,
|
||||
some apps improperly put multiple whitespace chars. This workaround allows accepting data from such apps.
|
||||
|
||||
|
||||
# [v1.49.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.49.0)
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ func (r *Row) unmarshal(s string, tagsPool []Tag, fieldsPool []Field, noEscapeCh
|
|||
return tagsPool, fieldsPool, fmt.Errorf("cannot find Whitespace I in %q", s)
|
||||
}
|
||||
measurementTags := s[:n]
|
||||
s = s[n+1:]
|
||||
s = stripLeadingWhitespace(s[n+1:])
|
||||
|
||||
// Parse measurement and tags
|
||||
var err error
|
||||
|
@ -110,7 +110,7 @@ func (r *Row) unmarshal(s string, tagsPool []Tag, fieldsPool []Field, noEscapeCh
|
|||
return tagsPool, fieldsPool, err
|
||||
}
|
||||
r.Fields = fieldsPool[fieldsStart:]
|
||||
s = s[n+1:]
|
||||
s = stripLeadingWhitespace(s[n+1:])
|
||||
|
||||
// Parse timestamp
|
||||
timestamp, err := fastfloat.ParseInt64(s)
|
||||
|
@ -409,3 +409,10 @@ func isInQuote(s string, noEscapeChars bool) bool {
|
|||
s = s[n+1:]
|
||||
}
|
||||
}
|
||||
|
||||
func stripLeadingWhitespace(s string) string {
|
||||
for len(s) > 0 && s[0] == ' ' {
|
||||
s = s[1:]
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
|
|
@ -468,6 +468,36 @@ func TestRowsUnmarshalSuccess(t *testing.T) {
|
|||
},
|
||||
})
|
||||
|
||||
// Superfluous whitespace between tags, fields and timestamps.
|
||||
f(`cpu_utilization,host=mnsbook-pro.local value=119.8 1607222595591`, &Rows{
|
||||
Rows: []Row{{
|
||||
Measurement: "cpu_utilization",
|
||||
Tags: []Tag{{
|
||||
Key: "host",
|
||||
Value: "mnsbook-pro.local",
|
||||
}},
|
||||
Fields: []Field{{
|
||||
Key: "value",
|
||||
Value: 119.8,
|
||||
}},
|
||||
Timestamp: 1607222595591,
|
||||
}},
|
||||
})
|
||||
f(`cpu_utilization,host=mnsbook-pro.local value=119.8 1607222595591`, &Rows{
|
||||
Rows: []Row{{
|
||||
Measurement: "cpu_utilization",
|
||||
Tags: []Tag{{
|
||||
Key: "host",
|
||||
Value: "mnsbook-pro.local",
|
||||
}},
|
||||
Fields: []Field{{
|
||||
Key: "value",
|
||||
Value: 119.8,
|
||||
}},
|
||||
Timestamp: 1607222595591,
|
||||
}},
|
||||
})
|
||||
|
||||
f("x,y=z,g=p:\\ \\ 5432\\,\\ gp\\ mon\\ [lol]\\ con10\\ cmd5\\ SELECT f=1", &Rows{
|
||||
Rows: []Row{{
|
||||
Measurement: "x",
|
||||
|
|
Loading…
Reference in a new issue