telemetry-metrics-parser 0.1.1 → 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 +3 -0
- data/README.md +5 -0
- data/lib/telemetry/metrics/parser/line_protocol.rb +77 -0
- data/lib/telemetry/metrics/parser/version.rb +1 -1
- 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
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
|
----------
|
@@ -55,6 +55,83 @@ module Telemetry
|
|
55
55
|
hash.map { |k, v| "#{k}=#{v}" }.join(',').strip.delete_suffix(',')
|
56
56
|
end
|
57
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?
|
58
135
|
end
|
59
136
|
end
|
60
137
|
end
|
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
|