telemetry-metrics-parser 0.1.0 → 0.2.0
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/CHANGELOG.md +8 -0
- data/README.md +5 -0
- data/lib/telemetry/metrics/parser/line_protocol.rb +82 -3
- data/lib/telemetry/metrics/parser/version.rb +1 -1
- data/lib/telemetry/metrics/parser.rb +2 -2
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 156821d84a53d9823378fa29da00d0e3fd89ac078f5462451c7bc4acb1a7066b
|
4
|
+
data.tar.gz: 6b2c1697d86683bed555fc543d82733fe1919fbd3fcd515af6b5c810107c05d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4310a3f81f543cdc23f552bc87a5a368d1813ec3ec3c2d0a32a6a35cd0eeedfba770d2dbca7c3019e821471a7eb59e35d8bc2edb4049537ae6dec33733006ef8
|
7
|
+
data.tar.gz: bcbb5036d57bebac6d56d0edd906e11507196681c1b6a0ec8e5e5b7d939882f9005f08884ca6fa89281357e16a6537648a2db44715a6ee958a7f3b654c9b612f
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,12 @@
|
|
1
1
|
# Telemetry::Metrics::Parser Changelog
|
2
2
|
|
3
|
+
## v0.2.0
|
4
|
+
Adding new line validation methods
|
5
|
+
|
6
|
+
## v0.1.1
|
7
|
+
* Adding more rspec tests for shellwords
|
8
|
+
* Adding in **opts to from_line_protocol method
|
9
|
+
* Changing line protocol parser to use shellwords logic by default
|
10
|
+
|
3
11
|
## v0.1.0
|
4
12
|
Initial Version
|
data/README.md
CHANGED
@@ -24,6 +24,11 @@ results[:fields] # => { temperature: 82 }
|
|
24
24
|
results[:timestamp] # => 1465839830100400200
|
25
25
|
```
|
26
26
|
|
27
|
+
#### Validations
|
28
|
+
```ruby
|
29
|
+
Telemetry::Metrics::Parser::LineProtocol.line_is_valid?('weather,location=us-midwest temperature=82 1465839830100400200') # true
|
30
|
+
Telemetry::Metrics::Parser::LineProtocol.line_is_valid?('weather,location=us-midwest temperature=this_field_is_a_string 1465839830100400200') # false but returned as a string error
|
31
|
+
```
|
27
32
|
|
28
33
|
Authors
|
29
34
|
----------
|
@@ -7,11 +7,11 @@ module Telemetry
|
|
7
7
|
module LineProtocol
|
8
8
|
extend Telemetry::NumberHelper
|
9
9
|
|
10
|
-
def parse(line, use_shellwords:
|
10
|
+
def parse(line, use_shellwords: true)
|
11
11
|
if use_shellwords
|
12
|
-
raw_tags, raw_fields, timestamp = Shellwords.split(line)
|
12
|
+
raw_tags, raw_fields, timestamp = Shellwords.split(line.strip)
|
13
13
|
else
|
14
|
-
raw_tags, raw_fields, timestamp = line.split
|
14
|
+
raw_tags, raw_fields, timestamp = line.strip.split
|
15
15
|
end
|
16
16
|
|
17
17
|
{
|
@@ -33,6 +33,8 @@ module Telemetry
|
|
33
33
|
|
34
34
|
def split_string_to_hash(raw_string)
|
35
35
|
results = {}
|
36
|
+
return results if raw_string.nil?
|
37
|
+
|
36
38
|
raw_string.split(',').each do |string|
|
37
39
|
next unless string.include? '='
|
38
40
|
|
@@ -53,6 +55,83 @@ module Telemetry
|
|
53
55
|
hash.map { |k, v| "#{k}=#{v}" }.join(',').strip.delete_suffix(',')
|
54
56
|
end
|
55
57
|
module_function :hash_to_line
|
58
|
+
|
59
|
+
def line_is_recent?(timestamp, max_age_sec: 86_400)
|
60
|
+
return false unless timestamp.is_a?(Integer)
|
61
|
+
return false unless max_age_sec.is_a?(Integer)
|
62
|
+
|
63
|
+
current_epoch_ns = DateTime.now.strftime('%s%9N').to_i
|
64
|
+
timestamp >= current_epoch_ns - (max_age_sec * 1000 * 1000 * 1000 * 3)
|
65
|
+
end
|
66
|
+
module_function :line_is_recent?
|
67
|
+
|
68
|
+
def field_is_number?(value)
|
69
|
+
return false if value.nil?
|
70
|
+
return true if value.is_a?(Integer)
|
71
|
+
return true if value.is_a?(Float)
|
72
|
+
|
73
|
+
%(f i).include?(value[-1])
|
74
|
+
end
|
75
|
+
module_function :field_is_number?
|
76
|
+
|
77
|
+
def tag_is_valid?(key, value)
|
78
|
+
return false if key.nil? || value.nil?
|
79
|
+
return false unless value.chars.detect { |ch| !valid_tag_chars.include?(ch) }.nil?
|
80
|
+
return false unless key.to_s.chars.detect { |ch| !valid_tag_chars.include?(ch) }.nil?
|
81
|
+
|
82
|
+
true
|
83
|
+
end
|
84
|
+
module_function :tag_is_valid?
|
85
|
+
|
86
|
+
def node_group_tag?(tags)
|
87
|
+
tags[:influxdb_node_group].is_a?(String)
|
88
|
+
end
|
89
|
+
module_function :node_group_tag?
|
90
|
+
|
91
|
+
def database_tag?(tags)
|
92
|
+
tags[:influxdb_database].is_a?(String)
|
93
|
+
end
|
94
|
+
module_function :database_tag?
|
95
|
+
|
96
|
+
def measurement_valid?(measurement)
|
97
|
+
return false unless measurement.is_a?(String)
|
98
|
+
|
99
|
+
measurement.chars.detect { |ch| !valid_measurement_chars.include?(ch) }.nil?
|
100
|
+
end
|
101
|
+
module_function :measurement_valid?
|
102
|
+
|
103
|
+
def valid_measurement_chars
|
104
|
+
@valid_measurement_chars ||= ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a + %w[_ - .]
|
105
|
+
end
|
106
|
+
module_function :valid_measurement_chars
|
107
|
+
|
108
|
+
def valid_tag_chars
|
109
|
+
@valid_tag_chars ||= ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a + %w[_ - .]
|
110
|
+
end
|
111
|
+
module_function :valid_tag_chars
|
112
|
+
|
113
|
+
def line_is_valid?(line) # rubocop:disable Metrics/AbcSize
|
114
|
+
line = parse(line) if line.is_a?(String)
|
115
|
+
return "line is too old, #{line}" unless line_is_recent?(line[:timestamp])
|
116
|
+
return "line is missing influxdb_database, #{line}" unless node_group_tag? line[:tags]
|
117
|
+
return "line is missing influxdb_node_group, #{line}" unless database_tag? line[:tags]
|
118
|
+
return "measurement name #{line[:measurement]} is not valid" unless measurement_valid?(line[:measurement])
|
119
|
+
|
120
|
+
line[:fields].each do |field, value|
|
121
|
+
next if field_is_number?(value)
|
122
|
+
|
123
|
+
return "field values must be an Integer or String, #{field} :#{value} #{value.class}"
|
124
|
+
end
|
125
|
+
|
126
|
+
line[:tags].each do |tag, value|
|
127
|
+
next if tag_is_valid?(tag, value)
|
128
|
+
|
129
|
+
return "tags must be a-z0-9_-. but was given #{tag}: #{value}"
|
130
|
+
end
|
131
|
+
|
132
|
+
true
|
133
|
+
end
|
134
|
+
module_function :line_is_valid?
|
56
135
|
end
|
57
136
|
end
|
58
137
|
end
|
@@ -4,8 +4,8 @@ require 'telemetry/metrics/parser/line_protocol'
|
|
4
4
|
module Telemetry
|
5
5
|
module Metrics
|
6
6
|
module Parser
|
7
|
-
def from_line_protocol(line)
|
8
|
-
Telemetry::Metrics::Parser::LineProtocol.parse(line)
|
7
|
+
def from_line_protocol(line, **opts)
|
8
|
+
Telemetry::Metrics::Parser::LineProtocol.parse(line, **opts)
|
9
9
|
end
|
10
10
|
module_function :from_line_protocol
|
11
11
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: telemetry-metrics-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Esity
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A metrics line parser gem for things like influxdb line protocol
|
14
14
|
email:
|
@@ -55,7 +55,7 @@ metadata:
|
|
55
55
|
homepage_uri: https://github.com/Optum/telemetry-metrics-parser
|
56
56
|
source_code_uri: https://github.com/Optum/telemetry-metrics-parser
|
57
57
|
wiki_uri: https://github.com/Optum/telemetry-metrics-parser/wiki
|
58
|
-
post_install_message:
|
58
|
+
post_install_message:
|
59
59
|
rdoc_options: []
|
60
60
|
require_paths:
|
61
61
|
- lib
|
@@ -70,8 +70,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
70
|
- !ruby/object:Gem::Version
|
71
71
|
version: '0'
|
72
72
|
requirements: []
|
73
|
-
rubygems_version: 3.
|
74
|
-
signing_key:
|
73
|
+
rubygems_version: 3.3.11
|
74
|
+
signing_key:
|
75
75
|
specification_version: 4
|
76
76
|
summary: Parses common line formats for InfluxDB Line Protocol and turns it into a
|
77
77
|
ruby hash
|