Skip to content

Commit 04dfa43

Browse files
Robert Fisherdanielnelson
authored andcommitted
Allow delta metrics in wavefront parser (influxdata#5115)
1 parent 03a5fc9 commit 04dfa43

File tree

4 files changed

+36
-0
lines changed

4 files changed

+36
-0
lines changed

plugins/parsers/wavefront/element.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ type LiteralParser struct {
3737
func (ep *NameParser) parse(p *PointParser, pt *Point) error {
3838
//Valid characters are: a-z, A-Z, 0-9, hyphen ("-"), underscore ("_"), dot (".").
3939
// Forward slash ("/") and comma (",") are allowed if metricName is enclosed in double quotes.
40+
// Delta (U+2206) is allowed as the first characeter of the
41+
// metricName
4042
name, err := parseLiteral(p)
43+
4144
if err != nil {
4245
return err
4346
}
@@ -225,6 +228,9 @@ func parseLiteral(p *PointParser) (string, error) {
225228
for tok != EOF && tok > literal_beg && tok < literal_end {
226229
p.writeBuf.WriteString(lit)
227230
tok, lit = p.scan()
231+
if tok == DELTA {
232+
return "", errors.New("found delta inside metric name")
233+
}
228234
}
229235
if tok == QUOTES {
230236
return "", errors.New("found quote inside unquoted literal")

plugins/parsers/wavefront/parser_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,26 @@ func TestParse(t *testing.T) {
1919
assert.Equal(t, parsedMetrics[0].Name(), testMetric.Name())
2020
assert.Equal(t, parsedMetrics[0].Fields(), testMetric.Fields())
2121

22+
parsedMetrics, err = parser.Parse([]byte("\u2206test.delta 1 1530939936"))
23+
assert.NoError(t, err)
24+
testMetric, err = metric.New("\u2206test.delta", map[string]string{},
25+
map[string]interface{}{"value": 1.}, time.Unix(1530939936, 0))
26+
assert.NoError(t, err)
27+
assert.EqualValues(t, parsedMetrics[0], testMetric)
28+
29+
parsedMetrics, err = parser.Parse([]byte("\u0394test.delta 1 1530939936"))
30+
assert.NoError(t, err)
31+
testMetric, err = metric.New("\u0394test.delta", map[string]string{},
32+
map[string]interface{}{"value": 1.}, time.Unix(1530939936, 0))
33+
assert.NoError(t, err)
34+
assert.EqualValues(t, parsedMetrics[0], testMetric)
35+
36+
parsedMetrics, err = parser.Parse([]byte("\u0394test.delta 1.234 1530939936 source=\"mysource\" tag2=value2"))
37+
assert.NoError(t, err)
38+
testMetric, err = metric.New("\u0394test.delta", map[string]string{"source": "mysource", "tag2": "value2"}, map[string]interface{}{"value": 1.234}, time.Unix(1530939936, 0))
39+
assert.NoError(t, err)
40+
assert.EqualValues(t, parsedMetrics[0], testMetric)
41+
2242
parsedMetrics, err = parser.Parse([]byte("test.metric 1 1530939936"))
2343
assert.NoError(t, err)
2444
testMetric, err = metric.New("test.metric", map[string]string{}, map[string]interface{}{"value": 1.}, time.Unix(1530939936, 0))
@@ -166,6 +186,9 @@ func TestParseInvalid(t *testing.T) {
166186
_, err = parser.Parse([]byte("test.metric 1 string"))
167187
assert.Error(t, err)
168188

189+
_, err = parser.Parse([]byte("test.\u2206delta 1"))
190+
assert.Error(t, err)
191+
169192
_, err = parser.Parse([]byte("test.metric 1 1530939936 tag_no_pair"))
170193
assert.Error(t, err)
171194

plugins/parsers/wavefront/scanner.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ func (s *PointScanner) Scan() (Token, string) {
4040
return LETTER, string(ch)
4141
} else if isNumber(ch) {
4242
return NUMBER, string(ch)
43+
} else if isDelta(ch) {
44+
return DELTA, string(ch)
4345
}
4446

4547
// Otherwise read the individual character.

plugins/parsers/wavefront/token.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const (
1818
SLASH
1919
BACKSLASH
2020
COMMA
21+
DELTA
2122
literal_end
2223

2324
// Misc characters
@@ -38,4 +39,8 @@ func isNumber(ch rune) bool {
3839
return ch >= '0' && ch <= '9'
3940
}
4041

42+
func isDelta(ch rune) bool {
43+
return ch == '\u2206' || ch == '\u0394'
44+
}
45+
4146
var eof = rune(0)

0 commit comments

Comments
 (0)