riemann-tools 1.1.1 → 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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +2 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +8 -0
  5. data/.ruby-version +1 -0
  6. data/CHANGELOG.md +60 -2
  7. data/Rakefile +17 -3
  8. data/bin/riemann-apache-status +1 -106
  9. data/bin/riemann-bench +2 -70
  10. data/bin/riemann-cloudant +1 -56
  11. data/bin/riemann-consul +1 -106
  12. data/bin/riemann-dir-files-count +1 -55
  13. data/bin/riemann-dir-space +1 -55
  14. data/bin/riemann-diskstats +1 -92
  15. data/bin/riemann-fd +2 -81
  16. data/bin/riemann-freeswitch +2 -119
  17. data/bin/riemann-haproxy +1 -58
  18. data/bin/riemann-health +0 -2
  19. data/bin/riemann-kvminstance +2 -22
  20. data/bin/riemann-md +8 -0
  21. data/bin/riemann-memcached +1 -37
  22. data/bin/riemann-net +0 -2
  23. data/bin/riemann-nginx-status +1 -85
  24. data/bin/riemann-ntp +0 -2
  25. data/bin/riemann-portcheck +1 -44
  26. data/bin/riemann-proc +1 -108
  27. data/bin/riemann-varnish +1 -54
  28. data/bin/riemann-wrapper +113 -0
  29. data/bin/riemann-zookeeper +1 -39
  30. data/bin/riemann-zpool +8 -0
  31. data/lib/riemann/tools/apache_status.rb +107 -0
  32. data/lib/riemann/tools/bench.rb +72 -0
  33. data/lib/riemann/tools/cloudant.rb +57 -0
  34. data/lib/riemann/tools/consul_health.rb +107 -0
  35. data/lib/riemann/tools/dir_files_count.rb +56 -0
  36. data/lib/riemann/tools/dir_space.rb +56 -0
  37. data/lib/riemann/tools/diskstats.rb +94 -0
  38. data/lib/riemann/tools/fd.rb +81 -0
  39. data/lib/riemann/tools/freeswitch.rb +119 -0
  40. data/lib/riemann/tools/haproxy.rb +59 -0
  41. data/lib/riemann/tools/health.rb +150 -19
  42. data/lib/riemann/tools/kvm.rb +23 -0
  43. data/lib/riemann/tools/md.rb +35 -0
  44. data/lib/riemann/tools/mdstat_parser.tab.rb +340 -0
  45. data/lib/riemann/tools/memcached.rb +38 -0
  46. data/lib/riemann/tools/net.rb +2 -1
  47. data/lib/riemann/tools/nginx_status.rb +86 -0
  48. data/lib/riemann/tools/ntp.rb +1 -0
  49. data/lib/riemann/tools/portcheck.rb +45 -0
  50. data/lib/riemann/tools/proc.rb +109 -0
  51. data/lib/riemann/tools/riemann_client_wrapper.rb +43 -0
  52. data/lib/riemann/tools/uptime_parser.tab.rb +323 -0
  53. data/lib/riemann/tools/varnish.rb +55 -0
  54. data/lib/riemann/tools/version.rb +1 -1
  55. data/lib/riemann/tools/zookeeper.rb +40 -0
  56. data/lib/riemann/tools/zpool.rb +40 -0
  57. data/lib/riemann/tools.rb +2 -20
  58. data/riemann-tools.gemspec +10 -1
  59. data/tools/riemann-aws/Rakefile +6 -9
  60. data/tools/riemann-aws/bin/riemann-aws-billing +2 -87
  61. data/tools/riemann-aws/bin/riemann-aws-rds-status +2 -62
  62. data/tools/riemann-aws/bin/riemann-aws-sqs-status +2 -44
  63. data/tools/riemann-aws/bin/riemann-aws-status +2 -77
  64. data/tools/riemann-aws/bin/riemann-elb-metrics +2 -162
  65. data/tools/riemann-aws/bin/riemann-s3-list +2 -81
  66. data/tools/riemann-aws/bin/riemann-s3-status +2 -96
  67. data/tools/riemann-aws/lib/riemann/tools/aws/billing.rb +87 -0
  68. data/tools/riemann-aws/lib/riemann/tools/aws/elb_metrics.rb +163 -0
  69. data/tools/riemann-aws/lib/riemann/tools/aws/rds_status.rb +63 -0
  70. data/tools/riemann-aws/lib/riemann/tools/aws/s3_list.rb +82 -0
  71. data/tools/riemann-aws/lib/riemann/tools/aws/s3_status.rb +97 -0
  72. data/tools/riemann-aws/lib/riemann/tools/aws/sqs_status.rb +45 -0
  73. data/tools/riemann-aws/lib/riemann/tools/aws/status.rb +74 -0
  74. data/tools/riemann-chronos/Rakefile +6 -9
  75. data/tools/riemann-chronos/bin/riemann-chronos +1 -154
  76. data/tools/riemann-chronos/lib/riemann/tools/chronos.rb +157 -0
  77. data/tools/riemann-docker/Rakefile +5 -8
  78. data/tools/riemann-docker/bin/riemann-docker +2 -200
  79. data/tools/riemann-docker/lib/riemann/tools/docker.rb +200 -0
  80. data/tools/riemann-elasticsearch/Rakefile +6 -9
  81. data/tools/riemann-elasticsearch/bin/riemann-elasticsearch +1 -167
  82. data/tools/riemann-elasticsearch/lib/riemann/tools/elasticsearch.rb +170 -0
  83. data/tools/riemann-marathon/Rakefile +6 -9
  84. data/tools/riemann-marathon/bin/riemann-marathon +1 -156
  85. data/tools/riemann-marathon/lib/riemann/tools/marathon.rb +159 -0
  86. data/tools/riemann-mesos/Rakefile +6 -9
  87. data/tools/riemann-mesos/bin/riemann-mesos +1 -139
  88. data/tools/riemann-mesos/lib/riemann/tools/mesos.rb +142 -0
  89. data/tools/riemann-munin/Rakefile +5 -8
  90. data/tools/riemann-munin/bin/riemann-munin +1 -36
  91. data/tools/riemann-munin/lib/riemann/tools/munin.rb +37 -0
  92. data/tools/riemann-rabbitmq/Rakefile +6 -9
  93. data/tools/riemann-rabbitmq/bin/riemann-rabbitmq +1 -266
  94. data/tools/riemann-rabbitmq/lib/riemann/tools/rabbitmq.rb +269 -0
  95. data/tools/riemann-riak/Rakefile +5 -8
  96. data/tools/riemann-riak/bin/riemann-riak +1 -316
  97. data/tools/riemann-riak/bin/riemann-riak-keys +0 -1
  98. data/tools/riemann-riak/bin/riemann-riak-ring +0 -1
  99. data/tools/riemann-riak/lib/riemann/tools/riak.rb +317 -0
  100. metadata +64 -10
  101. data/.travis.yml +0 -31
  102. data/tools/riemann-riak/riak_status/key_count.erl +0 -13
  103. data/tools/riemann-riak/riak_status/riak_status.rb +0 -152
  104. data/tools/riemann-riak/riak_status/ringready.erl +0 -9
