sensu-extensions-influxdb 2.0.1 → 2.1.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
  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: []