sensu-extensions-influxdb 2.0.1 → 2.1.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
  SHA1:
3
- metadata.gz: 1274c88a4a5ac95ad0fd334e410db0c8b05c5b09
4
- data.tar.gz: 7263d85b3abc0409346a72636f19f0f03789b57b
3
+ metadata.gz: c9b9d4e486f175a41c065e234e5257a8aafa5bc0
4
+ data.tar.gz: af0d09f36ab6f138dc2dd31f2d01c4532e35122e
5
5
  SHA512:
6
- metadata.gz: 91e9bfd2aedd0a2855c8820d9dd8dd75278216db86a7b0780c9317574798c8aace7cdc6584f7e8f3a50f2496e55a3a5e162c5005d3d504cb762d91a01a6e26a1
7
- data.tar.gz: c470b545e5e484e0cc643a750269e4790be696b48751e820e9f1641107db165e4a395ced4c6b84a63222d2883b70f6bec3dd63144bc1ce41795cf140de2580ca
6
+ metadata.gz: 4df67566cb2640965af7566f2ebe63f62c18dc978b5a9dce9c54c9f6e5f1348946a14c261fd7b83210f16c8d7a16aae2a8c48095b36263115394307ebb9840c6
7
+ data.tar.gz: cad7f8bbbf41fdcd2c2ca78169185412904f3b2da043f8d68eabae341728ff54c387a7ddbb5760c6ce4296d93c9cac103f7ad5f1bcd8295ea30c00c1d3b7dee0
@@ -1,8 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.1.0] - 2017-05-15
4
+ ### Added
5
+ - Support multiple handlers (@terjesannum)
6
+
3
7
  ## [2.0.1] - 2017-05-14
4
8
  ### Added
5
- - Released as Gem
9
+ - Released as Gem (@terjesannum)
6
10
 
7
11
  ## [1.7] - 2017-04-24
8
12
  ### Added
data/README.md CHANGED
@@ -175,6 +175,35 @@ measurement = app.downloads, tags = platform => iOS;device => iPad , value = 92,
175
175
 
176
176
  The event output tags will be merged with client and check definition tags and sent to InfluxDB as usual.
177
177
 
178
+ # Multiple handlers
179
+
180
+ If you need to have multiple handlers, eg. for different precision, proxy mode, writing to different influx databases, this can be done by configuring **additional_handlers**:
181
+
182
+ ```
183
+ {
184
+ "influxdb-extension": {
185
+ "hostname": "influxdb",
186
+ "port": 8086,
187
+ "database": "metrics",
188
+ "username": "sensu",
189
+ "password": "sensu",
190
+ "buffer_size": 1000,
191
+ "buffer_max_age": 10,
192
+ "additional_handlers": ["events", "events_nano"]
193
+ },
194
+ "events": {
195
+ "proxy_mode": true,
196
+ "precision": "s"
197
+ },
198
+ "events_nano": {
199
+ "proxy_mode": true,
200
+ "precision": "n"
201
+ }
202
+ }
203
+ ```
204
+
205
+ Settings for the additional handlers will be merged with the **influxdb-extension** settings, so you only need to specify the settings you want to change for that handler.
206
+
178
207
  # Performance
179
208
 
180
209
  The extension will buffer up points until it reaches the configured **buffer_size** length or **buffer_max_age**, and then post all the points in the buffer to InfluxDB.
@@ -18,60 +18,104 @@ module Sensu::Extension
18
18
  "Transforms and sends metrics to InfluxDB"
19
19
  end
20
20
 
21
- def post_init
22
- influxdb_config = settings[@@extension_name] || Hash.new
23
- validate_config(influxdb_config)
24
-
25
- hostname = influxdb_config[:hostname] || "127.0.0.1"
26
- port = influxdb_config[:port] || "8086"
27
- database = influxdb_config[:database]
28
- ssl = influxdb_config[:ssl] || false
29
- ssl_ca_file = influxdb_config[:ssl_ca_file]
30
- ssl_verify = if influxdb_config.key?(:ssl_verify) then influxdb_config[:ssl_verify] else true end
31
- precision = influxdb_config[:precision] || "s"
32
- retention_policy = influxdb_config[:retention_policy]
21
+ @@default_config = {
22
+ :hostname => "127.0.0.1",
23
+ :port => "8086",
24
+ :ssl => false,
25
+ :precision => "s",
26
+ :protocol => "http",
27
+ :buffer_size => 100,
28
+ :buffer_max_age => 10,
29
+ :proxy_mode => false
30
+ }
31
+
32
+ def create_config(name, defaults)
33
+ if settings[name].nil?
34
+ Raise ArgumentError "no configuration for #{name} provided. exiting..."
35
+ end
36
+ config = defaults.merge(settings[name])
37
+ @logger.debug("Config for #{name} created: #{config}")
38
+ validate_config(name, config)
39
+
40
+ hostname = config[:hostname]
41
+ port = config[:port]
42
+ database = config[:database]
43
+ ssl = config[:ssl]
44
+ ssl_ca_file = config[:ssl_ca_file]
45
+ ssl_verify = if config.key?(:ssl_verify) then config[:ssl_verify] else true end
46
+ precision = config[:precision]
47
+ retention_policy = config[:retention_policy]
33
48
  rp_queryparam = if retention_policy.nil? then "" else "&rp=#{retention_policy}" end