@@ -2,98 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
- require 'rubygems'
6
- require 'riemann/tools'
7
5
 
8
- module Riemann
9
- module Tools
10
- class Diskstats
11
- include Riemann::Tools
12
-
13
- opt :devices, 'Devices to monitor', type: :strings, default: nil
14
- opt :ignore_devices, 'Devices to ignore', type: :strings, default: nil
15
-
16
- def initialize
17
- @old_state = nil
18
- end
19
-
20
- def state
21
- f = File.read('/proc/diskstats')
22
- state = f.split("\n").reject { |d| d =~ /(ram|loop)/ }.each_with_object({}) do |line, s|
23
- next unless line =~ /^(?:\s+\d+){2}\s+([\w\d\-]+) (.*)$/
24
-
25
- dev = Regexp.last_match(1)
26
-
27
- ['reads reqs',
28
- 'reads merged',
29
- 'reads sector',
30
- 'reads time',
31
- 'writes reqs',
32
- 'writes merged',
33
- 'writes sector',
34
- 'writes time',
35
- 'io reqs',
36
- 'io time',
37
- 'io weighted',].map do |service|
38
- "#{dev} #{service}"
39
- end.zip( # rubocop:disable Style/MultilineBlockChain
40
- Regexp.last_match(2).split(/\s+/).map(&:to_i),
41
- ).each do |service, value|
42
- s[service] = value
43
- end
44
- end
45
-
46
- # Filter interfaces
47
- if (is = opts[:devices])
48
- state = state.select do |service, _value|
49
- is.include? service.split(' ').first
50
- end
51
- end
52
-
53
- if (ign = opts[:ignore_devices])
54
- state = state.reject do |service, _value|
55
- ign.include? service.split(' ').first
56
- end
57
- end
58
-
59
- state
60
- end
61
-
62
- def tick
63
- state = self.state
64
-
65
- if @old_state
66
- state.each do |service, metric|
67
- if service =~ /io reqs$/
68
- report(
69
- service: "diskstats #{service}",
70
- metric: metric,
71
- state: 'ok',
72
- )
73
- else
74
- delta = metric - @old_state[service]
75
-
76
- report(
77
- service: "diskstats #{service}",
78
- metric: (delta.to_f / opts[:interval]),
79
- state: 'ok',
80
- )
81
- end
82
-
83
- next unless service =~ /io time$/
84
-
85
- report(
86
- service: "diskstats #{service.gsub(/time/, 'util')}",
87
- metric: (delta.to_f / (opts[:interval] * 1000)),
88
- state: 'ok',
89
- )
90
- end
91
- end
92
-
93
- @old_state = state
94
- end
95
- end
96
- end
97
- end
6
+ require 'riemann/tools/diskstats'
98
7
 
