telemetry-metrics-parser 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b495c7a2172e397b350c2c30d3ebe57517024af5ddef9792959db5e0c07dfed7
4
- data.tar.gz: 62dd6baeb7e3a17cc92300714e8ea00d611f1f809eacf538675a8f031ada8c77
3
+ metadata.gz: 156821d84a53d9823378fa29da00d0e3fd89ac078f5462451c7bc4acb1a7066b
4
+ data.tar.gz: 6b2c1697d86683bed555fc543d82733fe1919fbd3fcd515af6b5c810107c05d2
5
5
  SHA512:
6
- metadata.gz: a41b4aec7089102e51a31dc054a341ba5cbb2046235f55d5f24f84d7d880b41e529248ac0a3d1e7cc9d3dd4897aa26cf726152895f11984b6e23c7942880f415
7
- data.tar.gz: 29a726191c6fb767c95a37118ddbd6f612f2cc47a413c6721580b7b5f2d3e8d1cf7c3b535d0f79c4ccb9a77870cc12304192bf4ed0f024be3a9872ba1309f979
6
+ metadata.gz: 4310a3f81f543cdc23f552bc87a5a368d1813ec3ec3c2d0a32a6a35cd0eeedfba770d2dbca7c3019e821471a7eb59e35d8bc2edb4049537ae6dec33733006ef8
7
+ data.tar.gz: bcbb5036d57bebac6d56d0edd906e11507196681c1b6a0ec8e5e5b7d939882f9005f08884ca6fa89281357e16a6537648a2db44715a6ee958a7f3b654c9b612f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Telemetry::Metrics::Parser Changelog
2
2
 
3
+ ## v0.2.0
4
+ Adding new line validation methods
5
+
3
6
  ## v0.1.1
4
7
  * Adding more rspec tests for shellwords
5
8
  * Adding in **opts to from_line_protocol method
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
@@ -1,7 +1,7 @@
1
1
  module Telemetry
2
2
  module Metrics
3
3
  module Parser
4
- VERSION = '0.1.1'.freeze
4
+ VERSION = '0.2.0'.freeze
5
5
  end
6
6
  end
7
7
  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.1.1
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: 2021-07-22 00:00:00.000000000 Z
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.2.15
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