34
49
  protocol = if ssl then "https" else "http" end
35
- username = influxdb_config[:username]
36
- password = influxdb_config[:password]
50
+ username = config[:username]
51
+ password = config[:password]
37
52
  auth_queryparam = if username.nil? or password.nil? then "" else "&u=#{username}&p=#{password}" end
38
- @BUFFER_SIZE = if influxdb_config.key?(:buffer_size) then influxdb_config[:buffer_size].to_i else 100 end
39
- @BUFFER_MAX_AGE = if influxdb_config.key?(:buffer_max_age) then influxdb_config[:buffer_max_age].to_i else 10 end
40
- @PROXY_MODE = influxdb_config[:proxy_mode] || false
53
+ buffer_size = config[:buffer_size]
54
+ buffer_max_age = config[:buffer_max_age]
55
+ proxy_mode = config[:proxy_mode]
41
56
 
42
57
  string = "#{protocol}://#{hostname}:#{port}/write?db=#{database}&precision=#{precision}#{rp_queryparam}#{auth_queryparam}"
43
- @uri = URI(string)
44
- @http = Net::HTTP::new(@uri.host, @uri.port)
58
+ uri = URI(string)
59
+ http = Net::HTTP::new(uri.host, uri.port)
45
60
  if ssl
46
- @http.ssl_version = :TLSv1
47
- @http.use_ssl = true
48
- @http.verify_mode = if ssl_verify then OpenSSL::SSL::VERIFY_PEER else OpenSSL::SSL::VERIFY_NONE end
49
- @http.ca_file = ssl_ca_file
61
+ http.ssl_version = :TLSv1
62
+ http.use_ssl = true
63
+ http.verify_mode = if ssl_verify then OpenSSL::SSL::VERIFY_PEER else OpenSSL::SSL::VERIFY_NONE end
64
+ http.ca_file = ssl_ca_file
50
65
  end
51
- @buffer = []
52
- @buffer_flushed = Time.now.to_i
53
66
 
54
- @logger.info("#{@@extension_name}: successfully initialized config: hostname: #{hostname}, port: #{port}, database: #{database}, uri: #{@uri.to_s}, username: #{username}, buffer_size: #{@BUFFER_SIZE}, buffer_max_age: #{@BUFFER_MAX_AGE}")
67
+ @handlers ||= Hash.new
68
+ @handlers[name] = {
69
+ "http" => http,
70
+ "uri" => uri,
71
+ "buffer" => [],
72
+ "buffer_flushed" => Time.now.to_i,
73
+ "buffer_size" => buffer_size,
74
+ "buffer_max_age" => buffer_max_age,
75
+ "proxy_mode" => proxy_mode
76
+ }
77
+
78
+ @logger.info("#{name}: successfully initialized handler: hostname: #{hostname}, port: #{port}, database: #{database}, uri: #{uri.to_s}, username: #{username}, buffer_size: #{buffer_size}, buffer_max_age: #{buffer_max_age}")
79
+ return config
80
+ end
81
+
82
+ def post_init
83
+ main_config = create_config(@@extension_name, @@default_config)
84
+ if settings[name].key?(:additional_handlers)
85
+ settings[name][:additional_handlers].each {|h| create_config(h, main_config)}
86
+ end
55
87
  end
56
88
 
57
89
  def run(event)
58
90
  begin
91
+ @logger.debug("event: #{event}")
92
+ event = JSON.parse(event)
59
93
 
60
- if buffer_too_old? or buffer_too_big?
61
- flush_buffer
94
+ handler = @handlers[@@extension_name]
95
+ unless event["check"]["handlers"].nil?
96
+ event["check"]["handlers"].each {|x|
97
+ if @handlers.has_key?(x)
98
+ @logger.debug("found additional handler: #{x}")
99
+ handler = @handlers[x]
100
+ break
101
+ end
102
+ }
103
+ end
104
+
105
+ if buffer_too_old?(handler) or buffer_too_big?(handler)
106
+ flush_buffer(handler)
62
107
  end