99
8
  Riemann::Tools::Diskstats.run
data/bin/riemann-fd CHANGED
@@ -3,85 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- # Reports current file descriptor use to riemann.
7
- # By default reports the total system fd usage, can also report usage of individual processes
6
+ require 'riemann/tools/fd'
8
7
 
9
- require File.expand_path('../lib/riemann/tools', __dir__)
10
-
11
- module Riemann
12
- module Tools
13
- class Health
14
- include Riemann::Tools
15
-
16
- opt :fd_sys_warning, 'open file descriptor threshold for system', default: 800
17
- opt :fd_sys_critical, 'open file descriptor critical threshold for system', default: 900
18
- opt :fd_proc_warning, 'open file descriptor threshold for process', default: 800
19
- opt :fd_proc_critical, 'open file descriptor critical threshold for process', default: 900
20
- opt :processes, 'list of processes to measure fd usage in addition to system total', type: :ints
21
-
22
- def initialize
23
- @limits = {
24
- fd: { critical: opts[:fd_sys_critical], warning: opts[:fd_sys_warning] },
25
- process: { critical: opts[:fd_proc_critical], warning: opts[:fd_proc_warning] },
26
- }
27
- ostype = `uname -s`.chomp.downcase
28
- case ostype
29
- when 'freebsd'
30
- @fd = method :freebsd_fd
31
- else
32
- puts "WARNING: OS '#{ostype}' not explicitly supported. Falling back to Linux" unless ostype == 'linux'
33
- @fd = method :linux_fd
34
- end
35
- end
36
-
37
- def alert(service, state, metric, description)
38
- report(
39
- service: service.to_s,
40
- state: state.to_s,
41
- metric: metric.to_f,
42
- description: description,
43
- )
44
- end
45
-
46
- def freebsd_fd
47
- sys_used = Integer(`sysctl -n kern.openfiles`)
48
- if sys_used > @limits[:fd][:critical]
49
- alert 'fd sys', :critical, sys_used, "system is using #{sys_used} fds"
50
- elsif sys_used > @limits[:fd][:warning]
51
- alert 'fd sys', :warning, sys_used, "system is using #{sys_used} fds"
52
- else
53
- alert 'fd sys', :ok, sys_used, "system is using #{sys_used} fds"
54
- end
55
- end
56
-
57
- def linux_fd
58
- sys_used = Integer(`lsof | wc -l`)
59
- if sys_used > @limits[:fd][:critical]
60
- alert 'fd sys', :critical, sys_used, "system is using #{sys_used} fds"
61
- elsif sys_used > @limits[:fd][:warning]
62
- alert 'fd sys', :warning, sys_used, "system is using #{sys_used} fds"
63
- else
64
- alert 'fd sys', :ok, sys_used, "system is using #{sys_used} fds"
65
- end
66
-
67
- opts[:processes]&.each do |process|
68
- used = Integer(`lsof -p #{process} | wc -l`)
69
- name, _pid = `ps axo comm,pid | grep -w #{process}`.split
70
- if used > @limits[:process][:critical]
71
- alert "fd #{name} #{process}", :critical, used, "process #{name} #{process} is using #{used} fds"
72
- elsif used > @limits[:process][:warning]
73
- alert "fd #{name} #{process}", :warning, used, "process #{name} #{process} is using #{used} fds"
74
- else
75
- alert "fd #{name} #{process}", :ok, used, "process #{name} #{process} is using #{used} fds"
76
- end
77
- end
78
- end
79
-
80
- def tick
81
- @fd.call
82
- end
83
- end
84
- end
85
- end
86
-
87
- Riemann::Tools::Health.run
8
+ Riemann::Tools::Fd.run
@@ -1,125 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'English'
5
-
6
4
  Process.setproctitle($PROGRAM_NAME)
