riemann-tools 1.10.0 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +7 -6
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +18 -0
  5. data/CHANGELOG.md +23 -0
  6. data/Gemfile +22 -0
  7. data/Rakefile +1 -1
  8. data/bin/riemann-hwmon +8 -0
  9. data/bin/riemann-tls-check +8 -0
  10. data/lib/riemann/tools/apache_status.rb +2 -0
  11. data/lib/riemann/tools/bench.rb +4 -2
  12. data/lib/riemann/tools/consul_health.rb +2 -0
  13. data/lib/riemann/tools/dir_files_count.rb +2 -0
  14. data/lib/riemann/tools/dir_space.rb +2 -0
  15. data/lib/riemann/tools/diskstats.rb +6 -4
  16. data/lib/riemann/tools/fd.rb +2 -0
  17. data/lib/riemann/tools/freeswitch.rb +2 -0
  18. data/lib/riemann/tools/haproxy.rb +2 -0
  19. data/lib/riemann/tools/health.rb +79 -11
  20. data/lib/riemann/tools/http_check.rb +56 -17
  21. data/lib/riemann/tools/hwmon.rb +111 -0
  22. data/lib/riemann/tools/mdstat_parser.tab.rb +4 -2
  23. data/lib/riemann/tools/net.rb +3 -7
  24. data/lib/riemann/tools/nginx_status.rb +8 -4
  25. data/lib/riemann/tools/ntp.rb +2 -0
  26. data/lib/riemann/tools/portcheck.rb +2 -0
  27. data/lib/riemann/tools/proc.rb +2 -0
  28. data/lib/riemann/tools/tls_check.rb +604 -0
  29. data/lib/riemann/tools/utils.rb +39 -0
  30. data/lib/riemann/tools/varnish.rb +2 -0
  31. data/lib/riemann/tools/version.rb +1 -1
  32. data/lib/riemann/tools.rb +26 -9
  33. data/riemann-tools.gemspec +2 -11
  34. data/tools/riemann-aws/lib/riemann/tools/aws/billing.rb +3 -1
  35. data/tools/riemann-aws/lib/riemann/tools/aws/rds_status.rb +2 -0
  36. data/tools/riemann-aws/lib/riemann/tools/aws/s3_status.rb +1 -1
  37. data/tools/riemann-aws/lib/riemann/tools/aws/sqs_status.rb +2 -0
  38. data/tools/riemann-aws/lib/riemann/tools/aws/status.rb +11 -9
  39. data/tools/riemann-chronos/lib/riemann/tools/chronos.rb +2 -0
  40. data/tools/riemann-docker/lib/riemann/tools/docker.rb +5 -5
  41. data/tools/riemann-marathon/lib/riemann/tools/marathon.rb +2 -0
  42. data/tools/riemann-munin/lib/riemann/tools/munin.rb +2 -0
  43. data/tools/riemann-rabbitmq/lib/riemann/tools/rabbitmq.rb +7 -7
  44. data/tools/riemann-riak/lib/riemann/tools/riak.rb +4 -2
  45. metadata +10 -129
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'riemann/tools'
4
+
5
+ # See https://www.kernel.org/doc/html/latest/hwmon/index.html
6
+ module Riemann
7
+ module Tools
8
+ class Hwmon
9
+ include Riemann::Tools
10
+
11
+ class Device
12
+ attr_reader :hwmon, :type, :number, :crit, :lcrit, :service
13
+
14
+ def initialize(hwmon, type, number)
15
+ @hwmon = hwmon
16
+ @type = type
17
+ @number = number
18
+
19
+ @crit = scale(read_hwmon_i('crit'))
20
+ @lcrit = scale(read_hwmon_i('lcrit'))
21
+ @service = ['hwmon', read_hwmon_file('name'), read_hwmon_s('label')].compact.join(' ')
22
+ end
23
+
24
+ def input
25
+ read_hwmon_i('input')
26
+ end
27
+
28
+ def report
29
+ value = scale(input)
30
+
31
+ state = :ok
32
+ state = :critical if crit && value >= crit
33
+ state = :critical if lcrit && value <= lcrit
34
+ {
35
+ service: service,
36
+ state: state,
37
+ metric: value,
38
+ description: fromat_input(value),
39
+ }
40
+ end
41
+
42
+ private
43
+
44
+ def scale(value)
45
+ return nil if value.nil?
46
+
47
+ case type
48
+ when :fan then value.to_i # rpm
49
+ when :in, :temp, :curr then value.to_f / 1000 # mV, m°C, mA
50
+ when :humidity then value.to_f / 100 # %H
51
+ when :power, :energy then value.to_f / 1_000_000 # uW, uJ
52
+ end
53
+ end
54
+
55
+ def fromat_input(value)
56
+ case type
57
+ when :in then format('%<value>.3f V', { value: value })
58
+ when :fan then "#{value} RPM"
59
+ when :temp then format('%<value>.3f °C', { value: value })
60
+ when :curr then format('%<value>.3f A', { value: value })
61
+ when :power then format('%<value>.3f W', { value: value })
62
+ when :energy then format('%<value>.3f J', { value: value })
63
+ when :humidity then format('%<value>d %H', { value: (value * 100).to_i })
64
+ end
65
+ end
66
+
67
+ def read_hwmon_i(file)
68
+ s = read_hwmon_s(file)
69
+ return nil if s.nil?
70
+
71
+ s.to_i
72
+ end
73
+
74
+ def read_hwmon_s(file)
75
+ read_hwmon_file("#{type}#{number}_#{file}")
76
+ end
77
+
78
+ def read_hwmon_file(file)
79
+ File.read("/sys/class/hwmon/hwmon#{hwmon}/#{file}").chomp
80
+ rescue Errno::ENOENT
81
+ nil
82
+ end
83
+ end
84
+
85
+ attr_reader :devices
86
+
87
+ def initialize
88
+ super
89
+
90
+ @devices = poll_devices
91
+ end
92
+
93
+ def poll_devices
94
+ res = []
95
+
96
+ Dir['/sys/class/hwmon/hwmon[0-9]*/{in,fan,temp,curr,power,energy,humidity}[0-9]*_input'].each do |filename|
97
+ m = filename.match(%r{/sys/class/hwmon/hwmon(\d+)/([[:alpha:]]+)(\d+)_input})
98
+ res << Device.new(m[1].to_i, m[2].to_sym, m[3].to_i)
99
+ end
100
+
101
+ res
102
+ end
103
+
104
+ def tick
105
+ devices.each do |device|
106
+ report(device.report)
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -1,7 +1,7 @@
1
1
  #