63
108
 
64
- event = JSON.parse(event)
65
109
  output = event["check"]["output"]
66
110
 
67
- if not @PROXY_MODE
111
+ if not handler["proxy_mode"]
68
112
  client_tags = event["client"]["tags"] || Hash.new
69
113
  check_tags = event["check"]["tags"] || Hash.new
70
114
  tags = create_tags(client_tags.merge(check_tags))
71
115
  end
72
116
 
73
117
  output.split(/\r\n|\n/).each do |point|
74
- if not @PROXY_MODE
118
+ if not handler["proxy_mode"]
75
119
  measurement, field_value, timestamp = point.split(/\s+/)
76
120
 
77
121
  if not is_number?(timestamp)
@@ -93,8 +137,8 @@ module Sensu::Extension
93
137
  point = "#{measurement}#{tags} value=#{field_value} #{timestamp}"
94
138
  end
95
139
 
96
- @buffer.push(point)
97
- @logger.debug("#{@@extension_name}: stored point in buffer (#{@buffer.length}/#{@BUFFER_SIZE})")
140
+ handler["buffer"].push(point)
141
+ @logger.debug("#{@@extension_name}: stored point in buffer (#{handler['buffer'].length}/#{handler['buffer_size']})")
98
142
  end
99
143
  yield 'ok', 0
100
144
  rescue => e
@@ -123,39 +167,39 @@ module Sensu::Extension
123
167
  end
124
168
  end
125
169
 
126
- def send_to_influxdb(payload)
127
- request = Net::HTTP::Post.new(@uri.request_uri)
170
+ def send_to_influxdb(handler)
171
+ payload = handler["buffer"].join("\n")
172
+ request = Net::HTTP::Post.new(handler['uri'].request_uri)
128
173
  request.body = payload
129
174
 
130
- @logger.debug("#{@@extension_name}: writing payload #{payload} to endpoint #{@uri.to_s}")
131
- response = @http.request(request)
175
+ @logger.debug("#{@@extension_name}: writing payload #{payload} to endpoint #{handler['uri'].to_s}")
176
+ response = handler["http"].request(request)
132
177
  @logger.debug("#{@@extension_name}: influxdb http response code = #{response.code}, body = #{response.body}")
133
178
  end
134
179
 
135
- def flush_buffer
136
- payload = @buffer.join("\n")
137
- send_to_influxdb(payload)
138
- @buffer = []
139
- @buffer_flushed = Time.now.to_i
180
+ def flush_buffer(handler)
181
+ send_to_influxdb(handler)
182
+ handler["buffer"] = []
183
+ handler["buffer_flushed"] = Time.now.to_i
140
184
  end
141
185
 
142
- def buffer_too_old?
143
- buffer_age = Time.now.to_i - @buffer_flushed
144
- buffer_age >= @BUFFER_MAX_AGE
186
+ def buffer_too_old?(handler)
187
+ buffer_age = Time.now.to_i - handler["buffer_flushed"]
188
+ buffer_age >= handler["buffer_max_age"]
145
189
  end
146
190
 
147
- def buffer_too_big?
148
- @buffer.length >= @BUFFER_SIZE
191
+ def buffer_too_big?(handler)
192
+ handler["buffer"].length >= handler["buffer_size"]
149
193
  end
150
194
 
151
- def validate_config(config)
195
+ def validate_config(name, config)
152
196
  if config.nil?
153
- raise ArgumentError, "no configuration for #{@@extension_name} provided. exiting..."
197
+ raise ArgumentError, "no configuration for #{name} provided. exiting..."
154
198
  end
155
199
 
156
200
  ["hostname", "database"].each do |required_setting|
157
- if config[required_setting].nil?
158
- raise ArgumentError, "required setting #{required_setting} not provided to extension. this should be provided as json element with key #{@@extension_name}. exiting..."
201
+ if config.has_key?(required_setting)
202
+ raise ArgumentError, "required setting #{required_setting} not provided to extension. this should be provided as json element with key #{name}. exiting..."
159
203
  end
160
204
  end
161
205
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-extensions-influxdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johnny Horvi
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-05-14 00:00:00.000000000 Z
12
+ date: 2017-05-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sensu-extension
@@ -108,7 +108,8 @@ files:
108
108
  - README.md
109
109
  - CHANGELOG.md
110
110
  homepage: https://github.com/jhrv/sensu-influxdb-extension
111
- licenses: []
111
+ licenses:
112
+ - MIT
112
113
  metadata: {}
113
114
  post_install_message:
114
115
  rdoc_options: []