influxdb-lineprotocol-parser 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/influxdb/lineprotocol/parser.rb +84 -34
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e956120bd53a5f395ccc4fc687eb9a629a515930adbd3e87cdbd56baab31873a
|
4
|
+
data.tar.gz: 1d5dbe0f72cc134f389e4d0e09c6e969caf597218167d360042bad9ef0331061
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd0b6ef6ceb0dd5cc242e664f05dd4396a6b24f099315b2e57a2c97e3e71140ef9ccb10e603350c8c352737e0f426085b1f0d2b2768d99a8919e5d633e2123a9
|
7
|
+
data.tar.gz: ee0f7800da3759015a52d35e384cf13e7d88a0be34109cdbd2f569430a6204334724f10a06c1751b03122acdd57ae0b59374e7425c53c739135642e865d2bde9
|
@@ -27,16 +27,20 @@ module InfluxDB
|
|
27
27
|
# Line Protocol parser.
|
28
28
|
#
|
29
29
|
class Parser
|
30
|
-
def initialize(logger: nil,
|
31
|
-
|
32
|
-
|
30
|
+
def initialize(logger: nil, escapes: nil)
|
31
|
+
if logger
|
32
|
+
@log = logger
|
33
|
+
else
|
34
|
+
@log = ::Logger.new(STDERR)
|
35
|
+
@log.level = :warn
|
36
|
+
end
|
33
37
|
case escapes
|
34
38
|
when :compat
|
35
39
|
@unescapes = InfluxDB::LineProtocol::CompatUnescapes.new
|
36
40
|
else
|
37
41
|
@unescapes = InfluxDB::LineProtocol::Unescapes.new
|
38
42
|
end
|
39
|
-
|
43
|
+
enter_whitespace0
|
40
44
|
end
|
41
45
|
|
42
46
|
##
|
@@ -64,7 +68,7 @@ module InfluxDB
|
|
64
68
|
else
|
65
69
|
points << @point
|
66
70
|
end
|
67
|
-
|
71
|
+
enter_whitespace0
|
68
72
|
end
|
69
73
|
end
|
70
74
|
|
@@ -73,9 +77,9 @@ module InfluxDB
|
|
73
77
|
|
74
78
|
private
|
75
79
|
|
76
|
-
def
|
80
|
+
def enter_whitespace0
|
77
81
|
@point = nil
|
78
|
-
@state = :
|
82
|
+
@state = :whitespace0
|
79
83
|
@escaped = false
|
80
84
|
@buf = nil
|
81
85
|
@key = nil
|
@@ -114,7 +118,7 @@ module InfluxDB
|
|
114
118
|
|
115
119
|
|
116
120
|
|
117
|
-
def
|
121
|
+
def whitespace0(buf, i, len)
|
118
122
|
# whitespace consumes TAB, SPACE, and NULL.
|
119
123
|
# This method consumes NEWLINE, HASH, and COMMA.
|
120
124
|
# BACKSLASH and EQUAL (of the special bytes) are valid measurement starts; they are not consumed.
|
@@ -123,7 +127,7 @@ module InfluxDB
|
|
123
127
|
when nil # just whitespace
|
124
128
|
len
|
125
129
|
when COMMA
|
126
|
-
@log.error "
|
130
|
+
@log.error "whitespace0: missing measurement"
|
127
131
|
@state = :invalid
|
128
132
|
i + 1
|
129
133
|
when HASH # comment
|
@@ -133,7 +137,6 @@ module InfluxDB
|
|
133
137
|
i + 1
|
134
138
|
else
|
135
139
|
# don't advance i because the byte belongs to measurement
|
136
|
-
@log.info "initial: start measurement at offset #{i}"
|
137
140
|
@state = :measurement
|
138
141
|
i
|
139
142
|
end
|
@@ -162,9 +165,8 @@ module InfluxDB
|
|
162
165
|
return i
|
163
166
|
when SPACE # start of field set
|
164
167
|
@point = {series: decode(buf, start, i-1), values: {}}
|
165
|
-
@state = :
|
166
|
-
|
167
|
-
return i
|
168
|
+
@state = :whitespace1
|
169
|
+
return i + 1
|
168
170
|
else # part of measurement
|
169
171
|
i += 1
|
170
172
|
end
|
@@ -252,6 +254,21 @@ module InfluxDB
|
|
252
254
|
i
|
253
255
|
end
|
254
256
|
|
257
|
+
def whitespace1(buf, i, len)
|
258
|
+
i, c = whitespace(buf, i, len)
|
259
|
+
case c
|
260
|
+
when nil
|
261
|
+
len
|
262
|
+
when NEWLINE
|
263
|
+
@log.error("whitespace1: missing fields")
|
264
|
+
@state = :invalid
|
265
|
+
i
|
266
|
+
else
|
267
|
+
@state = :field_key
|
268
|
+
i
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
255
272
|
def field_key(buf, i, len)
|
256
273
|
start = i
|
257
274
|
while i < len
|
@@ -340,7 +357,7 @@ module InfluxDB
|
|
340
357
|
value = decode(buf, start, i-1)
|
341
358
|
if value.nil?
|
342
359
|
@log.error("field value boolean: invalid boolean")
|
343
|
-
|
360
|
+
enter_whitespace0
|
344
361
|
return i + 1
|
345
362
|
end
|
346
363
|
@point[:values][@key] = value
|
@@ -356,8 +373,7 @@ module InfluxDB
|
|
356
373
|
end
|
357
374
|
@point[:values][@key] = value
|
358
375
|
@key = nil
|
359
|
-
@state = :
|
360
|
-
i, _ = whitespace(buf, i + 1, len)
|
376
|
+
@state = :whitespace2
|
361
377
|
return i
|
362
378
|
else
|
363
379
|
i += 1
|
@@ -414,8 +430,7 @@ module InfluxDB
|
|
414
430
|
end
|
415
431
|
@point[:values][@key] = value
|
416
432
|
@key = nil
|
417
|
-
@state = :
|
418
|
-
i, _ = whitespace(buf, i + 1, len)
|
433
|
+
@state = :whitespace2
|
419
434
|
return i
|
420
435
|
else
|
421
436
|
i += 1
|
@@ -475,8 +490,7 @@ module InfluxDB
|
|
475
490
|
@state = :complete
|
476
491
|
i + 1
|
477
492
|
when SPACE
|
478
|
-
@state = :
|
479
|
-
i, _ = whitespace(buf, i, len)
|
493
|
+
@state = :whitespace2
|
480
494
|
i
|
481
495
|
else
|
482
496
|
@state = :invalid
|
@@ -487,6 +501,21 @@ module InfluxDB
|
|
487
501
|
end
|
488
502
|
end
|
489
503
|
|
504
|
+
def whitespace2(buf, i, len)
|
505
|
+
i, c = whitespace(buf, i, len)
|
506
|
+
case c
|
507
|
+
when nil
|
508
|
+
len
|
509
|
+
when NEWLINE
|
510
|
+
@log.error("whitespace2: missing timestamp")
|
511
|
+
@state = :invalid
|
512
|
+
i
|
513
|
+
else
|
514
|
+
@state = :timestamp
|
515
|
+
i
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
490
519
|
def timestamp(buf, i, len)
|
491
520
|
start = i
|
492
521
|
while i < len
|
@@ -508,7 +537,6 @@ module InfluxDB
|
|
508
537
|
return i
|
509
538
|
end
|
510
539
|
@point[:timestamp] = value
|
511
|
-
@key = nil
|
512
540
|
@state = :complete
|
513
541
|
return i + 1
|
514
542
|
else
|
@@ -525,7 +553,7 @@ module InfluxDB
|
|
525
553
|
def comment(buf, i, len)
|
526
554
|
i = line_end(buf, i, len)
|
527
555
|
if i < len
|
528
|
-
|
556
|
+
enter_whitespace0
|
529
557
|
i += 1
|
530
558
|
end
|
531
559
|
i
|
@@ -534,7 +562,7 @@ module InfluxDB
|
|
534
562
|
def invalid(buf, i, len)
|
535
563
|
i = line_end(buf, i, len)
|
536
564
|
if i < len
|
537
|
-
|
565
|
+
enter_whitespace0
|
538
566
|
i += 1
|
539
567
|
end
|
540
568
|
i
|
@@ -581,11 +609,11 @@ module InfluxDB
|
|
581
609
|
when :measurement
|
582
610
|
@unescapes.unescape(:measurement, str)
|
583
611
|
when :tag_key
|
584
|
-
str
|
612
|
+
@unescapes.unescape(:tag_key, str)
|
585
613
|
when :tag_value
|
586
|
-
str
|
614
|
+
@unescapes.unescape(:tag_value, str)
|
587
615
|
when :field_key
|
588
|
-
str
|
616
|
+
@unescapes.unescape(:field_key, str)
|
589
617
|
when :field_value_boolean
|
590
618
|
case str
|
591
619
|
when 't', 'T', 'true', 'True'
|
@@ -598,7 +626,7 @@ module InfluxDB
|
|
598
626
|
end
|
599
627
|
when :field_value_numeric
|
600
628
|
case str
|
601
|
-
when /^[
|
629
|
+
when /^[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/
|
602
630
|
str.to_f
|
603
631
|
when /^[+-]?[0-9]+[ui]$/
|
604
632
|
str.to_i
|
@@ -607,7 +635,7 @@ module InfluxDB
|
|
607
635
|
nil
|
608
636
|
end
|
609
637
|
when :field_value_string
|
610
|
-
str
|
638
|
+
@unescapes.unescape(:string, str)
|
611
639
|
when :timestamp
|
612
640
|
case str
|
613
641
|
when /^-?[0-9]+$/
|
@@ -639,27 +667,49 @@ module InfluxDB
|
|
639
667
|
end # Parser
|
640
668
|
|
641
669
|
class CompatUnescapes
|
642
|
-
def unescape(field,
|
670
|
+
def unescape(field, str)
|
643
671
|
case field
|
644
672
|
when :measurement
|
645
|
-
|
646
|
-
|
647
|
-
|
673
|
+
# escaped comma or space anywhere
|
674
|
+
str.gsub(/\\([, ])/, '\\1')
|
675
|
+
when :tag_key, :tag_value, :field_key
|
676
|
+
# escaped comma, equals, or space anywhere
|
677
|
+
str.gsub(/\\([,= ])/, '\\1')
|
678
|
+
when :string
|
679
|
+
# escaped quote anywhere
|
680
|
+
str.gsub(/\\"/, '"')
|
648
681
|
end
|
649
682
|
end
|
650
683
|
end
|
651
684
|
|
652
685
|
class Unescapes
|
653
|
-
def unescape(field,
|
686
|
+
def unescape(field, str)
|
654
687
|
case field
|
655
688
|
when :measurement
|
656
689
|
# 1. escaped hash, null, or tab at the beginning
|
657
690
|
# 2. escaped comma, space, or newline anywhere
|
658
691
|
# 3. escaped backslash at the end
|
659
|
-
|
692
|
+
str
|
660
693
|
.sub(/^\\([#\0\t])/, '\\1')
|
661
694
|
.gsub(/\\([, \n])/, '\\1')
|
662
695
|
.sub(/\\\\$/, '\\')
|
696
|
+
when :tag_key, :tag_value
|
697
|
+
# 1. escaped comma, equals, newline, or space anywhere
|
698
|
+
# 2. escaped backslash at the end
|
699
|
+
str
|
700
|
+
.gsub(/\\([,=\n ])/, '\\1')
|
701
|
+
.sub(/\\\\$/, '\\')
|
702
|
+
when :field_key
|
703
|
+
# 1. escaped null or tab at beginning
|
704
|
+
# 2. escaped comma, equals, newline, or space anywhere
|
705
|
+
# 3. escaped backslash at the end
|
706
|
+
str
|
707
|
+
.sub(/^\\([\0\t])/, '\\1')
|
708
|
+
.gsub(/\\([,=\n ])/, '\\1')
|
709
|
+
.sub(/\\\\$/, '\\')
|
710
|
+
when :string
|
711
|
+
# escaped quote anywhere
|
712
|
+
str.gsub(/\\"/, '"')
|
663
713
|
end
|
664
714
|
end
|
665
715
|
end
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: influxdb-lineprotocol-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikko Värri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description: '
|
13
|
+
description: 'Incremental (a.k.a streaming) parser for InfluxDB Line Protocol.
|
14
14
|
|
15
15
|
'
|
16
16
|
email: mikko@varri.fi
|
@@ -43,5 +43,5 @@ requirements: []
|
|
43
43
|
rubygems_version: 3.0.3
|
44
44
|
signing_key:
|
45
45
|
specification_version: 4
|
46
|
-
summary: InfluxDB
|
46
|
+
summary: InfluxDB Line Protocol parser
|
47
47
|
test_files: []
|