influxdb-lineprotocol-parser 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: []
|