sensu-plugins-outlyer 0.5.0 → 0.6.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: 46c1c2455d4122918ce986502ba90d6305f5d36edd67d4d98168183d596947f6
4
- data.tar.gz: d7bdb065ab7a39cc84cc5b565450aa3df401bcce8cda35cf8a158b6c76a8de0c
3
+ metadata.gz: a52cd273a16bb979d729d59b18b362fea57a28e2735b66b3a4b85cf210d8d4da
4
+ data.tar.gz: 57bbeafe4ee42dd5cdd9eebb8ce32382e10270b10cb8d048f3d967159d3851dd
5
5
  SHA512:
6
- metadata.gz: a61588c67195ff17deedc7a6d8c2c67696c76e68f867984fd4518bfbfe26729cc903b66883d198578b3dbc7012b060c0e56d532e7e3be19ee77b9cbba6f60a5a
7
- data.tar.gz: b1b4f5348d643858473e4e9ad11fa21aa25aaf9d8b0a0706e34b316c403ebfe75b34976ab60b852707ba1fc32ff93abfc11a501534f8c12864cc2feb2b90333b
6
+ metadata.gz: 9bcb06a1122343f198587265b870a38c1518a1cb52590f59c8f577fd97bfdd65fed132616e5ea8535d9f9086e4ab10add59e90ac4972e77d38092f138ee851da
7
+ data.tar.gz: d7ff052d31f96d246b5ba5d09f03df74797c30c76172176939a740abc5b4cf30f61eef459bff0e8ae32d479096fe600df6505fbf009ece055f7f829e6b8097de
data/CHANGELOG.md CHANGED
@@ -3,10 +3,11 @@ This project adheres to [Semantic Versioning](http://semver.org/).
3
3
 
4
4
  This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/)
5
5
 
6
- ## [0.5.0] - 2018-07-16
6
+ ## [0.6.0] - 2018-07-16
7
7
  - Made debug flag boolean
8
8
  - Added additional debug logging for troubleshooting
9
9
  - Added Unit Tests
10
+ - Added new Graphite parsing method with filters
10
11
 
11
12
  ## [0.4.0] - 2018-07-13
12
13
  - Added handling for client environments set as array of values
@@ -75,10 +75,6 @@ class OutlyerMetrics < Sensu::Handler
75
75
  @check_name = @event['check']['name']
76
76
  @host = @event['client']['name'].strip.to_s
77
77
  @environment = @event['client']['environment']
78
- if @environment.kind_of?(Array)
79
- # environment can be an array, so merge values with hyphens
80
- @environment = @environment.join("-")
81
- end
82
78
  timestamp = @event['check']['executed'].to_i * 1000
83
79
 
84
80
  if config[:debug]
@@ -91,7 +87,7 @@ class OutlyerMetrics < Sensu::Handler
91
87
  else
92
88
  parse_graphite_output(output)
93
89
  end
94
-
90
+
95
91
  # Add a service status metric
96
92
  metrics.push(create_datapoint('service.status', check_status, timestamp, {service: "sensu.#{sanitize_value(@check_name)}"}))
97
93
  # Post metrics to Outlyer
@@ -100,23 +96,21 @@ class OutlyerMetrics < Sensu::Handler
100
96
 
101
97
  # Create a single data point
102
98
  #
103
- # @param name [String] metric name
104
- # @param value [Float] metric value
105
- # @param time [Integer] epoch timestamp of metric in milliseconds
106
- # @param labels [HashMap] (Optional) Additional labels to append to data point
99
+ # @param name [String] metric name
100
+ # @param value [Float] metric value
101
+ # @param time [Integer] epoch timestamp of metric in milliseconds
102
+ # @param labels [HashMap] (Optional) Additional labels to append to data point
103
+ # @param metric_host [String] (Optional) Set a host for the metric
107
104
  #
108
- def create_datapoint(name, value, time, labels = nil)
105
+ def create_datapoint(name, value, time, labels = {}, metric_host=@host)
109
106
  datapoint = {
110
- host: @host,
111
- labels: {
112
- environment: @environment,
113
- },
107
+ host: metric_host,
108
+ labels: labels,
114
109
  name: name,
115
110
  timestamp: time,
116
111
  type: 'gauge',
117
112
  value: value
118
113
  }
119
- datapoint[:labels].merge!(labels) unless labels.nil?
120
114
  datapoint
121
115
  end
122
116
 
@@ -160,49 +154,77 @@ class OutlyerMetrics < Sensu::Handler
160
154
  def parse_graphite_output(output)
161
155
  data = []
162
156
 