7
5
 
8
- require File.expand_path('../lib/riemann/tools', __dir__)
9
-
10
- module Riemann
11
- module Tools
12
- class FreeSWITCH
13
- include Riemann::Tools
14
-
15
- opt :calls_warning, 'Calls warning threshold', default: 100
16
- opt :calls_critical, 'Calls critical threshold', default: 300
17
- opt :pid_file, 'FreeSWITCH daemon pidfile', type: String, default: '/var/run/freeswitch/freeswitch.pid'
18
-
19
- def initialize
20
- @limits = {
21
- calls: { critical: opts[:calls_critical], warning: opts[:calls_warning] },
22
- }
23
- end
24
-
25
- def dead_proc?(pid)
26
- Process.getpgid(pid)
27
- false
28
- rescue Errno::ESRCH
29
- true
30
- end
31
-
32
- def alert(service, state, metric, description)
33
- report(
34
- service: service.to_s,
35
- state: state.to_s,
36
- metric: metric.to_f,
37
- description: description,
38
- )
39
- end
40
-
41
- def exec_with_timeout(cmd, timeout)
42
- pid = Process.spawn(cmd, { %i[err out] => :close, :pgroup => true })
43
- begin
44
- Timeout.timeout(timeout) do
45
- Process.waitpid(pid, 0)
46
- $CHILD_STATUS.exitstatus.zero?
47
- end
48
- rescue Timeout::Error
49
- Process.kill(15, -Process.getpgid(pid))
50
- puts "Killed pid: #{pid}"
51
- false
52
- end
53
- end
54
-
55
- def tick
56
- # Determine how many current calls I have according to FreeSWITCH
57
- fs_calls = `fs_cli -x "show calls count"| grep -Po '^\\d+'`.to_i
58
-
59
- # Determine how many current channels I have according to FreeSWITCH
60
- fs_channels = `fs_cli -x "show channels count"| grep -Po '^\\d+'`.to_i
61
-
62
- # Determine how many conferences I have according to FreeSWITCH
63
- fs_conferences = `fs_cli -x "conference list"| grep -Pco '^Conference'`.to_i
64
-
65
- # Try to read pidfile. If it fails use Devil's dummy PID
66
- begin
67
- fs_pid = File.read(opts[:pid_file]).to_i
68
- rescue StandardError
69
- puts "Couldn't read pidfile: #{opts[:pid_file]}"
70
- fs_pid = -666
71
- end
72
-
73
- fs_threads = fs_pid.positive? ? `ps huH p #{fs_pid} | wc -l`.to_i : 0
74
-
75
- # Submit calls to riemann
76
- if fs_calls > @limits[:calls][:critical]
77
- alert 'FreeSWITCH current calls', :critical, fs_calls, "Number of calls are #{fs_calls}"
78
- elsif fs_calls > @limits[:calls][:warning]
79
- alert 'FreeSWITCH current calls', :warning, fs_calls, "Number of calls are #{fs_calls}"
80
- else
81
- alert 'FreeSWITCH current calls', :ok, fs_calls, "Number of calls are #{fs_calls}"
82
- end
83
-
84
- # Submit channels to riemann
85
- if fs_channels > @limits[:calls][:critical]
86
- alert 'FreeSWITCH current channels', :critical, fs_channels, "Number of channels are #{fs_channels}"
87
- elsif fs_channels > @limits[:calls][:warning]
88
- alert 'FreeSWITCH current channels', :warning, fs_channels, "Number of channels are #{fs_channels}"
89
- else
90
- alert 'FreeSWITCH current channels', :ok, fs_channels, "Number of channels are #{fs_channels}"
91
- end
92
-
93
- # Submit conferences to riemann
94
- if fs_conferences > @limits[:calls][:critical]
95
- alert 'FreeSWITCH current conferences', :critical, fs_conferences,
96
- "Number of conferences are #{fs_conferences}"
97
- elsif fs_conferences > @limits[:calls][:warning]
98
- alert 'FreeSWITCH current conferences', :warning, fs_conferences,
99
- "Number of conferences are #{fs_conferences}"
100
- else
101
- alert 'FreeSWITCH current conferences', :ok, fs_conferences, "Number of conferences are #{fs_conferences}"
102
- end
103
-
104
- # Submit threads to riemann
105
- alert 'FreeSWITCH current threads', :ok, fs_threads, "Number of threads are #{fs_threads}" if fs_threads
106
-
107
- # Submit status to riemann
108
- if dead_proc?(fs_pid)
109
- alert 'FreeSWITCH status', :critical, -1, 'FreeSWITCH service status: not running'
110
- else
111
- alert 'FreeSWITCH status', :ok, nil, 'FreeSWITCH service status: running'
112
- end
113
-
114
- # Submit CLI status to riemann using timeout in case it's unresponsive
115
- if exec_with_timeout('fs_cli -x status', 2)
116
- alert 'FreeSWITCH CLI status', :ok, nil, 'FreeSWITCH CLI status: responsive'
117
- else
118
- alert 'FreeSWITCH CLI status', :critical, -1, 'FreeSWITCH CLI status: not responding'
119
- end
120
- end
121
- end
122
- end
123
- end
6
+ require 'riemann/tools/freeswitch'
124
7
 