2
2
  # DO NOT MODIFY!!!!
3
- # This file is automatically generated by Racc 1.6.2
4
- # from Racc grammar file "".
3
+ # This file is automatically generated by Racc 1.7.3
4
+ # from Racc grammar file "mdstat_parser.y".
5
5
  #
6
6
 
7
7
  require 'racc/parser.rb'
@@ -255,6 +255,7 @@ Racc_arg = [
255
255
  racc_shift_n,
256
256
  racc_reduce_n,
257
257
  racc_use_result_var ]
258
+ Ractor.make_shareable(Racc_arg) if defined?(Ractor)
258
259
 
259
260
  Racc_token_to_s_table = [
260
261
  "$end",
@@ -312,6 +313,7 @@ Racc_token_to_s_table = [
312
313
  "bitmap",
313
314
  "progress_action",
314
315
  "identifiers" ]
316
+ Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
315
317
 
316
318
  Racc_debug_parser = false
317
319
 
@@ -12,6 +12,8 @@ module Riemann
12
12
  opt :ignore_interfaces, 'Interfaces to ignore', type: :strings, default: ['\Alo\d*\z']
13
13
 
14
14
  def initialize
15
+ super
16
+
15
17
  @old_state = nil
16
18
  @interfaces = if opts[:interfaces]
17
19
  opts[:interfaces].reject(&:empty?).map(&:dup)
@@ -118,13 +120,7 @@ module Riemann
118
120
 
119
121
  delta = metric - @old_state[service]
120
122
  svc_state = case service
121
- when /drop$/
122
- if delta.positive?
123
- 'warning'
124
- else
125
- 'ok'
126
- end
127
- when /errs$/
123
+ when /drop$/, /errs$/
128
124
  if delta.positive?
129
125
  'warning'
130
126
  else
@@ -26,6 +26,8 @@ module Riemann
26
26
  opt :user_agent, 'User-Agent header for HTTP requests', short: :none, default: "#{File.basename($PROGRAM_NAME)}/#{Riemann::Tools::VERSION} (+https://github.com/riemann/riemann-tools)"
27
27
 
28
28
  def initialize
29
+ super
30
+
29
31
  @uri = URI.parse(opts[:uri])
30
32
 
31
33
  # sample response:
@@ -39,13 +41,13 @@ module Riemann
39
41
  end
40
42
 
41
43
  def state(key, value)
42
- if opts.key? "#{key}_critical".to_sym
43
- critical_threshold = opts["#{key}_critical".to_sym]
44
+ if opts.key? :"#{key}_critical"
45
+ critical_threshold = opts[:"#{key}_critical"]
44
46
  return 'critical' if critical_threshold.positive? && (value >= critical_threshold)
45
47
  end
46
48
 
47
- if opts.key? "#{key}_warning".to_sym
48
- warning_threshold = opts["#{key}_warning".to_sym]
49
+ if opts.key? :"#{key}_warning"
50
+ warning_threshold = opts[:"#{key}_warning"]
49
51
  return 'warning' if warning_threshold.positive? && (value >= warning_threshold)
50
52
  end
51
53
 
@@ -75,6 +77,8 @@ module Riemann
75
77
  values = @re.match(response).to_a[1, 7].map(&:to_i)
76
78
 
77
79
  @keys.zip(values).each do |key, value|
80
+ next unless opts[:checks].include?(key)
81
+
78
82
  report({
79
83
  service: "nginx #{key}",
80
84
  metric: value,
@@ -9,6 +9,8 @@ module Riemann
9
9
  include Riemann::Tools
10
10
 
11
11
  def initialize
12
+ super
13
+
12
14
  @hostname = `hostname`.chomp
13
15
  @ostype = `uname -s`.chomp.downcase
14
16
  abort 'WARNING: macOS not explicitly supported. Exiting.' if @ostype == 'darwin'
@@ -14,6 +14,8 @@ module Riemann
14
14
  opt :ports, "List of ports to check, e.g. '-r 80 443'", type: :ints
15
15
 
16
16
  def initialize
17
+ super
18
+
17
19
  @hostname = opts.fetch(:hostname)
18
20
  @ports = opts.fetch(:ports)
19
21
  end
@@ -13,6 +13,8 @@ module Riemann
13
13
  opt :proc_max_critical, 'running process count maximum', default: 65_536
14
14
 
15
15
  def initialize
16
+ super
17
+
16
18
  @limits = { critical: { min: opts[:proc_min_critical], max: opts[:proc_max_critical] } }
17
19
 
18
20
  abort 'FATAL: specify a process regular expression, see --help for usage' unless opts[:proc_regex]