163
- # Get Scheme to parse Graphite metrics if exists
164
- scheme = nil
157
+ # Get Schemes to parse Graphite metrics if exists
158
+ schemes = nil
165
159
  if settings['outlyer'].key?('schemes') && settings['outlyer']['schemes'] != nil
166
- if settings['outlyer']['schemes'].key?(@check_name)
167
- scheme = settings['outlyer']['schemes'][@check_name]
168
- else
169
- # Get default scheme if check specific scheme not defined
170
- scheme = settings['outlyer']['schemes']['default']
171
- end
160
+ schemes = settings['outlyer']['schemes']
172
161
  end
173
162
 
174
163
  # Parse the metric on each line in graphite format
175
164
  output.split("\n").each do |metric|
176
165
  m = metric.split
177
166
  next unless m.count == 3
178
- # Get name and extract labels - we remove hostname if in metric name
179
- # as it contains dots and breaks parsing
180
- metric_parts = m[0].gsub("#{@host}", 'host').split('.')
181
- labels = {service: "sensu.#{sanitize_value(@check_name)}"}
182
- if scheme
183
- metric_name = metric_parts.last(scheme['metric_name_length'].to_i).join('.')
184
- # Get dimensions from metric name
185
- schema_parts = scheme['scheme'].split('.')
186
- if (metric_parts.length - scheme['metric_name_length'].to_i) != schema_parts.length
187
- puts "Scheme Parsing Error: metric parts (#{metric_parts.length - scheme['metric_name_length'].to_i}) is not same length as schema (#{schema_parts.length})"
188
- puts "Scheme: #{scheme['scheme']}"
189
- puts "Example metric: #{m[0]}"
190
- if config[:debug]
191
- puts "Event Data: \n#{JSON.pretty_generate(@event)}"
167
+ labels = {service: "sensu.#{sanitize_value(@check_name)}"}
168
+ metric_host = @host
169
+
170
+ # Check to see if we have a scheme filter that matches the metric name
171
+ template = nil
172
+ if schemes
173
+ schemes.each do |scheme|
174
+ filter = Regexp.new("^#{Regexp.escape(scheme['filter']).gsub('\*','[^\.]*?')}$")
175
+ if m[0] =~ filter
176
+ template = scheme['template']
177
+ if config[:debug]
178
+ puts "Template Found: '#{template}' with REGEX '#{filter.inspect}'"
179
+ end
180
+ break
181
+ end
192
182
  end
193
- return []
194
- end
195
- schema_parts.each_with_index do |val,index|
196
- if val != 'host' && val != 'hostname' && val != 'name'
197
- labels.merge!(Hash[sanitize_value(val, 40),sanitize_value(metric_parts[index])])
183
+
184
+ # Found a template to parse metric
185
+ if template
186
+ metric_parts = m[0].split('.')
187
+ template_parts = template.split('.')
188
+
189
+ # Iterate through the template to parse the metric labels
190
+ template_parts.each_with_index do |val,index|
191
+ key = sanitize_value(val, 40)
192
+ value = sanitize_value(metric_parts[index])
193
+ if labels.key?(key)
194
+ # If value is spread over multiple parts re-append the value
195
+ labels[key] += ".#{value}"
196
+ else
197
+ labels.merge!(Hash[key,value])
198
+ end
199
+ end
200
+
201
+ # Now we have all the labels extracted, need to ensure a
202
+ # name was given and optional host
203
+ if labels.key?('name')
204
+ metric_name = labels['name']
205
+ labels.delete('name')
206
+ end
207
+ if labels.key?('host')
208
+ metric_host = labels['host']
209
+ labels.delete('host')
210
+ end
211
+
212
+ else
213
+ # If no template found, ignore metric and put warning in handler
214
+ # this avoids un-configured checks sending bad data to Outlyer
215
+ puts "No scheme was found that matches the metric '#{m[0]}.'"
216
+ puts "Please configure a scheme for the check '#{@check_name}' "\
217
+ "on the Sensu client '#{@host}'."
218
+ exit(2)
219
+ metric_name = sanitize_value(m[0])
198
220
  end
221
+ else
222
+ metric_name = sanitize_value(m[0])
199
223
  end
200
- else
201
- metric_name = sanitize_value(metric_parts.join('.'))
202
- end
224
+
203
225
  value = m[1].to_f
204
226
  time = m[2].to_i * 1000
205
- point = create_datapoint(metric_name, value, time, labels)
227
+ point = create_datapoint(metric_name, value, time, labels, metric_host)
206
228
  data.push(point)
207
229
  end
208
230
  data
@@ -1,7 +1,7 @@
1
1
  module SensuPluginsOutlyer
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 5
4
+ MINOR = 6
5
5
  PATCH = 0
6
6
 
7
7
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugins-outlyer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dataloop Software, INC. Trading as Outlyer