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 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