sensu-plugins-graphite-donotuse 0.0.7

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.
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Sensu - Graphite Event Handler
4
+ #
5
+ # This handler takes events and POSTs them to a graphite events URI.
6
+ #
7
+ # For configuration see: graphite_event.json
8
+ #
9
+ # See here for more details:
10
+ #
11
+ # * https://code.launchpad.net/~lucio.torre/graphite/add-events/+merge/69142
12
+ #
13
+ # Author: Rob Wilson <roobert@gmail.com>
14
+ #
15
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
16
+ # for details
17
+
18
+ require 'sensu-handler'
19
+ require 'net/http'
20
+ require 'net/https'
21
+ require 'uri'
22
+ require 'json'
23
+
24
+ class GraphiteEvent < Sensu::Handler
25
+ def post_event(uri, body)
26
+ uri = URI.parse(uri)
27
+ req = Net::HTTP::Post.new(uri.path)
28
+ sock = Net::HTTP.new(uri.host, uri.port)
29
+ sock.use_ssl = uri.scheme == 'https' ? true : false
30
+ req.body = body
31
+
32
+ req.basic_auth(uri.user, uri.password) if uri.user
33
+
34
+ sock.start { |http| http.request(req) }
35
+ end
36
+
37
+ def event_status
38
+ case @event['check']['status']
39
+ when 0
40
+ 'ok'
41
+ when 1
42
+ 'warning'
43
+ when 2
44
+ 'critical'
45
+ else
46
+ 'unknown'
47
+ end
48
+ end
49
+
50
+ def handle
51
+ tags = [
52
+ 'sensu',
53
+ 'event',
54
+ event_status,
55
+ @event['client']['name'],
56
+ @event['check']['name']
57
+ ]
58
+
59
+ tags += settings['graphite_event']['tags'] if settings['graphite_event']['tags']
60
+
61
+ body = {
62
+ 'what' => 'sensu_event',
63
+ 'tags' => tags.join(','),
64
+ 'data' => event_status,
65
+ 'when' => Time.now.to_i
66
+ }
67
+
68
+ uri = settings['graphite_event']['server_uri']
69
+
70
+ begin
71
+ post_event(uri, body.to_json)
72
+ rescue => e
73
+ bail "failed to send event to #{uri}: #{e}"
74
+ end
75
+
76
+ puts "sent event to graphite: #{body.to_json}"
77
+ end
78
+ end
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
4
+ # for details
5
+ #
6
+ # This will send a 1 to a graphite metric when an event is created and 0 when it's resolved
7
+ # See http://imansson.wordpress.com/2012/11/26/why-sensu-is-a-monitoring-router-some-cool-handlers/
8
+
9
+ require 'sensu-handler'
10
+ require 'simple-graphite'
11
+
12
+ class Resolve < Sensu::Handler
13
+ def handle
14
+ port = settings['graphite_notify']['port'] ? settings['graphite_notify']['port'].to_s : '2003'
15
+ graphite = Graphite.new(host: settings['graphite_notify']['host'], port: port)
16
+ return unless graphite
17
+ prop = @event['action'] == 'create' ? 1 : 0
18
+ message = "#{settings['graphite_notify']['prefix']}.#{@event['client']['name'].gsub('.', '_')}.#{@event['check']['name']}"
19
+ message += " #{prop} #{graphite.time_now + rand(100)}"
20
+ begin
21
+ graphite.push_to_graphite do |graphite_socket|
22
+ graphite_socket.puts message
23
+ end
24
+ rescue ETIMEDOUT
25
+ error_msg = "Can't connect to #{settings['graphite_notify']['host']}:#{port} and send message #{message}'"
26
+ raise error_msg
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Copyright 2013 vimov, LLC. <a.gameel@vimov.com>
4
+ #
5
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
6
+ # for details.
7
+
8
+ require 'sensu-handler'
9
+
10
+ class GraphiteOccurrences < Sensu::Handler
11
+ # override filters from Sensu::Handler. not appropriate for metric handlers
12
+ def filter; end
13
+
14
+ def handle
15
+ hostname = @event['client']['name'].split('.').first
16
+ # #YELLOW
17
+ check_name = @event['check']['name'].gsub(%r{[ \.]}, '_')
18
+ value = @event['action'] == 'create' ? @event['occurrences'] : 0
19
+ now = Time.now.to_i
20
+
21
+ # Get graphite-like format for sensu events here
22
+ check_occurences = "sensu.#{hostname}.#{check_name} #{value} #{now}"
23
+
24
+ graphite_server = settings['graphite']['server']
25
+ graphite_port = settings['graphite']['port']
26
+
27
+ begin
28
+ timeout(3) do
29
+ sock = TCPSocket.new(graphite_server, graphite_port)
30
+ sock.puts check_occurences
31
+ sock.close
32
+ end
33
+ rescue Timeout::Error
34
+ puts 'graphite -- timed out while sending check occurrence'
35
+ rescue => error
36
+ puts "graphite -- failed to send check occurrence: #{error}"
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Graphite
4
+ # ===
5
+ #
6
+ # DESCRIPTION:
7
+ # This mutator is an extension of the OnlyCheckOutput mutator, but
8
+ # modified for Graphite metrics. This mutator only sends event output
9
+ # (so you don't need to use OnlyCheckOutput) and it also modifies
10
+ # the format of the hostname in the output if present.
11
+ #
12
+ # OUTPUT:
13
+ # Sensu event output with all dots changed to underlines in host name
14
+ # If -r or --reverse parameter given script put hostname in reverse order
15
+ # for better graphite tree view
16
+ #
17
+ # PLATFORM:
18
+ # all
19
+ #
20
+ # DEPENDENCIES:
21
+ # none
22
+ #
23
+ # Copyright 2013 Peter Kepes <https://github.com/kepes>
24
+ #
25
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
26
+ # for details.
27
+ require 'json'
28
+
29
+ # parse event
30
+ event = JSON.parse(STDIN.read, symbolize_names: true)
31
+
32
+ if ARGV[0] == '-r' || ARGV[0] == '--reverse'
33
+ puts event[:check][:output].gsub(event[:client][:name], event[:client][:name].split('.').reverse.join('.'))
34
+ else
35
+ puts event[:check][:output].gsub(event[:client][:name], event[:client][:name].gsub('.', '_'))
36
+ end
@@ -0,0 +1 @@
1
+ require 'sensu-plugins-graphite/version'
@@ -0,0 +1,113 @@
1
+ module SensuPluginsGraphite
2
+ module GraphiteProxy
3
+ module Options
4
+ def self.included(base)
5
+ add_default_options(base)
6
+ end
7
+
8
+ def self.add_default_options(base)
9
+ default_options.each do |name, vals|
10
+ base.send(:option, name, vals)
11
+ end
12
+ end
13
+
14
+ def self.default_options
15
+ {
16
+ target: {
17
+ description: 'Graphite data target',
18
+ short: '-t TARGET',
19
+ long: '--target TARGET',
20
+ required: true
21
+ },
22
+
23
+ server: {
24
+ description: 'Server host and port',
25
+ short: '-s SERVER:PORT',
26
+ long: '--server SERVER:PORT',
27
+ required: true
28
+ },
29
+
30
+ username: {
31
+ description: 'username for basic http authentication',
32
+ short: '-u USERNAME',
33
+ long: '--user USERNAME',
34
+ required: false
35
+ },
36
+
37
+ password: {
38
+ description: 'user password for basic http authentication',
39
+ short: '-p PASSWORD',
40
+ long: '--pass PASSWORD',
41
+ required: false
42
+ },
43
+
44
+ passfile: {
45
+ description: 'password file path for basic http authentication',
46
+ short: '-P PASSWORDFILE',
47
+ long: '--passfile PASSWORDFILE',
48
+ required: false
49
+ },
50
+
51
+ no_ssl_verify: {
52
+ description: 'Do not verify SSL certs',
53
+ short: '-v',
54
+ long: '--nosslverify'
55
+ },
56
+
57
+ help: {
58
+ description: 'Show this message',
59
+ short: '-h',
60
+ long: '--help'
61
+ },
62
+
63
+ auth: {
64
+ description: 'Add an auth token to the HTTP request, in the form of "Name: Value",
65
+ e.g. --auth yourapitokenvaluegoeshere',
66
+ short: '-A TOKEN',
67
+ long: '--auth TOKEN'
68
+ },
69
+
70
+ name: {
71
+ description: 'Name used in responses',
72
+ short: '-n NAME',
73
+ long: '--name NAME',
74
+ default: 'graphite check'
75
+ },
76
+
77
+ hostname_sub: {
78
+ description: 'Character used to replace periods (.) in hostname (default: _)',
79
+ short: '-s CHARACTER',
80
+ long: '--host-sub CHARACTER'
81
+ },
82
+
83
+ from: {
84
+ description: 'Get samples starting from FROM (default: -10mins)',
85
+ short: '-f FROM',
86
+ long: '--from FROM',
87
+ default: '-10mins'
88
+ },
89
+
90
+ warning: {
91
+ description: 'Generate warning if number of hosts is below received value',
92
+ short: '-w VALUE',
93
+ long: '--warn VALUE',
94
+ proc: proc(&:to_f)
95
+ },
96
+
97
+ critical: {
98
+ description: 'Generate critical if number of hosts is below received value',
99
+ short: '-c VALUE',
100
+ long: '--critical VALUE',
101
+ proc: proc(&:to_f)
102
+ },
103
+
104
+ below: {
105
+ description: 'alert if number of hosts below specified thresholds',
106
+ short: '-b',
107
+ long: '--below'
108
+ }
109
+ }
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,120 @@
1
+ require 'open-uri'
2
+
3
+ module SensuPluginsGraphite
4
+ module GraphiteProxy
5
+ class ProxyError < StandardError
6
+ attr_accessor :exception
7
+
8
+ def initialize(msg, args)
9
+ self.exception = args[:exception]
10
+ super msg
11
+ end
12
+ end
13
+
14
+ class Proxy
15
+ attr_accessor :config
16
+
17
+ def initialize(config)
18
+ self.config = config
19
+ end
20
+
21
+ def formatted_target
22
+ if config[:target].include?('$')
23
+ require 'socket'
24
+ formatted = Socket.gethostbyname(Socket.gethostname).first.gsub('.', config[:hostname_sub] || '_')
25
+ config[:target].gsub('$', formatted)
26
+ else
27
+ URI.escape config[:target]
28
+ end
29
+ end
30
+
31
+ def request_auth_options(given_opts)
32
+ url_opts = {}
33
+
34
+ url_opts[:ssl_verify_mode] = OpenSSL::SSL::VERIFY_NONE if given_opts[:no_ssl_verify]
35
+
36
+ if given_opts[:username]
37
+ pass = derive_password(given_opts)
38
+ url_opts[:http_basic_authentication] = [given_opts[:username], pass.chomp]
39
+ end # we don't have both username and password trying without
40
+
41
+ url_opts['Authorization'] = "Bearer #{given_opts[:auth]}" if given_opts[:auth]
42
+
43
+ url_opts
44
+ end
45
+
46
+ def derive_password(given_opts)
47
+ if given_opts[:passfile]
48
+ File.open(given_opts[:passfile]).readline
49
+ elsif given_opts[:password]
50
+ given_opts[:password]
51
+ end
52
+ end
53
+
54
+ def format_output(data)
55
+ output = {}
56
+
57
+ data.each do |raw|
58
+ unless raw['datapoints'].empty?
59
+ line = output_line(raw)
60
+ output[line['target']] = line
61
+ end
62
+ end
63
+ output
64
+ end
65
+
66
+ def output_line(raw)
67
+ raw['datapoints'].delete_if { |v| v.first.nil? }
68
+ target = raw['target']
69
+ data = raw['datapoints'].map(&:first)
70
+ if !raw['datapoints'].first.nil? && !raw['datapoints'].last.nil? && raw['datapoints'].size.to_f > 0
71
+ start = raw['datapoints'].first.last
72
+ dend = raw['datapoints'].last.last
73
+ rdpsize = raw['datapoints'].size.to_f
74
+ step = ((dend - start) / rdpsize).ceil # moved it here to avoid division by 0.
75
+ else
76
+ # Filling up some dummy variables
77
+ start = 0
78
+ dend = 0
79
+ step = 0
80
+ end
81
+ { 'target' => target, 'data' => data, 'start' => start, 'end' => dend, 'step' => step }
82
+ end
83
+
84
+ # grab data from graphite
85
+ def retrieve_data!
86
+ unless @raw_data
87
+ begin
88
+ unless config[:server].start_with?('https://', 'http://')
89
+ config[:server].prepend('http://')
90
+ end
91
+
92
+ url = "#{config[:server]}/render?format=json&target=#{formatted_target}&from=#{config[:from]}"
93
+
94
+ handle = open(url, request_auth_options(config))
95
+
96
+ @raw_data = handle.gets
97
+ if @raw_data == '[]'
98
+ unknown 'Empty data received from Graphite - metric probably doesn\'t exists'
99
+ else
100
+ json_data = JSON.parse(@raw_data)
101
+ format_output(json_data)
102
+ end
103
+ rescue OpenURI::HTTPError => e
104
+ raise ProxyError.new('Failed to connect to graphite server', exception: e)
105
+ rescue NoMethodError => e
106
+ raise ProxyError.new('No data for time period and/or target', exception: e)
107
+ rescue Errno::ECONNREFUSED => e
108
+ raise ProxyError.new('Connection refused when connecting to graphite server', exception: e)
109
+ rescue Errno::ECONNRESET => e
110
+ raise ProxyError.new('Connection reset by peer when connecting to graphite server', exception: e)
111
+ rescue EOFError => e
112
+ raise ProxyError.new('End of file error when reading from graphite server', exception: e)
113
+ rescue => e
114
+ raise ProxyError.new("An unknown error occured: #{e.inspect}", exception: e)
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,9 @@
1
+ module SensuPluginsGraphite
2
+ module Version
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ PATCH = 7
6
+
7
+ VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,274 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sensu-plugins-graphite-donotuse
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.7
5
+ platform: ruby
6
+ authors:
7
+ - Sensu Plugins and contributors
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: array_stats
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.6.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.6.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: ipaddress
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.8.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.8.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rest-client
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.8.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.8.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: sensu-plugin
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.2.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 1.2.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: simple-graphite
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 2.1.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 2.1.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.7'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.7'
97
+ - !ruby/object:Gem::Dependency
98
+ name: codeclimate-test-reporter
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.4'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.4'
111
+ - !ruby/object:Gem::Dependency
112
+ name: github-markup
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.3'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.3'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.10'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.10'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rake
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '10.0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '10.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: redcarpet
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.2'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.2'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rubocop
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 0.32.1
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '='
179
+ - !ruby/object:Gem::Version
180
+ version: 0.32.1
181
+ - !ruby/object:Gem::Dependency
182
+ name: rspec
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '3.1'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '3.1'
195
+ - !ruby/object:Gem::Dependency
196
+ name: yard
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0.8'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '0.8'
209
+ description: |-
210
+ This plugin provides native Graphite instrumentation
211
+ for monitoring, including: replication status,
212
+ various Graphite data queries, mutators, and handlers
213
+ email: "<sensu-users@googlegroups.com>"
214
+ executables:
215
+ - check-graphite-data.rb
216
+ - check-graphite-hosts.rb
217
+ - check-graphite-replication.rb
218
+ - check-graphite-stats.rb
219
+ - check-graphite.rb
220
+ - handler-graphite-event.rb
221
+ - handler-graphite-notify.rb
222
+ - handler-graphite-occurrences.rb
223
+ - mutator-graphite.rb
224
+ extensions: []
225
+ extra_rdoc_files: []
226
+ files:
227
+ - CHANGELOG.md
228
+ - LICENSE
229
+ - README.md
230
+ - bin/check-graphite-data.rb
231
+ - bin/check-graphite-hosts.rb
232
+ - bin/check-graphite-replication.rb
233
+ - bin/check-graphite-stats.rb
234
+ - bin/check-graphite.rb
235
+ - bin/handler-graphite-event.rb
236
+ - bin/handler-graphite-notify.rb
237
+ - bin/handler-graphite-occurrences.rb
238
+ - bin/mutator-graphite.rb
239
+ - lib/sensu-plugins-graphite.rb
240
+ - lib/sensu-plugins-graphite/graphite_proxy/options.rb
241
+ - lib/sensu-plugins-graphite/graphite_proxy/proxy.rb
242
+ - lib/sensu-plugins-graphite/version.rb
243
+ homepage: https://github.com/sensu-plugins/sensu-plugins-graphite
244
+ licenses:
245
+ - MIT
246
+ metadata:
247
+ maintainer: "@mattyjones"
248
+ development_status: active
249
+ production_status: unstable - testing recommended
250
+ release_draft: 'false'
251
+ release_prerelease: 'false'
252
+ post_install_message: You can use the embedded Ruby by setting EMBEDDED_RUBY=true
253
+ in /etc/default/sensu
254
+ rdoc_options: []
255
+ require_paths:
256
+ - lib
257
+ required_ruby_version: !ruby/object:Gem::Requirement
258
+ requirements:
259
+ - - ">="
260
+ - !ruby/object:Gem::Version
261
+ version: 1.9.3
262
+ required_rubygems_version: !ruby/object:Gem::Requirement
263
+ requirements:
264
+ - - ">="
265
+ - !ruby/object:Gem::Version
266
+ version: '0'
267
+ requirements: []
268
+ rubyforge_project:
269
+ rubygems_version: 2.4.8
270
+ signing_key:
271
+ specification_version: 4
272
+ summary: Sensu plugins for graphite
273
+ test_files: []
274
+ has_rdoc: