sensu-plugins-haproxy 1.3.0 → 1.4.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: 15553d4397ef6d1b8e37f94afc8c0982b44bb7fb
4
- data.tar.gz: 096c0f8312b86330ef31db641a1c43876ee166c9
3
+ metadata.gz: 5eac4b8bdf306f0728cd979d1cb3ea8e3dfec908
4
+ data.tar.gz: 0e412f2e7b914a6e4dcb731aad2e893ca4e3835e
5
5
  SHA512:
6
- metadata.gz: 6d27c564bcaea1a9fe683bc4886e18cf893909b2f8c2739020dab01f5531172b30895ab23d2436b645dc5efddee02419ddaaafc92b0e95f476234b3322782ebf
7
- data.tar.gz: fbb1848bd2232b9954b362a3d12520eb0951c27756c821569f8412ff8d38d4ab1f28ad3f46df96f0c99290b530bdace9fe04dd7e81e09dfe564620b4b74c5e70
6
+ metadata.gz: 4ead0552383f5dc301fcb58793a58420aca0ab8e9970f74374e02fe04cb47d75a38500c0bf01527df9d73ff6c101c338d99b12158e99854e7c0e4f04c9e3316e
7
+ data.tar.gz: 431821d24f2c108fb469e13a2a38e3c638ef9d128b79d534a99141ba8742cf65a90ee1da8b04d3c9250c1a646c16b91aee1dcca5aad4dcc43188175058a6fae5
@@ -6,6 +6,12 @@ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachang
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.4.0] - 2017-09-09
10
+ ### Added
11
+ - metrics-haproxy.rb: new flag to expose all possible metrics `--expose-all` (@bergerx)
12
+ - added flag to use raw haproxy metric names `--use-haproxy-names` (@bergerx)
13
+ - added flag to include explicit type names in generated metrics names `--use-explicit-names` (@bergerx)
14
+
9
15
  ## [1.3.0] - 2017-08-05
10
16
  ### Added
11
17
  - Flag to use SSL in `check-haproxy.rb` (@foozmeat) (@Evesey)
@@ -69,7 +75,8 @@ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachang
69
75
  ### Added
70
76
  - initial release
71
77
 
72
- [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-haproxy/compare/1.3.0...HEAD
78
+ [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-haproxy/compare/1.4.0...HEAD
79
+ [1.4.0]:https://github.com/sensu-plugins/sensu-plugins-haproxy/compare/1.3.0...1.4.0
73
80
  [1.3.0]: https://github.com/sensu-plugins/sensu-plugins-haproxy/compare/1.2.0...1.3.0
74
81
  [1.2.0]: https://github.com/sensu-plugins/sensu-plugins-haproxy/compare/1.1.0...1.2.0
75
82
  [1.1.0]: https://github.com/sensu-plugins/sensu-plugins-haproxy/compare/1.0.0...1.1.0
data/README.md CHANGED
@@ -14,6 +14,31 @@
14
14
 
15
15
  ## Usage
16
16
 
17
+
18
+ ### Metrics
19
+
20
+ ```
21
+ $ /opt/sensu/embedded/bin/metrics-haproxy.rb --help
22
+ Usage: /opt/sensu/embedded/bin/metrics-haproxy.rb (options)
23
+ -f BACKEND1[,BACKEND2], comma-separated list of backends to fetch stats from. Default is all backends
24
+ --backends
25
+ -c HOSTNAME|SOCKETPATH, HAproxy web stats hostname or path to stats socket (required)
26
+ --connect
27
+ -a, --expose-all Expose all possible metrics, includes "--server-metrics", "--backends" will still in effect
28
+ -p, --pass PASSWORD HAproxy web stats password
29
+ -q, --statspath STATUSPATH HAproxy web stats path (the / will be prepended to the STATUSPATH e.g stats)
30
+ -P, --port PORT HAproxy web stats port
31
+ -r, --retries RETRIES Number of times to retry fetching stats from haproxy before giving up.
32
+ -i, --retry_interval SECONDS Interval (seconds) between retries
33
+ -s, --scheme SCHEME Metric naming scheme, text to prepend to metric
34
+ --server-metrics Gathers additional frontend metrics, i.e. total requests
35
+ --use-explicit-names Use explicit names for frontend, backend, server, listener
36
+ --use-haproxy-names Use raw names as used in haproxy CSV format definition rather than human friendly names
37
+ -S, --use-ssl Use SSL to connect to HAproxy web stats
38
+ -u, --user USERNAME HAproxy web stats username
39
+ $
40
+ ```
41
+
17
42
  ## Installation
18
43
 
19
44
  [Installation and Setup](http://sensu-plugins.io/docs/installation_instructions.html)
@@ -34,6 +34,102 @@ require 'uri'
34
34
  # HA Proxy Metrics
35
35
  #
36
36
  class HAProxyMetrics < Sensu::Plugin::Metric::CLI::Graphite
37
+ # Check http://cbonte.github.io/haproxy-dconv/1.7/management.html#9.1 for
38
+ # haproxy stats CSV format.
39
+
40
+ TYPE_FRONTEND = '0'.freeze
41
+ TYPE_BACKEND = '1'.freeze
42
+ TYPE_SERVER = '2'.freeze
43
+ TYPE_LISTENER = '3'.freeze
44
+ # All fields are listed here for ease of long term maintenance.
45
+ # Format: field_index => %w(haproxy-name friendly-name)
46
+ CSV_FIELDS = {
47
+ 0 => %w(pxname proxy_name),
48
+ 1 => %w(svname service_name),
49
+ 2 => %w(qcur queued_requests_current),
50
+ 3 => %w(qmax queued_requests_max),
51
+ 4 => %w(scur session_current),
52
+ 5 => %w(smax session_max),
53
+ 6 => %w(slim session_limit),
54
+ 7 => %w(stot session_total),
55
+ 8 => %w(bin bytes_in),
56
+ 9 => %w(bout bytes_out),
57
+ 10 => %w(dreq request_denied_security),
58
+ 11 => %w(dresp response_denied_security),
59
+ 12 => %w(ereq request_errors),
60
+ 13 => %w(econ connection_errors),
61
+ 14 => %w(eresp response_errors),
62
+ 15 => %w(wretr warning_retries),
63
+ 16 => %w(wredis warning_redispatched),
64
+ 17 => %w(status status),
65
+ 18 => %w(weight weight),
66
+ 19 => %w(act servers_active),
67
+ 20 => %w(bck servers_backup),
68
+ 21 => %w(chkfail healthcheck_failed),
69
+ 22 => %w(chkdown healthcheck_transitions),
70
+ 23 => %w(lastchg healthcheck_seconds_since_change),
71
+ 24 => %w(downtime healthcheck_downtime),
72
+ 25 => %w(qlimit server_queue_limit),
73
+ 26 => %w(pid process_id),
74
+ 27 => %w(iid proxy_id),
75
+ 28 => %w(sid server_id),
76
+ 29 => %w(throttle server_throttle_percent),
77
+ 30 => %w(lbtot server_selected),
78
+ 31 => %w(tracked tracked_server_id),
79
+ 32 => %w(type type),
80
+ 33 => %w(rate session_rate),
81
+ 34 => %w(rate_lim session_rate_limit),
82
+ 35 => %w(rate_max session_rate_max),
83
+ 36 => %w(check_status check_status),
84
+ 37 => %w(check_code check_code),
85
+ 38 => %w(check_duration healthcheck_duration),
86
+ 39 => %w(hrsp_1xx response_1xx),
87
+ 40 => %w(hrsp_2xx response_2xx),
88
+ 41 => %w(hrsp_3xx response_3xx),
89
+ 42 => %w(hrsp_4xx response_4xx),
90
+ 43 => %w(hrsp_5xx response_5xx),
91
+ 44 => %w(hrsp_other response_other),
92
+ 45 => %w(hanafail failed_healthcheck_details),
93
+ 46 => %w(req_rate requests_per_second),
94
+ 47 => %w(req_rate_max requests_per_second_max),
95
+ 48 => %w(req_tot requests_total),
96
+ 49 => %w(cli_abrt trasfer_aborts_client),
97
+ 50 => %w(srv_abrt trasfer_aborts_server),
98
+ 51 => %w(comp_in compressor_in),
99
+ 52 => %w(comp_out compressor_out),
100
+ 53 => %w(comp_byp compressor_bytes),
101
+ 54 => %w(comp_rsp compressor_responses),
102
+ 55 => %w(lastsess session_last_assigned_seconds),
103
+ 56 => %w(last_chk healthcheck_contents),
104
+ 57 => %w(last_agt agent_check_contents),
105
+ 58 => %w(qtime queue_time),
106
+ 59 => %w(ctime connect_time),
107
+ 60 => %w(rtime response_time),
108
+ 61 => %w(ttime average_time),
109
+ 62 => %w(agent_status agent_status),
110
+ 63 => %w(agent_code agent_code),
111
+ 64 => %w(agent_duration agent_duration),
112
+ 65 => %w(check_desc check_desc),
113
+ 66 => %w(agent_desc agent_desc),
114
+ 67 => %w(check_rise check_rise),
115
+ 68 => %w(check_fall check_fall),
116
+ 69 => %w(check_health check_health),
117
+ 70 => %w(agent_rise agent_rise),
118
+ 71 => %w(agent_fall agent_fall),
119
+ 72 => %w(agent_health agent_health),
120
+ 73 => %w(addr address),
121
+ 74 => %w(cookie cookie),
122
+ 75 => %w(mode mode),
123
+ 76 => %w(algo algorithm),
124
+ 77 => %w(conn_rate conn_rate),
125
+ 78 => %w(conn_rate_max conn_rate_max),
126
+ 79 => %w(conn_tot conn_tot),
127
+ 80 => %w(intercepted requests_intercepted),
128
+ 81 => %w(dcon requests_denied_connection),
129
+ 82 => %w(dses requests_denied_session)
130
+ }.freeze
131
+ NON_NUMERIC_FIELDS = [0, 1, 17, 26, 27, 28, 31, 32, 36, 37, 45, 56, 57, 62, 63, 65, 66, 73, 74, 75, 76].freeze
132
+
37
133
  option :connection,
38
134
  short: '-c HOSTNAME|SOCKETPATH',
39
135
  long: '--connect HOSTNAME|SOCKETPATH',
@@ -102,6 +198,25 @@ class HAProxyMetrics < Sensu::Plugin::Metric::CLI::Graphite
102
198
  default: 1,
103
199
  proc: proc(&:to_i)
104
200
 
201
+ option :expose_all,
202
+ description: 'Expose all possible metrics, includes "--server-metrics", "--backends" will still in effect',
203
+ short: '-a',
204
+ long: '--expose-all',
205
+ boolean: true,
206
+ default: false
207
+
208
+ option :use_haproxy_names,
209
+ description: 'Use raw names as used in haproxy CSV format definition rather than human friendly names',
210
+ long: '--use-haproxy-names',
211
+ boolean: true,
212
+ default: false
213
+
214
+ option :use_explicit_names,
215
+ description: 'Use explicit names for frontend, backend, server, listener',
216
+ long: '--use-explicit-names',
217
+ boolean: true,
218
+ default: false
219
+
105
220
  def acquire_stats
106
221
  uri = URI.parse(config[:connection])
107
222
 
@@ -125,11 +240,30 @@ class HAProxyMetrics < Sensu::Plugin::Metric::CLI::Graphite
125
240
  return nil
126
241
  end
127
242
 
128
- def output(*args)
129
- super(*args) unless args[1].nil?
243
+ def render_output(type, pxname, svname, index, value)
244
+ return if value.nil?
245
+ field_index = config[:use_haproxy_names] ? 0 : 1
246
+ field_name = CSV_FIELDS[index][field_index]
247
+ if config[:use_explicit_names]
248
+ if type == TYPE_FRONTEND
249
+ output "#{config[:scheme]}.frontend.#{pxname}.#{field_name}", value
250
+ elsif type == TYPE_BACKEND
251
+ output "#{config[:scheme]}.backend.#{pxname}.#{field_name}", value
252
+ elsif type == TYPE_SERVER
253
+ output "#{config[:scheme]}.backend.#{pxname}.server.#{svname}.#{field_name}", value
254
+ elsif type == TYPE_LISTENER
255
+ output "#{config[:scheme]}.listener.#{pxname}.#{svname}.#{field_name}", value
256
+ end
257
+ else
258
+ if type == TYPE_BACKEND # rubocop:disable IfInsideElse
259
+ output "#{config[:scheme]}.#{pxname}.#{field_name}", value
260
+ else
261
+ output "#{config[:scheme]}.#{pxname}.#{svname}.#{field_name}", value
262
+ end
263
+ end
130
264
  end
131
265
 
132
- def run #rubocop:disable all
266
+ def run
133
267
  out = nil
134
268
  1.upto(config[:retries]) do |_i|
135
269
  out = acquire_stats
@@ -145,50 +279,36 @@ class HAProxyMetrics < Sensu::Plugin::Metric::CLI::Graphite
145
279
  parsed = CSV.parse(out)
146
280
  parsed.shift
147
281
  parsed.each do |line|
282
+ pxname = line[0]
283
+ svname = line[1]
284
+ type = line[32]
285
+
148
286
  if config[:backends].length > 0
149
287
  next unless config[:backends].include? line[0]
150
288
  end
151
289
 
152
- if line[1] == 'BACKEND'
153
- output "#{config[:scheme]}.#{line[0]}.session_current", line[4]
154
- output "#{config[:scheme]}.#{line[0]}.session_total", line[7]
155
- output "#{config[:scheme]}.#{line[0]}.bytes_in", line[8]
156
- output "#{config[:scheme]}.#{line[0]}.bytes_out", line[9]
157
- output "#{config[:scheme]}.#{line[0]}.connection_errors", line[13]
158
- output "#{config[:scheme]}.#{line[0]}.warning_retries", line[15]
159
- output "#{config[:scheme]}.#{line[0]}.warning_redispatched", line[16]
160
- output "#{config[:scheme]}.#{line[0]}.response_1xx", line[39]
161
- output "#{config[:scheme]}.#{line[0]}.response_2xx", line[40]
162
- output "#{config[:scheme]}.#{line[0]}.response_3xx", line[41]
163
- output "#{config[:scheme]}.#{line[0]}.response_4xx", line[42]
164
- output "#{config[:scheme]}.#{line[0]}.response_5xx", line[43]
165
- output "#{config[:scheme]}.#{line[0]}.response_other", line[44]
166
- unless line[46].nil?
167
- output "#{config[:scheme]}.#{line[0]}.requests_per_second", line[46]
168
- end
169
- unless line[47].nil?
170
- output "#{config[:scheme]}.#{line[0]}.requests_per_second_max", line[47]
171
- end
172
- output "#{config[:scheme]}.#{line[0]}.queue_time", line[58]
173
- output "#{config[:scheme]}.#{line[0]}.connect_time", line[59]
174
- output "#{config[:scheme]}.#{line[0]}.response_time", line[60]
175
- output "#{config[:scheme]}.#{line[0]}.average_time", line[61]
290
+ indices = []
291
+ if config[:expose_all]
292
+ indices = CSV_FIELDS.keys - NON_NUMERIC_FIELDS
293
+ elsif type == TYPE_BACKEND
294
+ indices = [4, 7, 8, 9, 13, 15, 16, 39, 40, 41, 42, 43, 44, 46, 47, 58, 59, 60, 61]
176
295
  elsif config[:server_metrics]
177
- output "#{config[:scheme]}.#{line[0]}.#{line[1]}.session_total", line[7]
178
- output "#{config[:scheme]}.#{line[0]}.#{line[1]}.session_current", line[4]
179
- output "#{config[:scheme]}.#{line[0]}.#{line[1]}.requests_per_second", line[46]
180
- output "#{config[:scheme]}.#{line[0]}.#{line[1]}.requests_per_second_max", line[47]
181
- output "#{config[:scheme]}.#{line[0]}.#{line[1]}.requests_total", line[48]
296
+ indices = [4, 7, 46, 47, 48]
182
297
  end
298
+ indices.each { |i| render_output type, pxname, svname, i, line[i] }
183
299
 
184
- if line[1] != 'BACKEND' && !line[1].nil?
185
- up_by_backend[line[0]] ||= 0
186
- up_by_backend[line[0]] += line[17].start_with?('UP') ? 1 : 0
300
+ if type == TYPE_SERVER
301
+ up_by_backend[pxname] ||= 0
302
+ up_by_backend[pxname] += line[17].start_with?('UP') ? 1 : 0
187
303
  end
188
304
  end
189
305
 
190
306
  up_by_backend.each_pair do |backend, count|
191
- output "#{config[:scheme]}.#{backend}.num_up", count
307
+ if config[:use_explicit_names]
308
+ output "#{config[:scheme]}.backend.#{backend}.num_up", count
309
+ else
310
+ output "#{config[:scheme]}.#{backend}.num_up", count
311
+ end
192
312
  end
193
313
 
194
314
  ok
@@ -1,7 +1,7 @@
1
1
  module SensuPluginsHAProxy
2
2
  module Version
3
3
  MAJOR = 1
4
- MINOR = 3
4
+ MINOR = 4
5
5
  PATCH = 0
6
6
 
7
7
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugins-haproxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sensu-Plugins and contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-05 00:00:00.000000000 Z
11
+ date: 2017-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sensu-plugin
@@ -194,7 +194,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
194
  version: '0'
195
195
  requirements: []
196
196
  rubyforge_project:
197
- rubygems_version: 2.4.5
197
+ rubygems_version: 2.6.13
198
198
  signing_key:
199
199
  specification_version: 4
200
200
  summary: Sensu plugins for haproxy