125
- Riemann::Tools::FreeSWITCH.run
8
+ Riemann::Tools::Freeswitch.run
data/bin/riemann-haproxy CHANGED
@@ -3,63 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- # Gathers haproxy CSV statistics and submits them to Riemann.
7
-
8
- require File.expand_path('../lib/riemann/tools', __dir__)
9
-
10
- module Riemann
11
- module Tools
12
- class Haproxy
13
- include Riemann::Tools
14
- require 'net/http'
15
- require 'csv'
16
-
17
- opt :stats_url, 'Full url to haproxy stats (eg: https://user:password@host.com:9999/stats)', required: true,
18
- type: :string
19
-
20
- def initialize
21
- @uri = URI("#{opts[:stats_url]};csv")
22
- end
23
-
24
- def tick
25
- csv.each do |row|
26
- row = row.to_hash
27
- ns = "haproxy #{row['pxname']} #{row['svname']}"
28
- row.each do |property, metric|
29
- next if property.nil? || property == 'pxname' || property == 'svname'
30
-
31
- report(
32
- host: @uri.host,
33
- service: "#{ns} #{property}",
34
- metric: metric.to_f,
35
- tags: ['haproxy'],
36
- )
37
- end
38
-
39
- report(
40
- host: @uri.host,
41
- service: "#{ns} state",
42
- state: (%w[UP OPEN].include?(row['status']) ? 'ok' : 'critical'),
43
- tags: ['haproxy'],
44
- )
45
- end
46
- end
47
-
48
- def csv
49
- http = Net::HTTP.new(@uri.host, @uri.port)
50
- http.use_ssl = true if @uri.scheme == 'https'
51
- http.start do |h|
52
- get = Net::HTTP::Get.new(@uri.request_uri)
53
- unless @uri.userinfo.nil?
54
- userinfo = @uri.userinfo.split(':')
55
- get.basic_auth userinfo[0], userinfo[1]
56
- end
57
- h.request get
58
- end
59
- CSV.parse(http.body.split('# ')[1], { headers: true })
60
- end
61
- end
62
- end
63
- end
6
+ require 'riemann/tools/haproxy'
64
7
 
65
8
  Riemann::Tools::Haproxy.run
data/bin/riemann-health CHANGED
@@ -3,8 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- # Reports current CPU, disk, load average, and memory use to riemann.
7
-
8
6
  require 'riemann/tools/health'
9
7
 
10
8
  Riemann::Tools::Health.run
@@ -3,26 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- require File.expand_path('../lib/riemann/tools', __dir__)
6
+ require 'riemann/tools/kvm'
7
7
 
8
- module Riemann
9
- module Tools
10
- class KVM
11
- include Riemann::Tools
12
-
13
- def tick
14
- # determine how many instances I have according to libvirt
15
- kvm_instances = `LANG=C virsh list | grep -c running`
16
-
17
- # submit them to riemann
18
- report(
19
- service: 'KVM Running VMs',
20
- metric: kvm_instances.to_i,
21
- state: 'info',
22
- )
23
- end
24
- end
25
- end
26
- end
27
-
28
- Riemann::Tools::KVM.run
8
+ Riemann::Tools::Kvm.run
data/bin/riemann-md ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ Process.setproctitle($PROGRAM_NAME)
5
+
6
+ require 'riemann/tools/md'
7
+
8
+ Riemann::Tools::Md.run
@@ -3,42 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- # Gathers memcached STATS and submits them to Riemann.
7
-
8
- require File.expand_path('../lib/riemann/tools', __dir__)
9
-
10
- module Riemann
11
- module Tools
12
- class Memcached
13
- include Riemann::Tools
14
- require 'socket'
15
-
16
- opt :memcached_host, 'Memcached hostname', default: 'localhost'
17
- opt :memcached_port, 'Memcached port', default: 11_211
18
-
19
- def tick
20
- sock = TCPSocket.new(opts[:memcached_host], opts[:memcached_port])
21
- sock.print("stats\r\n")
22
- sock.flush
23
- stats = sock.gets
24
-
25
- loop do
26
- stats = sock.gets
27
- break if stats.strip == 'END'
28
-
29
- m = stats.match(/STAT (\w+) (\S+)/)
30
- report(
31
- host: opts[:memcached_host].dup,
32
- service: "memcached #{m[1]}",
33
- metric: m[2].to_f,
34
- state: 'ok',
35
- tags: ['memcached'],
36
- )
37
- end
38
- sock.close
39
- end
40
- end
41
- end
42
- end
6
+ require 'riemann/tools/memcached'
43
7
 
44
8
  Riemann::Tools::Memcached.run
data/bin/riemann-net CHANGED
@@ -3,8 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- # Gathers network interface statistics and submits them to Riemann.
7
-
8
6
  require 'riemann/tools/net'
9
7
 
10
8
  Riemann::Tools::Net.run
@@ -3,90 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- # Gathers nginx status stub statistics and submits them to Riemann.
7
- # See http://wiki.nginx.org/HttpStubStatusModule for configuring Nginx appropriately
8
-
9
- require File.expand_path('../lib/riemann/tools', __dir__)
10
-
11
- module Riemann
12
- module Tools
13
- class NginxStatus
14
- include Riemann::Tools
15
- require 'net/http'
16
- require 'uri'
17
-
18
- opt :uri, 'Nginx Stub Status URI', default: 'http://localhost:8080/nginx_status'
19
- opt :checks, 'Which metrics to report.', type: :strings,
20
- default: %w[active accepted handled requests reading writing waiting]
21
- opt :active_warning, 'Active connections warning threshold', default: 0
22
- opt :active_critical, 'Active connections critical threshold', default: 0
23
- opt :reading_warning, 'Reading connections warning threshold', default: 0
24
- opt :reading_critical, 'Reading connections critical threshold', default: 0
25
- opt :writing_warning, 'Writing connections warning threshold', default: 0
26
- opt :writing_critical, 'Writing connections critical threshold', default: 0
27
- opt :waiting_warning, 'Waiting connections warning threshold', default: 0
28
- opt :waiting_critical, 'Waiting connections critical threshold', default: 0
29
-
30
- def initialize
31
- @uri = URI.parse(opts[:uri])
32
-
33
- # sample response:
34
- #
35
- # Active connections: 1
36
- # server accepts handled requests
37
- # 39 39 39
38
- # Reading: 0 Writing: 1 Waiting: 0
39
- @keys = %w[active accepted handled requests reading writing waiting]
40
- @re = /Active connections: (\d+) \n.+\n (\d+) (\d+) (\d+) \nReading: (\d+) Writing: (\d+) Waiting: (\d+)/m
41
- end
42
-
43
- def state(key, value)
44
- if opts.key? "#{key}_critical".to_sym
45
- critical_threshold = opts["#{key}_critical".to_sym]
46
- return 'critical' if critical_threshold.positive? && (value >= critical_threshold)
47
- end
48
-
49
- if opts.key? "#{key}_warning".to_sym
50
- warning_threshold = opts["#{key}_warning".to_sym]
51
- return 'warning' if warning_threshold.positive? && (value >= warning_threshold)
52
- end
53
-
54
- 'ok'
55
- end
56
-
57
- def tick
58
- response = nil
59
- begin
60
- response = Net::HTTP.get(@uri)
61
- rescue StandardError => e
62
- report(
63
- service: 'nginx health',
64
- state: 'critical',
65
- description: "Connection error: #{e.class} - #{e.message}",
66
- )
67
- end
68
-
69
- return if response.nil?
70
-
71
- report(
72
- service: 'nginx health',
73
- state: 'ok',
74
- description: 'Nginx status connection ok',
75
- )
76
-
77
- values = @re.match(response).to_a[1, 7].map(&:to_i)
78
-
79
- @keys.zip(values).each do |key, value|
80
- report({
81
- service: "nginx #{key}",
82
- metric: value,
83
- state: state(key, value),
84
- tags: ['nginx'],
85
- })
86
- end
87
- end
88
- end
89
- end
90
- end
6
+ require 'riemann/tools/nginx_status'
91
7
 
92
8
  Riemann::Tools::NginxStatus.run
data/bin/riemann-ntp CHANGED
@@ -3,8 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- # Reports NTP stats to Riemann.
7
-
8
6
  require 'riemann/tools/ntp'
9
7
 
10
8
  Riemann::Tools::Ntp.run
@@ -3,49 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- # Checks for open tcp ports.
7
- # (c) Max Voit 2017
8
-
9
- require File.expand_path('../lib/riemann/tools', __dir__)
10
-
11
- module Riemann
12
- module Tools
13
- class Portcheck
14
- include Riemann::Tools
15
- require 'socket'
16
-
17
- opt :hostname, 'Host, defaults to localhost', default: `hostname`.chomp
18
- opt :ports, "List of ports to check, e.g. '-r 80 443'", type: :ints
19
-
20
- def initialize
21
- @hostname = opts.fetch(:hostname)
22
- @ports = opts.fetch(:ports)
23
- end
24
-
25
- def tick
26
- @ports.each do |thisport|
27
- # try opening tcp connection with 5s timeout;
28
- # if this fails, the port is considered closed
29
- portopen = begin
30
- Socket.tcp(@hostname, thisport, connect_timeout: 5) { true }
31
- rescue StandardError
32
- false
33
- end
34
- state = if portopen
35
- 'ok'
36
- else
37
- 'critical'
38
- end
39
- report(
40
- host: @hostname.to_s,
41
- service: "port #{thisport}",
42
- state: state.to_s,
43
- tags: ['portcheck'],
44
- )
45
- end
46
- end
47
- end
48
- end
49
- end
6
+ require 'riemann/tools/portcheck'
50
7
 
51
8
  Riemann::Tools::Portcheck.run